0
0
Fork 0
mirror of https://github.com/yt-dlp/yt-dlp.git synced 2024-12-22 06:00:00 +00:00

[cleanup] Fix infodict returned fields (#8906)

Authored by: seproDev
This commit is contained in:
sepro 2024-03-08 23:36:41 +01:00 committed by GitHub
parent dfd8c0b696
commit f4f9f6d00e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
74 changed files with 230 additions and 274 deletions

View file

@ -1310,6 +1310,8 @@ # OUTPUT TEMPLATE
- `description` (string): The description of the video - `description` (string): The description of the video
- `display_id` (string): An alternative identifier for the video - `display_id` (string): An alternative identifier for the video
- `uploader` (string): Full name of the video uploader - `uploader` (string): Full name of the video uploader
- `uploader_id` (string): Nickname or id of the video uploader
- `uploader_url` (string): URL to the video uploader's profile
- `license` (string): License name the video is licensed under - `license` (string): License name the video is licensed under
- `creators` (list): The creators of the video - `creators` (list): The creators of the video
- `creator` (string): The creators of the video; comma-separated - `creator` (string): The creators of the video; comma-separated
@ -1320,9 +1322,9 @@ # OUTPUT TEMPLATE
- `release_year` (numeric): Year (YYYY) when the video or album was released - `release_year` (numeric): Year (YYYY) when the video or album was released
- `modified_timestamp` (numeric): UNIX timestamp of the moment the video was last modified - `modified_timestamp` (numeric): UNIX timestamp of the moment the video was last modified
- `modified_date` (string): The date (YYYYMMDD) when the video was last modified in UTC - `modified_date` (string): The date (YYYYMMDD) when the video was last modified in UTC
- `uploader_id` (string): Nickname or id of the video uploader
- `channel` (string): Full name of the channel the video is uploaded on - `channel` (string): Full name of the channel the video is uploaded on
- `channel_id` (string): Id of the channel - `channel_id` (string): Id of the channel
- `channel_url` (string): URL of the channel
- `channel_follower_count` (numeric): Number of followers of the channel - `channel_follower_count` (numeric): Number of followers of the channel
- `channel_is_verified` (boolean): Whether the channel is verified on the platform - `channel_is_verified` (boolean): Whether the channel is verified on the platform
- `location` (string): Physical location where the video was filmed - `location` (string): Physical location where the video was filmed
@ -1362,6 +1364,9 @@ # OUTPUT TEMPLATE
- `webpage_url_basename` (string): The basename of the webpage URL - `webpage_url_basename` (string): The basename of the webpage URL
- `webpage_url_domain` (string): The domain of the webpage URL - `webpage_url_domain` (string): The domain of the webpage URL
- `original_url` (string): The URL given by the user (or same as `webpage_url` for playlist entries) - `original_url` (string): The URL given by the user (or same as `webpage_url` for playlist entries)
- `categories` (list): List of categories the video belongs to
- `tags` (list): List of tags assigned to the video
- `cast` (list): List of cast members
All the fields in [Filtering Formats](#filtering-formats) can also be used All the fields in [Filtering Formats](#filtering-formats) can also be used
@ -1374,6 +1379,7 @@ # OUTPUT TEMPLATE
Available for the video that is an episode of some series or programme: Available for the video that is an episode of some series or programme:
- `series` (string): Title of the series or programme the video episode belongs to - `series` (string): Title of the series or programme the video episode belongs to
- `series_id` (string): Id of the series or programme the video episode belongs to
- `season` (string): Title of the season the video episode belongs to - `season` (string): Title of the season the video episode belongs to
- `season_number` (numeric): Number of the season the video episode belongs to - `season_number` (numeric): Number of the season the video episode belongs to
- `season_id` (string): Id of the season the video episode belongs to - `season_id` (string): Id of the season the video episode belongs to

View file

@ -245,7 +245,6 @@ class ABCIViewIE(InfoExtractor):
'episode_id': 'NC2203H039S00', 'episode_id': 'NC2203H039S00',
'season_number': 2022, 'season_number': 2022,
'season': 'Season 2022', 'season': 'Season 2022',
'episode_number': None,
'episode': 'Locking Up Kids', 'episode': 'Locking Up Kids',
'thumbnail': 'https://cdn.iview.abc.net.au/thumbs/i/nc/NC2203H039S00_636d8a0944a22_1920.jpg', 'thumbnail': 'https://cdn.iview.abc.net.au/thumbs/i/nc/NC2203H039S00_636d8a0944a22_1920.jpg',
'timestamp': 1668460497, 'timestamp': 1668460497,
@ -271,8 +270,6 @@ class ABCIViewIE(InfoExtractor):
'episode_id': 'RF2004Q043S00', 'episode_id': 'RF2004Q043S00',
'season_number': 2021, 'season_number': 2021,
'season': 'Season 2021', 'season': 'Season 2021',
'episode_number': None,
'episode': None,
'thumbnail': 'https://cdn.iview.abc.net.au/thumbs/i/rf/RF2004Q043S00_61a950639dbc0_1920.jpg', 'thumbnail': 'https://cdn.iview.abc.net.au/thumbs/i/rf/RF2004Q043S00_61a950639dbc0_1920.jpg',
'timestamp': 1638710705, 'timestamp': 1638710705,

View file

@ -259,7 +259,7 @@ class AbemaTVIE(AbemaTVBaseIE):
'title': 'ゆるキャン△ SEASON 全話一挙【無料ビデオ72時間】', 'title': 'ゆるキャン△ SEASON 全話一挙【無料ビデオ72時間】',
'series': 'ゆるキャン△ SEASON', 'series': 'ゆるキャン△ SEASON',
'episode': 'ゆるキャン△ SEASON 全話一挙【無料ビデオ72時間】', 'episode': 'ゆるキャン△ SEASON 全話一挙【無料ビデオ72時間】',
'series_number': 2, 'season_number': 2,
'episode_number': 1, 'episode_number': 1,
'description': 'md5:9c5a3172ae763278f9303922f0ea5b17', 'description': 'md5:9c5a3172ae763278f9303922f0ea5b17',
}, },

View file

@ -3,6 +3,7 @@
float_or_none, float_or_none,
format_field, format_field,
int_or_none, int_or_none,
str_or_none,
traverse_obj, traverse_obj,
parse_codecs, parse_codecs,
parse_qs, parse_qs,
@ -129,7 +130,7 @@ class AcFunBangumiIE(AcFunVideoBaseIE):
'title': '红孩儿之趴趴蛙寻石记 第5话 ', 'title': '红孩儿之趴趴蛙寻石记 第5话 ',
'duration': 760.0, 'duration': 760.0,
'season': '红孩儿之趴趴蛙寻石记', 'season': '红孩儿之趴趴蛙寻石记',
'season_id': 5023171, 'season_id': '5023171',
'season_number': 1, # series has only 1 season 'season_number': 1, # series has only 1 season
'episode': 'Episode 5', 'episode': 'Episode 5',
'episode_number': 5, 'episode_number': 5,
@ -146,7 +147,7 @@ class AcFunBangumiIE(AcFunVideoBaseIE):
'title': '叽歪老表(第二季) 第5话 坚不可摧', 'title': '叽歪老表(第二季) 第5话 坚不可摧',
'season': '叽歪老表(第二季)', 'season': '叽歪老表(第二季)',
'season_number': 2, 'season_number': 2,
'season_id': 6065485, 'season_id': '6065485',
'episode': '坚不可摧', 'episode': '坚不可摧',
'episode_number': 5, 'episode_number': 5,
'upload_date': '20220324', 'upload_date': '20220324',
@ -191,7 +192,7 @@ def _real_extract(self, url):
'title': json_bangumi_data.get('showTitle'), 'title': json_bangumi_data.get('showTitle'),
'thumbnail': json_bangumi_data.get('image'), 'thumbnail': json_bangumi_data.get('image'),
'season': json_bangumi_data.get('bangumiTitle'), 'season': json_bangumi_data.get('bangumiTitle'),
'season_id': season_id, 'season_id': str_or_none(season_id),
'season_number': season_number, 'season_number': season_number,
'episode': json_bangumi_data.get('title'), 'episode': json_bangumi_data.get('title'),
'episode_number': episode_number, 'episode_number': episode_number,

View file

@ -31,6 +31,7 @@
unified_timestamp, unified_timestamp,
url_or_none, url_or_none,
urlhandle_detect_ext, urlhandle_detect_ext,
variadic,
) )
@ -49,7 +50,7 @@ class ArchiveOrgIE(InfoExtractor):
'release_date': '19681210', 'release_date': '19681210',
'timestamp': 1268695290, 'timestamp': 1268695290,
'upload_date': '20100315', 'upload_date': '20100315',
'creator': 'SRI International', 'creators': ['SRI International'],
'uploader': 'laura@archive.org', 'uploader': 'laura@archive.org',
'thumbnail': r're:https://archive\.org/download/.*\.jpg', 'thumbnail': r're:https://archive\.org/download/.*\.jpg',
'display_id': 'XD300-23_68HighlightsAResearchCntAugHumanIntellect.cdr', 'display_id': 'XD300-23_68HighlightsAResearchCntAugHumanIntellect.cdr',
@ -109,7 +110,7 @@ class ArchiveOrgIE(InfoExtractor):
'title': 'Turning', 'title': 'Turning',
'ext': 'flac', 'ext': 'flac',
'track': 'Turning', 'track': 'Turning',
'creator': 'Grateful Dead', 'creators': ['Grateful Dead'],
'display_id': 'gd1977-05-08d01t01.flac', 'display_id': 'gd1977-05-08d01t01.flac',
'track_number': 1, 'track_number': 1,
'album': '1977-05-08 - Barton Hall - Cornell University', 'album': '1977-05-08 - Barton Hall - Cornell University',
@ -129,7 +130,7 @@ class ArchiveOrgIE(InfoExtractor):
'location': 'Barton Hall - Cornell University', 'location': 'Barton Hall - Cornell University',
'duration': 438.68, 'duration': 438.68,
'track': 'Deal', 'track': 'Deal',
'creator': 'Grateful Dead', 'creators': ['Grateful Dead'],
'album': '1977-05-08 - Barton Hall - Cornell University', 'album': '1977-05-08 - Barton Hall - Cornell University',
'release_date': '19770508', 'release_date': '19770508',
'display_id': 'gd1977-05-08d01t07.flac', 'display_id': 'gd1977-05-08d01t07.flac',
@ -167,7 +168,7 @@ class ArchiveOrgIE(InfoExtractor):
'upload_date': '20160610', 'upload_date': '20160610',
'description': 'md5:f70956a156645a658a0dc9513d9e78b7', 'description': 'md5:f70956a156645a658a0dc9513d9e78b7',
'uploader': 'dimitrios@archive.org', 'uploader': 'dimitrios@archive.org',
'creator': ['British Broadcasting Corporation', 'Time-Life Films'], 'creators': ['British Broadcasting Corporation', 'Time-Life Films'],
'timestamp': 1465594947, 'timestamp': 1465594947,
}, },
'playlist': [ 'playlist': [
@ -257,7 +258,7 @@ def _real_extract(self, url):
'title': m['title'], 'title': m['title'],
'description': clean_html(m.get('description')), 'description': clean_html(m.get('description')),
'uploader': dict_get(m, ['uploader', 'adder']), 'uploader': dict_get(m, ['uploader', 'adder']),
'creator': m.get('creator'), 'creators': traverse_obj(m, ('creator', {variadic}, {lambda x: x[0] and list(x)})),
'license': m.get('licenseurl'), 'license': m.get('licenseurl'),
'release_date': unified_strdate(m.get('date')), 'release_date': unified_strdate(m.get('date')),
'timestamp': unified_timestamp(dict_get(m, ['publicdate', 'addeddate'])), 'timestamp': unified_timestamp(dict_get(m, ['publicdate', 'addeddate'])),
@ -272,7 +273,7 @@ def _real_extract(self, url):
'title': f.get('title') or f['name'], 'title': f.get('title') or f['name'],
'display_id': f['name'], 'display_id': f['name'],
'description': clean_html(f.get('description')), 'description': clean_html(f.get('description')),
'creator': f.get('creator'), 'creators': traverse_obj(f, ('creator', {variadic}, {lambda x: x[0] and list(x)})),
'duration': parse_duration(f.get('length')), 'duration': parse_duration(f.get('length')),
'track_number': int_or_none(f.get('track')), 'track_number': int_or_none(f.get('track')),
'album': f.get('album'), 'album': f.get('album'),

View file

@ -24,7 +24,8 @@ class AxsIE(InfoExtractor):
'timestamp': 1685729564, 'timestamp': 1685729564,
'duration': 1284.216, 'duration': 1284.216,
'series': 'Rock & Roll Road Trip with Sammy Hagar', 'series': 'Rock & Roll Road Trip with Sammy Hagar',
'season': 2, 'season': 'Season 2',
'season_number': 2,
'episode': '3', 'episode': '3',
'thumbnail': 'https://images.dotstudiopro.com/5f4e9d330a0c3b295a7e8394', 'thumbnail': 'https://images.dotstudiopro.com/5f4e9d330a0c3b295a7e8394',
}, },
@ -41,7 +42,8 @@ class AxsIE(InfoExtractor):
'timestamp': 1676403615, 'timestamp': 1676403615,
'duration': 2570.668, 'duration': 2570.668,
'series': 'The Big Interview with Dan Rather', 'series': 'The Big Interview with Dan Rather',
'season': 3, 'season': 'Season 3',
'season_number': 3,
'episode': '5', 'episode': '5',
'thumbnail': 'https://images.dotstudiopro.com/5f4d1901f340b50d937cec32', 'thumbnail': 'https://images.dotstudiopro.com/5f4d1901f340b50d937cec32',
}, },
@ -77,7 +79,7 @@ def _real_extract(self, url):
'title': ('title', {str}), 'title': ('title', {str}),
'description': ('description', {str}), 'description': ('description', {str}),
'series': ('seriestitle', {str}), 'series': ('seriestitle', {str}),
'season': ('season', {int}), 'season_number': ('season', {int}),
'episode': ('episode', {str}), 'episode': ('episode', {str}),
'duration': ('duration', {float_or_none}), 'duration': ('duration', {float_or_none}),
'timestamp': ('updated_at', {parse_iso8601}), 'timestamp': ('updated_at', {parse_iso8601}),

View file

