⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rss.c

📁 VLC Player Source Code
💻 C
📖 第 1 页 / 共 3 页
字号:
    xml_reader_t *p_xml_reader = NULL;    char *psz_eltname = NULL;    char *psz_eltvalue = NULL;    char *psz_feed = NULL;    char *psz_buffer = NULL;    char *psz_buffer_2 = NULL;    int i_feed;    int i_item;    bool b_is_item;    bool b_is_image;    int i_int;    FreeRSS( p_filter );    p_sys->i_feeds = 1;    i_int = 0;    while( p_sys->psz_urls[i_int] != 0 )        if( p_sys->psz_urls[i_int++] == '|' )            p_sys->i_feeds++;    p_sys->p_feeds = (struct rss_feed_t *)malloc( p_sys->i_feeds                                * sizeof( struct rss_feed_t ) );    p_xml = xml_Create( p_filter );    if( !p_xml )    {        msg_Err( p_filter, "Failed to open XML parser" );        return 1;    }    psz_buffer = strdup( p_sys->psz_urls );    psz_buffer_2 = psz_buffer; /* keep track so we can free it */    for( i_feed = 0; i_feed < p_sys->i_feeds; i_feed++ )    {        struct rss_feed_t *p_feed = p_sys->p_feeds+i_feed;        if( psz_buffer == NULL ) break;        if( psz_buffer[0] == 0 ) psz_buffer++;        psz_feed = psz_buffer;        psz_buffer = strchr( psz_buffer, '|' );        if( psz_buffer != NULL ) psz_buffer[0] = 0;        p_feed->psz_title = NULL;        p_feed->psz_description = NULL;        p_feed->psz_link = NULL;        p_feed->psz_image = NULL;        p_feed->p_pic = NULL;        p_feed->i_items = 0;        p_feed->p_items = NULL;        msg_Dbg( p_filter, "opening %s RSS/Atom feed ...", psz_feed );        p_stream = stream_UrlNew( p_filter, psz_feed );        if( !p_stream )        {            msg_Err( p_filter, "Failed to open %s for reading", psz_feed );            return 1;        }        p_xml_reader = xml_ReaderCreate( p_xml, p_stream );        if( !p_xml_reader )        {            msg_Err( p_filter, "Failed to open %s for parsing", psz_feed );            return 1;        }        i_item = 0;        b_is_item = false;        b_is_image = false;        while( xml_ReaderRead( p_xml_reader ) == 1 )        {            switch( xml_ReaderNodeType( p_xml_reader ) )            {                // Error                case -1:                    return 1;                case XML_READER_STARTELEM:                    free( psz_eltname );                    psz_eltname = xml_ReaderName( p_xml_reader );                    if( !psz_eltname )                    {                        return 1;                    }#                   ifdef RSS_DEBUG                    msg_Dbg( p_filter, "element name: %s", psz_eltname );#                   endif                    if( !strcmp( psz_eltname, "item" ) /* rss */                     || !strcmp( psz_eltname, "entry" ) ) /* atom */                    {                        b_is_item = true;                        p_feed->i_items++;                        p_feed->p_items = (struct rss_item_t *)realloc( p_feed->p_items, p_feed->i_items * sizeof( struct rss_item_t ) );                        p_feed->p_items[p_feed->i_items-1].psz_title = NULL;                        p_feed->p_items[p_feed->i_items-1].psz_description                                                                     = NULL;                        p_feed->p_items[p_feed->i_items-1].psz_link = NULL;                    }                    else if( !strcmp( psz_eltname, "image" ) ) /* rss */                    {                        b_is_image = true;                    }                    else if( !strcmp( psz_eltname, "link" ) ) /* atom */                    {                        char *psz_href = NULL;                        char *psz_rel = NULL;                        while( xml_ReaderNextAttr( p_xml_reader )                               == VLC_SUCCESS )                        {                            char *psz_name = xml_ReaderName( p_xml_reader );                            char *psz_value = xml_ReaderValue( p_xml_reader );                            if( !strcmp( psz_name, "rel" ) )                            {                                if( psz_rel )                                {                                    msg_Dbg( p_filter, "\"rel\" attribute of link atom duplicated (last value: %s)", psz_value );                                    free( psz_rel );                                }                                psz_rel = psz_value;                            }                            else if( !strcmp( psz_name, "href" ) )                            {                                if( psz_href )                                {                                    msg_Dbg( p_filter, "\"href\" attribute of link atom duplicated (last value: %s)", psz_href );                                    free( psz_href );                                }                                psz_href = psz_value;                            }                            else                            {                                free( psz_value );                            }                            free( psz_name );                        }                        if( psz_rel && psz_href )                        {                            if( !strcmp( psz_rel, "alternate" )                                && b_is_item == false                                && b_is_image == false                                && !p_feed->psz_link )                            {                                p_feed->psz_link = psz_href;                            }                            /* this isn't in the rfc but i found some ... */                            else if( ( !strcmp( psz_rel, "logo" )                                    || !strcmp( psz_rel, "icon" ) )                                    && b_is_item == false                                    && b_is_image == false                                    && !p_feed->psz_image )                            {                                p_feed->psz_image = psz_href;                            }                            else                            {                                free( psz_href );                            }                        }                        else                        {                            free( psz_href );                        }                        free( psz_rel );                    }                    break;                case XML_READER_ENDELEM:                    free( psz_eltname );                    psz_eltname = NULL;                    psz_eltname = xml_ReaderName( p_xml_reader );                    if( !psz_eltname )                    {                        return 1;                    }#                   ifdef RSS_DEBUG                    msg_Dbg( p_filter, "element end : %s", psz_eltname );#                   endif                    if( !strcmp( psz_eltname, "item" ) /* rss */                     || !strcmp( psz_eltname, "entry" ) ) /* atom */                    {                        b_is_item = false;                        i_item++;                    }                    else if( !strcmp( psz_eltname, "image" ) ) /* rss */                    {                        b_is_image = false;                    }                    free( psz_eltname );                    psz_eltname = NULL;                    break;                case XML_READER_TEXT:                    if( !psz_eltname ) break;                    psz_eltvalue = xml_ReaderValue( p_xml_reader );                    if( !psz_eltvalue )                    {                        return 1;                    }                    else                    {                        char *psz_clean;                        psz_clean = removeWhiteChars( psz_eltvalue );                        free( psz_eltvalue ); psz_eltvalue = psz_clean;                    }#                   ifdef RSS_DEBUG                    msg_Dbg( p_filter, "  text : <%s>", psz_eltvalue );#                   endif                    if( b_is_item == true )                    {                        struct rss_item_t *p_item;                        p_item = p_feed->p_items+i_item;                        if( !strcmp( psz_eltname, "title" ) /* rss/atom */                            && !p_item->psz_title )                        {                            p_item->psz_title = psz_eltvalue;                        }                        else if( !strcmp( psz_eltname, "link" ) /* rss */                                 && !p_item->psz_link )                        {                            p_item->psz_link = psz_eltvalue;                        }                        else if((!strcmp( psz_eltname, "description" ) /* rss */                              || !strcmp( psz_eltname, "summary" ) ) /* atom */                              && !p_item->psz_description )                        {                            p_item->psz_description = psz_eltvalue;                        }                        else                        {                            free( psz_eltvalue );                            psz_eltvalue = NULL;                        }                    }                    else if( b_is_image == true )                    {                        if( !strcmp( psz_eltname, "url" ) /* rss */                            && !p_feed->psz_image )                        {                            p_feed->psz_image = psz_eltvalue;                        }                        else                        {                            free( psz_eltvalue );                            psz_eltvalue = NULL;                        }                    }                    else                    {                        if( !strcmp( psz_eltname, "title" ) /* rss/atom */                            && !p_feed->psz_title )                        {                            p_feed->psz_title = psz_eltvalue;                        }                        else if( !strcmp( psz_eltname, "link" ) /* rss */                                 && !p_feed->psz_link )                        {                            p_feed->psz_link = psz_eltvalue;                        }                        else if((!strcmp( psz_eltname, "description" ) /* rss */                              || !strcmp( psz_eltname, "subtitle" ) ) /* atom */                              && !p_feed->psz_description )                        {                            p_feed->psz_description = psz_eltvalue;                        }                        else if( ( !strcmp( psz_eltname, "logo" ) /* atom */                              || !strcmp( psz_eltname, "icon" ) ) /* atom */                              && !p_feed->psz_image )                        {                            p_feed->psz_image = psz_eltvalue;                        }                        else                        {                            free( psz_eltvalue );                            psz_eltvalue = NULL;                        }                    }                    break;            }        }        if( p_sys->b_images == true            && p_feed->psz_image && !p_feed->p_pic )        {            p_feed->p_pic = LoadImage( p_filter, p_feed->psz_image );        }        if( p_xml_reader && p_xml ) xml_ReaderDelete( p_xml, p_xml_reader );        if( p_stream ) stream_Delete( p_stream );        msg_Dbg( p_filter, "done with %s RSS/Atom feed", psz_feed );    }    free( psz_buffer_2 );    if( p_xml ) xml_Delete( p_xml );    return 0;}/**************************************************************************** * FreeRSS ***************************************************************************/static void FreeRSS( filter_t *p_filter){    filter_sys_t *p_sys = p_filter->p_sys;    struct rss_item_t *p_item;    struct rss_feed_t *p_feed;    int i_feed;    int i_item;    for( i_feed = 0; i_feed < p_sys->i_feeds; i_feed++ )    {        p_feed = p_sys->p_feeds+i_feed;        for( i_item = 0; i_item < p_feed->i_items; i_item++ )        {            p_item = p_feed->p_items+i_item;            free( p_item->psz_title );            free( p_item->psz_link );            free( p_item->psz_description );        }        free( p_feed->p_items );        free( p_feed->psz_title);        free( p_feed->psz_link );        free( p_feed->psz_description );        free( p_feed->psz_image );        if( p_feed->p_pic != NULL )            picture_Release( p_feed->p_pic );    }    free( p_sys->p_feeds );    p_sys->i_feeds = 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -