void VlcProc::on_item_current_changed( vlc_object_t* p_obj, vlc_value_t newVal ) { (void)p_obj; input_item_t *p_item = static_cast<input_item_t*>(newVal.p_address); // Update short name char *psz_name = input_item_GetName( p_item ); SET_TEXT( m_cVarStreamName, UString( getIntf(), psz_name ) ); free( psz_name ); // Update local path (if possible) or full uri char *psz_uri = input_item_GetURI( p_item ); char *psz_path = make_path( psz_uri ); char *psz_save = psz_path ? psz_path : psz_uri; SET_TEXT( m_cVarStreamURI, UString( getIntf(), psz_save ) ); free( psz_path ); free( psz_uri ); // Update art uri char *psz_art = input_item_GetArtURL( p_item ); SET_STRING( m_cVarStreamArt, string( psz_art ? psz_art : "" ) ); free( psz_art ); // Update playtree getPlaytreeVar().onUpdateCurrent( true ); }
static lua_State * vlclua_meta_init( vlc_object_t *p_this, input_item_t * p_item ) { lua_State * L = luaL_newstate(); if( !L ) { msg_Err( p_this, "Could not create new Lua State" ); return NULL; } char *psz_meta; /* Load Lua libraries */ luaL_openlibs( L ); /* XXX: Don't open all the libs? */ luaL_register( L, "vlc", p_reg ); luaopen_msg( L ); luaopen_stream( L ); luaopen_strings( L ); luaopen_variables( L ); luaopen_object( L ); luaopen_misc( L ); lua_pushlightuserdata( L, p_this ); lua_setfield( L, -2, "private" ); psz_meta = input_item_GetName( p_item ); lua_pushstring( L, psz_meta ); lua_setfield( L, -2, "name" ); free( psz_meta ); psz_meta = input_item_GetArtist( p_item ); lua_pushstring( L, psz_meta ); lua_setfield( L, -2, "artist" ); free( psz_meta ); psz_meta = input_item_GetTitle( p_item ) ; lua_pushstring( L, psz_meta ); lua_setfield( L, -2, "title" ); free( psz_meta ); psz_meta = input_item_GetAlbum( p_item ); lua_pushstring( L, psz_meta ); lua_setfield( L, -2, "album" ); free( psz_meta ); psz_meta = input_item_GetArtURL( p_item ); lua_pushstring( L, psz_meta ); lua_setfield( L, -2, "arturl" ); free( psz_meta ); /* XXX: all should be passed ( could use macro ) */ return L; }
/** * Start the input for an item * * \param p_playlist the playlist object * \param p_item the item to play * \return nothing */ static void PlayItem( playlist_t *p_playlist, playlist_item_t *p_item ) { playlist_private_t *p_sys = pl_priv(p_playlist); input_item_t *p_input = p_item->p_input; PL_ASSERT_LOCKED; msg_Dbg( p_playlist, "creating new input thread" ); p_item->i_nb_played++; set_current_status_item( p_playlist, p_item ); p_sys->status.i_status = PLAYLIST_RUNNING; assert( p_sys->p_input == NULL ); PL_UNLOCK; input_thread_t *p_input_thread = input_Create( p_playlist, p_input, NULL, p_sys->p_input_resource ); if( likely(p_input_thread != NULL) ) { var_AddCallback( p_input_thread, "intf-event", InputEvent, p_playlist ); if( input_Start( p_input_thread ) ) { var_DelCallback( p_input_thread, "intf-event", InputEvent, p_playlist ); vlc_object_release( p_input_thread ); p_input_thread = NULL; } } var_SetAddress( p_playlist, "input-current", p_input_thread ); /* TODO store art policy in playlist private data */ char *psz_arturl = input_item_GetArtURL( p_input ); /* p_input->p_meta should not be null after a successful CreateThread */ bool b_has_art = !EMPTY_STR( psz_arturl ); if( !b_has_art || strncmp( psz_arturl, "attachment://", 13 ) ) { PL_DEBUG( "requesting art for new input thread" ); libvlc_ArtRequest( p_playlist->p_libvlc, p_input, META_REQUEST_OPTION_NONE ); } free( psz_arturl ); var_TriggerCallback( p_playlist, "activity" ); PL_LOCK; p_sys->p_input = p_input_thread; }
const QString InputManager::decodeArtURL( input_item_t *p_item ) { assert( p_item ); char *psz_art = input_item_GetArtURL( p_item ); if( psz_art ) { char *psz = make_path( psz_art ); free( psz_art ); psz_art = psz; } #if 0 /* Taglib seems to define a attachment://, It won't work yet */ url = url.replace( "attachment://", "" ); #endif return qfu( psz_art ? psz_art : "" ); }
void VlcProc::update_current_input() { input_thread_t* pInput = getIntf()->p_sys->p_input; if( !pInput ) return; input_item_t *pItem = input_GetItem( pInput ); if( pItem ) { // Update short name (as defined by --input-title-format) char *psz_fmt = var_InheritString( getIntf(), "input-title-format" ); char *psz_name = NULL; if( psz_fmt != NULL ) { psz_name = str_format_meta( pInput, psz_fmt ); free( psz_fmt ); } SET_TEXT( m_cVarStreamName, UString( getIntf(), psz_name ? psz_name : "" ) ); free( psz_name ); // Update local path (if possible) or full uri char *psz_uri = input_item_GetURI( pItem ); char *psz_path = make_path( psz_uri ); char *psz_save = psz_path ? psz_path : psz_uri; SET_TEXT( m_cVarStreamURI, UString( getIntf(), psz_save ) ); free( psz_path ); free( psz_uri ); // Update art uri char *psz_art = input_item_GetArtURL( pItem ); SET_STRING( m_cVarStreamArt, string( psz_art ? psz_art : "" ) ); free( psz_art ); } }
void input_ExtractAttachmentAndCacheArt( input_thread_t *p_input ) { input_item_t *p_item = p_input->p->p_item; /* */ char *psz_arturl = input_item_GetArtURL( p_item ); if( !psz_arturl || strncmp( psz_arturl, "attachment://", strlen("attachment://") ) ) { msg_Err( p_input, "internal input error with input_ExtractAttachmentAndCacheArt" ); free( psz_arturl ); return; } if( input_item_IsArtFetched( p_item ) ) { /* XXX Weird, we should not have end up with attachment:// art url unless there is a race * condition */ msg_Warn( p_input, "internal input error with input_ExtractAttachmentAndCacheArt" ); playlist_FindArtInCache( p_item ); goto exit; } /* */ input_attachment_t *p_attachment = NULL; vlc_mutex_lock( &p_item->lock ); for( int i_idx = 0; i_idx < p_input->p->i_attachment; i_idx++ ) { if( !strcmp( p_input->p->attachment[i_idx]->psz_name, &psz_arturl[strlen("attachment://")] ) ) { p_attachment = vlc_input_attachment_Duplicate( p_input->p->attachment[i_idx] ); break; } } vlc_mutex_unlock( &p_item->lock ); if( !p_attachment || p_attachment->i_data <= 0 ) { if( p_attachment ) vlc_input_attachment_Delete( p_attachment ); msg_Warn( p_input, "internal input error with input_ExtractAttachmentAndCacheArt" ); goto exit; } /* */ const char *psz_type = NULL; if( !strcmp( p_attachment->psz_mime, "image/jpeg" ) ) psz_type = ".jpg"; else if( !strcmp( p_attachment->psz_mime, "image/png" ) ) psz_type = ".png"; /* */ playlist_SaveArt( VLC_OBJECT(p_input), p_item, (const uint8_t *)p_attachment->p_data, p_attachment->i_data, psz_type ); // sunqueen modify vlc_input_attachment_Delete( p_attachment ); exit: free( psz_arturl ); }
/** * Start the input for an item * * \param p_playlist the playlist object * \param p_item the item to play * \return nothing */ static int PlayItem( playlist_t *p_playlist, playlist_item_t *p_item ) { playlist_private_t *p_sys = pl_priv(p_playlist); input_item_t *p_input = p_item->p_input; PL_ASSERT_LOCKED; msg_Dbg( p_playlist, "creating new input thread" ); p_input->i_nb_played++; set_current_status_item( p_playlist, p_item ); p_sys->status.i_status = PLAYLIST_RUNNING; UpdateActivity( p_playlist, DEFAULT_INPUT_ACTIVITY ); assert( p_sys->p_input == NULL ); if( !p_sys->p_input_resource ) p_sys->p_input_resource = input_resource_New( VLC_OBJECT( p_playlist ) ); input_thread_t *p_input_thread = input_Create( p_playlist, p_input, NULL, p_sys->p_input_resource ); if( p_input_thread ) { p_sys->p_input = p_input_thread; var_AddCallback( p_input_thread, "intf-event", InputEvent, p_playlist ); var_SetAddress( p_playlist, "input-current", p_input_thread ); if( input_Start( p_sys->p_input ) ) { vlc_object_release( p_input_thread ); p_sys->p_input = p_input_thread = NULL; } } char *psz_uri = input_item_GetURI( p_item->p_input ); if( psz_uri && ( !strncmp( psz_uri, "directory:", 10 ) || !strncmp( psz_uri, "vlc:", 4 ) ) ) { free( psz_uri ); return VLC_SUCCESS; } free( psz_uri ); /* TODO store art policy in playlist private data */ if( var_GetInteger( p_playlist, "album-art" ) == ALBUM_ART_WHEN_PLAYED ) { bool b_has_art; char *psz_arturl, *psz_name; psz_arturl = input_item_GetArtURL( p_input ); psz_name = input_item_GetName( p_input ); /* p_input->p_meta should not be null after a successfull CreateThread */ b_has_art = !EMPTY_STR( psz_arturl ); if( !b_has_art || strncmp( psz_arturl, "attachment://", 13 ) ) { PL_DEBUG( "requesting art for %s", psz_name ); playlist_AskForArtEnqueue( p_playlist, p_input ); } free( psz_arturl ); free( psz_name ); } /* FIXME: this is not safe !!*/ PL_UNLOCK; var_SetAddress( p_playlist, "item-current", p_input ); PL_LOCK; return VLC_SUCCESS; }
int ArtCallback( httpd_handler_sys_t *p_args, httpd_handler_t *p_handler, char *_p_url, uint8_t *p_request, int i_type, uint8_t *p_in, int i_in, char *psz_remote_addr, char *psz_remote_host, uint8_t **pp_data, int *pi_data ) { VLC_UNUSED(p_handler); VLC_UNUSED(_p_url); VLC_UNUSED(i_type); VLC_UNUSED(p_in); VLC_UNUSED(i_in); VLC_UNUSED(psz_remote_addr); VLC_UNUSED(psz_remote_host); char *psz_art = NULL; intf_thread_t *p_intf = p_args->file.p_intf; intf_sys_t *p_sys = p_intf->p_sys; char psz_id[16]; input_item_t *p_item = NULL; int i_id; psz_id[0] = '\0'; if( p_request ) ExtractURIValue( (char *)p_request, "id", psz_id, 15 ); i_id = atoi( psz_id ); if( i_id ) { playlist_Lock( p_sys->p_playlist ); playlist_item_t *p_pl_item = playlist_ItemGetById( p_sys->p_playlist, i_id ); if( p_pl_item ) p_item = p_pl_item->p_input; playlist_Unlock( p_sys->p_playlist ); } else { /* FIXME: Workarround a stupid assert in input_GetItem */ if( p_sys->p_input && p_sys->p_input->p ) p_item = input_GetItem( p_sys->p_input ); } if( p_item ) { psz_art = input_item_GetArtURL( p_item ); } if( psz_art ) { char *psz = make_path( psz_art ); free( psz_art ); psz_art = psz; } if( psz_art == NULL ) { msg_Dbg( p_intf, "No album art found" ); Callback404( &p_args->file, (char**)pp_data, pi_data ); return VLC_SUCCESS; } FILE *f = vlc_fopen( psz_art, "r" ); if( f == NULL ) { msg_Dbg( p_intf, "Couldn't open album art file %s", psz_art ); Callback404( &p_args->file, (char**)pp_data, pi_data ); free( psz_art ); return VLC_SUCCESS; } free( psz_art ); char *p_data = NULL; int i_data; FileLoad( f, &p_data, &i_data ); fclose( f ); char *psz_ext = strrchr( psz_art, '.' ); if( psz_ext ) psz_ext++; #define HEADER "Content-Type: image/%s\n" \ "Content-Length: %d\n" \ "\n" char *psz_header; int i_header_size = asprintf( &psz_header, HEADER, psz_ext, i_data ); #undef HEADER if( likely(i_header_size != -1) ) { *pp_data = malloc( i_header_size + i_data ); if( likely(*pp_data != NULL) ) { *pi_data = i_header_size + i_data; memcpy( *pp_data, psz_header, i_header_size ); memcpy( *pp_data+i_header_size, p_data, i_data ); } free( psz_header ); } free( p_data ); return VLC_SUCCESS; }
/** * Update all the MetaData and art on an "item-changed" event **/ void MetaPanel::update( input_item_t *p_item ) { if( !p_item ) { clear(); return; } /* Don't update if you are in edit mode */ if( b_inEditMode ) return; p_input = p_item; char *psz_meta; #define UPDATE_META( meta, widget ) { \ psz_meta = input_item_Get##meta( p_item ); \ widget->setText( !EMPTY_STR( psz_meta ) ? qfu( psz_meta ) : "" ); \ free( psz_meta ); } #define UPDATE_META_INT( meta, widget ) { \ psz_meta = input_item_Get##meta( p_item ); \ if( !EMPTY_STR( psz_meta ) ) \ widget->setValue( atoi( psz_meta ) ); } \ free( psz_meta ); /* Name / Title */ psz_meta = input_item_GetTitleFbName( p_item ); if( psz_meta ) { title_text->setText( qfu( psz_meta ) ); free( psz_meta ); } else title_text->setText( "" ); /* URL / URI */ psz_meta = input_item_GetURI( p_item ); if( !EMPTY_STR( psz_meta ) ) emit uriSet( qfu( psz_meta ) ); fingerprintButton->setVisible( Chromaprint::isSupported( QString( psz_meta ) ) ); free( psz_meta ); /* Other classic though */ UPDATE_META( Artist, artist_text ); UPDATE_META( Genre, genre_text ); UPDATE_META( Copyright, copyright_text ); UPDATE_META( Album, collection_text ); UPDATE_META( Description, description_text ); UPDATE_META( Language, language_text ); UPDATE_META( NowPlaying, nowplaying_text ); UPDATE_META( Publisher, publisher_text ); UPDATE_META( EncodedBy, encodedby_text ); UPDATE_META( Date, date_text ); UPDATE_META( TrackNum, seqnum_text ); UPDATE_META( TrackTotal, seqtot_text ); // UPDATE_META( Setting, setting_text ); // UPDATE_META_INT( Rating, rating_text ); /* URL */ psz_meta = input_item_GetURL( p_item ); if( !EMPTY_STR( psz_meta ) ) { QString newURL = qfu(psz_meta); if( currentURL != newURL ) { currentURL = newURL; lblURL->setText( "<a href='" + currentURL + "'>" + currentURL.remove( QRegExp( ".*://") ) + "</a>" ); } } free( psz_meta ); #undef UPDATE_META_INT #undef UPDATE_META // If a artURL is available as a local file, directly display it ! QString file; char *psz_art = input_item_GetArtURL( p_item ); if( psz_art ) { char *psz = make_path( psz_art ); free( psz_art ); file = qfu( psz ); free( psz ); } art_cover->showArtUpdate( file ); art_cover->setItem( p_item ); }
/************************************************************************* * Playlist stuff *************************************************************************/ void PlaylistListNode( intf_thread_t *p_intf, playlist_t *p_pl, playlist_item_t *p_node, char *name, mvar_t *s, int i_depth ) { if( !p_node || !p_node->p_input ) return; if( p_node->i_children == -1 ) { char value[512]; char *psz; playlist_item_t * p_item = playlist_CurrentPlayingItem( p_pl ); if( !p_item || !p_item->p_input ) return; mvar_t *itm = mvar_New( name, "set" ); if( p_item->p_input == p_node->p_input ) mvar_AppendNewVar( itm, "current", "1" ); else mvar_AppendNewVar( itm, "current", "0" ); sprintf( value, "%d", p_node->i_id ); mvar_AppendNewVar( itm, "index", value ); psz = input_item_GetName( p_node->p_input ); mvar_AppendNewVar( itm, "name", psz ); free( psz ); psz = input_item_GetURI( p_node->p_input ); mvar_AppendNewVar( itm, "uri", psz ); free( psz ); mvar_AppendNewVar( itm, "type", "Item" ); sprintf( value, "%d", i_depth ); mvar_AppendNewVar( itm, "depth", value ); if( p_node->i_flags & PLAYLIST_RO_FLAG ) mvar_AppendNewVar( itm, "ro", "ro" ); else mvar_AppendNewVar( itm, "ro", "rw" ); sprintf( value, "%"PRId64, input_item_GetDuration( p_node->p_input ) ); mvar_AppendNewVar( itm, "duration", value ); //Adding extra meta-information to each playlist item psz = input_item_GetTitle( p_node->p_input ); mvar_AppendNewVar( itm, "title", psz ); free( psz ); psz = input_item_GetArtist( p_node->p_input ); mvar_AppendNewVar( itm, "artist", psz ); free( psz ); psz = input_item_GetGenre( p_node->p_input ); mvar_AppendNewVar( itm, "genre", psz ); free( psz ); psz = input_item_GetCopyright( p_node->p_input ); mvar_AppendNewVar( itm, "copyright", psz ); free( psz ); psz = input_item_GetAlbum( p_node->p_input ); mvar_AppendNewVar( itm, "album", psz ); free( psz ); psz = input_item_GetTrackNum( p_node->p_input ); mvar_AppendNewVar( itm, "track", psz ); free( psz ); psz = input_item_GetDescription( p_node->p_input ); mvar_AppendNewVar( itm, "description", psz ); free( psz ); psz = input_item_GetRating( p_node->p_input ); mvar_AppendNewVar( itm, "rating", psz ); free( psz ); psz = input_item_GetDate( p_node->p_input ); mvar_AppendNewVar( itm, "date", psz ); free( psz ); psz = input_item_GetURL( p_node->p_input ); mvar_AppendNewVar( itm, "url", psz ); free( psz ); psz = input_item_GetLanguage( p_node->p_input ); mvar_AppendNewVar( itm, "language", psz ); free( psz ); psz = input_item_GetNowPlaying( p_node->p_input ); mvar_AppendNewVar( itm, "now_playing", psz ); free( psz ); psz = input_item_GetPublisher( p_node->p_input ); mvar_AppendNewVar( itm, "publisher", psz ); free( psz ); psz = input_item_GetEncodedBy( p_node->p_input ); mvar_AppendNewVar( itm, "encoded_by", psz ); free( psz ); psz = input_item_GetArtURL( p_node->p_input ); mvar_AppendNewVar( itm, "art_url", psz ); free( psz ); psz = input_item_GetTrackID( p_node->p_input ); mvar_AppendNewVar( itm, "track_id", psz ); free( psz ); mvar_AppendVar( s, itm ); } else { char value[512]; int i_child; mvar_t *itm = mvar_New( name, "set" ); mvar_AppendNewVar( itm, "name", p_node->p_input->psz_name ); mvar_AppendNewVar( itm, "uri", p_node->p_input->psz_name ); mvar_AppendNewVar( itm, "type", "Node" ); sprintf( value, "%d", p_node->i_id ); mvar_AppendNewVar( itm, "index", value ); sprintf( value, "%d", p_node->i_children); mvar_AppendNewVar( itm, "i_children", value ); sprintf( value, "%d", i_depth ); mvar_AppendNewVar( itm, "depth", value ); if( p_node->i_flags & PLAYLIST_RO_FLAG ) mvar_AppendNewVar( itm, "ro", "ro" ); else mvar_AppendNewVar( itm, "ro", "rw" ); mvar_AppendVar( s, itm ); for( i_child = 0 ; i_child < p_node->i_children ; i_child++ ) PlaylistListNode( p_intf, p_pl, p_node->pp_children[i_child], name, s, i_depth + 1); } }
/***************************************************************************** * ItemChange: Playlist item change callback *****************************************************************************/ static int ItemChange( vlc_object_t *p_this, const char *psz_var, vlc_value_t oldval, vlc_value_t newval, void *param ) { VLC_UNUSED(psz_var); VLC_UNUSED(oldval); VLC_UNUSED(newval); char psz_tmp[MAX_LENGTH]; char psz_notify[MAX_LENGTH]; char *psz_title; char *psz_artist; char *psz_album; char *psz_arturl; input_thread_t *p_input = playlist_CurrentInput( (playlist_t*)p_this ); intf_thread_t *p_intf = param; intf_sys_t *p_sys = p_intf->p_sys; if( !p_input ) return VLC_SUCCESS; if( p_input->b_dead ) { /* Not playing anything ... */ vlc_object_release( p_input ); return VLC_SUCCESS; } /* Wait a tad so the meta has been fetched * FIXME that's awfully wrong */ msleep( 10000 ); /* Playing something ... */ input_item_t *p_input_item = input_GetItem( p_input ); psz_title = input_item_GetTitleFbName( p_input_item ); /* We need at least a title */ if( EMPTY_STR( psz_title ) ) { free( psz_title ); vlc_object_release( p_input ); return VLC_SUCCESS; } psz_artist = input_item_GetArtist( p_input_item ); psz_album = input_item_GetAlbum( p_input_item ); if( !EMPTY_STR( psz_artist ) ) { if( !EMPTY_STR( psz_album ) ) snprintf( psz_tmp, MAX_LENGTH, "<b>%s</b>\n%s\n[%s]", psz_title, psz_artist, psz_album ); else snprintf( psz_tmp, MAX_LENGTH, "<b>%s</b>\n%s", psz_title, psz_artist ); } else snprintf( psz_tmp, MAX_LENGTH, "<b>%s</b>", psz_title ); free( psz_title ); free( psz_artist ); free( psz_album ); GdkPixbuf *pix = NULL; psz_arturl = input_item_GetArtURL( p_input_item ); vlc_object_release( p_input ); if( psz_arturl ) { char *psz = make_path( psz_arturl ); free( psz_arturl ); psz_arturl = psz; } if( psz_arturl ) { /* scale the art to show it in notify popup */ GError *p_error = NULL; pix = gdk_pixbuf_new_from_file_at_scale( psz_arturl, 72, 72, TRUE, &p_error ); } else /* else we show state-of-the art logo */ { /* First try to get an icon from the current theme. */ GtkIconTheme* p_theme = gtk_icon_theme_get_default(); pix = gtk_icon_theme_load_icon( p_theme, "vlc", 72, 0, NULL); if( !pix ) { /* Load icon from share/ */ GError *p_error = NULL; char *psz_pixbuf; char *psz_data = config_GetDataDir( p_this ); if( asprintf( &psz_pixbuf, "%s/icons/48x48/vlc.png", psz_data ) >= 0 ) { pix = gdk_pixbuf_new_from_file( psz_pixbuf, &p_error ); free( psz_pixbuf ); } free( psz_data ); } } free( psz_arturl ); /* we need to replace '&' with '&' because '&' is a keyword of * notification-daemon parser */ const int i_len = strlen( psz_tmp ); int i_notify = 0; for( int i = 0; i < i_len && i_notify < ( MAX_LENGTH - 5 ); i++ ) { /* we use MAX_LENGTH - 5 because if the last char of psz_tmp is '&' * we will need 5 more characters: 'amp;\0' . * however that's unlikely to happen because the last char is '\0' */ if( psz_tmp[i] != '&' ) { psz_notify[i_notify] = psz_tmp[i]; } else { strcpy( &psz_notify[i_notify], "&" ); i_notify += 4; } i_notify++; } psz_notify[i_notify] = '\0'; vlc_mutex_lock( &p_sys->lock ); Notify( p_this, psz_notify, pix, p_intf ); vlc_mutex_unlock( &p_sys->lock ); return VLC_SUCCESS; }
/***************************************************************************** * ItemChange: Playlist item change callback *****************************************************************************/ static int ItemChange( vlc_object_t *p_this, const char *psz_var, vlc_value_t oldval, vlc_value_t newval, void *param ) { VLC_UNUSED(psz_var); VLC_UNUSED(oldval); VLC_UNUSED(newval); char psz_tmp[MAX_LENGTH]; char psz_notify[MAX_LENGTH]; char *psz_title; char *psz_artist; char *psz_album; char *psz_arturl; input_thread_t *p_input = newval.p_address; intf_thread_t *p_intf = param; intf_sys_t *p_sys = p_intf->p_sys; if( !p_input ) return VLC_SUCCESS; /* Playing something ... */ input_item_t *p_input_item = input_GetItem( p_input ); /* Checking for click on directories */ if(p_input_item->i_type == ITEM_TYPE_DIRECTORY || p_input_item->i_type == ITEM_TYPE_PLAYLIST || p_input_item->i_type == ITEM_TYPE_NODE || p_input_item->i_type== ITEM_TYPE_UNKNOWN || p_input_item->i_type == ITEM_TYPE_CARD){ return VLC_SUCCESS; } psz_title = input_item_GetTitleFbName( p_input_item ); /* We need at least a title */ if( EMPTY_STR( psz_title ) ) { free( psz_title ); return VLC_SUCCESS; } psz_artist = input_item_GetArtist( p_input_item ); psz_album = input_item_GetAlbum( p_input_item ); if( !EMPTY_STR( psz_artist ) ) { if( !EMPTY_STR( psz_album ) ) snprintf( psz_tmp, MAX_LENGTH, "<b>%s</b>\n%s\n[%s]", psz_title, psz_artist, psz_album ); else snprintf( psz_tmp, MAX_LENGTH, "<b>%s</b>\n%s", psz_title, psz_artist ); } else snprintf( psz_tmp, MAX_LENGTH, "<b>%s</b>", psz_title ); free( psz_title ); free( psz_artist ); free( psz_album ); GdkPixbuf *pix = NULL; psz_arturl = input_item_GetArtURL( p_input_item ); if( psz_arturl ) { char *psz = vlc_uri2path( psz_arturl ); free( psz_arturl ); psz_arturl = psz; } if( psz_arturl ) { /* scale the art to show it in notify popup */ GError *p_error = NULL; pix = gdk_pixbuf_new_from_file_at_scale( psz_arturl, 72, 72, TRUE, &p_error ); } else /* else we show state-of-the art logo */ { /* First try to get an icon from the current theme. */ GtkIconTheme* p_theme = gtk_icon_theme_get_default(); pix = gtk_icon_theme_load_icon( p_theme, "vlc", 72, 0, NULL); if( !pix ) { /* Load icon from share/ */ GError *p_error = NULL; char *psz_pixbuf = config_GetSysPath(VLC_SYSDATA_DIR, "icons/hicolor/48x48/"PACKAGE_NAME".png"); if (psz_pixbuf != NULL) { pix = gdk_pixbuf_new_from_file( psz_pixbuf, &p_error ); free( psz_pixbuf ); } } } free( psz_arturl ); /* we need to replace '&' with '&' because '&' is a keyword of * notification-daemon parser */ const int i_len = strlen( psz_tmp ); int i_notify = 0; for( int i = 0; i < i_len && i_notify < ( MAX_LENGTH - 5 ); i++ ) { /* we use MAX_LENGTH - 5 because if the last char of psz_tmp is '&' * we will need 5 more characters: 'amp;\0' . * however that's unlikely to happen because the last char is '\0' */ if( psz_tmp[i] != '&' ) { psz_notify[i_notify] = psz_tmp[i]; } else { strcpy( &psz_notify[i_notify], "&" ); i_notify += 4; } i_notify++; } psz_notify[i_notify] = '\0'; vlc_mutex_lock( &p_sys->lock ); Notify( p_this, psz_notify, pix, p_intf ); vlc_mutex_unlock( &p_sys->lock ); return VLC_SUCCESS; }
/** * Update all the MetaData and art on an "item-changed" event **/ void MetaPanel::update( input_item_t *p_item ) { if( !p_item ) { clear(); return; } /* Don't update if you are in edit mode */ if( b_inEditMode ) return; else p_input = p_item; char *psz_meta; #define UPDATE_META( meta, widget ) { \ psz_meta = input_item_Get##meta( p_item ); \ if( !EMPTY_STR( psz_meta ) ) \ widget->setText( qfu( psz_meta ) ); \ else \ widget->setText( "" ); } \ free( psz_meta ); #define UPDATE_META_INT( meta, widget ) { \ psz_meta = input_item_Get##meta( p_item ); \ if( !EMPTY_STR( psz_meta ) ) \ widget->setValue( atoi( psz_meta ) ); } \ free( psz_meta ); /* Name / Title */ psz_meta = input_item_GetTitleFbName( p_item ); if( psz_meta ) { title_text->setText( qfu( psz_meta ) ); free( psz_meta ); } else title_text->setText( "" ); /* URL / URI */ psz_meta = input_item_GetURL( p_item ); if( !EMPTY_STR( psz_meta ) ) emit uriSet( qfu( psz_meta ) ); else { free( psz_meta ); psz_meta = input_item_GetURI( p_item ); if( !EMPTY_STR( psz_meta ) ) emit uriSet( qfu( psz_meta ) ); } free( psz_meta ); /* Other classic though */ UPDATE_META( Artist, artist_text ); UPDATE_META( Genre, genre_text ); UPDATE_META( Copyright, copyright_text ); UPDATE_META( Album, collection_text ); UPDATE_META( Description, description_text ); UPDATE_META( Language, language_text ); UPDATE_META( NowPlaying, nowplaying_text ); UPDATE_META( Publisher, publisher_text ); // UPDATE_META( Setting, setting_text ); //FIXME this is wrong if has Publisher and EncodedBy fields UPDATE_META( EncodedBy, publisher_text ); UPDATE_META( Date, date_text ); UPDATE_META( TrackNum, seqnum_text ); // UPDATE_META_INT( Rating, rating_text ); #undef UPDATE_META_INT #undef UPDATE_META // If a artURL is available as a local file, directly display it ! QString file; char *psz_art = input_item_GetArtURL( p_item ); if( psz_art ) { char *psz = make_path( psz_art ); free( psz_art ); file = qfu( psz ); free( psz ); } art_cover->showArtUpdate( file ); }
/** * Start the input for an item * * \param p_playlist the playlist object * \param p_item the item to play * \return nothing */ static int PlayItem( playlist_t *p_playlist, playlist_item_t *p_item ) { playlist_private_t *p_sys = pl_priv(p_playlist); input_item_t *p_input = p_item->p_input; PL_ASSERT_LOCKED; msg_Dbg( p_playlist, "creating new input thread" ); p_input->i_nb_played++; set_current_status_item( p_playlist, p_item ); p_sys->status.i_status = PLAYLIST_RUNNING; assert( p_sys->p_input == NULL ); input_thread_t *p_input_thread = input_Create( p_playlist, p_input, NULL, p_sys->p_input_resource ); if( p_input_thread ) { p_sys->p_input = p_input_thread; var_AddCallback( p_input_thread, "intf-event", InputEvent, p_playlist ); var_SetAddress( p_playlist, "input-current", p_input_thread ); if( input_Start( p_sys->p_input ) ) { vlc_object_release( p_input_thread ); p_sys->p_input = p_input_thread = NULL; } } bool b_find_art = var_GetInteger( p_playlist, "album-art" ) == ALBUM_ART_WHEN_PLAYED; if( b_find_art ) { char *psz_uri = input_item_GetURI( p_item->p_input ); if( psz_uri != NULL && (!strncmp( psz_uri, "directory:", 10 ) || !strncmp( psz_uri, "vlc:", 4 )) ) b_find_art = false; free( psz_uri ); } /* TODO store art policy in playlist private data */ if( b_find_art ) { char *psz_arturl = input_item_GetArtURL( p_input ); char *psz_name = input_item_GetName( p_input ); /* p_input->p_meta should not be null after a successful CreateThread */ bool b_has_art = !EMPTY_STR( psz_arturl ); if( !b_has_art || strncmp( psz_arturl, "attachment://", 13 ) ) { PL_DEBUG( "requesting art for %s", psz_name ); libvlc_ArtRequest( p_playlist->p_libvlc, p_input ); } free( psz_arturl ); free( psz_name ); } PL_UNLOCK; var_TriggerCallback( p_playlist, "activity" ); PL_LOCK; return VLC_SUCCESS; }
/***************************************************************************** * ItemChange: Playlist item change callback *****************************************************************************/ static int ItemChange( vlc_object_t *p_this, const char *psz_var, vlc_value_t oldval, vlc_value_t newval, void *param ) { VLC_UNUSED(psz_var); VLC_UNUSED(oldval); VLC_UNUSED(newval); char psz_tmp[MAX_LENGTH]; char psz_notify[MAX_LENGTH]; char *psz_title = NULL; char *psz_artist = NULL; char *psz_album = NULL; char *psz_arturl = NULL; input_thread_t *p_input = playlist_CurrentInput( (playlist_t*) p_this ); intf_thread_t *p_intf = param; intf_sys_t *p_sys = p_intf->p_sys; if( !p_input ) return VLC_SUCCESS; if( p_input->b_dead ) { /* Not playing anything ... */ vlc_object_release( p_input ); return VLC_SUCCESS; } /* Wait a tad so the meta has been fetched * FIXME that's awfully wrong */ msleep( 1000*4 ); /* Playing something ... */ input_item_t *p_input_item = input_GetItem( p_input ); psz_artist = input_item_GetArtist( p_input_item ); psz_album = input_item_GetAlbum( p_input_item ); psz_title = input_item_GetTitleFbName( p_input_item ); if( EMPTY_STR( psz_title ) ) { /* Not enough metadata ... */ free( psz_title ); free( psz_artist ); free( psz_album ); vlc_object_release( p_input ); return VLC_SUCCESS; } if( EMPTY_STR( psz_artist ) ) { free( psz_artist ); psz_artist = NULL; } if( EMPTY_STR( psz_album ) ) { free( psz_album ); psz_album = NULL; } if( psz_artist && psz_album ) snprintf( psz_tmp, MAX_LENGTH, "<b>%s</b>\n%s\n[%s]", psz_title, psz_artist, psz_album ); else if( psz_artist ) snprintf( psz_tmp, MAX_LENGTH, "<b>%s</b>\n%s", psz_title, psz_artist ); else snprintf( psz_tmp, MAX_LENGTH, "<b>%s</b>", psz_title ); free( psz_title ); free( psz_artist ); free( psz_album ); GdkPixbuf *pix = NULL; psz_arturl = input_item_GetArtURL( p_input_item ); vlc_object_release( p_input ); if( psz_arturl && !strncmp( psz_arturl, "file://", 7 ) && decode_URI( psz_arturl + 7 ) ) { /* scale the art to show it in notify popup */ GError *p_error = NULL; pix = gdk_pixbuf_new_from_file_at_scale( &psz_arturl[7], 72, 72, TRUE, &p_error ); } else /* else we show state-of-the art logo */ { GError *p_error = NULL; char *psz_pixbuf; if( asprintf( &psz_pixbuf, "%s/vlc48x48.png", config_GetDataDir() ) >= 0 ) { pix = gdk_pixbuf_new_from_file( psz_pixbuf, &p_error ); free( psz_pixbuf ); } } free( psz_arturl ); /* we need to replace '&' with '&' because '&' is a keyword of * notification-daemon parser */ const int i_len = strlen( psz_tmp ); int i_notify = 0; for( int i = 0; i < i_len && i_notify < ( MAX_LENGTH - 5 ); i++ ) { /* we use MAX_LENGTH - 5 because if the last char of psz_tmp is '&' * we will need 5 more characters: 'amp;\0' . * however that's unlikely to happen because the last char is '\0' */ if( psz_tmp[i] != '&' ) { psz_notify[i_notify] = psz_tmp[i]; } else { snprintf( &psz_notify[i_notify], 6, "&" ); i_notify += 4; } i_notify++; } psz_notify[i_notify] = '\0'; vlc_mutex_lock( &p_sys->lock ); Notify( p_this, psz_notify, pix, p_intf ); vlc_mutex_unlock( &p_sys->lock ); return VLC_SUCCESS; }
int ArtCallback( httpd_handler_sys_t *p_args, httpd_handler_t *p_handler, char *_p_url, uint8_t *p_request, int i_type, uint8_t *p_in, int i_in, char *psz_remote_addr, char *psz_remote_host, uint8_t **pp_data, int *pi_data ) { VLC_UNUSED(p_handler); VLC_UNUSED(_p_url); VLC_UNUSED(i_type); VLC_UNUSED(p_in); VLC_UNUSED(i_in); VLC_UNUSED(psz_remote_addr); VLC_UNUSED(psz_remote_host); VLC_UNUSED(p_request); char *psz_art = NULL; intf_thread_t *p_intf = p_args->file.p_intf; intf_sys_t *p_sys = p_intf->p_sys; input_item_t *p_item = NULL; p_sys->p_input = playlist_CurrentInput( p_sys->p_playlist ); /* Workaround a stupid assert in input_GetItem */ if( p_sys->p_input && p_sys->p_input->p ) p_item = input_GetItem( p_sys->p_input ); if( p_item ) { psz_art = input_item_GetArtURL( p_item ); } if( psz_art ) { char *psz = make_path( psz_art ); free( psz_art ); psz_art = psz; } if( psz_art == NULL ) { msg_Dbg( p_intf, "didn't find any art, so use default" ); char *psz_src = var_InheritString( p_intf, "http-src" ); if( psz_src == NULL ) { char *data_path = config_GetDataDir( p_intf ); if( asprintf( &psz_src, "%s" DIR_SEP "http", data_path ) == -1 ) psz_src = NULL; free( data_path ); } if( asprintf( &psz_art, "%s" DIR_SEP "images" DIR_SEP "default_album_art.png", psz_src ) == -1 ) psz_art = NULL; free( psz_src ); } FILE *f = vlc_fopen( psz_art, "r" ); if( f == NULL ) { Callback404( &p_args->file, (char**)pp_data, pi_data ); free( psz_art ); return VLC_SUCCESS; } free( psz_art ); char *p_data = NULL; int i_data; FileLoad( f, &p_data, &i_data ); fclose( f ); char *psz_ext = strrchr( psz_art, '.' ); if( psz_ext ) psz_ext++; #define HEADER "Content-Type: image/%s\n" \ "Content-Length: %d\n" \ "\n" char *psz_header; int i_header_size = asprintf( &psz_header, HEADER, psz_ext, i_data ); #undef HEADER if( likely(i_header_size != -1) ) { *pp_data = malloc( i_header_size + i_data ); if( likely(*pp_data != NULL) ) { *pi_data = i_header_size + i_data; memcpy( *pp_data, psz_header, i_header_size ); memcpy( *pp_data+i_header_size, p_data, i_data ); } free( psz_header ); } free( p_data ); return VLC_SUCCESS; }