play_tree_t* play_tree_parser_get_play_tree(play_tree_parser_t* p, int forced) { play_tree_t* tree = NULL; #ifdef MP_DEBUG assert(p != NULL); #endif while(play_tree_parser_get_line(p) != NULL) { play_tree_parser_reset(p); tree = parse_asx(p); if(tree) break; play_tree_parser_reset(p); tree = parse_pls(p); if(tree) break; play_tree_parser_reset(p); tree = parse_m3u(p); if(tree) break; play_tree_parser_reset(p); tree = parse_ref_ini(p); if(tree) break; play_tree_parser_reset(p); tree = parse_smil(p); if(tree) break; play_tree_parser_reset(p); // Here come the others formats ( textplain must stay the last one ) if (forced) { tree = parse_textplain(p); if(tree) break; } break; } if(tree) mp_msg(MSGT_PLAYTREE,MSGL_V,"Playlist successfully parsed\n"); else mp_msg(MSGT_PLAYTREE,((forced==1)?MSGL_ERR:MSGL_V),"Error while parsing playlist\n"); if(tree) tree = play_tree_cleanup(tree); if(!tree) mp_msg(MSGT_PLAYTREE,((forced==1)?MSGL_WARN:MSGL_V),"Warning: empty playlist\n"); return tree; }
/** * playlist_parser_scan_uri * @parser: A #PlaylistParser * @uri: An URI * @error: Location where to store a #GError if an error occurs. * * Parse @uri. * * Return value: TRUE on success, FALSE if an error occured in which case * @error is set as well. **/ gboolean playlist_parser_parse (PlaylistParser *parser, const char *uri, GError **error) { char *ext, *filename, *dirname; GIOChannel *channel; g_return_val_if_fail (IS_PLAYLIST_PARSER (parser), FALSE); g_return_val_if_fail (uri != NULL, FALSE); /** * Does @uri point to a M3U file? **/ ext = strrchr (uri, '.'); if (!ext || g_ascii_strcasecmp (ext, ".m3u")) { g_set_error (error, PLAYLIST_PARSER_ERROR, PLAYLIST_PARSER_ERROR_UNKNOWN_TYPE, "Unknown type"); return FALSE; } /** * Does @uri point to a local file? **/ if (g_ascii_strncasecmp (uri, "file:", 5)) { g_set_error (error, PLAYLIST_PARSER_ERROR, PLAYLIST_PARSER_ERROR_UNSUPPORTED_SCHEME, "Unsupported scheme in URI '%s'", uri); return FALSE; } /** * Convert @uri to a filename. **/ filename = g_filename_from_uri (uri, NULL, error); if (!filename) return FALSE; /** * Open @filename for reading. **/ channel = g_io_channel_new_file (filename, "r", error); if (!channel) { g_free (filename); return FALSE; } /** * Pass channel to parser. **/ dirname = g_path_get_dirname (filename); parse_m3u (parser, channel, dirname); g_free (dirname); /** * Cleanup. **/ g_io_channel_unref (channel); g_free (filename); return TRUE; }