@ -2,6 +2,7 @@
from ..utils import ( from ..utils import (
int_or_none, int_or_none,
str_or_none,
traverse_obj, traverse_obj,
try_get, try_get,
unified_timestamp, unified_timestamp,
@ -22,7 +23,7 @@ class BeegIE(InfoExtractor):
'age_limit': 18, 'age_limit': 18,
'upload_date': '20220131', 'upload_date': '20220131',
'timestamp': 1643656455, 'timestamp': 1643656455,
'display_id': 2540839, 'display_id': '2540839',
} }
}, { }, {
'url': 'https://beeg.com/-0599050563103750?t=4-861', 'url': 'https://beeg.com/-0599050563103750?t=4-861',
@ -36,7 +37,7 @@ class BeegIE(InfoExtractor):
'age_limit': 18, 'age_limit': 18,
'description': 'md5:b4fc879a58ae6c604f8f259155b7e3b9', 'description': 'md5:b4fc879a58ae6c604f8f259155b7e3b9',
'timestamp': 1643623200, 'timestamp': 1643623200,
'display_id': 2569965, 'display_id': '2569965',
'upload_date': '20220131', 'upload_date': '20220131',
} }
}, { }, {
@ -78,7 +79,7 @@ def _real_extract(self, url):
return { return {
'id': video_id, 'id': video_id,
'display_id': first_fact.get('id'), 'display_id': str_or_none(first_fact.get('id')),
'title': traverse_obj(video, ('file', 'stuff', 'sf_name')), 'title': traverse_obj(video, ('file', 'stuff', 'sf_name')),
'description': traverse_obj(video, ('file', 'stuff', 'sf_story')), 'description': traverse_obj(video, ('file', 'stuff', 'sf_story')),
'timestamp': unified_timestamp(first_fact.get('fc_created')), 'timestamp': unified_timestamp(first_fact.get('fc_created')),

View file

@ -32,7 +32,7 @@ class BellMediaIE(InfoExtractor):
'description': 'md5:810f7f8c6a83ad5b48677c3f8e5bb2c3', 'description': 'md5:810f7f8c6a83ad5b48677c3f8e5bb2c3',
'upload_date': '20180525', 'upload_date': '20180525',
'timestamp': 1527288600, 'timestamp': 1527288600,
'season_id': 73997, 'season_id': '73997',
'season': '2018', 'season': '2018',
'thumbnail': 'http://images2.9c9media.com/image_asset/2018_5_25_baf30cbd-b28d-4a18-9903-4bb8713b00f5_PNG_956x536.jpg', 'thumbnail': 'http://images2.9c9media.com/image_asset/2018_5_25_baf30cbd-b28d-4a18-9903-4bb8713b00f5_PNG_956x536.jpg',
'tags': [], 'tags': [],

View file

@ -93,7 +93,6 @@ class BFMTVArticleIE(BFMTVBaseIE):
'id': '6318445464112', 'id': '6318445464112',
'ext': 'mp4', 'ext': 'mp4',
'title': 'Le plein de bioéthanol fait de plus en plus mal à la pompe', 'title': 'Le plein de bioéthanol fait de plus en plus mal à la pompe',
'description': None,
'uploader_id': '876630703001', 'uploader_id': '876630703001',
'upload_date': '20230110', 'upload_date': '20230110',
'timestamp': 1673341692, 'timestamp': 1673341692,

View file

@ -185,7 +185,6 @@ class BitChuteChannelIE(InfoExtractor):
'info_dict': { 'info_dict': {
'id': 'UGlrF9o9b-Q', 'id': 'UGlrF9o9b-Q',
'ext': 'mp4', 'ext': 'mp4',
'filesize': None,
'title': 'This is the first video on #BitChute !', 'title': 'This is the first video on #BitChute !',
'description': 'md5:a0337e7b1fe39e32336974af8173a034', 'description': 'md5:a0337e7b1fe39e32336974af8173a034',
'thumbnail': r're:^https?://.*\.jpg$', 'thumbnail': r're:^https?://.*\.jpg$',

View file

@ -4,6 +4,7 @@
ExtractorError, ExtractorError,
int_or_none, int_or_none,
parse_iso8601, parse_iso8601,
str_or_none,
) )
@ -16,7 +17,7 @@ class BleacherReportIE(InfoExtractor):
'id': '2496438', 'id': '2496438',
'ext': 'mp4', 'ext': 'mp4',
'title': 'FSU Stat Projections: Is Jalen Ramsey Best Defensive Player in College Football?', 'title': 'FSU Stat Projections: Is Jalen Ramsey Best Defensive Player in College Football?',
'uploader_id': 3992341, 'uploader_id': '3992341',
'description': 'CFB, ACC, Florida State', 'description': 'CFB, ACC, Florida State',
'timestamp': 1434380212, 'timestamp': 1434380212,
'upload_date': '20150615', 'upload_date': '20150615',
@ -33,7 +34,7 @@ class BleacherReportIE(InfoExtractor):
'timestamp': 1446839961, 'timestamp': 1446839961,
'uploader': 'Sean Fay', 'uploader': 'Sean Fay',
'description': 'md5:b1601e2314c4d8eec23b6eafe086a757', 'description': 'md5:b1601e2314c4d8eec23b6eafe086a757',
'uploader_id': 6466954, 'uploader_id': '6466954',
'upload_date': '20151011', 'upload_date': '20151011',
}, },
'add_ie': ['Youtube'], 'add_ie': ['Youtube'],
@ -58,7 +59,7 @@ def _real_extract(self, url):
'id': article_id, 'id': article_id,
'title': article_data['title'], 'title': article_data['title'],
'uploader': article_data.get('author', {}).get('name'), 'uploader': article_data.get('author', {}).get('name'),
'uploader_id': article_data.get('authorId'), 'uploader_id': str_or_none(article_data.get('authorId')),
'timestamp': parse_iso8601(article_data.get('createdAt')), 'timestamp': parse_iso8601(article_data.get('createdAt')),
'thumbnails': thumbnails, 'thumbnails': thumbnails,
'comment_count': int_or_none(article_data.get('commentsCount')), 'comment_count': int_or_none(article_data.get('commentsCount')),

View file

@ -51,7 +51,7 @@ class CeskaTelevizeIE(InfoExtractor):
'url': 'http://www.ceskatelevize.cz/ivysilani/zive/ct4/', 'url': 'http://www.ceskatelevize.cz/ivysilani/zive/ct4/',
'only_matching': True, 'only_matching': True,
'info_dict': { 'info_dict': {
'id': 402, 'id': '402',
'ext': 'mp4', 'ext': 'mp4',
'title': r're:^ČT Sport \d{4}-\d{2}-\d{2} \d{2}:\d{2}$', 'title': r're:^ČT Sport \d{4}-\d{2}-\d{2} \d{2}:\d{2}$',
'is_live': True, 'is_live': True,

View file

@ -17,6 +17,7 @@ class CGTNIE(InfoExtractor):
'thumbnail': r're:^https?://.*\.jpg$', 'thumbnail': r're:^https?://.*\.jpg$',
'timestamp': 1615295940, 'timestamp': 1615295940,
'upload_date': '20210309', 'upload_date': '20210309',
'categories': ['Video'],
}, },
'params': { 'params': {
'skip_download': True 'skip_download': True
@ -29,8 +30,8 @@ class CGTNIE(InfoExtractor):
'title': 'China, Indonesia vow to further deepen maritime cooperation', 'title': 'China, Indonesia vow to further deepen maritime cooperation',
'thumbnail': r're:^https?://.*\.png$', 'thumbnail': r're:^https?://.*\.png$',
'description': 'China and Indonesia vowed to upgrade their cooperation into the maritime sector and also for political security, economy, and cultural and people-to-people exchanges.', 'description': 'China and Indonesia vowed to upgrade their cooperation into the maritime sector and also for political security, economy, and cultural and people-to-people exchanges.',
'author': 'CGTN', 'creators': ['CGTN'],
'category': 'China', 'categories': ['China'],
'timestamp': 1622950200, 'timestamp': 1622950200,
'upload_date': '20210606', 'upload_date': '20210606',
}, },
@ -45,7 +46,12 @@ def _real_extract(self, url):
webpage = self._download_webpage(url, video_id) webpage = self._download_webpage(url, video_id)
download_url = self._html_search_regex(r'data-video ="(?P<url>.+m3u8)"', webpage, 'download_url') download_url = self._html_search_regex(r'data-video ="(?P<url>.+m3u8)"', webpage, 'download_url')
datetime_str = self._html_search_regex(r'<span class="date">\s*(.+?)\s*</span>', webpage, 'datetime_str', fatal=False) datetime_str = self._html_search_regex(
r'<span class="date">\s*(.+?)\s*</span>', webpage, 'datetime_str', fatal=False)
category = self._html_search_regex(
r'<span class="section">\s*(.+?)\s*</span>', webpage, 'category', fatal=False)
author = self._search_regex(
r'<div class="news-author-name">\s*(.+?)\s*</div>', webpage, 'author', default=None)
return { return {
'id': video_id, 'id': video_id,
@ -53,9 +59,7 @@ def _real_extract(self, url):
'description': self._og_search_description(webpage, default=None), 'description': self._og_search_description(webpage, default=None),
'thumbnail': self._og_search_thumbnail(webpage), 'thumbnail': self._og_search_thumbnail(webpage),
'formats': self._extract_m3u8_formats(download_url, video_id, 'mp4', 'm3u8_native', m3u8_id='hls'), 'formats': self._extract_m3u8_formats(download_url, video_id, 'mp4', 'm3u8_native', m3u8_id='hls'),
'category': self._html_search_regex(r'<span class="section">\s*(.+?)\s*</span>', 'categories': [category] if category else None,
webpage, 'category', fatal=False), 'creators': [author] if author else None,
'author': self._html_search_regex(r'<div class="news-author-name">\s*(.+?)\s*</div>',
webpage, 'author', default=None, fatal=False),
'timestamp': try_get(unified_timestamp(datetime_str), lambda x: x - 8 * 3600), 'timestamp': try_get(unified_timestamp(datetime_str), lambda x: x - 8 * 3600),
} }

View file

@ -84,8 +84,6 @@ class ChingariIE(ChingariBaseIE):
'uploader_id': '5f0403982c8bd344f4813f8c', 'uploader_id': '5f0403982c8bd344f4813f8c',
'uploader': 'ISKCON,Inc.', 'uploader': 'ISKCON,Inc.',
'uploader_url': 'https://chingari.io/iskcon,inc', 'uploader_url': 'https://chingari.io/iskcon,inc',
'track': None,
'artist': None,
}, },
'params': {'skip_download': True} 'params': {'skip_download': True}
}] }]
@ -125,8 +123,6 @@ class ChingariUserIE(ChingariBaseIE):
'uploader_id': '5efc4b12cca35c3d1794c2d3', 'uploader_id': '5efc4b12cca35c3d1794c2d3',
'uploader': 'dada (girish) dhawale', 'uploader': 'dada (girish) dhawale',
'uploader_url': 'https://chingari.io/dada1023', 'uploader_url': 'https://chingari.io/dada1023',
'track': None,
'artist': None
}, },
'params': {'skip_download': True} 'params': {'skip_download': True}
}, { }, {
@ -147,8 +143,6 @@ class ChingariUserIE(ChingariBaseIE):
'uploader_id': '5efc4b12cca35c3d1794c2d3', 'uploader_id': '5efc4b12cca35c3d1794c2d3',
'uploader': 'dada (girish) dhawale', 'uploader': 'dada (girish) dhawale',
'uploader_url': 'https://chingari.io/dada1023', 'uploader_url': 'https://chingari.io/dada1023',
'track': None,
'artist': None
}, },
'params': {'skip_download': True} 'params': {'skip_download': True}
}, { }, {
@ -169,8 +163,6 @@ class ChingariUserIE(ChingariBaseIE):
'uploader_id': '5efc4b12cca35c3d1794c2d3', 'uploader_id': '5efc4b12cca35c3d1794c2d3',
'uploader': 'dada (girish) dhawale', 'uploader': 'dada (girish) dhawale',
'uploader_url': 'https://chingari.io/dada1023', 'uploader_url': 'https://chingari.io/dada1023',
'track': None,
'artist': None
}, },
'params': {'skip_download': True} 'params': {'skip_download': True}
}], }],

View file

@ -21,7 +21,7 @@ class CNBCVideoIE(InfoExtractor):
'modified_date': '20231208', 'modified_date': '20231208',
'release_date': '20231207', 'release_date': '20231207',
'duration': 65, 'duration': 65,
'author': 'Sean Conlon', 'creators': ['Sean Conlon'],
'title': 'Here\'s a first look at McDonald\'s new spinoff brand, CosMc\'s', 'title': 'Here\'s a first look at McDonald\'s new spinoff brand, CosMc\'s',
'thumbnail': 'https://image.cnbcfm.com/api/v1/image/107344192-1701894812493-CosMcsskyHero_2336x1040_hero-desktop.jpg?v=1701894855', 'thumbnail': 'https://image.cnbcfm.com/api/v1/image/107344192-1701894812493-CosMcsskyHero_2336x1040_hero-desktop.jpg?v=1701894855',
}, },
@ -29,7 +29,7 @@ class CNBCVideoIE(InfoExtractor):
}, { }, {
'url': 'https://www.cnbc.com/video/2023/12/08/jim-cramer-shares-his-take-on-seattles-tech-scene.html', 'url': 'https://www.cnbc.com/video/2023/12/08/jim-cramer-shares-his-take-on-seattles-tech-scene.html',
'info_dict': { 'info_dict': {
'author': 'Jim Cramer', 'creators': ['Jim Cramer'],
'channel': 'Mad Money with Jim Cramer', 'channel': 'Mad Money with Jim Cramer',
'description': 'md5:72925be21b952e95eba51178dddf4e3e', 'description': 'md5:72925be21b952e95eba51178dddf4e3e',
'duration': 299.0, 'duration': 299.0,
@ -49,7 +49,7 @@ class CNBCVideoIE(InfoExtractor):
}, { }, {
'url': 'https://www.cnbc.com/video/2023/12/08/the-epicenter-of-ai-is-in-seattle-says-jim-cramer.html', 'url': 'https://www.cnbc.com/video/2023/12/08/the-epicenter-of-ai-is-in-seattle-says-jim-cramer.html',
'info_dict': { 'info_dict': {
'author': 'Jim Cramer', 'creators': ['Jim Cramer'],
'channel': 'Mad Money with Jim Cramer', 'channel': 'Mad Money with Jim Cramer',
'description': 'md5:72925be21b952e95eba51178dddf4e3e', 'description': 'md5:72925be21b952e95eba51178dddf4e3e',
'duration': 113.0, 'duration': 113.0,
@ -86,12 +86,12 @@ def _real_extract(self, url):
'id': ('id', {str_or_none}), 'id': ('id', {str_or_none}),
'title': ('title', {str}), 'title': ('title', {str}),
'description': ('description', {str}), 'description': ('description', {str}),
'author': ('author', ..., 'name', {str}), 'creators': ('author', ..., 'name', {str}),
'timestamp': ('datePublished', {parse_iso8601}), 'timestamp': ('datePublished', {parse_iso8601}),
'release_timestamp': ('uploadDate', {parse_iso8601}), 'release_timestamp': ('uploadDate', {parse_iso8601}),
'modified_timestamp': ('dateLastPublished', {parse_iso8601}), 'modified_timestamp': ('dateLastPublished', {parse_iso8601}),
'thumbnail': ('thumbnail', {url_or_none}), 'thumbnail': ('thumbnail', {url_or_none}),
'duration': ('duration', {int_or_none}), 'duration': ('duration', {int_or_none}),
'channel': ('section', 'title', {str}), 'channel': ('section', 'title', {str}),
}, get_all=False), }),
} }

View file

@ -262,7 +262,7 @@ class InfoExtractor:
direct: True if a direct video file was given (must only be set by GenericIE) direct: True if a direct video file was given (must only be set by GenericIE)
alt_title: A secondary title of the video. alt_title: A secondary title of the video.
display_id An alternative identifier for the video, not necessarily display_id: An alternative identifier for the video, not necessarily
unique, but available before title. Typically, id is unique, but available before title. Typically, id is
something like "4234987", title "Dancing naked mole rats", something like "4234987", title "Dancing naked mole rats",
and display_id "dancing-naked-mole-rats" and display_id "dancing-naked-mole-rats"

View file

@ -65,7 +65,7 @@ def is_live(v_type):
'title': title, 'title': title,
'description': str_or_none(content['details'].get('description_%s_t' % (url_lang, ))), 'description': str_or_none(content['details'].get('description_%s_t' % (url_lang, ))),
'timestamp': unified_timestamp(content['details'].get('liveDateTime')), 'timestamp': unified_timestamp(content['details'].get('liveDateTime')),
'category': [category] if category else None, 'categories': [category] if category else None,
'thumbnail': urljoin(url, str_or_none(content['details'].get('image_%s_s' % (url_lang, )))), 'thumbnail': urljoin(url, str_or_none(content['details'].get('image_%s_s' % (url_lang, )))),
'is_live': is_live(content['details'].get('type')), 'is_live': is_live(content['details'].get('type')),
} }

View file

@ -514,7 +514,7 @@ class CrunchyrollMusicIE(CrunchyrollBaseIE):
'track': 'Egaono Hana', 'track': 'Egaono Hana',
'artist': 'Goose house', 'artist': 'Goose house',
'thumbnail': r're:(?i)^https://www.crunchyroll.com/imgsrv/.*\.jpeg?$', 'thumbnail': r're:(?i)^https://www.crunchyroll.com/imgsrv/.*\.jpeg?$',
'genre': ['J-Pop'], 'genres': ['J-Pop'],
}, },
'params': {'skip_download': 'm3u8'}, 'params': {'skip_download': 'm3u8'},
}, { }, {
@ -527,7 +527,7 @@ class CrunchyrollMusicIE(CrunchyrollBaseIE):
'track': 'Crossing Field', 'track': 'Crossing Field',
'artist': 'LiSA', 'artist': 'LiSA',
'thumbnail': r're:(?i)^https://www.crunchyroll.com/imgsrv/.*\.jpeg?$', 'thumbnail': r're:(?i)^https://www.crunchyroll.com/imgsrv/.*\.jpeg?$',
'genre': ['Anime'], 'genres': ['Anime'],
}, },
'params': {'skip_download': 'm3u8'}, 'params': {'skip_download': 'm3u8'},
}, { }, {
@ -541,7 +541,7 @@ class CrunchyrollMusicIE(CrunchyrollBaseIE):
'artist': 'LiSA', 'artist': 'LiSA',
'thumbnail': r're:(?i)^https://www.crunchyroll.com/imgsrv/.*\.jpeg?$', 'thumbnail': r're:(?i)^https://www.crunchyroll.com/imgsrv/.*\.jpeg?$',
'description': 'md5:747444e7e6300907b7a43f0a0503072e', 'description': 'md5:747444e7e6300907b7a43f0a0503072e',
'genre': ['J-Pop'], 'genres': ['J-Pop'],
}, },
'params': {'skip_download': 'm3u8'}, 'params': {'skip_download': 'm3u8'},
}, { }, {
@ -594,7 +594,7 @@ def _transform_music_response(data):
'width': ('width', {int_or_none}), 'width': ('width', {int_or_none}),
'height': ('height', {int_or_none}), 'height': ('height', {int_or_none}),
}), }),
'genre': ('genres', ..., 'displayValue'), 'genres': ('genres', ..., 'displayValue'),
'age_limit': ('maturity_ratings', -1, {parse_age_limit}), 'age_limit': ('maturity_ratings', -1, {parse_age_limit}),
}), }),
} }
@ -611,7 +611,7 @@ class CrunchyrollArtistIE(CrunchyrollBaseIE):
'info_dict': { 'info_dict': {
'id': 'MA179CB50D', 'id': 'MA179CB50D',
'title': 'LiSA', 'title': 'LiSA',
'genre': ['J-Pop', 'Anime', 'Rock'], 'genres': ['J-Pop', 'Anime', 'Rock'],
'description': 'md5:16d87de61a55c3f7d6c454b73285938e', 'description': 'md5:16d87de61a55c3f7d6c454b73285938e',
}, },
'playlist_mincount': 83, 'playlist_mincount': 83,
@ -645,6 +645,6 @@ def _transform_artist_response(data):
'width': ('width', {int_or_none}), 'width': ('width', {int_or_none}),
'height': ('height', {int_or_none}), 'height': ('height', {int_or_none}),
}), }),
'genre': ('genres', ..., 'displayValue'), 'genres': ('genres', ..., 'displayValue'),
}), }),
} }

View file

