]>
jfr.im git - yt-dlp.git/blob - devscripts/create-github-release.py
4 from __future__
import unicode_literals
15 sys
.path
.insert(0, os
.path
.dirname(os
.path
.dirname(os
.path
.abspath(__file__
))))
17 from yt_dlp
.compat
import (
21 compat_urllib_request
,
23 from yt_dlp
.utils
import (
29 class GitHubReleaser(object):
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'
32 _NETRC_MACHINE
= 'github.com'
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
)
39 def _init_github_account(self
):
41 info
= netrc
.netrc().authenticators(self
._NETRC
_MACHINE
)
44 compat_print('Using GitHub credentials found in .netrc...')
47 compat_print('No GitHub credentials found in .netrc')
48 except (IOError, netrc
.NetrcParseError
):
49 compat_print('Unable to parse .netrc')
50 self
._token
= compat_getpass(
51 'Type your GitHub PAT (personal access token) and press [Return]: ')
54 if isinstance(req
, compat_basestring
):
55 req
= sanitized_Request(req
)
56 req
.add_header('Authorization', 'token %s' % self
._token
)
57 response
= self
._opener
.open(req
).read().decode('utf-8')
58 return json
.loads(response
)
60 def list_releases(self
):
61 return self
._call
(self
._API
_URL
)
63 def create_release(self
, tag_name
, name
=None, body
='', draft
=False, prerelease
=False):
66 'target_commitish': 'master',
70 'prerelease': prerelease
,
72 req
= sanitized_Request(self
._API
_URL
, json
.dumps(data
).encode('utf-8'))
73 return self
._call
(req
)
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
)
87 parser
= optparse
.OptionParser(usage
='%prog CHANGELOG VERSION BUILDPATH')
88 options
, args
= parser
.parse_args()
90 parser
.error('Expected a version and a build directory')
92 changelog_file
, version
, build_path
= args
94 with io
.open(changelog_file
, encoding
='utf-8') as inf
:
95 changelog
= inf
.read()
97 mobj
= re
.search(r
'(?s)version %s\n{2}(.+?)\n{3}' % version
, changelog
)
98 body
= mobj
.group(1) if mobj
else ''
100 releaser
= GitHubReleaser()
102 new_release
= releaser
.create_release(
103 version
, name
='yt-dlp %s' % version
, body
=body
)
104 release_id
= new_release
['id']
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
))
111 if __name__
== '__main__':