📄 rss.c
字号:
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 + -