Skip to content

Commit

Permalink
Merge branch 'master' into df-testdl-patch
Browse files Browse the repository at this point in the history
  • Loading branch information
dirkf committed Feb 21, 2024
2 parents 6ae54a4 + 7687389 commit 0203fa9
Show file tree
Hide file tree
Showing 88 changed files with 8,893 additions and 2,021 deletions.
465 changes: 430 additions & 35 deletions .github/workflows/ci.yml

Large diffs are not rendered by default.

139 changes: 116 additions & 23 deletions README.md

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions devscripts/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# Empty file needed to make devscripts.utils properly importable from outside
11 changes: 7 additions & 4 deletions devscripts/bash-completion.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,12 @@
from os.path import dirname as dirn
import sys

sys.path.insert(0, dirn(dirn((os.path.abspath(__file__)))))
sys.path.insert(0, dirn(dirn(os.path.abspath(__file__))))

import youtube_dl
from youtube_dl.compat import compat_open as open

from utils import read_file

BASH_COMPLETION_FILE = "youtube-dl.bash-completion"
BASH_COMPLETION_TEMPLATE = "devscripts/bash-completion.in"
Expand All @@ -18,9 +22,8 @@ def build_completion(opt_parser):
for option in group.option_list:
# for every long flag
opts_flag.append(option.get_opt_string())
with open(BASH_COMPLETION_TEMPLATE) as f:
template = f.read()
with open(BASH_COMPLETION_FILE, "w") as f:
template = read_file(BASH_COMPLETION_TEMPLATE)
with open(BASH_COMPLETION_FILE, "w", encoding='utf-8') as f:
# just using the special char
filled_template = template.replace("{{flags}}", " ".join(opts_flag))
f.write(filled_template)
Expand Down
83 changes: 83 additions & 0 deletions devscripts/cli_to_api.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
#!/usr/bin/env python
# coding: utf-8

from __future__ import unicode_literals

"""
This script displays the API parameters corresponding to a yt-dl command line
Example:
$ ./cli_to_api.py -f best
{u'format': 'best'}
$
"""

# Allow direct execution
import os
import sys
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

import youtube_dl
from types import MethodType


def cli_to_api(*opts):
YDL = youtube_dl.YoutubeDL

# to extract the parsed options, break out of YoutubeDL instantiation

# return options via this Exception
class ParseYTDLResult(Exception):
def __init__(self, result):
super(ParseYTDLResult, self).__init__('result')
self.opts = result

# replacement constructor that raises ParseYTDLResult
def ytdl_init(ydl, ydl_opts):
super(YDL, ydl).__init__(ydl_opts)
raise ParseYTDLResult(ydl_opts)

# patch in the constructor
YDL.__init__ = MethodType(ytdl_init, YDL)

# core parser
def parsed_options(argv):
try:
youtube_dl._real_main(list(argv))
except ParseYTDLResult as result:
return result.opts

# from https://github.com/yt-dlp/yt-dlp/issues/5859#issuecomment-1363938900
default = parsed_options([])

def neq_opt(a, b):
if a == b:
return False
if a is None and repr(type(object)).endswith(".utils.DateRange'>"):
return '0001-01-01 - 9999-12-31' != '{0}'.format(b)
return a != b

diff = dict((k, v) for k, v in parsed_options(opts).items() if neq_opt(default[k], v))
if 'postprocessors' in diff:
diff['postprocessors'] = [pp for pp in diff['postprocessors'] if pp not in default['postprocessors']]
return diff


def main():
from pprint import PrettyPrinter

pprint = PrettyPrinter()
super_format = pprint.format

def format(object, context, maxlevels, level):
if repr(type(object)).endswith(".utils.DateRange'>"):
return '{0}: {1}>'.format(repr(object)[:-2], object), True, False
return super_format(object, context, maxlevels, level)

pprint.format = format

pprint.pprint(cli_to_api(*sys.argv))


if __name__ == '__main__':
main()
9 changes: 5 additions & 4 deletions devscripts/create-github-release.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
#!/usr/bin/env python
from __future__ import unicode_literals

import io
import json
import mimetypes
import netrc
Expand All @@ -10,7 +9,9 @@
import re
import sys

sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
dirn = os.path.dirname

sys.path.insert(0, dirn(dirn(os.path.abspath(__file__))))

