From e88dabb35e656ccff0a7831d467bb404989409cf Mon Sep 17 00:00:00 2001
From: coletdjnz <colethedj@protonmail.com>
Date: Wed, 1 Sep 2021 10:31:11 +1200
Subject: [PATCH] [Viafree] Fix extractor and extract subtitles (#828)

Authored by: coletdjnz
Fixes #820
---
 yt_dlp/extractor/tvplay.py | 36 ++++++++++++++++++++++++------------
 1 file changed, 24 insertions(+), 12 deletions(-)

diff --git a/yt_dlp/extractor/tvplay.py b/yt_dlp/extractor/tvplay.py
index c60af111c7..9b6d17f619 100644
--- a/yt_dlp/extractor/tvplay.py
+++ b/yt_dlp/extractor/tvplay.py
@@ -34,8 +34,8 @@ class TVPlayIE(InfoExtractor):
                                 tvplay(?:\.skaties)?\.lv(?:/parraides)?|
                                 (?:tv3play|play\.tv3)\.lt(?:/programos)?|
                                 tv3play(?:\.tv3)?\.ee/sisu|
-                                (?:tv(?:3|6|8|10)play|viafree)\.se/program|
-                                (?:(?:tv3play|viasat4play|tv6play|viafree)\.no|(?:tv3play|viafree)\.dk)/programmer|
+                                (?:tv(?:3|6|8|10)play)\.se/program|
+                                (?:(?:tv3play|viasat4play|tv6play)\.no|(?:tv3play)\.dk)/programmer|
                                 play\.nova(?:tv)?\.bg/programi
                             )
                             /(?:[^/]+/)+
@@ -223,10 +223,6 @@ class TVPlayIE(InfoExtractor):
             'url': 'http://tv3play.tv3.ee/sisu/kodu-keset-linna/238551?autostart=true',
             'only_matching': True,
         },
-        {
-            'url': 'http://www.viafree.se/program/underhallning/i-like-radio-live/sasong-1/676869',
-            'only_matching': True,
-        },
         {
             'url': 'mtg:418113',
             'only_matching': True,
@@ -359,6 +355,23 @@ class ViafreeIE(InfoExtractor):
         'params': {
             'skip_download': True,
         },
+    }, {
+        'url': 'https://www.viafree.dk/programmer/humor/comedy-central-roast-of-charlie-sheen/film/1047660',
+        'info_dict': {
+            'id': '1047660',
+            'ext': 'mp4',
+            'title': 'Comedy Central Roast of Charlie Sheen - Comedy Central Roast of Charlie Sheen',
+            'description': 'md5:ec956d941ae9fd7c65a48fd64951dc6d',
+            'series': 'Comedy Central Roast of Charlie Sheen',
+            'season_number': 1,
+            'duration': 3747,
+            'timestamp': 1608246060,
+            'upload_date': '20201217'
+        },
+        'params': {
+            'format': 'bestvideo',
+            'skip_download': True
+        }
     }, {
         # with relatedClips
         'url': 'http://www.viafree.se/program/reality/sommaren-med-youtube-stjarnorna/sasong-1/avsnitt-1',
@@ -373,13 +386,12 @@ class ViafreeIE(InfoExtractor):
     }, {
         'url': 'http://www.viafree.dk/programmer/reality/paradise-hotel/saeson-7/episode-5',
         'only_matching': True,
+    }, {
+        'url': 'http://www.viafree.se/program/underhallning/i-like-radio-live/sasong-1/676869',
+        'only_matching': True,
     }]
     _GEO_BYPASS = False
 
-    @classmethod
-    def suitable(cls, url):
-        return False if TVPlayIE.suitable(url) else super(ViafreeIE, cls).suitable(url)
-
     def _real_extract(self, url):
         country, path = self._match_valid_url(url).groups()
         content = self._download_json(
@@ -398,16 +410,16 @@ class ViafreeIE(InfoExtractor):
                 self.raise_geo_restricted(countries=[country])
             raise
 
-        formats = self._extract_m3u8_formats(stream_href, guid, 'mp4')
+        formats, subtitles = self._extract_m3u8_formats_and_subtitles(stream_href, guid, 'mp4')
         self._sort_formats(formats)
         episode = program.get('episode') or {}
-
         return {
             'id': guid,
             'title': title,
             'thumbnail': meta.get('image'),
             'description': meta.get('description'),
             'series': episode.get('seriesTitle'),
+            'subtitles': subtitles,
             'episode_number': int_or_none(episode.get('episodeNumber')),
             'season_number': int_or_none(episode.get('seasonNumber')),
             'duration': int_or_none(try_get(program, lambda x: x['video']['duration']['milliseconds']), 1000),