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;
}
Пример #2
0
/**
 * 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;
}