@ -114,7 +114,7 @@ class CybraryCourseIE(CybraryBaseIE):
_TESTS = [{ _TESTS = [{
'url': 'https://app.cybrary.it/browse/course/az-500-microsoft-azure-security-technologies', 'url': 'https://app.cybrary.it/browse/course/az-500-microsoft-azure-security-technologies',
'info_dict': { 'info_dict': {
'id': 898, 'id': '898',
'title': 'AZ-500: Microsoft Azure Security Technologies', 'title': 'AZ-500: Microsoft Azure Security Technologies',
'description': 'md5:69549d379c0fc1dec92926d4e8b6fbd4' 'description': 'md5:69549d379c0fc1dec92926d4e8b6fbd4'
}, },
@ -122,7 +122,7 @@ class CybraryCourseIE(CybraryBaseIE):
}, { }, {
'url': 'https://app.cybrary.it/browse/course/cybrary-orientation', 'url': 'https://app.cybrary.it/browse/course/cybrary-orientation',
'info_dict': { 'info_dict': {
'id': 1245, 'id': '1245',
'title': 'Cybrary Orientation', 'title': 'Cybrary Orientation',
'description': 'md5:9e69ff66b32fe78744e0ad4babe2e88e' 'description': 'md5:9e69ff66b32fe78744e0ad4babe2e88e'
}, },

View file

@ -83,7 +83,6 @@ class DamtomoRecordIE(DamtomoBaseIE):
'info_dict': { 'info_dict': {
'id': '27376862', 'id': '27376862',
'title': 'イカSUMMER [良音]', 'title': 'イカSUMMER [良音]',
'description': None,
'uploader': '', 'uploader': '',
'uploader_id': 'MzAyMDExNTY', 'uploader_id': 'MzAyMDExNTY',
'upload_date': '20210721', 'upload_date': '20210721',

View file

@ -27,7 +27,7 @@ class DaumIE(DaumBaseIE):
'duration': 2117, 'duration': 2117,
'view_count': int, 'view_count': int,
'comment_count': int, 'comment_count': int,
'uploader_id': 186139, 'uploader_id': '186139',
'uploader': '콘간지', 'uploader': '콘간지',
'timestamp': 1387310323, 'timestamp': 1387310323,
}, },
@ -44,7 +44,7 @@ class DaumIE(DaumBaseIE):
'view_count': int, 'view_count': int,
'comment_count': int, 'comment_count': int,
'uploader': 'MBC 예능', 'uploader': 'MBC 예능',
'uploader_id': 132251, 'uploader_id': '132251',
'timestamp': 1421604228, 'timestamp': 1421604228,
}, },
}, { }, {
@ -63,7 +63,7 @@ class DaumIE(DaumBaseIE):
'view_count': int, 'view_count': int,
'comment_count': int, 'comment_count': int,
'uploader': '까칠한 墮落始祖 황비홍님의', 'uploader': '까칠한 墮落始祖 황비홍님의',
'uploader_id': 560824, 'uploader_id': '560824',
'timestamp': 1203770745, 'timestamp': 1203770745,
}, },
}, { }, {
@ -77,7 +77,7 @@ class DaumIE(DaumBaseIE):
'description': '러블리즈 - Destiny (나의 지구) (Lovelyz - Destiny)\r\n\r\n[쇼! 음악중심] 20160611, 507회', 'description': '러블리즈 - Destiny (나의 지구) (Lovelyz - Destiny)\r\n\r\n[쇼! 음악중심] 20160611, 507회',
'upload_date': '20170129', 'upload_date': '20170129',
'uploader': '쇼! 음악중심', 'uploader': '쇼! 음악중심',
'uploader_id': 2653210, 'uploader_id': '2653210',
'timestamp': 1485684628, 'timestamp': 1485684628,
}, },
}] }]
@ -107,7 +107,7 @@ class DaumClipIE(DaumBaseIE):
'duration': 3868, 'duration': 3868,
'view_count': int, 'view_count': int,
'uploader': 'GOMeXP', 'uploader': 'GOMeXP',
'uploader_id': 6667, 'uploader_id': '6667',
'timestamp': 1377911092, 'timestamp': 1377911092,
}, },
}, { }, {

View file

@ -32,7 +32,7 @@ class DuoplayIE(InfoExtractor):
'season_number': 2, 'season_number': 2,
'episode': 'Operatsioon "Öö"', 'episode': 'Operatsioon "Öö"',
'episode_number': 12, 'episode_number': 12,
'episode_id': 24, 'episode_id': '24',
}, },
}, { }, {
'note': 'Empty title', 'note': 'Empty title',
@ -50,7 +50,7 @@ class DuoplayIE(InfoExtractor):
'series_id': '17', 'series_id': '17',
'season': 'Season 2', 'season': 'Season 2',
'season_number': 2, 'season_number': 2,
'episode_id': 14, 'episode_id': '14',
'release_year': 2010, 'release_year': 2010,
}, },
}, { }, {
@ -99,6 +99,6 @@ def _real_extract(self, url):
'season_number': ('season_id', {int_or_none}), 'season_number': ('season_id', {int_or_none}),
'episode': 'subtitle', 'episode': 'subtitle',
'episode_number': ('episode_nr', {int_or_none}), 'episode_number': ('episode_nr', {int_or_none}),
'episode_id': ('episode_id', {int_or_none}), 'episode_id': ('episode_id', {str_or_none}),
}, get_all=False) if episode_attr.get('category') != 'movies' else {}), }, get_all=False) if episode_attr.get('category') != 'movies' else {}),
} }

View file

@ -42,7 +42,6 @@ class EplusIbIE(InfoExtractor):
'live_status': 'was_live', 'live_status': 'was_live',
'release_date': '20210719', 'release_date': '20210719',
'release_timestamp': 1626703200, 'release_timestamp': 1626703200,
'description': None,
}, },
'params': { 'params': {
'skip_download': True, 'skip_download': True,

View file

@ -301,7 +301,7 @@ class FunimationShowIE(FunimationBaseIE):
_TESTS = [{ _TESTS = [{
'url': 'https://www.funimation.com/en/shows/sk8-the-infinity', 'url': 'https://www.funimation.com/en/shows/sk8-the-infinity',
'info_dict': { 'info_dict': {
'id': 1315000, 'id': '1315000',
'title': 'SK8 the Infinity' 'title': 'SK8 the Infinity'
}, },
'playlist_count': 13, 'playlist_count': 13,
@ -312,7 +312,7 @@ class FunimationShowIE(FunimationBaseIE):
# without lang code # without lang code
'url': 'https://www.funimation.com/shows/ouran-high-school-host-club/', 'url': 'https://www.funimation.com/shows/ouran-high-school-host-club/',
'info_dict': { 'info_dict': {
'id': 39643, 'id': '39643',
'title': 'Ouran High School Host Club' 'title': 'Ouran High School Host Club'
}, },
'playlist_count': 26, 'playlist_count': 26,
@ -339,7 +339,7 @@ def _real_extract(self, url):
return { return {
'_type': 'playlist', '_type': 'playlist',
'id': show_info['id'], 'id': str_or_none(show_info['id']),
'title': show_info['name'], 'title': show_info['name'],
'entries': orderedSet( 'entries': orderedSet(
self.url_result( self.url_result(

View file

@ -19,7 +19,6 @@ class GabTVIE(InfoExtractor):
'id': '61217eacea5665de450d0488', 'id': '61217eacea5665de450d0488',
'ext': 'mp4', 'ext': 'mp4',
'title': 'WHY WAS AMERICA IN AFGHANISTAN - AMERICA FIRST AGAINST AMERICAN OLIGARCHY', 'title': 'WHY WAS AMERICA IN AFGHANISTAN - AMERICA FIRST AGAINST AMERICAN OLIGARCHY',
'description': None,
'uploader': 'Wurzelroot', 'uploader': 'Wurzelroot',
'uploader_id': '608fb0a85738fd1974984f7d', 'uploader_id': '608fb0a85738fd1974984f7d',
'thumbnail': 'https://tv.gab.com/image/61217eacea5665de450d0488', 'thumbnail': 'https://tv.gab.com/image/61217eacea5665de450d0488',

View file

@ -267,9 +267,9 @@ class GameJoltIE(GameJoltBaseIE):
'id': 'dszyjnwi', 'id': 'dszyjnwi',
'ext': 'webm', 'ext': 'webm',
'title': 'gif-presentacion-mejorado-dszyjnwi', 'title': 'gif-presentacion-mejorado-dszyjnwi',
'n_entries': 1,
} }
}] }],
'playlist_count': 1,
}, { }, {
# Multiple GIFs # Multiple GIFs
'url': 'https://gamejolt.com/p/gif-yhsqkumq', 'url': 'https://gamejolt.com/p/gif-yhsqkumq',
@ -374,7 +374,6 @@ class GameJoltGameSoundtrackIE(GameJoltBaseIE):
'info_dict': { 'info_dict': {
'id': '657899', 'id': '657899',
'title': 'Friday Night Funkin\': Vs Oswald', 'title': 'Friday Night Funkin\': Vs Oswald',
'n_entries': None,
}, },
'playlist': [{ 'playlist': [{
'info_dict': { 'info_dict': {
@ -384,7 +383,6 @@ class GameJoltGameSoundtrackIE(GameJoltBaseIE):
'url': r're:^https://.+vs-oswald-menu-music\.mp3$', 'url': r're:^https://.+vs-oswald-menu-music\.mp3$',
'release_timestamp': 1635190816, 'release_timestamp': 1635190816,
'release_date': '20211025', 'release_date': '20211025',
'n_entries': 3,
} }
}, { }, {
'info_dict': { 'info_dict': {
@ -394,7 +392,6 @@ class GameJoltGameSoundtrackIE(GameJoltBaseIE):
'url': r're:^https://.+rabbit-s-luck--full-version-\.mp3$', 'url': r're:^https://.+rabbit-s-luck--full-version-\.mp3$',
'release_timestamp': 1635190841, 'release_timestamp': 1635190841,
'release_date': '20211025', 'release_date': '20211025',
'n_entries': 3,
} }
}, { }, {
'info_dict': { 'info_dict': {
@ -404,9 +401,9 @@ class GameJoltGameSoundtrackIE(GameJoltBaseIE):
'url': r're:^https://.+last-straw\.mp3$', 'url': r're:^https://.+last-straw\.mp3$',
'release_timestamp': 1635881104, 'release_timestamp': 1635881104,
'release_date': '20211102', 'release_date': '20211102',
'n_entries': 3,
} }
}] }],
'playlist_count': 3,
}] }]
def _real_extract(self, url): def _real_extract(self, url):

View file

@ -21,7 +21,6 @@ class GaskrankIE(InfoExtractor):
'display_id': 'strike-einparken-durch-anfaenger-crash-mit-groesserem-flurschaden', 'display_id': 'strike-einparken-durch-anfaenger-crash-mit-groesserem-flurschaden',
'uploader_id': 'Bikefun', 'uploader_id': 'Bikefun',
'upload_date': '20170110', 'upload_date': '20170110',
'uploader_url': None,
} }
}, { }, {
'url': 'http://www.gaskrank.tv/tv/racing/isle-of-man-tt-2011-michael-du-15920.htm', 'url': 'http://www.gaskrank.tv/tv/racing/isle-of-man-tt-2011-michael-du-15920.htm',

View file

@ -115,11 +115,11 @@ class HotStarIE(HotStarBaseIE):
'upload_date': '20190501', 'upload_date': '20190501',
'duration': 1219, 'duration': 1219,
'channel': 'StarPlus', 'channel': 'StarPlus',
'channel_id': 3, 'channel_id': '3',
'series': 'Ek Bhram - Sarvagun Sampanna', 'series': 'Ek Bhram - Sarvagun Sampanna',
'season': 'Chapter 1', 'season': 'Chapter 1',
'season_number': 1, 'season_number': 1,
'season_id': 6771, 'season_id': '6771',
'episode': 'Janhvi Targets Suman', 'episode': 'Janhvi Targets Suman',
'episode_number': 8, 'episode_number': 8,
} }
@ -135,12 +135,12 @@ class HotStarIE(HotStarBaseIE):
'channel': 'StarPlus', 'channel': 'StarPlus',
'series': 'Anupama', 'series': 'Anupama',
'season_number': 1, 'season_number': 1,
'season_id': 7399, 'season_id': '7399',
'upload_date': '20230307', 'upload_date': '20230307',
'episode': 'Anupama, Anuj Share a Moment', 'episode': 'Anupama, Anuj Share a Moment',
'episode_number': 853, 'episode_number': 853,
'duration': 1272, 'duration': 1272,
'channel_id': 3, 'channel_id': '3',
}, },
'skip': 'HTTP Error 504: Gateway Time-out', # XXX: Investigate 504 errors on some episodes 'skip': 'HTTP Error 504: Gateway Time-out', # XXX: Investigate 504 errors on some episodes
}, { }, {
@ -155,12 +155,12 @@ class HotStarIE(HotStarBaseIE):
'channel': 'Hotstar Specials', 'channel': 'Hotstar Specials',
'series': 'Kana Kaanum Kaalangal', 'series': 'Kana Kaanum Kaalangal',
'season_number': 1, 'season_number': 1,
'season_id': 9441, 'season_id': '9441',
'upload_date': '20220421', 'upload_date': '20220421',
'episode': 'Back To School', 'episode': 'Back To School',
'episode_number': 1, 'episode_number': 1,
'duration': 1810, 'duration': 1810,
'channel_id': 54, 'channel_id': '54',
}, },
}, { }, {
'url': 'https://www.hotstar.com/in/clips/e3-sairat-kahani-pyaar-ki/1000262286', 'url': 'https://www.hotstar.com/in/clips/e3-sairat-kahani-pyaar-ki/1000262286',
@ -325,11 +325,11 @@ def _real_extract(self, url):
'formats': formats, 'formats': formats,
'subtitles': subs, 'subtitles': subs,
'channel': video_data.get('channelName'), 'channel': video_data.get('channelName'),
'channel_id': video_data.get('channelId'), 'channel_id': str_or_none(video_data.get('channelId')),
'series': video_data.get('showName'), 'series': video_data.get('showName'),
'season': video_data.get('seasonName'), 'season': video_data.get('seasonName'),
'season_number': int_or_none(video_data.get('seasonNo')), 'season_number': int_or_none(video_data.get('seasonNo')),
'season_id': video_data.get('seasonId'), 'season_id': str_or_none(video_data.get('seasonId')),
'episode': video_data.get('title'), 'episode': video_data.get('title'),
'episode_number': int_or_none(video_data.get('episodeNo')), 'episode_number': int_or_none(video_data.get('episodeNo')),
} }

View file

@ -114,7 +114,6 @@ class HungamaSongIE(InfoExtractor):
'title': 'Lucky Ali - Kitni Haseen Zindagi', 'title': 'Lucky Ali - Kitni Haseen Zindagi',
'track': 'Kitni Haseen Zindagi', 'track': 'Kitni Haseen Zindagi',
'artist': 'Lucky Ali', 'artist': 'Lucky Ali',
'album': None,
'release_year': 2000, 'release_year': 2000,
'thumbnail': 'https://stat2.hungama.ind.in/assets/images/default_images/da-200x200.png', 'thumbnail': 'https://stat2.hungama.ind.in/assets/images/default_images/da-200x200.png',
}, },

View file

@ -9,7 +9,7 @@ class MonsterSirenHypergryphMusicIE(InfoExtractor):
'info_dict': { 'info_dict': {
'id': '514562', 'id': '514562',
'ext': 'wav', 'ext': 'wav',
'artist': ['塞壬唱片-MSR'], 'artists': ['塞壬唱片-MSR'],
'album': 'Flame Shadow', 'album': 'Flame Shadow',
'title': 'Flame Shadow', 'title': 'Flame Shadow',
} }
@ -27,6 +27,6 @@ def _real_extract(self, url):
'url': traverse_obj(json_data, ('player', 'songDetail', 'sourceUrl')), 'url': traverse_obj(json_data, ('player', 'songDetail', 'sourceUrl')),
'ext': 'wav', 'ext': 'wav',
'vcodec': 'none', 'vcodec': 'none',
'artist': traverse_obj(json_data, ('player', 'songDetail', 'artists')), 'artists': traverse_obj(json_data, ('player', 'songDetail', 'artists', ...)),
'album': traverse_obj(json_data, ('musicPlay', 'albumDetail', 'name')) 'album': traverse_obj(json_data, ('musicPlay', 'albumDetail', 'name'))
} }

View file

@ -231,7 +231,6 @@ class LBRYIE(LBRYBaseIE):
'release_timestamp': int, 'release_timestamp': int,
'release_date': str, 'release_date': str,
'tags': list, 'tags': list,
'duration': None,
'channel': 'RT', 'channel': 'RT',
'channel_id': 'fdd11cb3ab75f95efb7b3bc2d726aa13ac915b66', 'channel_id': 'fdd11cb3ab75f95efb7b3bc2d726aa13ac915b66',
'channel_url': 'https://odysee.com/@RT:fdd11cb3ab75f95efb7b3bc2d726aa13ac915b66', 'channel_url': 'https://odysee.com/@RT:fdd11cb3ab75f95efb7b3bc2d726aa13ac915b66',

View file

@ -22,8 +22,6 @@ class LikeeIE(InfoExtractor):
'description': 'md5:9a7ebe816f0e78722ee5ed76f75983b4', 'description': 'md5:9a7ebe816f0e78722ee5ed76f75983b4',
'thumbnail': r're:^https?://.+\.jpg', 'thumbnail': r're:^https?://.+\.jpg',
'uploader': 'Huỳnh Hồng Qu&acirc;n ', 'uploader': 'Huỳnh Hồng Qu&acirc;n ',
'play_count': int,
'download_count': int,
'artist': 'Huỳnh Hồng Qu&acirc;n ', 'artist': 'Huỳnh Hồng Qu&acirc;n ',
'timestamp': 1651571320, 'timestamp': 1651571320,
'upload_date': '20220503', 'upload_date': '20220503',
@ -44,11 +42,9 @@ class LikeeIE(InfoExtractor):
'comment_count': int, 'comment_count': int,
'like_count': int, 'like_count': int,
'uploader': 'Vương Phước Nhi', 'uploader': 'Vương Phước Nhi',
'download_count': int,
'timestamp': 1651506835, 'timestamp': 1651506835,
'upload_date': '20220502', 'upload_date': '20220502',
'duration': 60024, 'duration': 60024,
'play_count': int,
'artist': 'Vương Phước Nhi', 'artist': 'Vương Phước Nhi',
'uploader_id': '649222262', 'uploader_id': '649222262',
'view_count': int, 'view_count': int,
@ -65,9 +61,7 @@ class LikeeIE(InfoExtractor):
'duration': 9684, 'duration': 9684,
'uploader_id': 'fernanda_rivasg', 'uploader_id': 'fernanda_rivasg',
'view_count': int, 'view_count': int,
'play_count': int,
'artist': 'La Cami La✨', 'artist': 'La Cami La✨',
'download_count': int,
'like_count': int, 'like_count': int,
'uploader': 'Fernanda Rivas🎶', 'uploader': 'Fernanda Rivas🎶',
'timestamp': 1614034308, 'timestamp': 1614034308,
@ -83,13 +77,11 @@ class LikeeIE(InfoExtractor):
'thumbnail': r're:^https?://.+\.jpg', 'thumbnail': r're:^https?://.+\.jpg',
'comment_count': int, 'comment_count': int,
'duration': 18014, 'duration': 18014,
'play_count': int,
'view_count': int, 'view_count': int,
'timestamp': 1611694774, 'timestamp': 1611694774,
'like_count': int, 'like_count': int,
'uploader': 'Fernanda Rivas🎶', 'uploader': 'Fernanda Rivas🎶',
'uploader_id': 'fernanda_rivasg', 'uploader_id': 'fernanda_rivasg',
'download_count': int,
'artist': 'ʟᴇʀɪᴋ_ɴɪʀɴ♡', 'artist': 'ʟᴇʀɪᴋ_ɴɪʀɴ♡',
'upload_date': '20210126', 'upload_date': '20210126',
}, },
@ -128,8 +120,6 @@ def _real_extract(self, url):
'description': info.get('share_desc'), 'description': info.get('share_desc'),
'view_count': int_or_none(info.get('video_count')), 'view_count': int_or_none(info.get('video_count')),
'like_count': int_or_none(info.get('likeCount')), 'like_count': int_or_none(info.get('likeCount')),
'play_count': int_or_none(info.get('play_count')),
'download_count': int_or_none(info.get('download_count')),
'comment_count': int_or_none(info.get('comment_count')), 'comment_count': int_or_none(info.get('comment_count')),
'uploader': str_or_none(info.get('nick_name')), 'uploader': str_or_none(info.get('nick_name')),
'uploader_id': str_or_none(info.get('likeeId')), 'uploader_id': str_or_none(info.get('likeeId')),

