mirror of
https://github.com/yt-dlp/yt-dlp
synced 2024-12-26 21:59:08 +01:00
[cleanup] Misc
This commit is contained in:
parent
cd810afe2a
commit
812cdfa06c
5 changed files with 40 additions and 12 deletions
|
@ -76,7 +76,7 @@ yt-dlp is a [youtube-dl](https://github.com/ytdl-org/youtube-dl) fork based on t
|
||||||
|
|
||||||
# NEW FEATURES
|
# NEW FEATURES
|
||||||
|
|
||||||
* Merged with **youtube-dl v2021.12.17+ [commit/2dd6c6e](https://github.com/ytdl-org/youtube-dl/commit/2dd6c6e)** ([exceptions](https://github.com/yt-dlp/yt-dlp/issues/21)) and **youtube-dlc v2020.11.11-3+ [commit/f9401f2](https://github.com/blackjack4494/yt-dlc/commit/f9401f2a91987068139c5f757b12fc711d4c0cee)**: You get all the features and patches of [youtube-dlc](https://github.com/blackjack4494/yt-dlc) in addition to the latest [youtube-dl](https://github.com/ytdl-org/youtube-dl)
|
* Forked from [**yt-dlc@f9401f2**](https://github.com/blackjack4494/yt-dlc/commit/f9401f2a91987068139c5f757b12fc711d4c0cee) and merged with [**youtube-dl@42f2d4**](https://github.com/yt-dlp/yt-dlp/commit/42f2d4) ([exceptions](https://github.com/yt-dlp/yt-dlp/issues/21))
|
||||||
|
|
||||||
* **[SponsorBlock Integration](#sponsorblock-options)**: You can mark/remove sponsor sections in YouTube videos by utilizing the [SponsorBlock](https://sponsor.ajay.app) API
|
* **[SponsorBlock Integration](#sponsorblock-options)**: You can mark/remove sponsor sections in YouTube videos by utilizing the [SponsorBlock](https://sponsor.ajay.app) API
|
||||||
|
|
||||||
|
|
|
@ -35,5 +35,26 @@
|
||||||
"when": "8417f26b8a819cd7ffcd4e000ca3e45033e670fb",
|
"when": "8417f26b8a819cd7ffcd4e000ca3e45033e670fb",
|
||||||
"short": "Add option `--color` (#6904)",
|
"short": "Add option `--color` (#6904)",
|
||||||
"authors": ["Grub4K"]
|
"authors": ["Grub4K"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"action": "change",
|
||||||
|
"when": "7b37e8b23691613f331bd4ebc9d639dd6f93c972",
|
||||||
|
"short": "Improve `--download-sections`\n - Support negative time-ranges\n - Add `*from-url` to obey time-ranges in URL"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"action": "change",
|
||||||
|
"when": "1e75d97db21152acc764b30a688e516f04b8a142",
|
||||||
|
"short": "[extractor/youtube] Add `ios` to default clients used\n - IOS is affected neither by 403 nor by nsig so helps mitigate them preemptively\n - IOS also has higher bit-rate 'premium' formats though they are not labeled as such"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"action": "change",
|
||||||
|
"when": "f2ff0f6f1914b82d4a51681a72cc0828115dcb4a",
|
||||||
|
"short": "[extractor/motherless] Add gallery support, fix groups (#7211)",
|
||||||
|
"authors": ["rexlambert22", "Ti4eeT4e"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"action": "change",
|
||||||
|
"when": "a4486bfc1dc7057efca9dd3fe70d7fa25c56f700",
|
||||||
|
"short": "[misc] Revert \"Add automatic duplicate issue detection\""
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
|
@ -196,7 +196,7 @@ class Changelog:
|
||||||
for commit_infos in cleanup_misc_items.values():
|
for commit_infos in cleanup_misc_items.values():
|
||||||
sorted_items.append(CommitInfo(
|
sorted_items.append(CommitInfo(
|
||||||
'cleanup', ('Miscellaneous',), ', '.join(
|
'cleanup', ('Miscellaneous',), ', '.join(
|
||||||
self._format_message_link(None, info.commit.hash)
|
self._format_message_link(None, info.commit.hash).strip()
|
||||||
for info in sorted(commit_infos, key=lambda item: item.commit.hash or '')),
|
for info in sorted(commit_infos, key=lambda item: item.commit.hash or '')),
|
||||||
[], Commit(None, '', commit_infos[0].commit.authors), []))
|
[], Commit(None, '', commit_infos[0].commit.authors), []))
|
||||||
|
|
||||||
|
@ -205,10 +205,10 @@ class Changelog:
|
||||||
def format_single_change(self, info):
|
def format_single_change(self, info):
|
||||||
message = self._format_message_link(info.message, info.commit.hash)
|
message = self._format_message_link(info.message, info.commit.hash)
|
||||||
if info.issues:
|
if info.issues:
|
||||||
message = f'{message} ({self._format_issues(info.issues)})'
|
message = message.replace('\n', f' ({self._format_issues(info.issues)})\n', 1)
|
||||||
|
|
||||||
if info.commit.authors:
|
if info.commit.authors:
|
||||||
message = f'{message} by {self._format_authors(info.commit.authors)}'
|
message = message.replace('\n', f' by {self._format_authors(info.commit.authors)}\n', 1)
|
||||||
|
|
||||||
if info.fixes:
|
if info.fixes:
|
||||||
fix_message = ', '.join(f'{self._format_message_link(None, fix.hash)}' for fix in info.fixes)
|
fix_message = ', '.join(f'{self._format_message_link(None, fix.hash)}' for fix in info.fixes)
|
||||||
|
@ -217,14 +217,16 @@ class Changelog:
|
||||||
if authors != info.commit.authors:
|
if authors != info.commit.authors:
|
||||||
fix_message = f'{fix_message} by {self._format_authors(authors)}'
|
fix_message = f'{fix_message} by {self._format_authors(authors)}'
|
||||||
|
|
||||||
message = f'{message} (With fixes in {fix_message})'
|
message = message.replace('\n', f' (With fixes in {fix_message})\n', 1)
|
||||||
|
|
||||||
return message
|
return message[:-1]
|
||||||
|
|
||||||
def _format_message_link(self, message, hash):
|
def _format_message_link(self, message, hash):
|
||||||
assert message or hash, 'Improperly defined commit message or override'
|
assert message or hash, 'Improperly defined commit message or override'
|
||||||
message = message if message else hash[:HASH_LENGTH]
|
message = message if message else hash[:HASH_LENGTH]
|
||||||
return f'[{message}]({self.repo_url}/commit/{hash})' if hash else message
|
if not hash:
|
||||||
|
return f'{message}\n'
|
||||||
|
return f'[{message}\n'.replace('\n', f']({self.repo_url}/commit/{hash})\n', 1)
|
||||||
|
|
||||||
def _format_issues(self, issues):
|
def _format_issues(self, issues):
|
||||||
return ', '.join(f'[#{issue}]({self.repo_url}/issues/{issue})' for issue in issues)
|
return ', '.join(f'[#{issue}]({self.repo_url}/issues/{issue})' for issue in issues)
|
||||||
|
|
|
@ -8,7 +8,7 @@ class TestURLIE(InfoExtractor):
|
||||||
""" Allows addressing of the test cases as test:yout.*be_1 """
|
""" Allows addressing of the test cases as test:yout.*be_1 """
|
||||||
|
|
||||||
IE_DESC = False # Do not list
|
IE_DESC = False # Do not list
|
||||||
_VALID_URL = r'test(?:url)?:(?P<extractor>.*?)(?:_(?P<num>[0-9]+))?$'
|
_VALID_URL = r'test(?:url)?:(?P<extractor>.*?)(?:_(?P<num>\d+|all))?$'
|
||||||
|
|
||||||
def _real_extract(self, url):
|
def _real_extract(self, url):
|
||||||
from . import gen_extractor_classes
|
from . import gen_extractor_classes
|
||||||
|
@ -36,6 +36,10 @@ class TestURLIE(InfoExtractor):
|
||||||
extractor = matching_extractors[0]
|
extractor = matching_extractors[0]
|
||||||
|
|
||||||
testcases = tuple(extractor.get_testcases(True))
|
testcases = tuple(extractor.get_testcases(True))
|
||||||
|
if num == 'all':
|
||||||
|
return self.playlist_result(
|
||||||
|
[self.url_result(tc['url'], extractor) for tc in testcases],
|
||||||
|
url, f'{extractor.IE_NAME} tests')
|
||||||
try:
|
try:
|
||||||
tc = testcases[int(num or 0)]
|
tc = testcases[int(num or 0)]
|
||||||
except IndexError:
|
except IndexError:
|
||||||
|
@ -43,4 +47,4 @@ class TestURLIE(InfoExtractor):
|
||||||
f'Test case {num or 0} not found, got only {len(testcases)} tests', expected=True)
|
f'Test case {num or 0} not found, got only {len(testcases)} tests', expected=True)
|
||||||
|
|
||||||
self.to_screen(f'Test URL: {tc["url"]}')
|
self.to_screen(f'Test URL: {tc["url"]}')
|
||||||
return self.url_result(tc['url'])
|
return self.url_result(tc['url'], extractor)
|
||||||
|
|
|
@ -3507,7 +3507,8 @@ def get_compatible_ext(*, vcodecs, acodecs, vexts, aexts, preferences=None):
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
sanitize_codec = functools.partial(try_get, getter=lambda x: x[0].split('.')[0].replace('0', ''))
|
sanitize_codec = functools.partial(
|
||||||
|
try_get, getter=lambda x: x[0].split('.')[0].replace('0', '').lower())
|
||||||
vcodec, acodec = sanitize_codec(vcodecs), sanitize_codec(acodecs)
|
vcodec, acodec = sanitize_codec(vcodecs), sanitize_codec(acodecs)
|
||||||
|
|
||||||
for ext in preferences or COMPATIBLE_CODECS.keys():
|
for ext in preferences or COMPATIBLE_CODECS.keys():
|
||||||
|
@ -5737,9 +5738,9 @@ class FormatSorter:
|
||||||
'source': {'convert': 'float', 'field': 'source_preference', 'default': -1},
|
'source': {'convert': 'float', 'field': 'source_preference', 'default': -1},
|
||||||
|
|
||||||
'codec': {'type': 'combined', 'field': ('vcodec', 'acodec')},
|
'codec': {'type': 'combined', 'field': ('vcodec', 'acodec')},
|
||||||
'br': {'type': 'multiple', 'field': ('tbr', 'vbr', 'abr'),
|
'br': {'type': 'multiple', 'field': ('tbr', 'vbr', 'abr'), 'convert': 'float_none',
|
||||||
'function': lambda it: next(filter(None, it), None)},
|
'function': lambda it: next(filter(None, it), None)},
|
||||||
'size': {'type': 'multiple', 'field': ('filesize', 'fs_approx'),
|
'size': {'type': 'multiple', 'field': ('filesize', 'fs_approx'), 'convert': 'bytes',
|
||||||
'function': lambda it: next(filter(None, it), None)},
|
'function': lambda it: next(filter(None, it), None)},
|
||||||
'ext': {'type': 'combined', 'field': ('vext', 'aext')},
|
'ext': {'type': 'combined', 'field': ('vext', 'aext')},
|
||||||
'res': {'type': 'multiple', 'field': ('height', 'width'),
|
'res': {'type': 'multiple', 'field': ('height', 'width'),
|
||||||
|
|
Loading…
Reference in a new issue