Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • videolan/vlc
  • chouquette/vlc
  • bakiewicz.marek122/vlc
  • devnexen/vlc
  • rohanrajpal/vlc
  • blurrrb/vlc
  • gsoc/gsoc2019/darkapex/vlc
  • b1ue/vlc
  • fkuehne/vlc
  • magsoft/vlc
  • chub/vlc
  • cramiro9/vlc
  • robUx4/vlc
  • rom1v/vlc
  • akshayaky/vlc
  • tmk907/vlc
  • akymaster/vlc
  • govind.sharma/vlc
  • psilokos/vlc
  • xjbeta/vlc
  • jahan/vlc
  • 1480c1/vlc
  • amanchande/vlc
  • aaqib/vlc
  • rist/vlc
  • apol/vlc
  • mindfreeze/vlc
  • alexandre-janniaux/vlc
  • sandsmark/vlc
  • jagannatharjun/vlc
  • gsoc/gsoc2020/matiaslgonzalez/vlc
  • gsoc/gsoc2020/jagannatharjun/vlc
  • mstorsjo/vlc
  • gsoc/gsoc2020/vedenta/vlc
  • gsoc/gsoc2020/arnav-ishaan/vlc
  • gsoc/gsoc2020/andreduong/vlc
  • fuzun/vlc
  • gsoc/gsoc2020/vatsin/vlc
  • gsoc/gsoc2020/sagid/vlc
  • yaron/vlc
  • Phoenix/vlc
  • Garf/vlc
  • ePiratWorkarounds/vlc
  • tguillem/vlc
  • jnqnfe/vlc
  • mdc/vlc
  • Vedaa/vlc
  • rasa/vlc
  • quink/vlc
  • yealo/vlc
  • aleksey_ak/vlc
  • ePirat/vlc
  • ilya.yanok/vlc
  • asenat/vlc
  • m/vlc
  • bunjee/vlc
  • BLumia/vlc
  • sagudev/vlc
  • hamedmonji30/vlc
  • nullgemm/vlc
  • DivyamAhuja/vlc
  • thesamesam/vlc
  • dag7/vlc
  • snehil101/vlc
  • haasn/vlc
  • jbk/vlc
  • ValZapod/vlc
  • mfkl/vlc
  • WangChuan/vlc
  • core1024/vlc
  • GhostVaibhav/vlc
  • dfuhrmann/vlc
  • davide.prade/vlc
  • tmatth/vlc
  • Courmisch/vlc
  • zouya/vlc
  • hpi/vlc
  • EwoutH/vlc
  • aleung27/vlc
  • hengwu0/vlc
  • saladin/vlc
  • ashuio/vlc
  • richselwood/vlc
  • verma16Ayush/vlc
  • chemicalflash/vlc
  • PoignardAzur/vlc
  • huangjieNT/vlc
  • Blake-Haydon/vlc
  • AnuthaDev/vlc
  • gsoc/gsoc2021/mpd/vlc
  • nicolas_lequec/vlc
  • sambassaly/vlc
  • thresh/vlc
  • bonniegong/vlc
  • myaashish/vlc
  • stavros.vagionitis/vlc
  • ileoo/vlc
  • louis-santucci/vlc
  • cchristiansen/vlc
  • sabyasachi07/vlc
  • AbduAmeen/vlc
  • ashishb0410/vlc
  • urbanhusky/vlc
  • davidepietrasanta/vlc
  • riksleutelstad/vlc
  • jeremyVignelles/vlc
  • komh/vlc
  • iamjithinjohn/vlc
  • JohannesKauffmann/vlc2
  • kunglao/vlc
  • natzberg/vlc
  • jill/vlc
  • cwendling/vlc
  • adufou/vlc
  • ErwanAirone/vlc
  • HasinduDilshan10/vlc
  • vagrantc/vlc
  • rafiv/macos-bigsur-icon
  • Aymeriic/vlc
  • saranshg20/vlc
  • metzlove24/vlc
  • linkfanel/vlc
  • Ds886/vlc
  • metehan-arslan/vlc
  • Skantes/vlc
  • kgsandundananjaya96/vlc
  • mitchcapper/vlc
  • advaitgupta/vlc
  • StefanBruens/vlc
  • ratajs/vlc
  • T.M.F.B.3761/vlc
  • m222059/vlc
  • casemerrick/vlc
  • joshuaword2alt/vlc
  • sjwaddy/vlc
  • dima/vlc
  • Ybalrid/vlc
  • umxprime/vlc
  • eschmidt/vlc
  • vannieuwenhuysenmichelle/vlc
  • badcf00d/vlc
  • wesinator/vlc
  • louis/vlc
  • xqq/vlc
  • EmperorYP7/vlc
  • NicoLiam/vlc
  • loveleen/vlc
  • rofferom/vlc
  • rbultje/vlc
  • TheUnamed/vlc
  • pratiksharma341/vlc
  • Saurab17/vlc
  • purist.coder/vlc
  • Shuicheng/vlc
  • mdrrubel292/vlc
  • silverbleu00/vlc
  • metif12/vlc
  • asher-m/vlc
  • jeffk/vlc
  • Brandonbr1/vlc
  • beautyyuyanli/vlc
  • rego21/vlc
  • muyangren907/vlc
  • collectionbylawrencejason/vlc
  • evelez/vlc
  • GSMgeeth/vlc
  • Oneric/vlc
  • TJ5/vlc
  • XuanTung95/vlc
  • darrenjenny21/vlc
  • Trenly/vlc
  • RockyTDR/vlc
  • mjakubowski/vlc
  • caprica/vlc
  • ForteFrankie/vlc
  • seannamiller19/vlc
  • junlon2006/vlc
  • kiwiren6666/vlc
  • iuseiphonexs/vlc
  • fenngtun/vlc
  • Rajdutt999/vlc
  • typx/vlc
  • leon.vitanos/vlc
  • robertogarci0938/vlc
  • gsoc/gsoc2022/luc65r/vlc-mpd
  • skeller/vlc
  • MCJack123/vlc
  • luc65r/vlc-mpd
  • popov895/vlc
  • claucambra/vlc
  • brad/vlc
  • matthewmurua88/vlc
  • Tomas8874/vlc
  • philenotfound/vlc
  • makita-do3/vlc
  • LZXCorp/vlc
  • mar0x/vlc
  • senojetkennedy0102/vlc
  • shaneb243/vlc
  • ahmadbader/vlc
  • rajduttcse26/vlc-audio-filters
  • Juniorzito8415/vlc
  • achernyakov/vlc
  • lucasjetgroup/vlc
  • pupdoggy666/vlc
  • gmde9363/vlc
  • alexnwayne/vlc
  • bahareebrahimi781/vlc
  • hamad633666/vlc
  • umghof3112/vlc
  • joe0199771874/vlc
  • Octocats66666666/vlc
  • jjm_223/vlc
  • btech10110.19/vlc
  • sunnykfc028/vlc-audio-filters
  • loic/vlc
  • nguyenminhducmx1/vlc
  • JanekKrueger/vlc
  • bstubbington2/vlc
  • rcombs/vlc
  • Ordissimo/vlc
  • king7532/vlc
  • noobsauce101/vlc
  • schong0525/vlc
  • myQwil/vlc
  • apisbg91/vlc
  • geeboy0101017/vlc
  • kim.faughey/vlc
  • nurupo/vlc
  • yyusea/vlc
  • 0711235879.khco/vlc
  • ialo/vlc
  • iloveyeye2/vlc
  • gdtdftdqtd/vlc
  • leandroconsiglio/vlc
  • AndyHTML2012/vlc
  • ncz/vlc
  • lucenticus/vlc
  • knr1931/vlc
  • kjoonlee/vlc
  • chandrakant100/vlc-qt
  • johge42/vlc
  • polter/vlc
  • hexchain/vlc
  • Tushwrld/vlc
  • mztea928/vlc
  • jbelloncastro/vlc
  • alvinhochun/vlc
  • ghostpiratecrow/vlc
  • ujjwaltwitx/vlc
  • alexsonarin06/vlc
  • adrianbon76/vlc
  • altsod/vlc
  • damien.lucas44/vlc
  • dmytrivtaisa/vlc
  • utk202/vlc
  • aaxhrj/vlc
  • thomas.hermes/vlc
  • structurenewworldorder/vlc
  • slomo/vlc
  • wantlamy/vlc
  • musc.o3cminc/vlc
  • thebarshablog/vlc
  • kerrick/vlc
  • kratos142518/vlc
  • leogps/vlc
  • vacantron/vlc
  • luna_koly/vlc
  • Ratio2/vlc
  • anuoshemohammad/vlc
  • apsun/vlc
  • aaa1115910/vlc
  • alimotmoyo/vlc
  • Ambossmann/vlc
  • Sam-LearnsToCode/vlc
  • Chilledheart/vlc
  • Labnann/vlc
  • ktcoooot1/vlc
  • mohit-marathe/vlc
  • johnddx/vlc
  • manstabuk/vlc
  • Omar-ahmed314/vlc
  • vineethkm/vlc
  • 9Enemi86/vlc
  • radoslav.m.panteleev/vlc
  • ashishami2002/vlc
  • Corbax/vlc
  • firnasahmed/vlc
  • pelayarmalam4/vlc
  • c0ff330k/vlc
  • shikhindahikar/vlc
  • l342723951/vlc
  • christianschwandner/vlc
  • douniwan5788/vlc
  • 7damian7/vlc
  • ferdnyc/vlc
  • f.ales1/vlc
  • pandagby/vlc
  • BaaBaa/vlc
  • jewe37/vlc
  • w00drow/vlc
  • russelltg/vlc
  • ironicallygod/vlc
  • soumyaDghosh/vlc
  • linzihao1999/vlc
  • deyayush6/vlc
  • mibi88/vlc
  • newabdallah10/vlc
  • jhorbincolombia/vlc
  • rimvihaqueshupto/vlc
  • andrewkhon98/vlc
  • fab78/vlc
  • lapaz17/vlc
  • amanna13/vlc
  • mdakram28/vlc
  • 07jw1980/vlc
  • sohamgupta/vlc
  • Eson-Jia1/vlc
  • Sumou/vlc
  • vikram-kangotra/vlc
  • chalice191/vlc
  • olivercalder/vlc
  • aaasg4001/vlc
  • zipdox/vlc
  • kwizart/vlc
  • Dragon-S/vlc
  • jdemeule/vlc
  • gabriel_lt/vlc
  • locutusofborg/vlc
  • sammirata/vlc-librist
  • another/vlc
  • Benjamin_Loison/vlc
  • ahmedmoselhi/vlc
  • petergaal/vlc
  • huynhsontung/vlc
  • dariusmihut/vlc
  • tvermaashutosh/vlc
  • buti/vlc
  • Niram7777/vlc
  • rohan-here/vlc
  • balaji-sivasakthi/vlc
  • rlindner81/vlc
  • Kakadus/vlc
  • djain/vlc
  • ABBurmeister/vlc
  • craighuggins/vlc
  • orbea/vlc
  • maxos/vlc
  • aakarshmj/vlc
  • kblaschke/vlc
  • ankitm/vlc
  • advait-0/vlc
  • mohak2003/vlc
  • yselkowitz/vlc
  • AZM999/vlc-azm
  • andrey.turkin/vlc
  • Disha-Baghel/vlc
  • nowrep/vlc
  • Apeng/vlc
  • Choucroute_melba/vlc
  • autra/vlc
  • eclipseo/vlc
  • fhuber/vlc
  • olafhering/vlc
  • sdasda7777/vlc
  • 1div0/vlc
  • skosnits/vlc-extended-playlist-support
  • dnicolson/vlc
  • Timshel/vlc
  • octopols/vlc
  • MangalK/vlc
  • nima64/vlc
  • misawai/vlc
  • Alexander-Wilms/vlc
  • Maxime2/vlc-fork-for-visualizer
  • ww/vlc
  • jeske/vlc
  • sgross-emlix/vlc
  • morenonatural/vlc
  • freakingLovesVLC/vlc
  • borisgolovnev/vlc
  • mpromonet/vlc
  • diogo.simao-marques/vlc
  • masstock/vlc
  • pratikpatel8982/vlc
  • hugok79/vlc
  • longervision/vlc
  • abhiudaysurya/vlc
  • rishabhgarg/vlc
  • tumic/vlc
  • cart/vlc
  • shubham442/vlc
  • Aditya692005/vlc
  • sammirata/vlc4
  • syrykh/vlc
  • Vvorcun/macos-new-icon
  • AyaanshC/vlc
  • nasso/vlc
  • Quark/vlc
  • sebastinas/vlc
  • rhstone/vlc
  • talregev/vlc
  • Managor/vlc