from youtube_dl.compat import (
compat_basestring,
Expand All @@ -22,6 +23,7 @@
make_HTTPS_handler,
sanitized_Request,
)
from utils import read_file


class GitHubReleaser(object):
Expand Down Expand Up @@ -89,8 +91,7 @@ def main():

changelog_file, version, build_path = args

with io.open(changelog_file, encoding='utf-8') as inf:
changelog = inf.read()
changelog = read_file(changelog_file)

mobj = re.search(r'(?s)version %s\n{2}(.+?)\n{3}' % version, changelog)
body = mobj.group(1) if mobj else ''
Expand Down
11 changes: 6 additions & 5 deletions devscripts/fish-completion.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,13 @@
from os.path import dirname as dirn
import sys

sys.path.insert(0, dirn(dirn((os.path.abspath(__file__)))))
sys.path.insert(0, dirn(dirn(os.path.abspath(__file__))))

import youtube_dl
from youtube_dl.utils import shell_quote

from utils import read_file, write_file

FISH_COMPLETION_FILE = 'youtube-dl.fish'
FISH_COMPLETION_TEMPLATE = 'devscripts/fish-completion.in'

Expand Down Expand Up @@ -38,11 +41,9 @@ def build_completion(opt_parser):
complete_cmd.extend(EXTRA_ARGS.get(long_option, []))
commands.append(shell_quote(complete_cmd))

with open(FISH_COMPLETION_TEMPLATE) as f:
template = f.read()
template = read_file(FISH_COMPLETION_TEMPLATE)
filled_template = template.replace('{{commands}}', '\n'.join(commands))
with open(FISH_COMPLETION_FILE, 'w') as f:
f.write(filled_template)
write_file(FISH_COMPLETION_FILE, filled_template)


parser = youtube_dl.parseOpts()[0]
Expand Down
15 changes: 10 additions & 5 deletions devscripts/gh-pages/add-version.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,16 +6,21 @@
import hashlib
import os.path

dirn = os.path.dirname

sys.path.insert(0, dirn(dirn(dirn(os.path.abspath(__file__)))))

from devscripts.utils import read_file, write_file
from youtube_dl.compat import compat_open as open

if len(sys.argv) <= 1:
print('Specify the version number as parameter')
sys.exit()
version = sys.argv[1]

with open('update/LATEST_VERSION', 'w') as f:
f.write(version)
write_file('update/LATEST_VERSION', version)

versions_info = json.load(open('update/versions.json'))
versions_info = json.loads(read_file('update/versions.json'))
if 'signature' in versions_info:
del versions_info['signature']

Expand All @@ -39,5 +44,5 @@
versions_info['versions'][version] = new_version
versions_info['latest'] = version

with open('update/versions.json', 'w') as jsonf:
json.dump(versions_info, jsonf, indent=4, sort_keys=True)
with open('update/versions.json', 'w', encoding='utf-8') as jsonf:
json.dumps(versions_info, jsonf, indent=4, sort_keys=True)
17 changes: 12 additions & 5 deletions devscripts/gh-pages/generate-download.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,21 @@
from __future__ import unicode_literals

import json
import os.path
import sys

versions_info = json.load(open('update/versions.json'))
dirn = os.path.dirname

sys.path.insert(0, dirn(dirn((os.path.abspath(__file__)))))

from utils import read_file, write_file

versions_info = json.loads(read_file('update/versions.json'))
version = versions_info['latest']
version_dict = versions_info['versions'][version]

# Read template page
with open('download.html.in', 'r', encoding='utf-8') as tmplf:
template = tmplf.read()
template = read_file('download.html.in')

template = template.replace('@PROGRAM_VERSION@', version)
template = template.replace('@PROGRAM_URL@', version_dict['bin'][0])
Expand All @@ -18,5 +25,5 @@
template = template.replace('@EXE_SHA256SUM@', version_dict['exe'][1])
template = template.replace('@TAR_URL@', version_dict['tar'][0])
template = template.replace('@TAR_SHA256SUM@', version_dict['tar'][1])
with open('download.html', 'w', encoding='utf-8') as dlf:
dlf.write(template)

write_file('download.html', template)
17 changes: 11 additions & 6 deletions devscripts/gh-pages/update-copyright.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,17 +5,22 @@

import datetime
import glob
import io # For Python 2 compatibility
import os
import re
import sys