View file

@ -8,15 +8,15 @@ class MegaphoneIE(InfoExtractor):
_VALID_URL = r'https://player\.megaphone\.fm/(?P<id>[A-Z0-9]+)' _VALID_URL = r'https://player\.megaphone\.fm/(?P<id>[A-Z0-9]+)'
_EMBED_REGEX = [rf'<iframe[^>]*?\ssrc=["\'](?P<url>{_VALID_URL})'] _EMBED_REGEX = [rf'<iframe[^>]*?\ssrc=["\'](?P<url>{_VALID_URL})']
_TEST = { _TEST = {
'url': 'https://player.megaphone.fm/GLT9749789991?"', 'url': 'https://player.megaphone.fm/GLT9749789991',
'md5': '4816a0de523eb3e972dc0dda2c191f96', 'md5': '4816a0de523eb3e972dc0dda2c191f96',
'info_dict': { 'info_dict': {
'id': 'GLT9749789991', 'id': 'GLT9749789991',
'ext': 'mp3', 'ext': 'mp3',
'title': '#97 What Kind Of Idiot Gets Phished?', 'title': '#97 What Kind Of Idiot Gets Phished?',
'thumbnail': r're:^https://.*\.png.*$', 'thumbnail': r're:^https://.*\.png.*$',
'duration': 1776.26375, 'duration': 1998.36,
'author': 'Reply All', 'creators': ['Reply All'],
}, },
} }
@ -40,7 +40,7 @@ def _real_extract(self, url):
'id': video_id, 'id': video_id,
'thumbnail': thumbnail, 'thumbnail': thumbnail,
'title': title, 'title': title,
'author': author, 'creators': [author] if author else None,
'duration': episode_data['duration'], 'duration': episode_data['duration'],
'formats': formats, 'formats': formats,
} }

View file

@ -17,11 +17,11 @@ def _return_info(self, track_json, album_json, id):
'track_number': track_json.get('number'), 'track_number': track_json.get('number'),
'url': format_field(track_json, 'url', 'https://www.musicdex.org/%s'), 'url': format_field(track_json, 'url', 'https://www.musicdex.org/%s'),
'duration': track_json.get('duration'), 'duration': track_json.get('duration'),
'genre': [genre.get('name') for genre in track_json.get('genres') or []], 'genres': [genre.get('name') for genre in track_json.get('genres') or []],
'like_count': track_json.get('likes_count'), 'like_count': track_json.get('likes_count'),
'view_count': track_json.get('plays'), 'view_count': track_json.get('plays'),
'artist': [artist.get('name') for artist in track_json.get('artists') or []], 'artists': [artist.get('name') for artist in track_json.get('artists') or []],
'album_artist': [artist.get('name') for artist in album_json.get('artists') or []], 'album_artists': [artist.get('name') for artist in album_json.get('artists') or []],
'thumbnail': format_field(album_json, 'image', 'https://www.musicdex.org/%s'), 'thumbnail': format_field(album_json, 'image', 'https://www.musicdex.org/%s'),
'album': album_json.get('name'), 'album': album_json.get('name'),
'release_year': try_get(album_json, lambda x: date_from_str(unified_strdate(x['release_date'])).year), 'release_year': try_get(album_json, lambda x: date_from_str(unified_strdate(x['release_date'])).year),
@ -43,11 +43,11 @@ class MusicdexSongIE(MusicdexBaseIE):
'track': 'dual existence', 'track': 'dual existence',
'track_number': 1, 'track_number': 1,
'duration': 266000, 'duration': 266000,
'genre': ['Anime'], 'genres': ['Anime'],
'like_count': int, 'like_count': int,
'view_count': int, 'view_count': int,
'artist': ['fripSide'], 'artists': ['fripSide'],
'album_artist': ['fripSide'], 'album_artists': ['fripSide'],
'thumbnail': 'https://www.musicdex.org/storage/album/9iDIam1DHTVqUG4UclFIEq1WAFGXfPW4y0TtZa91.png', 'thumbnail': 'https://www.musicdex.org/storage/album/9iDIam1DHTVqUG4UclFIEq1WAFGXfPW4y0TtZa91.png',
'album': 'To Aru Kagaku no Railgun T OP2 Single - dual existence', 'album': 'To Aru Kagaku no Railgun T OP2 Single - dual existence',
'release_year': 2020 'release_year': 2020
@ -69,9 +69,9 @@ class MusicdexAlbumIE(MusicdexBaseIE):
'playlist_mincount': 28, 'playlist_mincount': 28,
'info_dict': { 'info_dict': {
'id': '56', 'id': '56',
'genre': ['OST'], 'genres': ['OST'],
'view_count': int, 'view_count': int,
'artist': ['TENMON & Eiichiro Yanagi / minori'], 'artists': ['TENMON & Eiichiro Yanagi / minori'],
'title': 'ef - a tale of memories Original Soundtrack 2 ~fortissimo~', 'title': 'ef - a tale of memories Original Soundtrack 2 ~fortissimo~',
'release_year': 2008, 'release_year': 2008,
'thumbnail': 'https://www.musicdex.org/storage/album/2rSHkyYBYfB7sbvElpEyTMcUn6toY7AohOgJuDlE.jpg', 'thumbnail': 'https://www.musicdex.org/storage/album/2rSHkyYBYfB7sbvElpEyTMcUn6toY7AohOgJuDlE.jpg',
@ -88,9 +88,9 @@ def _real_extract(self, url):
'id': id, 'id': id,
'title': data_json.get('name'), 'title': data_json.get('name'),
'description': data_json.get('description'), 'description': data_json.get('description'),
'genre': [genre.get('name') for genre in data_json.get('genres') or []], 'genres': [genre.get('name') for genre in data_json.get('genres') or []],
'view_count': data_json.get('plays'), 'view_count': data_json.get('plays'),
'artist': [artist.get('name') for artist in data_json.get('artists') or []], 'artists': [artist.get('name') for artist in data_json.get('artists') or []],
'thumbnail': format_field(data_json, 'image', 'https://www.musicdex.org/%s'), 'thumbnail': format_field(data_json, 'image', 'https://www.musicdex.org/%s'),
'release_year': try_get(data_json, lambda x: date_from_str(unified_strdate(x['release_date'])).year), 'release_year': try_get(data_json, lambda x: date_from_str(unified_strdate(x['release_date'])).year),
'entries': entries, 'entries': entries,

View file

@ -118,7 +118,6 @@ class NekoHackerIE(InfoExtractor):
'artist': 'Neko Hacker', 'artist': 'Neko Hacker',
'track': 'md5:1a5fcbc96ca3c3265b1c6f9f79f30fd0', 'track': 'md5:1a5fcbc96ca3c3265b1c6f9f79f30fd0',
'track_number': 1, 'track_number': 1,
'duration': None
} }
}, },
{ {
@ -136,7 +135,6 @@ class NekoHackerIE(InfoExtractor):
'artist': 'Neko Hacker', 'artist': 'Neko Hacker',
'track': 'むじな de なじむ feat. 六科なじむ (CV: 日高里菜 )', 'track': 'むじな de なじむ feat. 六科なじむ (CV: 日高里菜 )',
'track_number': 2, 'track_number': 2,
'duration': None
} }
}, },
{ {
@ -154,7 +152,6 @@ class NekoHackerIE(InfoExtractor):
'artist': 'Neko Hacker', 'artist': 'Neko Hacker',
'track': '進め!むじなカンパニー (instrumental)', 'track': '進め!むじなカンパニー (instrumental)',
'track_number': 3, 'track_number': 3,
'duration': None
} }
}, },
{ {
@ -172,7 +169,6 @@ class NekoHackerIE(InfoExtractor):
'artist': 'Neko Hacker', 'artist': 'Neko Hacker',
'track': 'むじな de なじむ (instrumental)', 'track': 'むじな de なじむ (instrumental)',
'track_number': 4, 'track_number': 4,
'duration': None
} }
} }
] ]

View file

@ -163,8 +163,6 @@ class NiconicoIE(InfoExtractor):
'description': 'md5:15df8988e47a86f9e978af2064bf6d8e', 'description': 'md5:15df8988e47a86f9e978af2064bf6d8e',
'timestamp': 1341128008, 'timestamp': 1341128008,
'upload_date': '20120701', 'upload_date': '20120701',
'uploader': None,
'uploader_id': None,
'thumbnail': r're:https?://.*', 'thumbnail': r're:https?://.*',
'duration': 5271, 'duration': 5271,
'view_count': int, 'view_count': int,

View file

@ -3,6 +3,7 @@
float_or_none, float_or_none,
int_or_none, int_or_none,
parse_iso8601, parse_iso8601,
str_or_none,
try_get, try_get,
) )
@ -73,7 +74,7 @@ def _real_extract(self, url):
'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': int_or_none(season.get('Number')), 'season_number': int_or_none(season.get('Number')),
'season_id': season.get('Id'), 'season_id': str_or_none(season.get('Id')),
'series': try_get(content, lambda x: x['Media']['Name']), 'series': try_get(content, lambda x: x['Media']['Name']),
'tags': tags, 'tags': tags,
'categories': categories, 'categories': categories,
@ -109,10 +110,9 @@ class CPTwentyFourIE(InfoExtractor):
'title': 'WATCH: Truck rips ATM from Mississauga business', 'title': 'WATCH: Truck rips ATM from Mississauga business',
'description': 'md5:cf7498480885f080a754389a2b2f7073', 'description': 'md5:cf7498480885f080a754389a2b2f7073',
'timestamp': 1637618377, 'timestamp': 1637618377,
'episode_number': None,
'season': 'Season 0', 'season': 'Season 0',
'season_number': 0, 'season_number': 0,
'season_id': 57974, 'season_id': '57974',
'series': 'CTV News Toronto', 'series': 'CTV News Toronto',
'duration': 26.86, 'duration': 26.86,
'thumbnail': 'http://images2.9c9media.com/image_asset/2014_11_5_2eb609a0-475b-0132-fbd6-34b52f6f1279_jpg_2000x1125.jpg', 'thumbnail': 'http://images2.9c9media.com/image_asset/2014_11_5_2eb609a0-475b-0132-fbd6-34b52f6f1279_jpg_2000x1125.jpg',

View file

@ -18,7 +18,6 @@ class NovaPlayIE(InfoExtractor):
'upload_date': '20220722', 'upload_date': '20220722',
'thumbnail': 'https://nbg-img.fite.tv/img/606627_460x260.jpg', 'thumbnail': 'https://nbg-img.fite.tv/img/606627_460x260.jpg',
'description': '29 сек', 'description': '29 сек',
'view_count': False
}, },
}, },
{ {
@ -34,7 +33,6 @@ class NovaPlayIE(InfoExtractor):
'upload_date': '20220722', 'upload_date': '20220722',
'thumbnail': 'https://nbg-img.fite.tv/img/606609_460x260.jpg', 'thumbnail': 'https://nbg-img.fite.tv/img/606609_460x260.jpg',
'description': '29 сек', 'description': '29 сек',
'view_count': False
}, },
} }
] ]

View file

@ -11,6 +11,7 @@
join_nonempty, join_nonempty,
parse_age_limit, parse_age_limit,
parse_qs, parse_qs,
str_or_none,
unified_strdate, unified_strdate,
url_or_none, url_or_none,
) )
@ -32,7 +33,7 @@ class OnDemandKoreaIE(InfoExtractor):
'duration': 5486.955, 'duration': 5486.955,
'release_date': '20220924', 'release_date': '20220924',
'series': 'Ask Us Anything', 'series': 'Ask Us Anything',
'series_id': 11790, 'series_id': '11790',
'episode_number': 351, 'episode_number': 351,
'episode': 'Jung Sung-ho, Park Seul-gi, Kim Bo-min, Yang Seung-won', 'episode': 'Jung Sung-ho, Park Seul-gi, Kim Bo-min, Yang Seung-won',
}, },
@ -47,7 +48,7 @@ class OnDemandKoreaIE(InfoExtractor):
'duration': 1586.0, 'duration': 1586.0,
'release_date': '20231001', 'release_date': '20231001',
'series': 'Breakup Probation, A Week', 'series': 'Breakup Probation, A Week',
'series_id': 22912, 'series_id': '22912',
'episode_number': 8, 'episode_number': 8,
'episode': 'E08', 'episode': 'E08',
}, },
@ -117,7 +118,7 @@ def if_series(key=None):
'duration': ('duration', {functools.partial(float_or_none, scale=1000)}), 'duration': ('duration', {functools.partial(float_or_none, scale=1000)}),
'age_limit': ('age_rating', 'name', {lambda x: x.replace('R', '')}, {parse_age_limit}), 'age_limit': ('age_rating', 'name', {lambda x: x.replace('R', '')}, {parse_age_limit}),
'series': ('episode', {if_series(key='program')}, 'title'), 'series': ('episode', {if_series(key='program')}, 'title'),
'series_id': ('episode', {if_series(key='program')}, 'id'), 'series_id': ('episode', {if_series(key='program')}, 'id', {str_or_none}),
'episode': ('episode', {if_series(key='title')}), 'episode': ('episode', {if_series(key='title')}),
'episode_number': ('episode', {if_series(key='number')}, {int_or_none}), 'episode_number': ('episode', {if_series(key='number')}, {int_or_none}),
}, get_all=False), }, get_all=False),

View file

@ -49,7 +49,6 @@ class ORFTVthekIE(InfoExtractor):
'url': 'https://tvthek.orf.at/profile/ZIB-2/1211/ZIB-2/14121079/Umfrage-Welches-Tier-ist-Sebastian-Kurz/15083150', 'url': 'https://tvthek.orf.at/profile/ZIB-2/1211/ZIB-2/14121079/Umfrage-Welches-Tier-ist-Sebastian-Kurz/15083150',
'info_dict': { 'info_dict': {
'id': '14121079', 'id': '14121079',
'playlist_count': 1
}, },
'playlist': [{ 'playlist': [{
'info_dict': { 'info_dict': {

View file

@ -157,7 +157,6 @@ class PlayVidsIE(PeekVidsBaseIE):
'display_id': '47iUho33toY', 'display_id': '47iUho33toY',
'ext': 'mp4', 'ext': 'mp4',
'title': 'KATEE OWEN STRIPTIASE IN SEXY RED LINGERIE', 'title': 'KATEE OWEN STRIPTIASE IN SEXY RED LINGERIE',
'description': None,
'timestamp': 1507052209, 'timestamp': 1507052209,
'upload_date': '20171003', 'upload_date': '20171003',
'thumbnail': r're:^https?://.*\.jpg$', 'thumbnail': r're:^https?://.*\.jpg$',
@ -176,7 +175,6 @@ class PlayVidsIE(PeekVidsBaseIE):
'display_id': 'z3_7iwWCmqt', 'display_id': 'z3_7iwWCmqt',
'ext': 'mp4', 'ext': 'mp4',
'title': 'SEXY TEEN FILIPINA STRIPTEASE - Beautiful Pinay Bargirl Strips and Dances', 'title': 'SEXY TEEN FILIPINA STRIPTEASE - Beautiful Pinay Bargirl Strips and Dances',
'description': None,
'timestamp': 1607470323, 'timestamp': 1607470323,
'upload_date': '20201208', 'upload_date': '20201208',
'thumbnail': r're:^https?://.*\.jpg$', 'thumbnail': r're:^https?://.*\.jpg$',

View file

@ -35,7 +35,6 @@ class PladformIE(InfoExtractor):
'thumbnail': str, 'thumbnail': str,
'view_count': int, 'view_count': int,
'description': str, 'description': str,
'category': list,
'uploader_id': '12082', 'uploader_id': '12082',
'uploader': 'Comedy Club', 'uploader': 'Comedy Club',
'duration': 367, 'duration': 367,

View file

@ -20,7 +20,6 @@ class PlanetMarathiIE(InfoExtractor):
'title': 'ek unad divas', 'title': 'ek unad divas',
'alt_title': 'चित्रपट', 'alt_title': 'चित्रपट',
'description': 'md5:41c7ed6b041c2fea9820a3f3125bd881', 'description': 'md5:41c7ed6b041c2fea9820a3f3125bd881',
'season_number': None,
'episode_number': 1, 'episode_number': 1,
'duration': 5539, 'duration': 5539,
'upload_date': '20210829', 'upload_date': '20210829',

View file

@ -29,7 +29,7 @@ class PodchaserIE(InfoExtractor):
'duration': 3708, 'duration': 3708,
'timestamp': 1636531259, 'timestamp': 1636531259,
'upload_date': '20211110', 'upload_date': '20211110',
'rating': 4.0 'average_rating': 4.0
} }
}, { }, {
'url': 'https://www.podchaser.com/podcasts/the-bone-zone-28853', 'url': 'https://www.podchaser.com/podcasts/the-bone-zone-28853',
@ -59,7 +59,7 @@ def _parse_episode(episode, podcast):
'thumbnail': episode.get('image_url'), 'thumbnail': episode.get('image_url'),
'duration': str_to_int(episode.get('length')), 'duration': str_to_int(episode.get('length')),
'timestamp': unified_timestamp(episode.get('air_date')), 'timestamp': unified_timestamp(episode.get('air_date')),
'rating': float_or_none(episode.get('rating')), 'average_rating': float_or_none(episode.get('rating')),
'categories': list(set(traverse_obj(podcast, (('summary', None), 'categories', ..., 'text')))), 'categories': list(set(traverse_obj(podcast, (('summary', None), 'categories', ..., 'text')))),
'tags': traverse_obj(podcast, ('tags', ..., 'text')), 'tags': traverse_obj(podcast, ('tags', ..., 'text')),
'series': podcast.get('title'), 'series': podcast.get('title'),

View file

@ -1,5 +1,4 @@
import json import json
from datetime import date
from urllib.parse import unquote from urllib.parse import unquote
from .common import InfoExtractor from .common import InfoExtractor
@ -10,6 +9,7 @@
int_or_none, int_or_none,
make_archive_id, make_archive_id,
mimetype2ext, mimetype2ext,
str_or_none,
urljoin, urljoin,
) )
from ..utils.traversal import traverse_obj from ..utils.traversal import traverse_obj
@ -25,8 +25,8 @@ class Pr0grammIE(InfoExtractor):
'title': 'pr0gramm-5466437 by g11st', 'title': 'pr0gramm-5466437 by g11st',
'tags': ['Neon Genesis Evangelion', 'Touhou Project', 'Fly me to the Moon', 'Marisad', 'Marisa Kirisame', 'video', 'sound', 'Marisa', 'Anime'], 'tags': ['Neon Genesis Evangelion', 'Touhou Project', 'Fly me to the Moon', 'Marisad', 'Marisa Kirisame', 'video', 'sound', 'Marisa', 'Anime'],
'uploader': 'g11st', 'uploader': 'g11st',
'uploader_id': 394718, 'uploader_id': '394718',
'upload_timestamp': 1671590240, 'timestamp': 1671590240,
'upload_date': '20221221', 'upload_date': '20221221',
'like_count': int, 'like_count': int,
'dislike_count': int, 'dislike_count': int,
@ -42,8 +42,8 @@ class Pr0grammIE(InfoExtractor):
'title': 'pr0gramm-3052805 by Hansking1', 'title': 'pr0gramm-3052805 by Hansking1',
'tags': 'count:15', 'tags': 'count:15',
'uploader': 'Hansking1', 'uploader': 'Hansking1',
'uploader_id': 385563, 'uploader_id': '385563',
'upload_timestamp': 1552930408, 'timestamp': 1552930408,
'upload_date': '20190318', 'upload_date': '20190318',
'like_count': int, 'like_count': int,
'dislike_count': int, 'dislike_count': int,
@ -60,8 +60,8 @@ class Pr0grammIE(InfoExtractor):
'title': 'pr0gramm-5848332 by erd0pfel', 'title': 'pr0gramm-5848332 by erd0pfel',
'tags': 'count:18', 'tags': 'count:18',
'uploader': 'erd0pfel', 'uploader': 'erd0pfel',
'uploader_id': 349094, 'uploader_id': '349094',
'upload_timestamp': 1694489652, 'timestamp': 1694489652,
'upload_date': '20230912', 'upload_date': '20230912',
'like_count': int, 'like_count': int,
'dislike_count': int, 'dislike_count': int,
@ -77,8 +77,8 @@ class Pr0grammIE(InfoExtractor):
'title': 'pr0gramm-5895149 by algoholigSeeManThrower', 'title': 'pr0gramm-5895149 by algoholigSeeManThrower',
'tags': 'count:19', 'tags': 'count:19',
'uploader': 'algoholigSeeManThrower', 'uploader': 'algoholigSeeManThrower',
'uploader_id': 457556, 'uploader_id': '457556',
'upload_timestamp': 1697580902, 'timestamp': 1697580902,
'upload_date': '20231018', 'upload_date': '20231018',
'like_count': int, 'like_count': int,
'dislike_count': int, 'dislike_count': int,
@ -192,11 +192,10 @@ def _real_extract(self, url):
'_old_archive_ids': [make_archive_id('Pr0grammStatic', video_id)], '_old_archive_ids': [make_archive_id('Pr0grammStatic', video_id)],
**traverse_obj(video_info, { **traverse_obj(video_info, {
'uploader': ('user', {str}), 'uploader': ('user', {str}),
'uploader_id': ('userId', {int}), 'uploader_id': ('userId', {str_or_none}),
'like_count': ('up', {int}), 'like_count': ('up', {int}),
'dislike_count': ('down', {int}), 'dislike_count': ('down', {int}),
'upload_timestamp': ('created', {int}), 'timestamp': ('created', {int}),
'upload_date': ('created', {int}, {date.fromtimestamp}, {lambda x: x.strftime('%Y%m%d')}),
'thumbnail': ('thumb', {lambda x: urljoin('https://thumb.pr0gramm.com', x)}) 'thumbnail': ('thumb', {lambda x: urljoin('https://thumb.pr0gramm.com', x)})
}), }),
} }

