mirror of
				https://github.com/ytdl-org/youtube-dl.git
				synced 2025-10-29 09:26:20 -07:00 
			
		
		
		
	[devscripts/create-github-release] Add script for releasing on GitHub
Yet only Basic authentication is supported either via .netrc or by manual input
This commit is contained in:
		
							
								
								
									
										112
									
								
								devscripts/create-github-release.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										112
									
								
								devscripts/create-github-release.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,112 @@ | ||||
| #!/usr/bin/env python | ||||
| from __future__ import unicode_literals | ||||
|  | ||||
| import base64 | ||||
| import json | ||||
| import mimetypes | ||||
| import netrc | ||||
| import optparse | ||||
| import os | ||||
| import sys | ||||
|  | ||||
| sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) | ||||
|  | ||||
| from youtube_dl.compat import ( | ||||
|     compat_basestring, | ||||
|     compat_input, | ||||
|     compat_getpass, | ||||
|     compat_print, | ||||
|     compat_urllib_request, | ||||
| ) | ||||
| from youtube_dl.utils import ( | ||||
|     make_HTTPS_handler, | ||||
|     sanitized_Request, | ||||
| ) | ||||
|  | ||||
|  | ||||
| class GitHubReleaser(object): | ||||
|     _API_URL = 'https://api.github.com/repos/rg3/youtube-dl/releases' | ||||
|     _UPLOADS_URL = 'https://uploads.github.com/repos/rg3/youtube-dl/releases/%s/assets?name=%s' | ||||
|     _NETRC_MACHINE = 'github.com' | ||||
|  | ||||
|     def __init__(self, debuglevel=0): | ||||
|         self._init_github_account() | ||||
|         https_handler = make_HTTPS_handler({}, debuglevel=debuglevel) | ||||
|         self._opener = compat_urllib_request.build_opener(https_handler) | ||||
|  | ||||
|     def _init_github_account(self): | ||||
|         try: | ||||
|             info = netrc.netrc().authenticators(self._NETRC_MACHINE) | ||||
|             if info is not None: | ||||
|                 self._username = info[0] | ||||
|                 self._password = info[2] | ||||
|                 compat_print('Using GitHub credentials found in .netrc...') | ||||
|                 return | ||||
|             else: | ||||
|                 compat_print('No GitHub credentials found in .netrc') | ||||
|         except (IOError, netrc.NetrcParseError): | ||||
|             compat_print('Unable to parse .netrc') | ||||
|         self._username = compat_input( | ||||
|             'Type your GitHub username or email address and press [Return]: ') | ||||
|         self._password = compat_getpass( | ||||
|             'Type your GitHub password and press [Return]: ') | ||||
|  | ||||
|     def _call(self, req): | ||||
|         if isinstance(req, compat_basestring): | ||||
|             req = sanitized_Request(req) | ||||
|         # Authorizing manually since GitHub does not response with 401 with | ||||
|         # WWW-Authenticate header set (see | ||||
|         # https://developer.github.com/v3/#basic-authentication) | ||||
|         b64 = base64.b64encode( | ||||
|             ('%s:%s' % (self._username, self._password)).encode('utf-8')).decode('ascii') | ||||
|         req.add_header('Authorization', 'Basic %s' % b64) | ||||
|         response = self._opener.open(req).read().decode('utf-8') | ||||
|         return json.loads(response) | ||||
|  | ||||
|     def list_releases(self): | ||||
|         return self._call(self._API_URL) | ||||
|  | ||||
|     def create_release(self, tag_name, name=None, body='', draft=False, prerelease=False): | ||||
|         data = { | ||||
|             'tag_name': tag_name, | ||||
|             'target_commitish': 'master', | ||||
|             'name': name, | ||||
|             'body': body, | ||||
|             'draft': draft, | ||||
|             'prerelease': prerelease, | ||||
|         } | ||||
|         req = sanitized_Request(self._API_URL, json.dumps(data).encode('utf-8')) | ||||
|         return self._call(req) | ||||
|  | ||||
|     def create_asset(self, release_id, asset): | ||||
|         asset_name = os.path.basename(asset) | ||||
|         url = self._UPLOADS_URL % (release_id, asset_name) | ||||
|         # Our files are small enough to be loaded directly into memory. | ||||
|         data = open(asset, 'rb').read() | ||||
|         req = sanitized_Request(url, data) | ||||
|         mime_type, _ = mimetypes.guess_type(asset_name) | ||||
|         req.add_header('Content-Type', mime_type or 'application/octet-stream') | ||||
|         return self._call(req) | ||||
|  | ||||
|  | ||||
| def main(): | ||||
|     parser = optparse.OptionParser(usage='%prog VERSION BUILDPATH') | ||||
|     options, args = parser.parse_args() | ||||
|     if len(args) != 2: | ||||
|         parser.error('Expected a version and a build directory') | ||||
|  | ||||
|     version, build_path = args | ||||
|  | ||||
|     releaser = GitHubReleaser(debuglevel=0) | ||||
|  | ||||
|     new_release = releaser.create_release( | ||||
|         version, name='youtube-dl %s' % version, draft=True, prerelease=True) | ||||
|     release_id = new_release['id'] | ||||
|  | ||||
|     for asset in os.listdir(build_path): | ||||
|         compat_print('Uploading %s...' % asset) | ||||
|         releaser.create_asset(release_id, os.path.join(build_path, asset)) | ||||
|  | ||||
|  | ||||
| if __name__ == '__main__': | ||||
|     main() | ||||
		Reference in New Issue
	
	Block a user