]>
Commit | Line | Data |
---|---|---|
c76eb41b | 1 | # Unused |
2 | ||
cc52de43 | 3 | #!/usr/bin/env python3 |
db56f281 S |
4 | from __future__ import unicode_literals |
5 | ||
689f31fd | 6 | import io |
db56f281 S |
7 | import json |
8 | import mimetypes | |
9 | import netrc | |
10 | import optparse | |
11 | import os | |
689f31fd | 12 | import re |
db56f281 S |
13 | import sys |
14 | ||
15 | sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) | |
16 | ||
7a5c1cfe | 17 | from yt_dlp.compat import ( |
db56f281 | 18 | compat_basestring, |
db56f281 S |
19 | compat_getpass, |
20 | compat_print, | |
21 | compat_urllib_request, | |
22 | ) | |
7a5c1cfe | 23 | from yt_dlp.utils import ( |
db56f281 S |
24 | make_HTTPS_handler, |
25 | sanitized_Request, | |
26 | ) | |
27 | ||
28 | ||
29 | class GitHubReleaser(object): | |
067aa17e S |
30 | _API_URL = 'https://api.github.com/repos/ytdl-org/youtube-dl/releases' |
31 | _UPLOADS_URL = 'https://uploads.github.com/repos/ytdl-org/youtube-dl/releases/%s/assets?name=%s' | |
db56f281 S |
32 | _NETRC_MACHINE = 'github.com' |
33 | ||
34 | def __init__(self, debuglevel=0): | |
35 | self._init_github_account() | |
36 | https_handler = make_HTTPS_handler({}, debuglevel=debuglevel) | |
37 | self._opener = compat_urllib_request.build_opener(https_handler) | |
38 | ||
39 | def _init_github_account(self): | |
40 | try: | |
41 | info = netrc.netrc().authenticators(self._NETRC_MACHINE) | |
42 | if info is not None: | |
0d5c415e | 43 | self._token = info[2] |
db56f281 S |
44 | compat_print('Using GitHub credentials found in .netrc...') |
45 | return | |
46 | else: | |
47 | compat_print('No GitHub credentials found in .netrc') | |
48 | except (IOError, netrc.NetrcParseError): | |
49 | compat_print('Unable to parse .netrc') | |
0d5c415e S |
50 | self._token = compat_getpass( |
51 | 'Type your GitHub PAT (personal access token) and press [Return]: ') | |
db56f281 S |
52 | |
53 | def _call(self, req): | |
54 | if isinstance(req, compat_basestring): | |
55 | req = sanitized_Request(req) | |
0d5c415e | 56 | req.add_header('Authorization', 'token %s' % self._token) |
db56f281 S |
57 | response = self._opener.open(req).read().decode('utf-8') |
58 | return json.loads(response) | |
59 | ||
60 | def list_releases(self): | |
61 | return self._call(self._API_URL) | |
62 | ||
63 | def create_release(self, tag_name, name=None, body='', draft=False, prerelease=False): | |
64 | data = { | |
65 | 'tag_name': tag_name, | |
66 | 'target_commitish': 'master', | |
67 | 'name': name, | |
68 | 'body': body, | |
69 | 'draft': draft, | |
70 | 'prerelease': prerelease, | |
71 | } | |
72 | req = sanitized_Request(self._API_URL, json.dumps(data).encode('utf-8')) | |
73 | return self._call(req) | |
74 | ||
75 | def create_asset(self, release_id, asset): | |
76 | asset_name = os.path.basename(asset) | |
77 | url = self._UPLOADS_URL % (release_id, asset_name) | |
78 | # Our files are small enough to be loaded directly into memory. | |
79 | data = open(asset, 'rb').read() | |
80 | req = sanitized_Request(url, data) | |
81 | mime_type, _ = mimetypes.guess_type(asset_name) | |
82 | req.add_header('Content-Type', mime_type or 'application/octet-stream') | |
83 | return self._call(req) | |
84 | ||
85 | ||
86 | def main(): | |
689f31fd | 87 | parser = optparse.OptionParser(usage='%prog CHANGELOG VERSION BUILDPATH') |
db56f281 | 88 | options, args = parser.parse_args() |
689f31fd | 89 | if len(args) != 3: |
db56f281 S |
90 | parser.error('Expected a version and a build directory') |
91 | ||
689f31fd S |
92 | changelog_file, version, build_path = args |
93 | ||
94 | with io.open(changelog_file, encoding='utf-8') as inf: | |
95 | changelog = inf.read() | |
96 | ||
97 | mobj = re.search(r'(?s)version %s\n{2}(.+?)\n{3}' % version, changelog) | |
98 | body = mobj.group(1) if mobj else '' | |
db56f281 | 99 | |
db59b37d | 100 | releaser = GitHubReleaser() |
db56f281 | 101 | |
689f31fd | 102 | new_release = releaser.create_release( |
7a5c1cfe | 103 | version, name='yt-dlp %s' % version, body=body) |
db56f281 S |
104 | release_id = new_release['id'] |
105 | ||
106 | for asset in os.listdir(build_path): | |
107 | compat_print('Uploading %s...' % asset) | |
108 | releaser.create_asset(release_id, os.path.join(build_path, asset)) | |
109 | ||
110 | ||
111 | if __name__ == '__main__': | |
112 | main() |