View file

@ -16,7 +16,7 @@ class PrankCastIE(InfoExtractor):
'display_id': 'Beverly-is-back-like-a-heart-attack-', 'display_id': 'Beverly-is-back-like-a-heart-attack-',
'timestamp': 1661391575, 'timestamp': 1661391575,
'uploader': 'Devonanustart', 'uploader': 'Devonanustart',
'channel_id': 4, 'channel_id': '4',
'duration': 7918, 'duration': 7918,
'cast': ['Devonanustart', 'Phonelosers'], 'cast': ['Devonanustart', 'Phonelosers'],
'description': '', 'description': '',
@ -33,7 +33,7 @@ class PrankCastIE(InfoExtractor):
'display_id': 'NOT-COOL', 'display_id': 'NOT-COOL',
'timestamp': 1665028364, 'timestamp': 1665028364,
'uploader': 'phonelosers', 'uploader': 'phonelosers',
'channel_id': 6, 'channel_id': '6',
'duration': 4044, 'duration': 4044,
'cast': ['phonelosers'], 'cast': ['phonelosers'],
'description': '', 'description': '',
@ -60,7 +60,7 @@ def _real_extract(self, url):
'url': f'{json_info["broadcast_url"]}{json_info["recording_hash"]}.mp3', 'url': f'{json_info["broadcast_url"]}{json_info["recording_hash"]}.mp3',
'timestamp': start_date, 'timestamp': start_date,
'uploader': uploader, 'uploader': uploader,
'channel_id': json_info.get('user_id'), 'channel_id': str_or_none(json_info.get('user_id')),
'duration': try_call(lambda: parse_iso8601(json_info['end_date']) - start_date), 'duration': try_call(lambda: parse_iso8601(json_info['end_date']) - start_date),
'cast': list(filter(None, [uploader] + traverse_obj(guests_json, (..., 'name')))), 'cast': list(filter(None, [uploader] + traverse_obj(guests_json, (..., 'name')))),
'description': json_info.get('broadcast_description'), 'description': json_info.get('broadcast_description'),

View file

@ -30,7 +30,8 @@ class RadioComercialIE(InfoExtractor):
'title': 'Taylor Swift entranhando-se que nem uma espada no ventre dos fãs.', 'title': 'Taylor Swift entranhando-se que nem uma espada no ventre dos fãs.',
'release_date': '20231025', 'release_date': '20231025',
'thumbnail': r're:https://radiocomercial.pt/upload/[^.]+.jpg', 'thumbnail': r're:https://radiocomercial.pt/upload/[^.]+.jpg',
'season': 6 'season': 'Season 6',
'season_number': 6,
} }
}, { }, {
'url': 'https://radiocomercial.pt/podcasts/convenca-me-num-minuto/t3/convenca-me-num-minuto-que-os-lobisomens-existem', 'url': 'https://radiocomercial.pt/podcasts/convenca-me-num-minuto/t3/convenca-me-num-minuto-que-os-lobisomens-existem',
@ -41,7 +42,8 @@ class RadioComercialIE(InfoExtractor):
'title': 'Convença-me num minuto que os lobisomens existem', 'title': 'Convença-me num minuto que os lobisomens existem',
'release_date': '20231026', 'release_date': '20231026',
'thumbnail': r're:https://radiocomercial.pt/upload/[^.]+.jpg', 'thumbnail': r're:https://radiocomercial.pt/upload/[^.]+.jpg',
'season': 3 'season': 'Season 3',
'season_number': 3,
} }
}, { }, {
'url': 'https://radiocomercial.pt/podcasts/inacreditavel-by-ines-castel-branco/t2/o-desastre-de-aviao', 'url': 'https://radiocomercial.pt/podcasts/inacreditavel-by-ines-castel-branco/t2/o-desastre-de-aviao',
@ -53,7 +55,8 @@ class RadioComercialIE(InfoExtractor):
'description': 'md5:8a82beeb372641614772baab7246245f', 'description': 'md5:8a82beeb372641614772baab7246245f',
'release_date': '20231101', 'release_date': '20231101',
'thumbnail': r're:https://radiocomercial.pt/upload/[^.]+.jpg', 'thumbnail': r're:https://radiocomercial.pt/upload/[^.]+.jpg',
'season': 2 'season': 'Season 2',
'season_number': 2,
}, },
'params': { 'params': {
# inconsistant md5 # inconsistant md5
@ -68,7 +71,8 @@ class RadioComercialIE(InfoExtractor):
'title': 'T.N.T 29 de outubro', 'title': 'T.N.T 29 de outubro',
'release_date': '20231029', 'release_date': '20231029',
'thumbnail': r're:https://radiocomercial.pt/upload/[^.]+.jpg', 'thumbnail': r're:https://radiocomercial.pt/upload/[^.]+.jpg',
'season': 2023 'season': 'Season 2023',
'season_number': 2023,
} }
}] }]
@ -82,7 +86,7 @@ def _real_extract(self, url):
'release_date': unified_strdate(get_element_by_class( 'release_date': unified_strdate(get_element_by_class(
'date', get_element_html_by_class('descriptions', webpage) or '')), 'date', get_element_html_by_class('descriptions', webpage) or '')),
'thumbnail': self._og_search_thumbnail(webpage), 'thumbnail': self._og_search_thumbnail(webpage),
'season': int_or_none(season), 'season_number': int_or_none(season),
'url': extract_attributes(get_element_html_by_class('audiofile', webpage) or '').get('href'), 'url': extract_attributes(get_element_html_by_class('audiofile', webpage) or '').get('href'),
} }

View file

@ -38,10 +38,6 @@ class RadLiveIE(InfoExtractor):
'language': 'en', 'language': 'en',
'thumbnail': 'https://lsp.littlstar.com/channels/WHISTLE/BAD_JOKES/SEASON_1/BAD_JOKES_101/poster.jpg', 'thumbnail': 'https://lsp.littlstar.com/channels/WHISTLE/BAD_JOKES/SEASON_1/BAD_JOKES_101/poster.jpg',
'description': 'Bad Jokes - Champions, Adam Pally, Super Troopers, Team Edge and 2Hype', 'description': 'Bad Jokes - Champions, Adam Pally, Super Troopers, Team Edge and 2Hype',
'release_timestamp': None,
'channel': None,
'channel_id': None,
'channel_url': None,
'episode': 'E01: Bad Jokes 1', 'episode': 'E01: Bad Jokes 1',
'episode_number': 1, 'episode_number': 1,
'episode_id': '336', 'episode_id': '336',

View file

@ -229,7 +229,7 @@ class RCTIPlusSeriesIE(RCTIPlusBaseIE):
'age_limit': 2, 'age_limit': 2,
'cast': ['Verrel Bramasta', 'Ranty Maria', 'Riza Syah', 'Ivan Fadilla', 'Nicole Parham', 'Dll', 'Aviv Elham'], 'cast': ['Verrel Bramasta', 'Ranty Maria', 'Riza Syah', 'Ivan Fadilla', 'Nicole Parham', 'Dll', 'Aviv Elham'],
'display_id': 'putri-untuk-pangeran', 'display_id': 'putri-untuk-pangeran',
'tag': 'count:18', 'tags': 'count:18',
}, },
}, { # No episodes }, { # No episodes
'url': 'https://www.rctiplus.com/programs/615/inews-pagi', 'url': 'https://www.rctiplus.com/programs/615/inews-pagi',
@ -239,7 +239,7 @@ class RCTIPlusSeriesIE(RCTIPlusBaseIE):
'title': 'iNews Pagi', 'title': 'iNews Pagi',
'description': 'md5:f18ee3d4643cfb41c358e5a9b693ee04', 'description': 'md5:f18ee3d4643cfb41c358e5a9b693ee04',
'age_limit': 2, 'age_limit': 2,
'tag': 'count:11', 'tags': 'count:11',
'display_id': 'inews-pagi', 'display_id': 'inews-pagi',
} }
}] }]
@ -327,8 +327,8 @@ def _real_extract(self, url):
'age_limit': try_get(series_meta, lambda x: self._AGE_RATINGS[x['age_restriction'][0]['code']]), 'age_limit': try_get(series_meta, lambda x: self._AGE_RATINGS[x['age_restriction'][0]['code']]),
'cast': traverse_obj(series_meta, (('starring', 'creator', 'writer'), ..., 'name'), 'cast': traverse_obj(series_meta, (('starring', 'creator', 'writer'), ..., 'name'),
expected_type=lambda x: strip_or_none(x) or None), expected_type=lambda x: strip_or_none(x) or None),
'tag': traverse_obj(series_meta, ('tag', ..., 'name'), 'tags': traverse_obj(series_meta, ('tag', ..., 'name'),
expected_type=lambda x: strip_or_none(x) or None), expected_type=lambda x: strip_or_none(x) or None),
} }
return self.playlist_result( return self.playlist_result(
self._series_entries(series_id, display_id, video_type, metadata), series_id, self._series_entries(series_id, display_id, video_type, metadata), series_id,

View file

@ -38,7 +38,7 @@ class RokfinIE(InfoExtractor):
'upload_date': '20211023', 'upload_date': '20211023',
'timestamp': 1634998029, 'timestamp': 1634998029,
'channel': 'Jimmy Dore', 'channel': 'Jimmy Dore',
'channel_id': 65429, 'channel_id': '65429',
'channel_url': 'https://rokfin.com/TheJimmyDoreShow', 'channel_url': 'https://rokfin.com/TheJimmyDoreShow',
'availability': 'public', 'availability': 'public',
'live_status': 'not_live', 'live_status': 'not_live',
@ -56,7 +56,7 @@ class RokfinIE(InfoExtractor):
'upload_date': '20190412', 'upload_date': '20190412',
'timestamp': 1555052644, 'timestamp': 1555052644,
'channel': 'Ron Placone', 'channel': 'Ron Placone',
'channel_id': 10, 'channel_id': '10',
'channel_url': 'https://rokfin.com/RonPlacone', 'channel_url': 'https://rokfin.com/RonPlacone',
'availability': 'public', 'availability': 'public',
'live_status': 'not_live', 'live_status': 'not_live',
@ -73,7 +73,7 @@ class RokfinIE(InfoExtractor):
'thumbnail': r're:https://img\.production\.rokfin\.com/.+', 'thumbnail': r're:https://img\.production\.rokfin\.com/.+',
'description': 'md5:324ce2d3e3b62e659506409e458b9d8e', 'description': 'md5:324ce2d3e3b62e659506409e458b9d8e',
'channel': 'TLAVagabond', 'channel': 'TLAVagabond',
'channel_id': 53856, 'channel_id': '53856',
'channel_url': 'https://rokfin.com/TLAVagabond', 'channel_url': 'https://rokfin.com/TLAVagabond',
'availability': 'public', 'availability': 'public',
'is_live': False, 'is_live': False,
@ -86,7 +86,6 @@ class RokfinIE(InfoExtractor):
'dislike_count': int, 'dislike_count': int,
'like_count': int, 'like_count': int,
'tags': ['FreeThinkingMedia^'], 'tags': ['FreeThinkingMedia^'],
'duration': None,
} }
}, { }, {
'url': 'https://rokfin.com/post/126703/Brave-New-World--Aldous-Huxley-DEEPDIVE--Chpts-13--Quite-Frankly--Jay-Dyer', 'url': 'https://rokfin.com/post/126703/Brave-New-World--Aldous-Huxley-DEEPDIVE--Chpts-13--Quite-Frankly--Jay-Dyer',
@ -96,7 +95,7 @@ class RokfinIE(InfoExtractor):
'title': 'Brave New World - Aldous Huxley DEEPDIVE! (Chpts 1-3) - Quite Frankly & Jay Dyer', 'title': 'Brave New World - Aldous Huxley DEEPDIVE! (Chpts 1-3) - Quite Frankly & Jay Dyer',
'thumbnail': r're:https://img\.production\.rokfin\.com/.+', 'thumbnail': r're:https://img\.production\.rokfin\.com/.+',
'channel': 'Jay Dyer', 'channel': 'Jay Dyer',
'channel_id': 186881, 'channel_id': '186881',
'channel_url': 'https://rokfin.com/jaydyer', 'channel_url': 'https://rokfin.com/jaydyer',
'availability': 'premium_only', 'availability': 'premium_only',
'live_status': 'not_live', 'live_status': 'not_live',
@ -116,7 +115,7 @@ class RokfinIE(InfoExtractor):
'title': 'The Grayzone live on Nordstream blame game', 'title': 'The Grayzone live on Nordstream blame game',
'thumbnail': r're:https://image\.v\.rokfin\.com/.+', 'thumbnail': r're:https://image\.v\.rokfin\.com/.+',
'channel': 'Max Blumenthal', 'channel': 'Max Blumenthal',
'channel_id': 248902, 'channel_id': '248902',
'channel_url': 'https://rokfin.com/MaxBlumenthal', 'channel_url': 'https://rokfin.com/MaxBlumenthal',
'availability': 'premium_only', 'availability': 'premium_only',
'live_status': 'was_live', 'live_status': 'was_live',
@ -174,7 +173,7 @@ def _real_extract(self, url):
'like_count': int_or_none(metadata.get('likeCount')), 'like_count': int_or_none(metadata.get('likeCount')),
'dislike_count': int_or_none(metadata.get('dislikeCount')), 'dislike_count': int_or_none(metadata.get('dislikeCount')),
'channel': str_or_none(traverse_obj(metadata, ('createdBy', 'name'), ('creator', 'name'))), 'channel': str_or_none(traverse_obj(metadata, ('createdBy', 'name'), ('creator', 'name'))),
'channel_id': traverse_obj(metadata, ('createdBy', 'id'), ('creator', 'id')), 'channel_id': str_or_none(traverse_obj(metadata, ('createdBy', 'id'), ('creator', 'id'))),
'channel_url': url_or_none(f'https://rokfin.com/{uploader}') if uploader else None, 'channel_url': url_or_none(f'https://rokfin.com/{uploader}') if uploader else None,
'timestamp': timestamp, 'timestamp': timestamp,
'release_timestamp': timestamp if live_status != 'not_live' else None, 'release_timestamp': timestamp if live_status != 'not_live' else None,

View file

@ -90,7 +90,6 @@ class RumbleEmbedIE(InfoExtractor):
'channel_url': 'https://rumble.com/c/LofiGirl', 'channel_url': 'https://rumble.com/c/LofiGirl',
'channel': 'Lofi Girl', 'channel': 'Lofi Girl',
'thumbnail': r're:https://.+\.jpg', 'thumbnail': r're:https://.+\.jpg',
'duration': None,
'uploader': 'Lofi Girl', 'uploader': 'Lofi Girl',
'live_status': 'is_live', 'live_status': 'is_live',
}, },