year = str(datetime.datetime.now().year)
dirn = os.path.dirname

sys.path.insert(0, dirn(dirn(dirn(os.path.abspath(__file__)))))

from devscripts.utils import read_file, write_file
from youtube_dl import compat_str

year = compat_str(datetime.datetime.now().year)
for fn in glob.glob('*.html*'):
with io.open(fn, encoding='utf-8') as f:
content = f.read()
content = read_file(fn)
newc = re.sub(r'(?P<copyright>Copyright © 2011-)(?P<year>[0-9]{4})', 'Copyright © 2011-' + year, content)
if content != newc:
tmpFn = fn + '.part'
with io.open(tmpFn, 'wt', encoding='utf-8') as outf:
outf.write(newc)
write_file(tmpFn, newc)
os.rename(tmpFn, fn)
11 changes: 8 additions & 3 deletions devscripts/gh-pages/update-feed.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,16 @@
from __future__ import unicode_literals

import datetime
import io
import json
import os.path
import textwrap
import sys

dirn = os.path.dirname

sys.path.insert(0, dirn(dirn(os.path.abspath(__file__))))

from utils import write_file

atom_template = textwrap.dedent("""\
<?xml version="1.0" encoding="utf-8"?>
Expand Down Expand Up @@ -72,5 +78,4 @@
entries_str = textwrap.indent(''.join(entries), '\t')
atom_template = atom_template.replace('@ENTRIES@', entries_str)

with io.open('update/releases.atom', 'w', encoding='utf-8') as atom_file:
atom_file.write(atom_template)
write_file('update/releases.atom', atom_template)
11 changes: 6 additions & 5 deletions devscripts/gh-pages/update-sites.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,17 @@
import os
import textwrap

dirn = os.path.dirname

# We must be able to import youtube_dl
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))
sys.path.insert(0, dirn(dirn(dirn(os.path.abspath(__file__)))))

import youtube_dl
from devscripts.utils import read_file, write_file


def main():
with open('supportedsites.html.in', 'r', encoding='utf-8') as tmplf:
template = tmplf.read()
template = read_file('supportedsites.html.in')

ie_htmls = []
for ie in youtube_dl.list_extractors(age_limit=None):
Expand All @@ -29,8 +31,7 @@ def main():

template = template.replace('@SITES@', textwrap.indent('\n'.join(ie_htmls), '\t'))

with open('supportedsites.html', 'w', encoding='utf-8') as sitesf:
sitesf.write(template)
write_file('supportedsites.html', template)


if __name__ == '__main__':
Expand Down
9 changes: 4 additions & 5 deletions devscripts/make_contributing.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
#!/usr/bin/env python
from __future__ import unicode_literals

import io
import optparse
import re

from utils import read_file, write_file


def main():
parser = optparse.OptionParser(usage='%prog INFILE OUTFILE')
Expand All @@ -14,8 +15,7 @@ def main():

infile, outfile = args

with io.open(infile, encoding='utf-8') as inf:
readme = inf.read()
readme = read_file(infile)

bug_text = re.search(
r'(?s)#\s*BUGS\s*[^\n]*\s*(.*?)#\s*COPYRIGHT', readme).group(1)
Expand All @@ -25,8 +25,7 @@ def main():

out = bug_text + dev_text

with io.open(outfile, 'w', encoding='utf-8') as outf:
outf.write(out)
write_file(outfile, out)


if __name__ == '__main__':
Expand Down
17 changes: 7 additions & 10 deletions devscripts/make_issue_template.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
#!/usr/bin/env python
from __future__ import unicode_literals

import io
import optparse
import os.path
import sys

from utils import read_file, read_version, write_file


def main():
Expand All @@ -13,17 +16,11 @@ def main():

infile, outfile = args

with io.open(infile, encoding='utf-8') as inf:
issue_template_tmpl = inf.read()

# Get the version from youtube_dl/version.py without importing the package
exec(compile(open('youtube_dl/version.py').read(),
'youtube_dl/version.py', 'exec'))
issue_template_tmpl = read_file(infile)

out = issue_template_tmpl % {'version': locals()['__version__']}
out = issue_template_tmpl % {'version': read_version()}

with io.open(outfile, 'w', encoding='utf-8') as outf:
outf.write(out)
write_file(outfile, out)

if __name__ == '__main__':
main()

0 comments on commit 0203fa9

Please sign in to comment.