@@ -527,7 +527,7 @@ def build_menu_from_page(self, url, path):
527
527
except Exception :
528
528
pass
529
529
530
- def build_episode_menu (self , video_id , include_segments = True ,
530
+ def build_episode_menu (self , video_id_or_urn , include_segments = True ,
531
531
segment_option = False , audio = False ):
532
532
"""
533
533
Builds a list entry for a episode by a given video id.
@@ -536,7 +536,7 @@ def build_episode_menu(self, video_id, include_segments=True,
536
536
entry for the segment will be created.
537
537
538
538
Keyword arguments:
539
- video_id -- the id of the video
539
+ video_id_or_urn -- the video id or the urn
540
540
include_segments -- indicates if the segments (if available) of the
541
541
video should be included in the list
542
542
(default: True)
@@ -545,25 +545,30 @@ def build_episode_menu(self, video_id, include_segments=True,
545
545
audio -- boolean value to indicate if the episode is a
546
546
radio show (default: False)
547
547
"""
548
- self .log (f'build_episode_menu, video_id = { video_id } ' )
548
+ self .log (f'build_episode_menu, video_id_or_urn = { video_id_or_urn } ' )
549
549
content_type = 'audio' if audio else 'video'
550
- json_url = f'https://il.srgssr.ch/integrationlayer/2.0/{ self .bu } /' \
551
- f'mediaComposition/{ content_type } /{ video_id } .json'
550
+ if ':' in video_id_or_urn :
551
+ json_url = 'https://il.srgssr.ch/integrationlayer/2.0/' \
552
+ f'mediaComposition/byUrn/{ video_id_or_urn } .json'
553
+ video_id = video_id_or_urn .split (':' )[- 1 ]
554
+ else :
555
+ json_url = f'https://il.srgssr.ch/integrationlayer/2.0/{ self .bu } ' \
556
+ f'/mediaComposition/{ content_type } /{ video_id_or_urn } ' \
557
+ '.json'
558
+ video_id = video_id_or_urn
552
559
self .log (f'build_episode_menu. Open URL { json_url } ' )
553
560
try :
554
561
json_response = json .loads (self .open_url (json_url ))
555
562
except Exception :
556
- self .log (f'build_episode_menu: Cannot open json for { video_id } .' )
563
+ self .log (
564
+ f'build_episode_menu: Cannot open json for { video_id_or_urn } .' )
557
565
return
558
566
559
567
chapter_urn = utils .try_get (json_response , 'chapterUrn' )
560
568
segment_urn = utils .try_get (json_response , 'segmentUrn' )
561
569
562
- id_regex = r'[a-z]+:[a-z]+:[a-z]+:(?P<id>.+)'
563
- match_chapter_id = re .match (id_regex , chapter_urn )
564
- match_segment_id = re .match (id_regex , segment_urn )
565
- chapter_id = match_chapter_id .group ('id' ) if match_chapter_id else None
566
- segment_id = match_segment_id .group ('id' ) if match_segment_id else None
570
+ chapter_id = chapter_urn .split (':' )[- 1 ] if chapter_urn else None
571
+ segment_id = segment_urn .split (':' )[- 1 ] if segment_urn else None
567
572
568
573
if not chapter_id :
569
574
self .log (f'build_episode_menu: No valid chapter URN \
@@ -588,6 +593,7 @@ def build_episode_menu(self, video_id, include_segments=True,
588
593
for video_id { video_id } ' )
589
594
return
590
595
596
+ # TODO: Simplify
591
597
json_segment_list = utils .try_get (
592
598
json_chapter , 'segmentList' , data_type = list , default = [])
593
599
if video_id == chapter_id :
@@ -690,20 +696,9 @@ def build_entry_apiv3(self, data, is_show=False, whitelist_ids=None):
690
696
url = self .build_url (mode = 100 , name = urn )
691
697
is_folder = True
692
698
693
- # Prevent upcoming live events from being played:
694
- if 'swisstxt' in urn :
695
- url = self .build_url (mode = 500 , name = urn )
696
- is_folder = False
697
-
698
699
xbmcplugin .addDirectoryItem (
699
700
self .handle , url , list_item , isFolder = is_folder )
700
701
701
- def playback_not_supported_dialog (self , urn ):
702
- heading = self .language (30500 )
703
- message = self .language (30501 ) + f' { urn } ' + self .language (30502 )
704
- dialog = xbmcgui .Dialog ()
705
- dialog .notification (heading , message )
706
-
707
702
def build_menu_by_urn (self , urn ):
708
703
"""
709
704
Builds a menu from an urn.
@@ -714,6 +709,10 @@ def build_menu_by_urn(self, urn):
714
709
id = urn .split (':' )[- 1 ]
715
710
if 'show' in urn :
716
711
self .build_menu_apiv3 (f'videos-by-show-id?showId={ id } ' )
712
+ elif 'swisstxt' in urn :
713
+ # Do not include segments for livestreams,
714
+ # they fail to play.
715
+ self .build_episode_menu (urn , include_segments = False )
717
716
elif 'video' in urn :
718
717
self .build_episode_menu (id )
719
718
elif 'topic' in urn :
@@ -811,7 +810,11 @@ def build_entry(self, json_entry, is_folder=False, audio=False,
811
810
url = self .build_url (mode = 21 , name = name )
812
811
else :
813
812
list_item .setProperty ('IsPlayable' , 'true' )
814
- url = self .build_url (mode = 50 , name = name )
813
+ # TODO: Simplify this, use URN instead of video id everywhere
814
+ if 'swisstxt' in urn :
815
+ url = self .build_url (mode = 50 , name = urn )
816
+ else :
817
+ url = self .build_url (mode = 50 , name = name )
815
818
xbmcplugin .addDirectoryItem (
816
819
self .handle , url , list_item , isFolder = is_folder )
817
820
@@ -1329,74 +1332,6 @@ def write_search(self, filename, name, max_entries=10):
1329
1332
# continue
1330
1333
# self.build_entry(json_entry)
1331
1334
1332
- def build_live_menu (self , extract_srf3 = False ):
1333
- """
1334
- Builds the menu listing the currently available livestreams.
1335
- """
1336
- def get_live_ids ():
1337
- """
1338
- Downloads the main webpage and scrapes it for
1339
- possible livestreams. If some live events were found, a list
1340
- of live ids will be returned, otherwise an empty list.
1341
- """
1342
- live_ids = []
1343
- webpage = self .open_url (self .host_url , use_cache = False )
1344
- event_id_regex = r'(?:data-sport-id=\"|eventId=)(?P<live_id>\d+)'
1345
- try :
1346
- for match in re .finditer (event_id_regex , webpage ):
1347
- live_ids .append (match .group ('live_id' ))
1348
- except StopIteration :
1349
- pass
1350
- return live_ids
1351
-
1352
- def get_srf3_live_ids ():
1353
- """
1354
- Returns a list of Radio SRF 3 video streams.
1355
- """
1356
- url = 'https://www.srf.ch/radio-srf-3'
1357
- webpage = self .open_url (url , use_cache = False )
1358
- video_id_regex = r'''(?x)
1359
- popupvideoplayer\?id=
1360
- (?P<video_id>
1361
- [a-f0-9]{8}-
1362
- [a-f0-9]{4}-
1363
- [a-f0-9]{4}-
1364
- [a-f0-9]{4}-
1365
- [a-f0-9]{12}
1366
- )
1367
- '''
1368
- live_ids = []
1369
- try :
1370
- for match in re .finditer (video_id_regex , webpage ):
1371
- live_ids .append (match .group ('video_id' ))
1372
- except StopIteration :
1373
- pass
1374
- return live_ids
1375
- live_ids = get_live_ids ()
1376
- for lid in live_ids :
1377
- api_url = ('https://event.api.swisstxt.ch/v1/events/'
1378
- f'{ self .bu } /byEventItemId/?eids={ lid } ' )
1379
- live_json = json .loads (self .open_url (api_url ))
1380
- entry = utils .try_get (live_json , 0 , data_type = dict , default = {})
1381
- if not entry :
1382
- self .log ('build_live_menu: No entry found for live id {lid}.' )
1383
- continue
1384
- if utils .try_get (entry , 'streamType' ) == 'noStream' :
1385
- continue
1386
- title = utils .try_get (entry , 'title' )
1387
- stream_url = utils .try_get (entry , 'hls' )
1388
- image = utils .try_get (entry , 'imageUrl' )
1389
- item = xbmcgui .ListItem (label = title )
1390
- item .setProperty ('IsPlayable' , 'true' )
1391
- item .setArt ({'thumb' : image })
1392
- purl = self .build_url (mode = 51 , name = stream_url )
1393
- xbmcplugin .addDirectoryItem (
1394
- self .handle , purl , item , isFolder = False )
1395
- if extract_srf3 :
1396
- srf3_ids = get_srf3_live_ids ()
1397
- for vid in srf3_ids :
1398
- self .build_episode_menu (vid , include_segments = False )
1399
-
1400
1335
def _read_youtube_channels (self , fname ):
1401
1336
"""
1402
1337
Reads YouTube channel IDs from a specified file and returns a list
0 commit comments