View file

@ -46,7 +46,7 @@ def _extract_info(self, video, video_id=None, require_title=True):
'uploader': try_get(video, lambda x: x['author']['name']), 'uploader': try_get(video, lambda x: x['author']['name']),
'uploader_id': compat_str(uploader_id) if uploader_id else None, 'uploader_id': compat_str(uploader_id) if uploader_id else None,
'timestamp': unified_timestamp(video.get('created_ts')), 'timestamp': unified_timestamp(video.get('created_ts')),
'category': [category] if category else None, 'categories': [category] if category else None,
'age_limit': age_limit, 'age_limit': age_limit,
'view_count': int_or_none(video.get('hits')), 'view_count': int_or_none(video.get('hits')),
'comment_count': int_or_none(video.get('comments_count')), 'comment_count': int_or_none(video.get('comments_count')),
@ -112,7 +112,7 @@ class RutubeIE(RutubeBaseIE):
'age_limit': 0, 'age_limit': 0,
'view_count': int, 'view_count': int,
'thumbnail': 'http://pic.rutubelist.ru/video/d2/a0/d2a0aec998494a396deafc7ba2c82add.jpg', 'thumbnail': 'http://pic.rutubelist.ru/video/d2/a0/d2a0aec998494a396deafc7ba2c82add.jpg',
'category': ['Новости и СМИ'], 'categories': ['Новости и СМИ'],
'chapters': [], 'chapters': [],
}, },
'expected_warnings': ['Unable to download f4m'], 'expected_warnings': ['Unable to download f4m'],
@ -144,7 +144,7 @@ class RutubeIE(RutubeBaseIE):
'age_limit': 0, 'age_limit': 0,
'view_count': int, 'view_count': int,
'thumbnail': 'http://pic.rutubelist.ru/video/f2/d4/f2d42b54be0a6e69c1c22539e3152156.jpg', 'thumbnail': 'http://pic.rutubelist.ru/video/f2/d4/f2d42b54be0a6e69c1c22539e3152156.jpg',
'category': ['Видеоигры'], 'categories': ['Видеоигры'],
'chapters': [], 'chapters': [],
}, },
'expected_warnings': ['Unable to download f4m'], 'expected_warnings': ['Unable to download f4m'],
@ -154,7 +154,7 @@ class RutubeIE(RutubeBaseIE):
'id': 'c65b465ad0c98c89f3b25cb03dcc87c6', 'id': 'c65b465ad0c98c89f3b25cb03dcc87c6',
'ext': 'mp4', 'ext': 'mp4',
'chapters': 'count:4', 'chapters': 'count:4',
'category': ['Бизнес и предпринимательство'], 'categories': ['Бизнес и предпринимательство'],
'description': 'md5:252feac1305257d8c1bab215cedde75d', 'description': 'md5:252feac1305257d8c1bab215cedde75d',
'thumbnail': 'http://pic.rutubelist.ru/video/71/8f/718f27425ea9706073eb80883dd3787b.png', 'thumbnail': 'http://pic.rutubelist.ru/video/71/8f/718f27425ea9706073eb80883dd3787b.png',
'duration': 782, 'duration': 782,

View file

@ -44,8 +44,6 @@ class SBSIE(InfoExtractor):
'timestamp': 1408613220, 'timestamp': 1408613220,
'upload_date': '20140821', 'upload_date': '20140821',
'uploader': 'SBSC', 'uploader': 'SBSC',
'tags': None,
'categories': None,
}, },
'expected_warnings': ['Unable to download JSON metadata'], 'expected_warnings': ['Unable to download JSON metadata'],
}, { }, {

View file

@ -10,7 +10,7 @@ class SkebIE(InfoExtractor):
'info_dict': { 'info_dict': {
'id': '466853', 'id': '466853',
'title': '内容はおまかせします! by 姫ノ森りぃる@一周年', 'title': '内容はおまかせします! by 姫ノ森りぃる@一周年',
'descripion': 'md5:1ec50901efc3437cfbfe3790468d532d', 'description': 'md5:1ec50901efc3437cfbfe3790468d532d',
'uploader': '姫ノ森りぃる@一周年', 'uploader': '姫ノ森りぃる@一周年',
'uploader_id': 'riiru_wm', 'uploader_id': 'riiru_wm',
'age_limit': 0, 'age_limit': 0,
@ -34,7 +34,7 @@ class SkebIE(InfoExtractor):
'info_dict': { 'info_dict': {
'id': '489408', 'id': '489408',
'title': 'いつもお世話になってお... by 古川ノブ@音楽とVlo...', 'title': 'いつもお世話になってお... by 古川ノブ@音楽とVlo...',
'descripion': 'md5:5adc2e41d06d33b558bf7b1faeb7b9c2', 'description': 'md5:5adc2e41d06d33b558bf7b1faeb7b9c2',
'uploader': '古川ノブ@音楽とVlogのVtuber', 'uploader': '古川ノブ@音楽とVlogのVtuber',
'uploader_id': 'furukawa_nob', 'uploader_id': 'furukawa_nob',
'age_limit': 0, 'age_limit': 0,
@ -61,12 +61,12 @@ class SkebIE(InfoExtractor):
'info_dict': { 'info_dict': {
'id': '6', 'id': '6',
'title': 'ヒロ。\n\n私のキャラク... by 諸々', 'title': 'ヒロ。\n\n私のキャラク... by 諸々',
'descripion': 'md5:aa6cbf2ba320b50bce219632de195f07', 'description': 'md5:aa6cbf2ba320b50bce219632de195f07',
'_type': 'playlist', '_type': 'playlist',
'entries': [{ 'entries': [{
'id': '486430', 'id': '486430',
'title': 'ヒロ。\n\n私のキャラク... by 諸々', 'title': 'ヒロ。\n\n私のキャラク... by 諸々',
'descripion': 'md5:aa6cbf2ba320b50bce219632de195f07', 'description': 'md5:aa6cbf2ba320b50bce219632de195f07',
}, { }, {
'id': '486431', 'id': '486431',
'title': 'ヒロ。\n\n私のキャラク... by 諸々', 'title': 'ヒロ。\n\n私のキャラク... by 諸々',
@ -81,7 +81,7 @@ def _real_extract(self, url):
parent = { parent = {
'id': video_id, 'id': video_id,
'title': nuxt_data.get('title'), 'title': nuxt_data.get('title'),
'descripion': nuxt_data.get('description'), 'description': nuxt_data.get('description'),
'uploader': traverse_obj(nuxt_data, ('creator', 'name')), 'uploader': traverse_obj(nuxt_data, ('creator', 'name')),
'uploader_id': traverse_obj(nuxt_data, ('creator', 'screen_name')), 'uploader_id': traverse_obj(nuxt_data, ('creator', 'screen_name')),
'age_limit': 18 if nuxt_data.get('nsfw') else 0, 'age_limit': 18 if nuxt_data.get('nsfw') else 0,

View file

@ -21,7 +21,7 @@ class StagePlusVODConcertIE(InfoExtractor):
'id': 'vod_concert_APNM8GRFDPHMASJKBSPJACG', 'id': 'vod_concert_APNM8GRFDPHMASJKBSPJACG',
'title': 'Yuja Wang plays Rachmaninoff\'s Piano Concerto No. 2 from Odeonsplatz', 'title': 'Yuja Wang plays Rachmaninoff\'s Piano Concerto No. 2 from Odeonsplatz',
'description': 'md5:50f78ec180518c9bdb876bac550996fc', 'description': 'md5:50f78ec180518c9bdb876bac550996fc',
'artist': ['Yuja Wang', 'Lorenzo Viotti'], 'artists': ['Yuja Wang', 'Lorenzo Viotti'],
'upload_date': '20230331', 'upload_date': '20230331',
'timestamp': 1680249600, 'timestamp': 1680249600,
'release_date': '20210709', 'release_date': '20210709',
@ -40,10 +40,10 @@ class StagePlusVODConcertIE(InfoExtractor):
'release_timestamp': 1625788800, 'release_timestamp': 1625788800,
'duration': 2207, 'duration': 2207,
'chapters': 'count:5', 'chapters': 'count:5',
'artist': ['Yuja Wang'], 'artists': ['Yuja Wang'],
'composer': ['Sergei Rachmaninoff'], 'composers': ['Sergei Rachmaninoff'],
'album': 'Yuja Wang plays Rachmaninoff\'s Piano Concerto No. 2 from Odeonsplatz', 'album': 'Yuja Wang plays Rachmaninoff\'s Piano Concerto No. 2 from Odeonsplatz',
'album_artist': ['Yuja Wang', 'Lorenzo Viotti'], 'album_artists': ['Yuja Wang', 'Lorenzo Viotti'],
'track': 'Piano Concerto No. 2 in C Minor, Op. 18', 'track': 'Piano Concerto No. 2 in C Minor, Op. 18',
'track_number': 1, 'track_number': 1,
'genre': 'Instrumental Concerto', 'genre': 'Instrumental Concerto',
@ -474,7 +474,7 @@ def _real_extract(self, url):
metadata = traverse_obj(data, { metadata = traverse_obj(data, {
'title': 'title', 'title': 'title',
'description': ('shortDescription', {str}), 'description': ('shortDescription', {str}),
'artist': ('artists', 'edges', ..., 'node', 'name'), 'artists': ('artists', 'edges', ..., 'node', 'name'),
'timestamp': ('archiveReleaseDate', {unified_timestamp}), 'timestamp': ('archiveReleaseDate', {unified_timestamp}),
'release_timestamp': ('productionDate', {unified_timestamp}), 'release_timestamp': ('productionDate', {unified_timestamp}),
}) })
@ -494,7 +494,7 @@ def _real_extract(self, url):
'formats': formats, 'formats': formats,
'subtitles': subtitles, 'subtitles': subtitles,
'album': metadata.get('title'), 'album': metadata.get('title'),
'album_artist': metadata.get('artist'), 'album_artists': metadata.get('artist'),
'track_number': idx, 'track_number': idx,
**metadata, **metadata,
**traverse_obj(video, { **traverse_obj(video, {
@ -506,8 +506,8 @@ def _real_extract(self, url):
'title': 'title', 'title': 'title',
'start_time': ('mark', {float_or_none}), 'start_time': ('mark', {float_or_none}),
}), }),
'artist': ('artists', 'edges', ..., 'node', 'name'), 'artists': ('artists', 'edges', ..., 'node', 'name'),
'composer': ('work', 'composers', ..., 'name'), 'composers': ('work', 'composers', ..., 'name'),
'genre': ('work', 'genre', 'title'), 'genre': ('work', 'genre', 'title'),
}), }),
}) })

View file

@ -2,9 +2,10 @@
from .common import InfoExtractor from .common import InfoExtractor
from ..utils import ( from ..utils import (
extract_attributes,
ExtractorError, ExtractorError,
extract_attributes,
get_element_by_class, get_element_by_class,
str_or_none,
) )
@ -30,7 +31,6 @@ class SteamIE(InfoExtractor):
'ext': 'mp4', 'ext': 'mp4',
'title': 'Terraria video 256785003', 'title': 'Terraria video 256785003',
'thumbnail': r're:^https://cdn\.[^\.]+\.steamstatic\.com', 'thumbnail': r're:^https://cdn\.[^\.]+\.steamstatic\.com',
'n_entries': 2,
} }
}, },
{ {
@ -39,9 +39,7 @@ class SteamIE(InfoExtractor):
'id': '2040428', 'id': '2040428',
'ext': 'mp4', 'ext': 'mp4',
'title': 'Terraria video 2040428', 'title': 'Terraria video 2040428',
'playlist_index': 2,
'thumbnail': r're:^https://cdn\.[^\.]+\.steamstatic\.com', 'thumbnail': r're:^https://cdn\.[^\.]+\.steamstatic\.com',
'n_entries': 2,
} }
} }
], ],
@ -55,12 +53,10 @@ class SteamIE(InfoExtractor):
}, { }, {
'url': 'https://store.steampowered.com/app/271590/Grand_Theft_Auto_V/', 'url': 'https://store.steampowered.com/app/271590/Grand_Theft_Auto_V/',
'info_dict': { 'info_dict': {
'id': '256757115', 'id': '271590',
'title': 'Grand Theft Auto V video 256757115', 'title': 'Grand Theft Auto V',
'ext': 'mp4',
'thumbnail': r're:^https://cdn\.[^\.]+\.steamstatic\.com',
'n_entries': 20,
}, },
'playlist_count': 23,
}] }]
def _real_extract(self, url): def _real_extract(self, url):
@ -136,7 +132,7 @@ class SteamCommunityBroadcastIE(InfoExtractor):
'id': '76561199073851486', 'id': '76561199073851486',
'title': r're:Steam Community :: pepperm!nt :: Broadcast 2022-06-26 \d{2}:\d{2}', 'title': r're:Steam Community :: pepperm!nt :: Broadcast 2022-06-26 \d{2}:\d{2}',
'ext': 'mp4', 'ext': 'mp4',
'uploader_id': 1113585758, 'uploader_id': '1113585758',
'uploader': 'pepperm!nt', 'uploader': 'pepperm!nt',
'live_status': 'is_live', 'live_status': 'is_live',
}, },
@ -169,6 +165,6 @@ def _real_extract(self, url):
'live_status': 'is_live', 'live_status': 'is_live',
'view_count': json_data.get('num_view'), 'view_count': json_data.get('num_view'),
'uploader': uploader_json.get('persona_name'), 'uploader': uploader_json.get('persona_name'),
'uploader_id': uploader_json.get('accountid'), 'uploader_id': str_or_none(uploader_json.get('accountid')),
'subtitles': subs, 'subtitles': subs,
} }

View file

@ -20,7 +20,8 @@ class TenPlayIE(InfoExtractor):
'alt_title': 'Nathan Borg Is The First Aussie Actor With A Cochlear Implant To Join Neighbours', 'alt_title': 'Nathan Borg Is The First Aussie Actor With A Cochlear Implant To Join Neighbours',
'description': 'md5:a02d0199c901c2dd4c796f1e7dd0de43', 'description': 'md5:a02d0199c901c2dd4c796f1e7dd0de43',
'duration': 186, 'duration': 186,
'season': 39, 'season': 'Season 39',
'season_number': 39,
'series': 'Neighbours', 'series': 'Neighbours',
'thumbnail': r're:https://.*\.jpg', 'thumbnail': r're:https://.*\.jpg',
'uploader': 'Channel 10', 'uploader': 'Channel 10',
@ -108,7 +109,7 @@ def _real_extract(self, url):
'description': data.get('description'), 'description': data.get('description'),
'age_limit': self._AUS_AGES.get(data.get('classification')), 'age_limit': self._AUS_AGES.get(data.get('classification')),
'series': data.get('tvShow'), 'series': data.get('tvShow'),
'season': int_or_none(data.get('season')), 'season_number': int_or_none(data.get('season')),
'episode_number': int_or_none(data.get('episode')), 'episode_number': int_or_none(data.get('episode')),
'timestamp': data.get('published'), 'timestamp': data.get('published'),
'thumbnail': data.get('imageUrl'), 'thumbnail': data.get('imageUrl'),

View file

