[cleanup] Fix infodict returned fields (#8906)

Authored by: seproDev
pull/9238/head
sepro 8 months ago committed by GitHub
parent dfd8c0b696
commit f4f9f6d00e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -1310,6 +1310,8 @@ The available fields are:
- `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 @@ The available fields are:
- `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 @@ The available fields are:
- `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 @@ Available for the video that belongs to some logical chapter or section:
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

@ -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,

@ -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',
}, },

@ -3,6 +3,7 @@ from ..utils import (
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 @@ class AcFunBangumiIE(AcFunVideoBaseIE):
'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,

@ -31,6 +31,7 @@ from ..utils import (
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 @@ class ArchiveOrgIE(InfoExtractor):
'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 @@ class ArchiveOrgIE(InfoExtractor):
'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'),

@ -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 @@ class AxsIE(InfoExtractor):
'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}),

@ -2,6 +2,7 @@ from .common import InfoExtractor
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 @@ class BeegIE(InfoExtractor):
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')),

@ -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': [],

@ -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,

@ -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$',

@ -4,6 +4,7 @@ from ..utils import (
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 @@ class BleacherReportIE(InfoExtractor):
'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')),

@ -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,

@ -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 @@ class CGTNIE(InfoExtractor):
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 @@ class CGTNIE(InfoExtractor):
'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),
} }

@ -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}
}], }],

@ -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 @@ class CNBCVideoIE(InfoExtractor):
'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), }),
} }

@ -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"

@ -65,7 +65,7 @@ class CPACIE(InfoExtractor):
'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')),
} }

@ -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 @@ class CrunchyrollMusicIE(CrunchyrollBaseIE):
'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 @@ class CrunchyrollArtistIE(CrunchyrollBaseIE):
'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'),
}), }),
} }

@ -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'
}, },

@ -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',

@ -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,
}, },
}, { }, {

@ -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 @@ class DuoplayIE(InfoExtractor):
'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 {}),
} }

@ -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,

@ -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 @@ class FunimationShowIE(FunimationBaseIE):
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(

@ -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',

@ -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):

@ -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',

@ -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 @@ class HotStarIE(HotStarBaseIE):
'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')),
} }

@ -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',
}, },

@ -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 @@ class MonsterSirenHypergryphMusicIE(InfoExtractor):
'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'))
} }

@ -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',

@ -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 @@ class LikeeIE(InfoExtractor):
'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')),

@ -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 @@ class MegaphoneIE(InfoExtractor):
'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,
} }

@ -17,11 +17,11 @@ class MusicdexBaseIE(InfoExtractor):
'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 @@ class MusicdexAlbumIE(MusicdexBaseIE):
'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,

@ -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
} }
} }
] ]

@ -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,

@ -3,6 +3,7 @@ from ..utils import (
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 @@ class NineCNineMediaIE(InfoExtractor):
'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',

@ -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
}, },
} }
] ]

@ -11,6 +11,7 @@ from ..utils import (
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 @@ class OnDemandKoreaIE(InfoExtractor):
'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),

@ -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': {

@ -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$',

@ -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,

@ -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',

@ -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 @@ class PodchaserIE(InfoExtractor):
'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'),

@ -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 @@ from ..utils import (
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 @@ class Pr0grammIE(InfoExtractor):
'_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)})
}), }),
} }

@ -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 @@ class PrankCastIE(InfoExtractor):
'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'),

@ -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 @@ class RadioComercialIE(InfoExtractor):
'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'),
} }

@ -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',

@ -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,7 +327,7 @@ class RCTIPlusSeriesIE(RCTIPlusBaseIE):
'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(

@ -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 @@ class RokfinIE(InfoExtractor):
'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,

@ -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',
}, },

@ -46,7 +46,7 @@ class RutubeBaseIE(InfoExtractor):
'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,

@ -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'],
}, { }, {

@ -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 @@ class SkebIE(InfoExtractor):
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,

@ -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 @@ fragment BannerFields on Banner {
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 @@ fragment BannerFields on Banner {
'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 @@ fragment BannerFields on Banner {
'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'),
}), }),
}) })

@ -2,9 +2,10 @@ import re
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 @@ class SteamCommunityBroadcastIE(InfoExtractor):
'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,
} }

@ -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 @@ class TenPlayIE(InfoExtractor):
'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'),

@ -320,7 +320,7 @@ class TikTokBaseIE(InfoExtractor):
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 @@ class TikTokBaseIE(InfoExtractor):
'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 @@ class TikTokBaseIE(InfoExtractor):
'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 @@ class TikTokBaseIE(InfoExtractor):
'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,

@ -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,
} }
}, { }, {

@ -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',

@ -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,

@ -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'],
}, { }, {

@ -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 @@ class VideofyMeIE(InfoExtractor):
'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')),
} }

@ -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

@ -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': {

@ -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+',

@ -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,

@ -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'
}, },
} }

@ -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 @@ class XimalayaIE(XimalayaBaseIE):
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,

@ -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 @@ class XinpianchangIE(InfoExtractor):
'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,
} }

@ -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,

@ -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',

@ -6,6 +6,7 @@ from ..utils import (
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',
}, },
} }

@ -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',

Loading…
Cancel
Save