403 results
Show changes
Commits on Source (7)
......@@ -241,7 +241,7 @@ static int CreateEntry( input_item_node_t *p_node, const struct entry_meta_s *me
if( meta->psz_tvgid )
input_item_AddInfo( p_input, "XMLTV", "tvg-id", "%s", meta->psz_tvgid );
if( meta->psz_grouptitle )
input_item_SetAlbum( p_input, meta->psz_grouptitle );
input_item_SetPublisher( p_input, meta->psz_grouptitle );
input_item_node_AppendItem( p_node, p_input );
input_item_Release( p_input );
......@@ -252,6 +252,7 @@ static int CreateEntry( input_item_node_t *p_node, const struct entry_meta_s *me
static int ReadDir( stream_t *p_demux, input_item_node_t *p_subitems )
{
char *psz_line;
char *psz_group = NULL; /* group is toggling tag */
struct entry_meta_s meta;
entry_meta_Init( &meta );
char * (*pf_dup) (const char *) = p_demux->p_sys;
......@@ -283,6 +284,15 @@ static int ReadDir( stream_t *p_demux, input_item_node_t *p_subitems )
meta.i_duration = INPUT_DURATION_INDEFINITE;
parseEXTINF( psz_parse, pf_dup, &meta );
}
else if( !strncasecmp( psz_parse, "EXTGRP:", sizeof("EXTGRP:") -1 ) )
{
psz_parse += sizeof("EXTGRP:") - 1;
if( *psz_parse )
{
free( psz_group );
psz_group = pf_dup( psz_parse );
}
}
else if( !strncasecmp( psz_parse, "EXTVLCOPT:",
sizeof("EXTVLCOPT:") -1 ) )
{
......@@ -310,7 +320,7 @@ static int ReadDir( stream_t *p_demux, input_item_node_t *p_subitems )
sizeof( "PLAYLIST:" ) - 1 ) )
{
psz_parse += sizeof( "PLAYLIST:" ) - 1;
input_item_SetTitle( p_demux->p_input_item, psz_parse );
input_item_SetTitle( p_subitems->p_item, psz_parse );
}
}
else if( !strncasecmp( psz_parse, "RTSPtext", sizeof("RTSPtext") -1 ) )
......@@ -323,6 +333,8 @@ static int ReadDir( stream_t *p_demux, input_item_node_t *p_subitems )
if( !meta.psz_name && psz_parse )
/* Use filename as name for relative entries */
meta.psz_name = strdup( psz_parse );
if( psz_group && !meta.psz_grouptitle )
meta.psz_grouptitle = strdup( psz_group );
meta.psz_mrl = ProcessMRL( psz_parse, p_demux->psz_url );
free( psz_parse );
......@@ -343,6 +355,7 @@ static int ReadDir( stream_t *p_demux, input_item_node_t *p_subitems )
/* Cleanup state */
entry_meta_Clean( &meta );
entry_meta_Init( &meta );
free( psz_group );
}
}
return VLC_SUCCESS; /* Needed for correct operation of go back */
......@@ -399,47 +412,50 @@ static void parseEXTINFIptvDiots( char *psz_string,
char *(*pf_dup)(const char *),
struct entry_meta_s *meta )
{
char **ppsz_meta = NULL;
if( strncmp( psz_string, "tvg-", 4 ) &&
strncmp( psz_string, "group-", 6 ) )
return;
char *psz_sep = strchr( psz_string + 4, '=' );
if( unlikely(!psz_sep) )
char *psz = strchr( psz_string, '=' );
if( unlikely(!psz) )
return;
size_t i_keylen = psz_sep - psz_string;
if( !strncmp( psz_string + 4, "logo", i_keylen - 4 ) )
ppsz_meta = &meta->psz_album_art;
else if( !strncmp( psz_string + 4, "name", i_keylen - 4 ) )
ppsz_meta = &meta->psz_name;
else if( !strncmp( psz_string + 4, "language", i_keylen - 4 ) )
ppsz_meta = &meta->psz_language;
else if( !strncmp( psz_string + 4, "id", i_keylen - 4 ) )
ppsz_meta = &meta->psz_tvgid;
else if( !strncmp( psz_string + 6, "title", i_keylen - 4 ) )
char **ppsz_meta = NULL;
*psz = 0;
if( !strncasecmp( psz_string, "tvg-", 4 ) )
{
if( !strcasecmp( psz_string + 4, "logo" ) )
ppsz_meta = &meta->psz_album_art;
else if( !strcasecmp( psz_string + 4, "name" ) )
ppsz_meta = &meta->psz_name;
else if( !strcasecmp( psz_string + 4, "language" ) )
ppsz_meta = &meta->psz_language;
else if( !strcasecmp( psz_string + 4, "id" ) )
ppsz_meta = &meta->psz_tvgid;
}
else if( !strcasecmp( psz_string, "group-title" ) )
{
ppsz_meta = &meta->psz_grouptitle;
}
*psz = '=';
if( !ppsz_meta || *ppsz_meta /* no overwrite */ )
return;
char *psz_value = psz_sep + 1;
size_t i_valuelen = strlen( psz_value );
size_t i_valuelen = strlen( ++psz );
if( unlikely(i_valuelen == 0) )
return;
bool b_escaped = (*psz_value == '"');
bool b_escaped = (*psz == '"');
if( i_valuelen > 2 && b_escaped )
{
psz_value[ i_valuelen - 1 ] = 0;
*ppsz_meta = pf_dup( psz_value + 1 );
psz[ i_valuelen - 1 ] = 0;
*ppsz_meta = pf_dup( psz + 1 );
}
else
*ppsz_meta = pf_dup( psz_value );
*ppsz_meta = pf_dup( psz );
}
static void parseEXTINFIptvDiotsInDuration( char *psz_string,
char *(*pf_dup)(const char *),
struct entry_meta_s *meta )
struct entry_meta_s *meta,
char **ppsz_end )
{
for( ;; )
{
......@@ -456,6 +472,18 @@ static void parseEXTINFIptvDiotsInDuration( char *psz_string,
{
switch( *psz_string )
{
case ',': /* Last comma for title */
if(!b_escaped)
{
if(b_value)
{
*psz_string = '\0';
parseEXTINFIptvDiots( psz_start, pf_dup, meta );
}
*ppsz_end = psz_string + 1;
return;
}
break;
case '"':
if(!b_escaped && b_value)
return;
......@@ -502,24 +530,41 @@ static void parseEXTINF( char *psz_string,
while( psz_string < end && ( *psz_string == '\t' || *psz_string == ' ' ) )
psz_string++;
/* duration: read to next comma */
char *psz_comma = strchr( psz_string, ',' );
if( psz_comma )
{
*psz_comma = '\0'; /* Split strings */
if( ++psz_comma < end )
parseEXTINFTitle( psz_comma, pf_dup, meta );
}
/* Parse duration */
char *psz_end = NULL;
long i_parsed_duration = strtol( psz_string, &psz_end, 10 );
float i_parsed_duration = us_strtof( psz_string, &psz_end );
if( i_parsed_duration > 0 )
meta->i_duration = vlc_tick_from_sec( i_parsed_duration );
meta->i_duration = vlc_tick_from_sec( (double)i_parsed_duration );
/* skip to first unmatched */
if( psz_end )
psz_string = psz_end;
/* skip whitespaces */
while( psz_string < end && ( *psz_string == '\t' || *psz_string == ' ' ) )
psz_string++;
if( psz_string == end )
return;
if( psz_end && psz_end != psz_string && ( *psz_end == '\t' || *psz_end == ' ' ) )
/* EXTINF:1,title*/
/* EXTINF: -123.12 ,title*/
if( *psz_string == ',' )
{
parseEXTINFIptvDiotsInDuration( psz_end, pf_dup, meta );
if( ++psz_string < end )
parseEXTINFTitle( psz_string, pf_dup, meta );
}
/* EXTINF: -1 tvg-foo="val" tvg-foo2="val",title */
/* EXTINF: -1 tvg-foo="val,val2" ,title */
else if( *psz_string >= 'A' && *psz_string <= 'z' )
{
psz_end = NULL;
parseEXTINFIptvDiotsInDuration( psz_string, pf_dup, meta, &psz_end );
if( psz_end && *psz_end ) /* returns past last comma */
{
free(meta->psz_name);
meta->psz_name = pf_dup( psz_end );
}
}
}
......@@ -41,6 +41,7 @@ check_PROGRAMS = \
test_modules_keystore \
test_modules_demux_timestamps_filter \
test_modules_demux_ts_pes \
test_modules_playlist_m3u \
$(NULL)
if ENABLE_SOUT
......@@ -151,6 +152,8 @@ test_modules_demux_ts_pes_LDADD = $(LIBVLCCORE) $(LIBVLC)
test_modules_demux_ts_pes_SOURCES = modules/demux/ts_pes.c \
../modules/demux/mpeg/ts_pes.c \
../modules/demux/mpeg/ts_pes.h
test_modules_playlist_m3u_SOURCES = modules/demux/playlist/m3u.c
test_modules_playlist_m3u_LDADD = $(LIBVLCCORE) $(LIBVLC)
checkall:
......
/*****************************************************************************
* m3u.c: M3U unit testing
*****************************************************************************
* Copyright (C) 2021 VideoLabs, VideoLAN and VLC Authors
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#include <vlc/vlc.h>
#include "../../../../lib/libvlc_internal.h"
#include "../../../libvlc/test.h"
#include <vlc_common.h>
#include <vlc_modules.h>
#include <vlc_demux.h>
#include <vlc_meta.h>
#include <vlc_input_item.h>
#define BAILOUT(run) { fprintf(stderr, "failed %s line %d\n", run, __LINE__); \
return 1; }
#define EXPECT(foo) if(!(foo)) BAILOUT(run)
#define NOPFIL(n) "bar"#n
#define NOPURI(n) INPUT_ITEM_URI_NOP "/" NOPFIL(n)
static int runtest(const char *run,
libvlc_instance_t *vlc,
const char *data, size_t datasz,
int(*checkfunc)(const char *, const input_item_node_t *))
{
stream_t *s = vlc_stream_MemoryNew(vlc->p_libvlc_int, (uint8_t *)data, datasz, true);
if(!s)
BAILOUT(run);
demux_t *pl = demux_New(VLC_OBJECT(vlc->p_libvlc_int), "m3u", INPUT_ITEM_URI_NOP, s, NULL);
if(!pl || !pl->pf_readdir)
{
vlc_stream_Delete(s);
BAILOUT(run);
}
int ret = 0;
input_item_t *p_item = input_item_New(NULL, NULL);
if(p_item)
{
input_item_node_t *p_node = input_item_node_Create(p_item);
if(p_node)
{
pl->pf_readdir(pl, p_node);
ret = checkfunc(run, p_node);
input_item_node_Delete(p_node);
}
else
{
ret = 1;
}
input_item_Release(p_item);
}
else
{
ret = 1;
}
demux_Delete(pl);
return ret;
}
const char m3uplaylist0[] =
"#EXTM3U\n"
"#JUNK\n"
NOPFIL(0) "\n"
NOPURI(1) "\n";
static int check0(const char *run, const input_item_node_t *p_node)
{
EXPECT(p_node->i_children == 2);
const input_item_t *p_item = p_node->pp_children[0]->p_item;
EXPECT(p_item->psz_name && p_item->psz_uri);
EXPECT(!strcmp(NOPURI(0), p_item->psz_uri));
EXPECT(!strcmp(NOPFIL(0), p_item->psz_name));
EXPECT(p_item->i_duration == INPUT_DURATION_INDEFINITE);
p_item = p_node->pp_children[1]->p_item;
EXPECT(p_item->psz_name && p_item->psz_uri);
EXPECT(!strcmp(p_item->psz_name, p_item->psz_uri));
EXPECT(!strcmp(NOPURI(1), p_item->psz_name));
return 0;
}
const char m3uplaylist1[] =
"#EXTM3U\n"
"#EXTINF: 1\n"
NOPFIL(0) "\n"
"#EXTINF: 1.11\n"
NOPURI(1) "\n"
"#EXTINF: -2,\n"
"#JUNK:foo\n"
NOPURI(2) "\n"
"#EXTINF: 3,artist3 - name3\n"
NOPURI(3) "\n"
"#EXTINF: 4,,name4\n"
NOPURI(4) "\n"
"#EXTINF: 5,artist5,name5\n"
NOPURI(5) "\n";
static int check1(const char *run, const input_item_node_t *p_node)
{
EXPECT(p_node->i_children == 6);
const input_item_t *p_item = p_node->pp_children[0]->p_item;
EXPECT(p_item->psz_name && p_item->psz_uri);
EXPECT(!strcmp(NOPFIL(0), p_item->psz_name));
EXPECT(p_item->i_duration == vlc_tick_from_sec(1));
p_item = p_node->pp_children[1]->p_item;
EXPECT(p_item->psz_name && p_item->psz_uri);
EXPECT(!strcmp(NOPURI(1), p_item->psz_name));
EXPECT(p_item->i_duration == vlc_tick_from_sec(1.11));
p_item = p_node->pp_children[2]->p_item;
EXPECT(p_item->psz_name && p_item->psz_uri);
EXPECT(!strcmp(NOPURI(2), p_item->psz_uri));
EXPECT(!strcmp(p_item->psz_name, p_item->psz_uri));
EXPECT(p_item->i_duration == INPUT_DURATION_INDEFINITE);
p_item = p_node->pp_children[3]->p_item;
EXPECT(p_item->psz_name && p_item->psz_uri);
EXPECT(!strcmp(NOPURI(3), p_item->psz_uri));
EXPECT(!strcmp("name3", p_item->psz_name));
const char *p = vlc_meta_Get(p_item->p_meta, vlc_meta_Artist);
EXPECT(p && !strcmp("artist3", p));
p_item = p_node->pp_children[4]->p_item;
EXPECT(p_item->psz_name && p_item->psz_uri);
EXPECT(!strcmp("name4", p_item->psz_name));
EXPECT(vlc_meta_Get(p_item->p_meta, vlc_meta_Artist) == NULL);
p_item = p_node->pp_children[5]->p_item;
EXPECT(p_item->psz_name && p_item->psz_uri);
EXPECT(!strcmp("name5", p_item->psz_name));
p = vlc_meta_Get(p_item->p_meta, vlc_meta_Artist);
EXPECT(p && !strcmp("artist5", p));
return 0;
}
const char m3uplaylist2[] =
"#EXTM3U\n"
"#PLAYLIST:playlist0\n"
"#EXTINF:-1 tvg-id=\"id0\" tvg-logo=\"logo0\" group-title=\"group0\",name0\n"
NOPURI(0)"\n"
"#EXTGRP:group1\n"
"#EXTINF:-1,name1\n"
NOPURI(1)"\n"
"#EXTINF:-1,name2\n"
NOPURI(2)"\n";
static int check2(const char *run, const input_item_node_t *p_node)
{
EXPECT(p_node->i_children == 3);
const char *p = vlc_meta_Get(p_node->p_item->p_meta, vlc_meta_Title);
EXPECT(p && !strcmp(p, "playlist0"));
const input_item_t *p_item = p_node->pp_children[0]->p_item;
EXPECT(p_item->psz_name && p_item->psz_uri);
EXPECT(!strcmp(NOPURI(0), p_item->psz_uri));
EXPECT(!strcmp("name0", p_item->psz_name));
p = vlc_meta_Get(p_item->p_meta, vlc_meta_Publisher);
EXPECT(p && !strcmp("group0", p));
p = vlc_meta_Get(p_item->p_meta, vlc_meta_ArtworkURL);
p_item = p_node->pp_children[1]->p_item;
EXPECT(p_item->psz_name && p_item->psz_uri);
EXPECT(!strcmp(NOPURI(1), p_item->psz_uri));
EXPECT(!strcmp("name1", p_item->psz_name));
p = vlc_meta_Get(p_item->p_meta, vlc_meta_Publisher);
EXPECT(p && !strcmp("group1", p));
p_item = p_node->pp_children[2]->p_item;
EXPECT(p_item->psz_name && p_item->psz_uri);
EXPECT(!strcmp(NOPURI(2), p_item->psz_uri));
EXPECT(!strcmp("name2", p_item->psz_name));
p = vlc_meta_Get(p_item->p_meta, vlc_meta_Publisher);
EXPECT(p && !strcmp("group1", p));
return 0;
}
int main(void)
{
test_init();
libvlc_instance_t *vlc = libvlc_new(0, NULL);
if(!vlc)
return 1;
int ret = runtest("run0", vlc, m3uplaylist0, sizeof(m3uplaylist0), check0);
if(!ret)
ret = runtest("run1", vlc, m3uplaylist1, sizeof(m3uplaylist1), check1);
if(!ret)
ret = runtest("run2", vlc, m3uplaylist2, sizeof(m3uplaylist2), check2);
libvlc_release(vlc);
return ret;
}