@ -320,7 +320,7 @@ def extract_addr(addr, add_meta={}):
if is_generic_og_trackname: if is_generic_og_trackname:
music_track, music_author = contained_music_track or 'original sound', contained_music_author music_track, music_author = contained_music_track or 'original sound', contained_music_author
else: else:
music_track, music_author = music_info.get('title'), music_info.get('author') music_track, music_author = music_info.get('title'), traverse_obj(music_info, ('author', {str}))
return { return {
'id': aweme_id, 'id': aweme_id,
@ -336,15 +336,16 @@ def extract_addr(addr, add_meta={}):
'comment_count': 'comment_count', 'comment_count': 'comment_count',
}, expected_type=int_or_none), }, expected_type=int_or_none),
**traverse_obj(author_info, { **traverse_obj(author_info, {
'uploader': 'unique_id', 'uploader': ('unique_id', {str}),
'uploader_id': 'uid', 'uploader_id': ('uid', {str_or_none}),
'creator': 'nickname', 'creators': ('nickname', {str}, {lambda x: [x] if x else None}), # for compat
'channel_id': 'sec_uid', 'channel': ('nickname', {str}),
}, expected_type=str_or_none), 'channel_id': ('sec_uid', {str}),
}),
'uploader_url': user_url, 'uploader_url': user_url,
'track': music_track, 'track': music_track,
'album': str_or_none(music_info.get('album')) or None, 'album': str_or_none(music_info.get('album')) or None,
'artist': music_author or None, 'artists': re.split(r'(?:, | & )', music_author) if music_author else None,
'formats': formats, 'formats': formats,
'subtitles': self.extract_subtitles(aweme_detail, aweme_id), 'subtitles': self.extract_subtitles(aweme_detail, aweme_id),
'thumbnails': thumbnails, 'thumbnails': thumbnails,
@ -405,7 +406,8 @@ def _parse_aweme_video_web(self, aweme_detail, webpage_url, video_id):
'timestamp': ('createTime', {int_or_none}), 'timestamp': ('createTime', {int_or_none}),
}), }),
**traverse_obj(author_info or aweme_detail, { **traverse_obj(author_info or aweme_detail, {
'creator': ('nickname', {str}), 'creators': ('nickname', {str}, {lambda x: [x] if x else None}), # for compat
'channel': ('nickname', {str}),
'uploader': (('uniqueId', 'author'), {str}), 'uploader': (('uniqueId', 'author'), {str}),
'uploader_id': (('authorId', 'uid', 'id'), {str_or_none}), 'uploader_id': (('authorId', 'uid', 'id'), {str_or_none}),
}, get_all=False), }, get_all=False),
@ -416,10 +418,10 @@ def _parse_aweme_video_web(self, aweme_detail, webpage_url, video_id):
'comment_count': 'commentCount', 'comment_count': 'commentCount',
}, expected_type=int_or_none), }, expected_type=int_or_none),
**traverse_obj(music_info, { **traverse_obj(music_info, {
'track': 'title', 'track': ('title', {str}),
'album': ('album', {lambda x: x or None}), 'album': ('album', {str}, {lambda x: x or None}),
'artist': 'authorName', 'artists': ('authorName', {str}, {lambda x: [x] if x else None}),
}, expected_type=str), }),
'channel_id': channel_id, 'channel_id': channel_id,
'uploader_url': user_url, 'uploader_url': user_url,
'formats': formats, 'formats': formats,
@ -476,7 +478,8 @@ class TikTokIE(TikTokBaseIE):
'uploader_id': '18702747', 'uploader_id': '18702747',
'uploader_url': 'https://www.tiktok.com/@MS4wLjABAAAAiFnldaILebi5heDoVU6bn4jBWWycX6-9U3xuNPqZ8Ws', 'uploader_url': 'https://www.tiktok.com/@MS4wLjABAAAAiFnldaILebi5heDoVU6bn4jBWWycX6-9U3xuNPqZ8Ws',
'channel_id': 'MS4wLjABAAAAiFnldaILebi5heDoVU6bn4jBWWycX6-9U3xuNPqZ8Ws', 'channel_id': 'MS4wLjABAAAAiFnldaILebi5heDoVU6bn4jBWWycX6-9U3xuNPqZ8Ws',
'creator': 'patroX', 'channel': 'patroX',
'creators': ['patroX'],
'thumbnail': r're:^https?://[\w\/\.\-]+(~[\w\-]+\.image)?', 'thumbnail': r're:^https?://[\w\/\.\-]+(~[\w\-]+\.image)?',
'upload_date': '20190930', 'upload_date': '20190930',
'timestamp': 1569860870, 'timestamp': 1569860870,
@ -484,7 +487,7 @@ class TikTokIE(TikTokBaseIE):
'like_count': int, 'like_count': int,
'repost_count': int, 'repost_count': int,
'comment_count': int, 'comment_count': int,
'artist': 'Evan Todd, Jessica Keenan Wynn, Alice Lee, Barrett Wilbert Weed & Jon Eidson', 'artists': ['Evan Todd', 'Jessica Keenan Wynn', 'Alice Lee', 'Barrett Wilbert Weed', 'Jon Eidson'],
'track': 'Big Fun', 'track': 'Big Fun',
}, },
}, { }, {
@ -496,12 +499,13 @@ class TikTokIE(TikTokBaseIE):
'title': 'Balas @yolaaftwsr hayu yu ? #SquadRandom_ 🔥', 'title': 'Balas @yolaaftwsr hayu yu ? #SquadRandom_ 🔥',
'description': 'Balas @yolaaftwsr hayu yu ? #SquadRandom_ 🔥', 'description': 'Balas @yolaaftwsr hayu yu ? #SquadRandom_ 🔥',
'uploader': 'barudakhb_', 'uploader': 'barudakhb_',
'creator': 'md5:29f238c49bc0c176cb3cef1a9cea9fa6', 'channel': 'md5:29f238c49bc0c176cb3cef1a9cea9fa6',
'creators': ['md5:29f238c49bc0c176cb3cef1a9cea9fa6'],
'uploader_id': '6974687867511718913', 'uploader_id': '6974687867511718913',
'uploader_url': 'https://www.tiktok.com/@MS4wLjABAAAAbhBwQC-R1iKoix6jDFsF-vBdfx2ABoDjaZrM9fX6arU3w71q3cOWgWuTXn1soZ7d', 'uploader_url': 'https://www.tiktok.com/@MS4wLjABAAAAbhBwQC-R1iKoix6jDFsF-vBdfx2ABoDjaZrM9fX6arU3w71q3cOWgWuTXn1soZ7d',
'channel_id': 'MS4wLjABAAAAbhBwQC-R1iKoix6jDFsF-vBdfx2ABoDjaZrM9fX6arU3w71q3cOWgWuTXn1soZ7d', 'channel_id': 'MS4wLjABAAAAbhBwQC-R1iKoix6jDFsF-vBdfx2ABoDjaZrM9fX6arU3w71q3cOWgWuTXn1soZ7d',
'track': 'Boka Dance', 'track': 'Boka Dance',
'artist': 'md5:29f238c49bc0c176cb3cef1a9cea9fa6', 'artists': ['md5:29f238c49bc0c176cb3cef1a9cea9fa6'],
'timestamp': 1626121503, 'timestamp': 1626121503,
'duration': 18, 'duration': 18,
'thumbnail': r're:^https?://[\w\/\.\-]+(~[\w\-]+\.image)?', 'thumbnail': r're:^https?://[\w\/\.\-]+(~[\w\-]+\.image)?',
@ -520,7 +524,8 @@ class TikTokIE(TikTokBaseIE):
'title': 'Slap and Run!', 'title': 'Slap and Run!',
'description': 'Slap and Run!', 'description': 'Slap and Run!',
'uploader': 'user440922249', 'uploader': 'user440922249',
'creator': 'Slap And Run', 'channel': 'Slap And Run',
'creators': ['Slap And Run'],
'uploader_id': '7036055384943690754', 'uploader_id': '7036055384943690754',
'uploader_url': 'https://www.tiktok.com/@MS4wLjABAAAATh8Vewkn0LYM7Fo03iec3qKdeCUOcBIouRk1mkiag6h3o_pQu_dUXvZ2EZlGST7_', 'uploader_url': 'https://www.tiktok.com/@MS4wLjABAAAATh8Vewkn0LYM7Fo03iec3qKdeCUOcBIouRk1mkiag6h3o_pQu_dUXvZ2EZlGST7_',
'channel_id': 'MS4wLjABAAAATh8Vewkn0LYM7Fo03iec3qKdeCUOcBIouRk1mkiag6h3o_pQu_dUXvZ2EZlGST7_', 'channel_id': 'MS4wLjABAAAATh8Vewkn0LYM7Fo03iec3qKdeCUOcBIouRk1mkiag6h3o_pQu_dUXvZ2EZlGST7_',
@ -544,7 +549,8 @@ class TikTokIE(TikTokBaseIE):
'title': 'TikTok video #7059698374567611694', 'title': 'TikTok video #7059698374567611694',
'description': '', 'description': '',
'uploader': 'pokemonlife22', 'uploader': 'pokemonlife22',
'creator': 'Pokemon', 'channel': 'Pokemon',
'creators': ['Pokemon'],
'uploader_id': '6820838815978423302', 'uploader_id': '6820838815978423302',
'uploader_url': 'https://www.tiktok.com/@MS4wLjABAAAA0tF1nBwQVVMyrGu3CqttkNgM68Do1OXUFuCY0CRQk8fEtSVDj89HqoqvbSTmUP2W', 'uploader_url': 'https://www.tiktok.com/@MS4wLjABAAAA0tF1nBwQVVMyrGu3CqttkNgM68Do1OXUFuCY0CRQk8fEtSVDj89HqoqvbSTmUP2W',
'channel_id': 'MS4wLjABAAAA0tF1nBwQVVMyrGu3CqttkNgM68Do1OXUFuCY0CRQk8fEtSVDj89HqoqvbSTmUP2W', 'channel_id': 'MS4wLjABAAAA0tF1nBwQVVMyrGu3CqttkNgM68Do1OXUFuCY0CRQk8fEtSVDj89HqoqvbSTmUP2W',
@ -553,7 +559,7 @@ class TikTokIE(TikTokBaseIE):
'duration': 6, 'duration': 6,
'thumbnail': r're:^https?://[\w\/\.\-]+(~[\w\-]+\.image)?', 'thumbnail': r're:^https?://[\w\/\.\-]+(~[\w\-]+\.image)?',
'upload_date': '20220201', 'upload_date': '20220201',
'artist': 'Pokemon', 'artists': ['Pokemon'],
'view_count': int, 'view_count': int,
'like_count': int, 'like_count': int,
'repost_count': int, 'repost_count': int,
@ -590,12 +596,13 @@ class TikTokIE(TikTokBaseIE):
'ext': 'mp3', 'ext': 'mp3',
'title': 'TikTok video #7139980461132074283', 'title': 'TikTok video #7139980461132074283',
'description': '', 'description': '',
'creator': 'Antaura', 'channel': 'Antaura',
'creators': ['Antaura'],
'uploader': '_le_cannibale_', 'uploader': '_le_cannibale_',
'uploader_id': '6604511138619654149', 'uploader_id': '6604511138619654149',
'uploader_url': 'https://www.tiktok.com/@MS4wLjABAAAAoShJqaw_5gvy48y3azFeFcT4jeyKWbB0VVYasOCt2tTLwjNFIaDcHAM4D-QGXFOP', 'uploader_url': 'https://www.tiktok.com/@MS4wLjABAAAAoShJqaw_5gvy48y3azFeFcT4jeyKWbB0VVYasOCt2tTLwjNFIaDcHAM4D-QGXFOP',
'channel_id': 'MS4wLjABAAAAoShJqaw_5gvy48y3azFeFcT4jeyKWbB0VVYasOCt2tTLwjNFIaDcHAM4D-QGXFOP', 'channel_id': 'MS4wLjABAAAAoShJqaw_5gvy48y3azFeFcT4jeyKWbB0VVYasOCt2tTLwjNFIaDcHAM4D-QGXFOP',
'artist': 'nathan !', 'artists': ['nathan !'],
'track': 'grahamscott canon', 'track': 'grahamscott canon',
'upload_date': '20220905', 'upload_date': '20220905',
'timestamp': 1662406249, 'timestamp': 1662406249,
@ -603,18 +610,18 @@ class TikTokIE(TikTokBaseIE):
'like_count': int, 'like_count': int,
'repost_count': int, 'repost_count': int,
'comment_count': int, 'comment_count': int,
'thumbnail': r're:^https://.+\.webp', 'thumbnail': r're:^https://.+\.(?:webp|jpe?g)',
}, },
}, { }, {
# only available via web # only available via web
'url': 'https://www.tiktok.com/@moxypatch/video/7206382937372134662', 'url': 'https://www.tiktok.com/@moxypatch/video/7206382937372134662', # FIXME
'md5': '6aba7fad816e8709ff2c149679ace165', 'md5': '6aba7fad816e8709ff2c149679ace165',
'info_dict': { 'info_dict': {
'id': '7206382937372134662', 'id': '7206382937372134662',
'ext': 'mp4', 'ext': 'mp4',
'title': 'md5:1d95c0b96560ca0e8a231af4172b2c0a', 'title': 'md5:1d95c0b96560ca0e8a231af4172b2c0a',
'description': 'md5:1d95c0b96560ca0e8a231af4172b2c0a', 'description': 'md5:1d95c0b96560ca0e8a231af4172b2c0a',
'creator': 'MoxyPatch', 'channel': 'MoxyPatch',
'creators': ['MoxyPatch'], 'creators': ['MoxyPatch'],
'uploader': 'moxypatch', 'uploader': 'moxypatch',
'uploader_id': '7039142049363379205', 'uploader_id': '7039142049363379205',
@ -635,7 +642,7 @@ class TikTokIE(TikTokBaseIE):
'expected_warnings': ['Unable to find video in feed'], 'expected_warnings': ['Unable to find video in feed'],
}, { }, {
# 1080p format # 1080p format
'url': 'https://www.tiktok.com/@tatemcrae/video/7107337212743830830', 'url': 'https://www.tiktok.com/@tatemcrae/video/7107337212743830830', # FIXME
'md5': '982512017a8a917124d5a08c8ae79621', 'md5': '982512017a8a917124d5a08c8ae79621',
'info_dict': { 'info_dict': {
'id': '7107337212743830830', 'id': '7107337212743830830',
@ -646,8 +653,9 @@ class TikTokIE(TikTokBaseIE):
'uploader_id': '86328792343818240', 'uploader_id': '86328792343818240',
'uploader_url': 'https://www.tiktok.com/@MS4wLjABAAAA-0bQT0CqebTRr6I4IkYvMDMKSRSJHLNPBo5HrSklJwyA2psXLSZG5FP-LMNpHnJd', 'uploader_url': 'https://www.tiktok.com/@MS4wLjABAAAA-0bQT0CqebTRr6I4IkYvMDMKSRSJHLNPBo5HrSklJwyA2psXLSZG5FP-LMNpHnJd',
'channel_id': 'MS4wLjABAAAA-0bQT0CqebTRr6I4IkYvMDMKSRSJHLNPBo5HrSklJwyA2psXLSZG5FP-LMNpHnJd', 'channel_id': 'MS4wLjABAAAA-0bQT0CqebTRr6I4IkYvMDMKSRSJHLNPBo5HrSklJwyA2psXLSZG5FP-LMNpHnJd',
'creator': 'tate mcrae', 'channel': 'tate mcrae',
'artist': 'tate mcrae', 'creators': ['tate mcrae'],
'artists': ['tate mcrae'],
'track': 'original sound', 'track': 'original sound',
'upload_date': '20220609', 'upload_date': '20220609',
'timestamp': 1654805899, 'timestamp': 1654805899,
@ -672,8 +680,9 @@ class TikTokIE(TikTokBaseIE):
'uploader_id': '6582536342634676230', 'uploader_id': '6582536342634676230',
'uploader_url': 'https://www.tiktok.com/@MS4wLjABAAAAIAlDxriiPWLE-p8p1R_0Bx8qWKfi-7zwmGhzU8Mv25W8sNxjfIKrol31qTczzuLB', 'uploader_url': 'https://www.tiktok.com/@MS4wLjABAAAAIAlDxriiPWLE-p8p1R_0Bx8qWKfi-7zwmGhzU8Mv25W8sNxjfIKrol31qTczzuLB',
'channel_id': 'MS4wLjABAAAAIAlDxriiPWLE-p8p1R_0Bx8qWKfi-7zwmGhzU8Mv25W8sNxjfIKrol31qTczzuLB', 'channel_id': 'MS4wLjABAAAAIAlDxriiPWLE-p8p1R_0Bx8qWKfi-7zwmGhzU8Mv25W8sNxjfIKrol31qTczzuLB',
'creator': 'лампочка', 'channel': 'лампочка',
'artist': 'Øneheart', 'creators': ['лампочка'],
'artists': ['Øneheart'],
'album': 'watching the stars', 'album': 'watching the stars',
'track': 'watching the stars', 'track': 'watching the stars',
'upload_date': '20230708', 'upload_date': '20230708',
@ -682,7 +691,7 @@ class TikTokIE(TikTokBaseIE):
'like_count': int, 'like_count': int,
'comment_count': int, 'comment_count': int,
'repost_count': int, 'repost_count': int,
'thumbnail': r're:^https://.+\.webp', 'thumbnail': r're:^https://.+\.(?:webp|jpe?g)',
}, },
}, { }, {
# Auto-captions available # Auto-captions available
@ -949,7 +958,7 @@ class DouyinIE(TikTokBaseIE):
'uploader_id': '110403406559', 'uploader_id': '110403406559',
'uploader_url': 'https://www.douyin.com/user/MS4wLjABAAAAEKnfa654JAJ_N5lgZDQluwsxmY0lhfmEYNQBBkwGG98', 'uploader_url': 'https://www.douyin.com/user/MS4wLjABAAAAEKnfa654JAJ_N5lgZDQluwsxmY0lhfmEYNQBBkwGG98',
'channel_id': 'MS4wLjABAAAAEKnfa654JAJ_N5lgZDQluwsxmY0lhfmEYNQBBkwGG98', 'channel_id': 'MS4wLjABAAAAEKnfa654JAJ_N5lgZDQluwsxmY0lhfmEYNQBBkwGG98',
'creator': '杨超越', 'channel': '杨超越',
'creators': ['杨超越'], 'creators': ['杨超越'],
'duration': 19, 'duration': 19,
'timestamp': 1620905839, 'timestamp': 1620905839,
@ -974,7 +983,7 @@ class DouyinIE(TikTokBaseIE):
'uploader_id': '408654318141572', 'uploader_id': '408654318141572',
'uploader_url': 'https://www.douyin.com/user/MS4wLjABAAAAZJpnglcjW2f_CMVcnqA_6oVBXKWMpH0F8LIHuUu8-lA', 'uploader_url': 'https://www.douyin.com/user/MS4wLjABAAAAZJpnglcjW2f_CMVcnqA_6oVBXKWMpH0F8LIHuUu8-lA',
'channel_id': 'MS4wLjABAAAAZJpnglcjW2f_CMVcnqA_6oVBXKWMpH0F8LIHuUu8-lA', 'channel_id': 'MS4wLjABAAAAZJpnglcjW2f_CMVcnqA_6oVBXKWMpH0F8LIHuUu8-lA',
'creator': '杨超越工作室', 'channel': '杨超越工作室',
'creators': ['杨超越工作室'], 'creators': ['杨超越工作室'],
'duration': 42, 'duration': 42,
'timestamp': 1625739481, 'timestamp': 1625739481,
@ -999,7 +1008,7 @@ class DouyinIE(TikTokBaseIE):
'uploader_id': '110403406559', 'uploader_id': '110403406559',
'uploader_url': 'https://www.douyin.com/user/MS4wLjABAAAAEKnfa654JAJ_N5lgZDQluwsxmY0lhfmEYNQBBkwGG98', 'uploader_url': 'https://www.douyin.com/user/MS4wLjABAAAAEKnfa654JAJ_N5lgZDQluwsxmY0lhfmEYNQBBkwGG98',
'channel_id': 'MS4wLjABAAAAEKnfa654JAJ_N5lgZDQluwsxmY0lhfmEYNQBBkwGG98', 'channel_id': 'MS4wLjABAAAAEKnfa654JAJ_N5lgZDQluwsxmY0lhfmEYNQBBkwGG98',
'creator': '杨超越', 'channel': '杨超越',
'creators': ['杨超越'], 'creators': ['杨超越'],
'duration': 17, 'duration': 17,
'timestamp': 1619098692, 'timestamp': 1619098692,
@ -1041,7 +1050,7 @@ class DouyinIE(TikTokBaseIE):
'uploader_id': '110403406559', 'uploader_id': '110403406559',
'uploader_url': 'https://www.douyin.com/user/MS4wLjABAAAAEKnfa654JAJ_N5lgZDQluwsxmY0lhfmEYNQBBkwGG98', 'uploader_url': 'https://www.douyin.com/user/MS4wLjABAAAAEKnfa654JAJ_N5lgZDQluwsxmY0lhfmEYNQBBkwGG98',
'channel_id': 'MS4wLjABAAAAEKnfa654JAJ_N5lgZDQluwsxmY0lhfmEYNQBBkwGG98', 'channel_id': 'MS4wLjABAAAAEKnfa654JAJ_N5lgZDQluwsxmY0lhfmEYNQBBkwGG98',
'creator': '杨超越', 'channel': '杨超越',
'creators': ['杨超越'], 'creators': ['杨超越'],
'duration': 15, 'duration': 15,
'timestamp': 1621261163, 'timestamp': 1621261163,

View file

@ -277,7 +277,6 @@ class EMPFlixIE(TNAEMPFlixBaseIE):
'thumbnail': r're:https?://.*\.jpg$', 'thumbnail': r're:https?://.*\.jpg$',
'duration': 83, 'duration': 83,
'age_limit': 18, 'age_limit': 18,
'uploader': None,
'categories': list, 'categories': list,
} }
}, { }, {

View file

@ -19,7 +19,6 @@ class TruthIE(InfoExtractor):
'id': '108779000807761862', 'id': '108779000807761862',
'ext': 'qt', 'ext': 'qt',
'title': 'Truth video #108779000807761862', 'title': 'Truth video #108779000807761862',
'description': None,
'timestamp': 1659835827, 'timestamp': 1659835827,
'upload_date': '20220807', 'upload_date': '20220807',
'uploader': 'Donald J. Trump', 'uploader': 'Donald J. Trump',

View file

@ -20,7 +20,6 @@ class TV2HuIE(InfoExtractor):
'description': 'md5:7350147e75485a59598e806c47967b07', 'description': 'md5:7350147e75485a59598e806c47967b07',
'thumbnail': r're:^https?://.*\.jpg$', 'thumbnail': r're:^https?://.*\.jpg$',
'release_date': '20210825', 'release_date': '20210825',
'season_number': None,
'episode_number': 213, 'episode_number': 213,
}, },
'params': { 'params': {
@ -38,8 +37,6 @@ class TV2HuIE(InfoExtractor):
'description': 'md5:47762155dc9a50241797ded101b1b08c', 'description': 'md5:47762155dc9a50241797ded101b1b08c',
'thumbnail': r're:^https?://.*\.jpg$', 'thumbnail': r're:^https?://.*\.jpg$',
'release_date': '20210118', 'release_date': '20210118',
'season_number': None,
'episode_number': None,
}, },
'params': { 'params': {
'skip_download': True, 'skip_download': True,

View file

@ -21,8 +21,6 @@ class TVerIE(InfoExtractor):
'episode': '売り場席巻のチーズSP財前直見×森泉親子の脱東京暮らし密着', 'episode': '売り場席巻のチーズSP財前直見×森泉親子の脱東京暮らし密着',
'alt_title': '売り場席巻のチーズSP財前直見×森泉親子の脱東京暮らし密着', 'alt_title': '売り場席巻のチーズSP財前直見×森泉親子の脱東京暮らし密着',
'channel': 'テレビ朝日', 'channel': 'テレビ朝日',
'onair_label': '5月3日(火)放送分',
'ext_title': '家事ヤロウ!!! 売り場席巻のチーズSP財前直見×森泉親子の脱東京暮らし密着 テレビ朝日 5月3日(火)放送分',
}, },
'add_ie': ['BrightcoveNew'], 'add_ie': ['BrightcoveNew'],
}, { }, {

View file

@ -22,7 +22,7 @@ class VideofyMeIE(InfoExtractor):
'uploader': 'VideofyMe', 'uploader': 'VideofyMe',
'uploader_id': 'thisisvideofyme', 'uploader_id': 'thisisvideofyme',
'view_count': int, 'view_count': int,
'likes': int, 'like_count': int,
'comment_count': int, 'comment_count': int,
}, },
} }
@ -45,6 +45,6 @@ def _real_extract(self, url):
'uploader': blog.get('name'), 'uploader': blog.get('name'),
'uploader_id': blog.get('identifier'), 'uploader_id': blog.get('identifier'),
'view_count': int_or_none(self._search_regex(r'([0-9]+)', video.get('views'), 'view count', fatal=False)), 'view_count': int_or_none(self._search_regex(r'([0-9]+)', video.get('views'), 'view count', fatal=False)),
'likes': int_or_none(video.get('likes')), 'like_count': int_or_none(video.get('likes')),
'comment_count': int_or_none(video.get('nrOfComments')), 'comment_count': int_or_none(video.get('nrOfComments')),
} }

