Repository: yt-dlp/yt-dlp

Issue:
Islam Channel
### DO NOT REMOVE OR SKIP THE ISSUE TEMPLATE

- [X] I understand that I will be **blocked** if I remove or skip any mandatory\* field

### Checklist

- [X] I'm reporting a new site support request
- [X] I've verified that I'm running yt-dlp version **2022.08.19** ([update instructions](https://github.com/yt-dlp/yt-dlp#update)) or later (specify commit)
- [X] I've checked that all provided URLs are playable in a browser with the same IP and same login details
- [X] I've checked that none of provided URLs [violate any copyrights](https://github.com/ytdl-org/youtube-dl#can-you-add-support-for-this-anime-video-site-or-site-which-shows-current-movies-for-free) or contain any [DRM](https://en.wikipedia.org/wiki/Digital_rights_management) to the best of my knowledge
- [X] I've searched the [bugtracker](https://github.com/yt-dlp/yt-dlp/issues?q=) for similar issues **including closed ones**. DO NOT post duplicates
- [X] I've read the [guidelines for opening an issue](https://github.com/yt-dlp/yt-dlp/blob/master/CONTRIBUTING.md#opening-an-issue)
- [X] I've read about [sharing account credentials](https://github.com/yt-dlp/yt-dlp/blob/master/CONTRIBUTING.md#are-you-willing-to-share-account-details-if-needed) and am willing to share it if required

### Region

United Kingdom

### Example URLs

https://watch.islamchannel.tv/watch/38604310
https://watch.islamchannel.tv/series/a6cccef3-3ef1-11eb-bc19-06b69c2357cd

### Provide a description that is worded well enough to be understood

Islam Channel is a British TV channel that in 2021 had the highest viewership among all UK Asian Entertainment TV channels and reaches 60% of British Muslims. No auth is needed so no credential-sharing is needed either.

The playlist link is not strictly a playlist link so it wouldn't be a dealbreaker not to have support for it; I can live with downloading each video individually.

### Provide verbose output that clearly demonstrates the problem

- [X] Run **your** yt-dlp command with **-vU** flag added (`yt-dlp -vU <your command line>`)
- [X] Copy the WHOLE output (starting with `[debug] Command-line config`) and insert it below

### Complete Verbose Output

```shell
[debug] Command-line config: ['-vU', 'https://watch.islamchannel.tv/watch/38604310']
[debug] Encodings: locale cp1252, fs utf-8, pref cp1252, out utf-8, error utf-8, screen utf-8
[debug] yt-dlp version 2022.08.19 [48c88e0] (win32_exe)
[debug] Python 3.8.10 (CPython 64bit) - Windows-10-10.0.19044-SP0
[debug] Checking exe version: ffmpeg -bsfs
[debug] Checking exe version: ffprobe -bsfs
[debug] exe versions: ffmpeg N-106837-geda1e99c87-gf77ac5131c (fdk,setts), ffprobe N-106837-geda1e99c87-g
f77ac5131c, rtmpdump 2.4-20210219-gf1b83c1-GnuTLS_3.6.13-x86_64-static
[debug] Optional libraries: Cryptodome-3.15.0, brotli-1.0.9, certifi-2022.06.15, mutagen-1.45.1, sqlite3-
2.6.0, websockets-10.3
[debug] Proxy map: {}
[debug] Fetching release info: https://api.github.com/repos/yt-dlp/yt-dlp/releases/latest
Latest version: 2022.08.19, Current version: 2022.08.19
yt-dlp is up to date (2022.08.19)
[debug] [generic] Extracting URL: https://watch.islamchannel.tv/watch/38604310
[generic] 38604310: Downloading webpage
WARNING: [generic] Falling back on generic information extractor
[generic] 38604310: Extracting information
[debug] Looking for Brightcove embeds
[debug] Looking for embeds
ERROR: Unsupported URL: https://watch.islamchannel.tv/watch/38604310
Traceback (most recent call last):
  File "yt_dlp\YoutubeDL.py", line 1442, in wrapper
  File "yt_dlp\YoutubeDL.py", line 1518, in __extract_info
  File "yt_dlp\extractor\common.py", line 666, in extract
  File "yt_dlp\extractor\generic.py", line 3077, in _real_extract
yt_dlp.utils.UnsupportedError: Unsupported URL: https://watch.islamchannel.tv/watch/38604310
```



Discussion:

Resolving patch:
diff --git a/yt_dlp/extractor/_extractors.py b/yt_dlp/extractor/_extractors.py
--- a/yt_dlp/extractor/_extractors.py
+++ b/yt_dlp/extractor/_extractors.py
@@ -720,6 +720,10 @@
     IqIE,
     IqAlbumIE
 )
+from .islamchannel import (
+    IslamChannelIE,
+    IslamChannelSeriesIE,
+)
 from .itprotv import (
     ITProTVIE,
     ITProTVCourseIE
diff --git a/yt_dlp/extractor/islamchannel.py b/yt_dlp/extractor/islamchannel.py
new file mode 100644
--- /dev/null
+++ b/yt_dlp/extractor/islamchannel.py
@@ -0,0 +1,82 @@
+import re
+
+from .common import InfoExtractor
+from ..utils import traverse_obj, urljoin
+
+
+class IslamChannelIE(InfoExtractor):
+    _VALID_URL = r'https?://watch\.islamchannel\.tv/watch/(?P<id>\d+)'
+    _TESTS = [{
+        'url': 'https://watch.islamchannel.tv/watch/38604310',
+        'info_dict': {
+            'id': '38604310',
+            'title': 'Omar - Young Omar',
+            'description': 'md5:5cc7ddecef064ea7afe52eb5e0e33b55',
+            'thumbnail': r're:https?://.+',
+            'ext': 'mp4',
+        }
+    }]
+
+    def _real_extract(self, url):
+        video_id = self._match_id(url)
+        webpage = self._download_webpage(url, video_id)
+
+        thumbnail = self._search_regex(
+            r'data-poster="([^"]+)"', webpage, 'data poster', fatal=False) or \
+            self._html_search_meta(('og:image', 'twitter:image'), webpage)
+
+        headers = {
+            'Token': self._search_regex(r'data-token="([^"]+)"', webpage, 'data token'),
+            'Token-Expiry': self._search_regex(r'data-expiry="([^"]+)"', webpage, 'data expiry'),
+            'Uvid': video_id,
+        }
+        show_stream = self._download_json(
+            f'https://v2-streams-elb.simplestreamcdn.com/api/show/stream/{video_id}', video_id,
+            query={
+                'key': self._search_regex(r'data-key="([^"]+)"', webpage, 'data key'),
+                'platform': 'chrome',
+            }, headers=headers)
+        # TODO: show_stream['stream'] and show_stream['drm'] may contain something interesting
+        streams = self._download_json(
+            traverse_obj(show_stream, ('response', 'tokenization', 'url')), video_id,
+            headers=headers)
+        formats, subs = self._extract_m3u8_formats_and_subtitles(traverse_obj(streams, ('Streams', 'Adaptive')), video_id, 'mp4')
+        self._sort_formats(formats)
+
+        return {
+            'id': video_id,
+            'title': self._html_search_meta(('og:title', 'twitter:title'), webpage),
+            'description': self._html_search_meta(('og:description', 'twitter:description', 'description'), webpage),
+            'formats': formats,
+            'subtitles': subs,
+            'thumbnails': [{
+                'id': 'unscaled',
+                'url': thumbnail.split('?')[0],
+                'ext': 'jpg',
+                'preference': 2,
+            }, {
+                'id': 'orig',
+                'url': thumbnail,
+                'ext': 'jpg',
+                'preference': 1,
+            }] if thumbnail else None,
+        }
+
+
+class IslamChannelSeriesIE(InfoExtractor):
+    _VALID_URL = r'https?://watch\.islamchannel\.tv/series/(?P<id>[a-f\d-]+)'
+    _TESTS = [{
+        'url': 'https://watch.islamchannel.tv/series/a6cccef3-3ef1-11eb-bc19-06b69c2357cd',
+        'info_dict': {
+            'id': 'a6cccef3-3ef1-11eb-bc19-06b69c2357cd',
+        },
+        'playlist_mincount': 31,
+    }]
+
+    def _real_extract(self, url):
+        pl_id = self._match_id(url)
+        webpage = self._download_webpage(url, pl_id)
+
+        return self.playlist_from_matches(
+            re.finditer(r'<a\s+href="(/watch/\d+)"[^>]+?data-video-type="show">', webpage),
+            pl_id, getter=lambda x: urljoin(url, x.group(1)), ie=IslamChannelIE)


Test patch: