int Export_M3U8( vlc_object_t *p_this ) { playlist_export_t *p_export = (playlist_export_t *)p_this; msg_Dbg( p_export, "saving using M3U8 format"); DoChildren( p_export, p_export->p_root, fprintf ); return VLC_SUCCESS; }
/** * Recursiveyy follow the playlist * @param p_playlist: the playlist * @param p_export: the export structure * @param p_root: the current node */ static void DoChildren( playlist_t *p_playlist, playlist_export_t *p_export, playlist_item_t *p_root ) { /* Go through the playlist and add items */ for( int i = 0; i < p_root->i_children ; i++) { playlist_item_t *p_current = p_root->pp_children[i]; assert( p_current ); if( p_current->i_flags & PLAYLIST_SAVE_FLAG ) continue; if( p_current->i_children >= 0 ) { DoChildren( p_playlist, p_export, p_current ); continue; } char* psz_name = NULL; char *psz_tmp = input_item_GetName( p_current->p_input ); if( psz_tmp ) psz_name = convert_xml_special_chars( psz_tmp ); free( psz_tmp ); if( psz_name ) { char* psz_artist = NULL; psz_tmp = input_item_GetArtist( p_current->p_input ); if( psz_tmp ) psz_artist = convert_xml_special_chars( psz_tmp ); free( psz_tmp ); mtime_t i_duration = input_item_GetDuration( p_current->p_input ); int min = ( i_duration / 1000000 ) / 60; int sec = ( i_duration / 1000000 ) - min * 60; // Print the artist if we have one if( psz_artist && *psz_artist ) fprintf( p_export->p_file, " <li>%s - %s (%02d:%02d)</li>\n", psz_artist, psz_name, min, sec ); else fprintf( p_export->p_file, " <li>%s (%2d:%2d)</li>\n", psz_name, min, sec ); free( psz_artist ); } free( psz_name ); } }
/** * Export the playlist as an HTML page * @param p_this: the playlist * @return VLC_SUCCESS if everything goes fine */ int Export_HTML( vlc_object_t *p_this ) { playlist_t *p_playlist = (playlist_t*)p_this; playlist_export_t *p_export = (playlist_export_t *)p_playlist->p_private; msg_Dbg( p_playlist, "saving using HTML format" ); /* Write header */ fprintf( p_export->p_file, "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n" "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">\n" "<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\">\n" "<head>\n" " <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n" " <meta name=\"Generator\" content=\"VLC media player\" />\n" " <meta name=\"Author\" content=\"[email protected] (VideoLAN team)\" />\n" " <title>VLC generated playlist</title>\n" " <style type=\"text/css\">\n" " body {\n" " background-color: #E4F3FF;\n" " font-family: sans-serif, Helvetica, Arial;\n" " font-size: 13px;\n" " }\n" " h1 {\n" " color: #2D58AE;\n" " font-size: 25px;\n" " }\n" " hr {\n" " color: #555555;\n" " }\n" " </style>\n" "</head>\n\n" "<body>\n" " <h1>Playlist</h1>\n" " <hr />\n" " <ol>\n" ); // Call the playlist constructor DoChildren( p_playlist, p_export, p_export->p_root ); // Print the footer fprintf( p_export->p_file, " </ol>\n" " <hr />\n" "</body>\n" "</html>" ); return VLC_SUCCESS; }
/** * Recursively follow the playlist * @param p_export: the export structure * @param p_root: the current node */ static void DoChildren( playlist_export_t *p_export, playlist_item_t *p_root ) { /* Go through the playlist and add items */ for( int i = 0; i < p_root->i_children ; i++) { playlist_item_t *p_current = p_root->pp_children[i]; assert( p_current ); if( p_current->i_children >= 0 ) { DoChildren( p_export, p_current ); continue; } char* psz_name = NULL; char *psz_tmp = input_item_GetName( p_current->p_input ); if( psz_tmp ) psz_name = vlc_xml_encode( psz_tmp ); free( psz_tmp ); if( psz_name ) { char* psz_artist = NULL; psz_tmp = input_item_GetArtist( p_current->p_input ); if( psz_tmp ) psz_artist = vlc_xml_encode( psz_tmp ); free( psz_tmp ); vlc_tick_t i_duration = input_item_GetDuration( p_current->p_input ); int min = SEC_FROM_VLC_TICK( i_duration ) / 60; int sec = SEC_FROM_VLC_TICK( i_duration ) - min * 60; // Print the artist if we have one if( psz_artist && *psz_artist ) fprintf( p_export->p_file, " <li>%s - %s (%02d:%02d)</li>\n", psz_artist, psz_name, min, sec ); else fprintf( p_export->p_file, " <li>%s (%2d:%2d)</li>\n", psz_name, min, sec ); free( psz_artist ); } free( psz_name ); } }
/***************************************************************************** * Export_M3U: main export function *****************************************************************************/ static void DoChildren( playlist_export_t *p_export, playlist_item_t *p_root, int (*pf_fprintf) (FILE *, const char *, ...) ) { /* Write header */ fputs( "#EXTM3U\n", p_export->p_file ); /* Go through the playlist and add items */ for( int i = 0; i< p_root->i_children ; i++) { playlist_item_t *p_current = p_root->pp_children[i]; assert( p_current ); if( p_current->i_flags & PLAYLIST_SAVE_FLAG ) continue; if( p_current->i_children >= 0 ) { DoChildren( p_export, p_current, pf_fprintf ); continue; } /* General info */ char *psz_uri = input_item_GetURI( p_current->p_input ); assert( psz_uri ); char *psz_name = input_item_GetName( p_current->p_input ); if( psz_name && strcmp( psz_uri, psz_name ) ) { char *psz_artist = input_item_GetArtist( p_current->p_input ); if( psz_artist == NULL ) psz_artist = strdup( "" ); mtime_t i_duration = input_item_GetDuration( p_current->p_input ); if( psz_artist && *psz_artist ) { /* write EXTINF with artist */ pf_fprintf( p_export->p_file, "#EXTINF:%"PRIu64",%s - %s\n", i_duration / CLOCK_FREQ, psz_artist, psz_name); } else { /* write EXTINF without artist */ pf_fprintf( p_export->p_file, "#EXTINF:%"PRIu64",%s\n", i_duration / CLOCK_FREQ, psz_name); } free( psz_artist ); } free( psz_name ); /* VLC specific options */ vlc_mutex_lock( &p_current->p_input->lock ); for( int j = 0; j < p_current->p_input->i_options; j++ ) { pf_fprintf( p_export->p_file, "#EXTVLCOPT:%s\n", p_current->p_input->ppsz_options[j][0] == ':' ? p_current->p_input->ppsz_options[j] + 1 : p_current->p_input->ppsz_options[j] ); } vlc_mutex_unlock( &p_current->p_input->lock ); /* Stupid third party players don't understand file: URIs. */ char *psz_path = make_path( psz_uri ); if( psz_path != NULL ) { free( psz_uri ); psz_uri = psz_path; } fprintf( p_export->p_file, "%s\n", psz_uri ); free( psz_uri ); } }