View file

@ -231,7 +231,6 @@ class ViewLiftIE(ViewLiftBaseIE):
'description': 'md5:e28f2fb8680096a69c944d37c1fa5ffc', 'description': 'md5:e28f2fb8680096a69c944d37c1fa5ffc',
'thumbnail': r're:^https?://.*\.jpg$', 'thumbnail': r're:^https?://.*\.jpg$',
'upload_date': '20211006', 'upload_date': '20211006',
'series': None
}, },
'params': {'skip_download': True}, 'params': {'skip_download': True},
}, { # Free film }, { # Free film
@ -243,7 +242,6 @@ class ViewLiftIE(ViewLiftBaseIE):
'description': 'md5:605cba408e51a79dafcb824bdeded51e', 'description': 'md5:605cba408e51a79dafcb824bdeded51e',
'thumbnail': r're:^https?://.*\.jpg$', 'thumbnail': r're:^https?://.*\.jpg$',
'upload_date': '20210827', 'upload_date': '20210827',
'series': None
}, },
'params': {'skip_download': True}, 'params': {'skip_download': True},
}, { # Free episode }, { # Free episode

View file

@ -375,7 +375,6 @@ class VimeoIE(VimeoBaseInfoExtractor):
'uploader_url': r're:https?://(?:www\.)?vimeo\.com/businessofsoftware', 'uploader_url': r're:https?://(?:www\.)?vimeo\.com/businessofsoftware',
'uploader_id': 'businessofsoftware', 'uploader_id': 'businessofsoftware',
'duration': 3610, 'duration': 3610,
'description': None,
'thumbnail': 'https://i.vimeocdn.com/video/376682406-f34043e7b766af6bef2af81366eacd6724f3fc3173179a11a97a1e26587c9529-d_1280', 'thumbnail': 'https://i.vimeocdn.com/video/376682406-f34043e7b766af6bef2af81366eacd6724f3fc3173179a11a97a1e26587c9529-d_1280',
}, },
'params': { 'params': {

View file

@ -810,7 +810,7 @@ class VKPlayLiveIE(VKPlayBaseIE):
'ext': 'mp4', 'ext': 'mp4',
'title': r're:эскапизм крута .*', 'title': r're:эскапизм крута .*',
'uploader': 'Bayda', 'uploader': 'Bayda',
'uploader_id': 12279401, 'uploader_id': '12279401',
'release_timestamp': 1687209962, 'release_timestamp': 1687209962,
'release_date': '20230619', 'release_date': '20230619',
'thumbnail': r're:https://images.vkplay.live/public_video_stream/12279401/preview\?change_time=\d+', 'thumbnail': r're:https://images.vkplay.live/public_video_stream/12279401/preview\?change_time=\d+',

View file

@ -24,7 +24,6 @@ class VVVVIDIE(InfoExtractor):
'series': 'The Power of Computing', 'series': 'The Power of Computing',
'season_id': '518', 'season_id': '518',
'episode': 'Playstation VR cambierà il nostro modo di giocare', 'episode': 'Playstation VR cambierà il nostro modo di giocare',
'episode_number': None,
'episode_id': '4747', 'episode_id': '4747',
'view_count': int, 'view_count': int,
'like_count': int, 'like_count': int,
@ -58,7 +57,6 @@ class VVVVIDIE(InfoExtractor):
'description': 'md5:a5e802558d35247fee285875328c0b80', 'description': 'md5:a5e802558d35247fee285875328c0b80',
'uploader_id': '@EMOTIONLabelChannel', 'uploader_id': '@EMOTIONLabelChannel',
'uploader': 'EMOTION Label Channel', 'uploader': 'EMOTION Label Channel',
'episode_number': None,
'episode_id': '3115', 'episode_id': '3115',
'view_count': int, 'view_count': int,
'like_count': int, 'like_count': int,

View file

@ -324,7 +324,6 @@ class WDRElefantIE(InfoExtractor):
'title': 'Wippe', 'title': 'Wippe',
'id': 'mdb-1198320', 'id': 'mdb-1198320',
'ext': 'mp4', 'ext': 'mp4',
'age_limit': None,
'upload_date': '20071003' 'upload_date': '20071003'
}, },
} }

View file

@ -1,7 +1,7 @@
import math import math
from .common import InfoExtractor from .common import InfoExtractor
from ..utils import traverse_obj, try_call, InAdvancePagedList from ..utils import InAdvancePagedList, str_or_none, traverse_obj, try_call
class XimalayaBaseIE(InfoExtractor): class XimalayaBaseIE(InfoExtractor):
@ -19,7 +19,7 @@ class XimalayaIE(XimalayaBaseIE):
'id': '47740352', 'id': '47740352',
'ext': 'm4a', 'ext': 'm4a',
'uploader': '小彬彬爱听书', 'uploader': '小彬彬爱听书',
'uploader_id': 61425525, 'uploader_id': '61425525',
'uploader_url': 'http://www.ximalaya.com/zhubo/61425525/', 'uploader_url': 'http://www.ximalaya.com/zhubo/61425525/',
'title': '261.唐诗三百首.卷八.送孟浩然之广陵.李白', 'title': '261.唐诗三百首.卷八.送孟浩然之广陵.李白',
'description': "contains:《送孟浩然之广陵》\n作者:李白\n故人西辞黄鹤楼,烟花三月下扬州。\n孤帆远影碧空尽,惟见长江天际流。", 'description': "contains:《送孟浩然之广陵》\n作者:李白\n故人西辞黄鹤楼,烟花三月下扬州。\n孤帆远影碧空尽,惟见长江天际流。",
@ -48,7 +48,7 @@ class XimalayaIE(XimalayaBaseIE):
'id': '47740352', 'id': '47740352',
'ext': 'm4a', 'ext': 'm4a',
'uploader': '小彬彬爱听书', 'uploader': '小彬彬爱听书',
'uploader_id': 61425525, 'uploader_id': '61425525',
'uploader_url': 'http://www.ximalaya.com/zhubo/61425525/', 'uploader_url': 'http://www.ximalaya.com/zhubo/61425525/',
'title': '261.唐诗三百首.卷八.送孟浩然之广陵.李白', 'title': '261.唐诗三百首.卷八.送孟浩然之广陵.李白',
'description': "contains:《送孟浩然之广陵》\n作者:李白\n故人西辞黄鹤楼,烟花三月下扬州。\n孤帆远影碧空尽,惟见长江天际流。", 'description': "contains:《送孟浩然之广陵》\n作者:李白\n故人西辞黄鹤楼,烟花三月下扬州。\n孤帆远影碧空尽,惟见长江天际流。",
@ -107,7 +107,7 @@ def _real_extract(self, url):
return { return {
'id': audio_id, 'id': audio_id,
'uploader': audio_info.get('nickname'), 'uploader': audio_info.get('nickname'),
'uploader_id': audio_uploader_id, 'uploader_id': str_or_none(audio_uploader_id),
'uploader_url': f'{scheme}://www.ximalaya.com/zhubo/{audio_uploader_id}/' if audio_uploader_id else None, 'uploader_url': f'{scheme}://www.ximalaya.com/zhubo/{audio_uploader_id}/' if audio_uploader_id else None,
'title': audio_info['title'], 'title': audio_info['title'],
'thumbnails': thumbnails, 'thumbnails': thumbnails,

View file

@ -1,6 +1,7 @@
from .common import InfoExtractor from .common import InfoExtractor
from ..utils import ( from ..utils import (
int_or_none, int_or_none,
str_or_none,
try_get, try_get,
update_url_query, update_url_query,
url_or_none, url_or_none,
@ -21,9 +22,9 @@ class XinpianchangIE(InfoExtractor):
'duration': 151, 'duration': 151,
'thumbnail': r're:^https?://oss-xpc0\.xpccdn\.com.+/assets/', 'thumbnail': r're:^https?://oss-xpc0\.xpccdn\.com.+/assets/',
'uploader': '正时文创', 'uploader': '正时文创',
'uploader_id': 10357277, 'uploader_id': '10357277',
'categories': ['宣传片', '国家城市', '广告', '其他'], 'categories': ['宣传片', '国家城市', '广告', '其他'],
'keywords': ['北京冬奥会', '冰墩墩', '再见', '告别', '冰墩墩哭了', '感动', '闭幕式', '熄火'] 'tags': ['北京冬奥会', '冰墩墩', '再见', '告别', '冰墩墩哭了', '感动', '闭幕式', '熄火']
}, },
}, { }, {
'url': 'https://www.xinpianchang.com/a11762904', 'url': 'https://www.xinpianchang.com/a11762904',
@ -35,9 +36,9 @@ class XinpianchangIE(InfoExtractor):
'duration': 136, 'duration': 136,
'thumbnail': r're:^https?://oss-xpc0\.xpccdn\.com.+/assets/', 'thumbnail': r're:^https?://oss-xpc0\.xpccdn\.com.+/assets/',
'uploader': '精品动画', 'uploader': '精品动画',
'uploader_id': 10858927, 'uploader_id': '10858927',
'categories': ['动画', '三维CG'], 'categories': ['动画', '三维CG'],
'keywords': ['France Télévisions', '法国3台', '蠢萌', '冬奥会'] 'tags': ['France Télévisions', '法国3台', '蠢萌', '冬奥会']
}, },
}, { }, {
'url': 'https://www.xinpianchang.com/a11779743?from=IndexPick&part=%E7%BC%96%E8%BE%91%E7%B2%BE%E9%80%89&index=2', 'url': 'https://www.xinpianchang.com/a11779743?from=IndexPick&part=%E7%BC%96%E8%BE%91%E7%B2%BE%E9%80%89&index=2',
@ -78,10 +79,10 @@ def _real_extract(self, url):
'description': data.get('description'), 'description': data.get('description'),
'duration': int_or_none(data.get('duration')), 'duration': int_or_none(data.get('duration')),
'categories': data.get('categories'), 'categories': data.get('categories'),
'keywords': data.get('keywords'), 'tags': data.get('keywords'),
'thumbnail': data.get('cover'), 'thumbnail': data.get('cover'),
'uploader': try_get(data, lambda x: x['owner']['username']), 'uploader': try_get(data, lambda x: x['owner']['username']),
'uploader_id': try_get(data, lambda x: x['owner']['id']), 'uploader_id': str_or_none(try_get(data, lambda x: x['owner']['id'])),
'formats': formats, 'formats': formats,
'subtitles': subtitles, 'subtitles': subtitles,
} }

View file

@ -46,10 +46,6 @@ class YleAreenaIE(InfoExtractor):
'title': 'Albi haluaa vessan', 'title': 'Albi haluaa vessan',
'description': 'md5:15236d810c837bed861fae0e88663c33', 'description': 'md5:15236d810c837bed861fae0e88663c33',
'series': 'Albi Lumiukko', 'series': 'Albi Lumiukko',
'season': None,
'season_number': None,
'episode': None,
'episode_number': None,
'thumbnail': 'http://cfvod.kaltura.com/p/1955031/sp/195503100/thumbnail/entry_id/1_l38iz9ur/version/100021', 'thumbnail': 'http://cfvod.kaltura.com/p/1955031/sp/195503100/thumbnail/entry_id/1_l38iz9ur/version/100021',
'uploader_id': 'ovp@yle.fi', 'uploader_id': 'ovp@yle.fi',
'duration': 319, 'duration': 319,

View file

@ -42,11 +42,11 @@ class YoukuIE(InfoExtractor):
'uploader_id': '322014285', 'uploader_id': '322014285',
'uploader_url': 'http://i.youku.com/u/UMTI4ODA1NzE0MA==', 'uploader_url': 'http://i.youku.com/u/UMTI4ODA1NzE0MA==',
'tags': list, 'tags': list,
'skip': '404',
}, },
'params': { 'params': {
'videopassword': '100600', 'videopassword': '100600',
}, },
'skip': '404',
}, { }, {
# /play/get.json contains streams with "channel_type":"tail" # /play/get.json contains streams with "channel_type":"tail"
'url': 'http://v.youku.com/v_show/id_XOTUxMzg4NDMy.html', 'url': 'http://v.youku.com/v_show/id_XOTUxMzg4NDMy.html',

View file

@ -6,6 +6,7 @@
ExtractorError, ExtractorError,
format_field, format_field,
int_or_none, int_or_none,
str_or_none,
try_get, try_get,
) )
@ -102,7 +103,7 @@ def _extract_moment(item, fatal=True):
'timestamp': int_or_none(item.get('created')), 'timestamp': int_or_none(item.get('created')),
'creator': uploader, 'creator': uploader,
'uploader': uploader, 'uploader': uploader,
'uploader_id': uploader_id, 'uploader_id': str_or_none(uploader_id),
'uploader_url': uploader_url, 'uploader_url': uploader_url,
'formats': [{ 'formats': [{
'url': 'https://hls.younow.com/momentsplaylists/live/%s/%s.m3u8' 'url': 'https://hls.younow.com/momentsplaylists/live/%s/%s.m3u8'
@ -184,7 +185,7 @@ class YouNowMomentIE(InfoExtractor):
'timestamp': 1490432040, 'timestamp': 1490432040,
'upload_date': '20170325', 'upload_date': '20170325',
'uploader': 'GABO...', 'uploader': 'GABO...',
'uploader_id': 35917228, 'uploader_id': '35917228',
}, },
} }

View file

@ -513,7 +513,6 @@ class ZingMp3LiveRadioIE(ZingMp3BaseIE):
'id': 'IWZ979UB', 'id': 'IWZ979UB',
'title': r're:^V\-POP', 'title': r're:^V\-POP',
'description': 'md5:aa857f8a91dc9ce69e862a809e4bdc10', 'description': 'md5:aa857f8a91dc9ce69e862a809e4bdc10',
'protocol': 'm3u8_native',
'ext': 'mp4', 'ext': 'mp4',
'view_count': int, 'view_count': int,
'thumbnail': r're:^https?://.*\.jpg', 'thumbnail': r're:^https?://.*\.jpg',
@ -529,7 +528,6 @@ class ZingMp3LiveRadioIE(ZingMp3BaseIE):
'id': 'IWZ97CWB', 'id': 'IWZ97CWB',
'title': r're:^Live\s247', 'title': r're:^Live\s247',
'description': 'md5:d41d8cd98f00b204e9800998ecf8427e', 'description': 'md5:d41d8cd98f00b204e9800998ecf8427e',
'protocol': 'm3u8_native',
'ext': 'm4a', 'ext': 'm4a',
'view_count': int, 'view_count': int,
'thumbnail': r're:^https?://.*\.jpg', 'thumbnail': r're:^https?://.*\.jpg',