mirror of
https://github.com/ytdl-org/youtube-dl
synced 2024-12-23 04:30:10 +09:00
Compare commits
2 Commits
4ef1fc9707
...
7f3c90ab25
Author | SHA1 | Date | |
---|---|---|---|
|
7f3c90ab25 | ||
|
1d3cd29730 |
52
youtube_dl/extractor/ctv.py
Normal file
52
youtube_dl/extractor/ctv.py
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
# coding: utf-8
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from .common import InfoExtractor
|
||||||
|
|
||||||
|
|
||||||
|
class CTVIE(InfoExtractor):
|
||||||
|
_VALID_URL = r'https?://(?:www\.)?ctv\.ca/(?P<id>(?:show|movie)s/[^/]+/[^/?#&]+)'
|
||||||
|
_TESTS = [{
|
||||||
|
'url': 'https://www.ctv.ca/shows/your-morning/wednesday-december-23-2020-s5e88',
|
||||||
|
'info_dict': {
|
||||||
|
'id': '2102249',
|
||||||
|
'ext': 'flv',
|
||||||
|
'title': 'Wednesday, December 23, 2020',
|
||||||
|
'thumbnail': r're:^https?://.*\.jpg$',
|
||||||
|
'description': 'Your Morning delivers original perspectives and unique insights into the headlines of the day.',
|
||||||
|
'timestamp': 1608732000,
|
||||||
|
'upload_date': '20201223',
|
||||||
|
'series': 'Your Morning',
|
||||||
|
'season': '2020-2021',
|
||||||
|
'season_number': 5,
|
||||||
|
'episode_number': 88,
|
||||||
|
'tags': ['Your Morning'],
|
||||||
|
'categories': ['Talk Show'],
|
||||||
|
'duration': 7467.126,
|
||||||
|
},
|
||||||
|
}, {
|
||||||
|
'url': 'https://www.ctv.ca/movies/adam-sandlers-eight-crazy-nights/adam-sandlers-eight-crazy-nights',
|
||||||
|
'only_matching': True,
|
||||||
|
}]
|
||||||
|
|
||||||
|
def _real_extract(self, url):
|
||||||
|
display_id = self._match_id(url)
|
||||||
|
content = self._download_json(
|
||||||
|
'https://www.ctv.ca/space-graphql/graphql', display_id, query={
|
||||||
|
'query': '''{
|
||||||
|
resolvedPath(path: "/%s") {
|
||||||
|
lastSegment {
|
||||||
|
content {
|
||||||
|
... on AxisContent {
|
||||||
|
axisId
|
||||||
|
videoPlayerDestCode
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}''' % display_id,
|
||||||
|
})['data']['resolvedPath']['lastSegment']['content']
|
||||||
|
video_id = content['axisId']
|
||||||
|
return self.url_result(
|
||||||
|
'9c9media:%s:%s' % (content['videoPlayerDestCode'], video_id),
|
||||||
|
'NineCNineMedia', video_id)
|
@ -244,6 +244,7 @@ from .crunchyroll import (
|
|||||||
)
|
)
|
||||||
from .cspan import CSpanIE
|
from .cspan import CSpanIE
|
||||||
from .ctsnews import CtsNewsIE
|
from .ctsnews import CtsNewsIE
|
||||||
|
from .ctv import CTVIE
|
||||||
from .ctvnews import CTVNewsIE
|
from .ctvnews import CTVNewsIE
|
||||||
from .cultureunplugged import CultureUnpluggedIE
|
from .cultureunplugged import CultureUnpluggedIE
|
||||||
from .curiositystream import (
|
from .curiositystream import (
|
||||||
|
@ -5,10 +5,11 @@ import re
|
|||||||
|
|
||||||
from .common import InfoExtractor
|
from .common import InfoExtractor
|
||||||
from ..utils import (
|
from ..utils import (
|
||||||
parse_iso8601,
|
|
||||||
float_or_none,
|
|
||||||
ExtractorError,
|
ExtractorError,
|
||||||
|
float_or_none,
|
||||||
int_or_none,
|
int_or_none,
|
||||||
|
parse_iso8601,
|
||||||
|
try_get,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@ -35,7 +36,7 @@ class NineCNineMediaIE(InfoExtractor):
|
|||||||
'$include': '[HasClosedCaptions]',
|
'$include': '[HasClosedCaptions]',
|
||||||
})
|
})
|
||||||
|
|
||||||
if content_package.get('Constraints', {}).get('Security', {}).get('Type'):
|
if try_get(content_package, lambda x: x['Constraints']['Security']['Type']):
|
||||||
raise ExtractorError('This video is DRM protected.', expected=True)
|
raise ExtractorError('This video is DRM protected.', expected=True)
|
||||||
|
|
||||||
manifest_base_url = content_package_url + 'manifest.'
|
manifest_base_url = content_package_url + 'manifest.'
|
||||||
@ -52,7 +53,7 @@ class NineCNineMediaIE(InfoExtractor):
|
|||||||
self._sort_formats(formats)
|
self._sort_formats(formats)
|
||||||
|
|
||||||
thumbnails = []
|
thumbnails = []
|
||||||
for image in content.get('Images', []):
|
for image in (content.get('Images') or []):
|
||||||
image_url = image.get('Url')
|
image_url = image.get('Url')
|
||||||
if not image_url:
|
if not image_url:
|
||||||
continue
|
continue
|
||||||
@ -70,7 +71,7 @@ class NineCNineMediaIE(InfoExtractor):
|
|||||||
continue
|
continue
|
||||||
container.append(e_name)
|
container.append(e_name)
|
||||||
|
|
||||||
season = content.get('Season', {})
|
season = content.get('Season') or {}
|
||||||
|
|
||||||
info = {
|
info = {
|
||||||
'id': content_id,
|
'id': content_id,
|
||||||
@ -79,13 +80,14 @@ class NineCNineMediaIE(InfoExtractor):
|
|||||||
'timestamp': parse_iso8601(content.get('BroadcastDateTime')),
|
'timestamp': parse_iso8601(content.get('BroadcastDateTime')),
|
||||||
'episode_number': int_or_none(content.get('Episode')),
|
'episode_number': int_or_none(content.get('Episode')),
|
||||||
'season': season.get('Name'),
|
'season': season.get('Name'),
|
||||||
'season_number': season.get('Number'),
|
'season_number': int_or_none(season.get('Number')),
|
||||||
'season_id': season.get('Id'),
|
'season_id': season.get('Id'),
|
||||||
'series': content.get('Media', {}).get('Name'),
|
'series': try_get(content, lambda x: x['Media']['Name']),
|
||||||
'tags': tags,
|
'tags': tags,
|
||||||
'categories': categories,
|
'categories': categories,
|
||||||
'duration': float_or_none(content_package.get('Duration')),
|
'duration': float_or_none(content_package.get('Duration')),
|
||||||
'formats': formats,
|
'formats': formats,
|
||||||
|
'thumbnails': thumbnails,
|
||||||
}
|
}
|
||||||
|
|
||||||
if content_package.get('HasClosedCaptions'):
|
if content_package.get('HasClosedCaptions'):
|
||||||
|
Loading…
Reference in New Issue
Block a user