mirror of
				https://github.com/yt-dlp/yt-dlp.git
				synced 2025-10-31 06:35:12 +00:00 
			
		
		
		
	
							
								
								
									
										177
									
								
								pyinst.py
									
									
									
									
									
								
							
							
						
						
									
										177
									
								
								pyinst.py
									
									
									
									
									
								
							| @@ -1,84 +1,85 @@ | ||||
| #!/usr/bin/env python3 | ||||
| # coding: utf-8 | ||||
|  | ||||
| from __future__ import unicode_literals | ||||
| import sys | ||||
| import os | ||||
| import platform | ||||
|  | ||||
| import sys | ||||
| from PyInstaller.utils.hooks import collect_submodules | ||||
|  | ||||
| if platform.system() == 'Windows': | ||||
|  | ||||
| OS_NAME = platform.system() | ||||
| if OS_NAME == 'Windows': | ||||
|     from PyInstaller.utils.win32.versioninfo import ( | ||||
|         VarStruct, VarFileInfo, StringStruct, StringTable, | ||||
|         StringFileInfo, FixedFileInfo, VSVersionInfo, SetVersion, | ||||
|     ) | ||||
| import PyInstaller.__main__ | ||||
| elif OS_NAME == 'Darwin': | ||||
|     pass | ||||
| else: | ||||
|     raise Exception('{OS_NAME} is not supported') | ||||
|  | ||||
| suffix = '' | ||||
| arch = platform.architecture()[0][:2] | ||||
| assert arch in ('32', '64') | ||||
| _x86 = '_x86' if arch == '32' else '' | ||||
| ARCH = platform.architecture()[0][:2] | ||||
|  | ||||
| if platform.system() == 'Windows': | ||||
|     suffix = _x86 | ||||
| if platform.system() == 'Darwin': | ||||
|     suffix = '_macos' | ||||
|  | ||||
| # Compatability with older arguments | ||||
| opts = sys.argv[1:] | ||||
| if opts[0:1] in (['32'], ['64']): | ||||
|     if arch != opts[0]: | ||||
|         raise Exception(f'{opts[0]}bit executable cannot be built on a {arch}bit system') | ||||
|     opts = opts[1:] | ||||
| opts = opts or ['--onefile'] | ||||
| def main(): | ||||
|     opts = parse_options() | ||||
|     version = read_version() | ||||
|  | ||||
| print(f'Building {arch}bit version with options {opts}') | ||||
|     suffix = '_x86' if ARCH == '32' else '_macos' if OS_NAME == 'Darwin' else '' | ||||
|     final_file = 'dist/%syt-dlp%s%s' % ( | ||||
|         'yt-dlp/' if '--onedir' in opts else '', suffix, '.exe' if OS_NAME == 'Windows' else '') | ||||
|  | ||||
| FILE_DESCRIPTION = 'yt-dlp%s' % (' (32 Bit)' if _x86 else '') | ||||
|     print(f'Building yt-dlp v{version} {ARCH}bit for {OS_NAME} with options {opts}') | ||||
|     print('Remember to update the version using "devscripts/update-version.py"') | ||||
|     if not os.path.isfile('yt_dlp/extractor/lazy_extractors.py'): | ||||
|         print('WARNING: Building without lazy_extractors. Run  ' | ||||
|               '"devscripts/make_lazy_extractors.py" "yt_dlp/extractor/lazy_extractors.py"  ' | ||||
|               'to build lazy extractors', file=sys.stderr) | ||||
|     print(f'Destination: {final_file}\n') | ||||
|  | ||||
| exec(compile(open('yt_dlp/version.py').read(), 'yt_dlp/version.py', 'exec')) | ||||
| VERSION = locals()['__version__'] | ||||
|     opts = [ | ||||
|         f'--name=yt-dlp{suffix}', | ||||
|         '--icon=devscripts/logo.ico', | ||||
|         '--upx-exclude=vcruntime140.dll', | ||||
|         '--noconfirm', | ||||
|         *dependancy_options(), | ||||
|         *opts, | ||||
|         'yt_dlp/__main__.py', | ||||
|     ] | ||||
|     print(f'Running PyInstaller with {opts}') | ||||
|  | ||||
| VERSION_LIST = VERSION.split('.') | ||||
| VERSION_LIST = list(map(int, VERSION_LIST)) + [0] * (4 - len(VERSION_LIST)) | ||||
|     import PyInstaller.__main__ | ||||
|  | ||||
| print('Version: %s%s' % (VERSION, _x86)) | ||||
| print('Remember to update the version using devscipts\\update-version.py') | ||||
|     PyInstaller.__main__.run(opts) | ||||
|  | ||||
| if platform.system() == 'Windows': | ||||
|     VERSION_FILE = VSVersionInfo( | ||||
|         ffi=FixedFileInfo( | ||||
|             filevers=VERSION_LIST, | ||||
|             prodvers=VERSION_LIST, | ||||
|             mask=0x3F, | ||||
|             flags=0x0, | ||||
|             OS=0x4, | ||||
|             fileType=0x1, | ||||
|             subtype=0x0, | ||||
|             date=(0, 0), | ||||
|         ), | ||||
|         kids=[ | ||||
|             StringFileInfo([ | ||||
|                 StringTable( | ||||
|                     '040904B0', [ | ||||
|                         StringStruct('Comments', 'yt-dlp%s Command Line Interface.' % _x86), | ||||
|                         StringStruct('CompanyName', 'https://github.com/yt-dlp'), | ||||
|                         StringStruct('FileDescription', FILE_DESCRIPTION), | ||||
|                         StringStruct('FileVersion', VERSION), | ||||
|                         StringStruct('InternalName', 'yt-dlp%s' % _x86), | ||||
|                         StringStruct( | ||||
|                             'LegalCopyright', | ||||
|                             'pukkandan.ytdlp@gmail.com | UNLICENSE', | ||||
|                         ), | ||||
|                         StringStruct('OriginalFilename', 'yt-dlp%s.exe' % _x86), | ||||
|                         StringStruct('ProductName', 'yt-dlp%s' % _x86), | ||||
|                         StringStruct( | ||||
|                             'ProductVersion', | ||||
|                             '%s%s on Python %s' % (VERSION, _x86, platform.python_version())), | ||||
|                     ])]), | ||||
|             VarFileInfo([VarStruct('Translation', [0, 1200])]) | ||||
|         ] | ||||
|     ) | ||||
|     set_version_info(final_file, version) | ||||
|  | ||||
|  | ||||
| def parse_options(): | ||||
|     # Compatability with older arguments | ||||
|     opts = sys.argv[1:] | ||||
|     if opts[0:1] in (['32'], ['64']): | ||||
|         if ARCH != opts[0]: | ||||
|             raise Exception(f'{opts[0]}bit executable cannot be built on a {ARCH}bit system') | ||||
|         opts = opts[1:] | ||||
|     return opts or ['--onefile'] | ||||
|  | ||||
|  | ||||
| def read_version(): | ||||
|     exec(compile(open('yt_dlp/version.py').read(), 'yt_dlp/version.py', 'exec')) | ||||
|     return locals()['__version__'] | ||||
|  | ||||
|  | ||||
| def version_to_list(version): | ||||
|     version_list = version.split('.') | ||||
|     return list(map(int, version_list)) + [0] * (4 - len(version_list)) | ||||
|  | ||||
|  | ||||
| def dependancy_options(): | ||||
|     dependancies = [pycryptodome_module(), 'mutagen'] + collect_submodules('websockets') | ||||
|     excluded_modules = ['test', 'ytdlp_plugins', 'youtube-dl', 'youtube-dlc'] | ||||
|  | ||||
|     yield from (f'--hidden-import={module}' for module in dependancies) | ||||
|     yield from (f'--exclude-module={module}' for module in excluded_modules) | ||||
|  | ||||
|  | ||||
| def pycryptodome_module(): | ||||
| @@ -95,19 +96,41 @@ def pycryptodome_module(): | ||||
|     return 'Cryptodome' | ||||
|  | ||||
|  | ||||
| dependancies = [pycryptodome_module(), 'mutagen'] + collect_submodules('websockets') | ||||
| excluded_modules = ['test', 'ytdlp_plugins', 'youtube-dl', 'youtube-dlc'] | ||||
| def set_version_info(exe, version): | ||||
|     if OS_NAME == 'Windows': | ||||
|         windows_set_version(exe, version) | ||||
|  | ||||
| PyInstaller.__main__.run([ | ||||
|     '--name=yt-dlp%s' % suffix, | ||||
|     '--icon=devscripts/logo.ico', | ||||
|     *[f'--exclude-module={module}' for module in excluded_modules], | ||||
|     *[f'--hidden-import={module}' for module in dependancies], | ||||
|     '--upx-exclude=vcruntime140.dll', | ||||
|     '--noconfirm', | ||||
|     *opts, | ||||
|     'yt_dlp/__main__.py', | ||||
| ]) | ||||
|  | ||||
| if platform.system() == 'Windows': | ||||
|     SetVersion('dist/%syt-dlp%s.exe' % ('yt-dlp/' if '--onedir' in opts else '', _x86), VERSION_FILE) | ||||
| def windows_set_version(exe, version): | ||||
|     version_list = version_to_list(version) | ||||
|     suffix = '_x86' if ARCH == '32' else '' | ||||
|     SetVersion(exe, VSVersionInfo( | ||||
|         ffi=FixedFileInfo( | ||||
|             filevers=version_list, | ||||
|             prodvers=version_list, | ||||
|             mask=0x3F, | ||||
|             flags=0x0, | ||||
|             OS=0x4, | ||||
|             fileType=0x1, | ||||
|             subtype=0x0, | ||||
|             date=(0, 0), | ||||
|         ), | ||||
|         kids=[ | ||||
|             StringFileInfo([StringTable('040904B0', [ | ||||
|                 StringStruct('Comments', 'yt-dlp%s Command Line Interface.' % suffix), | ||||
|                 StringStruct('CompanyName', 'https://github.com/yt-dlp'), | ||||
|                 StringStruct('FileDescription', 'yt-dlp%s' % (' (32 Bit)' if ARCH == '32' else '')), | ||||
|                 StringStruct('FileVersion', version), | ||||
|                 StringStruct('InternalName', f'yt-dlp{suffix}'), | ||||
|                 StringStruct('LegalCopyright', 'pukkandan.ytdlp@gmail.com | UNLICENSE'), | ||||
|                 StringStruct('OriginalFilename', f'yt-dlp{suffix}.exe'), | ||||
|                 StringStruct('ProductName', f'yt-dlp{suffix}'), | ||||
|                 StringStruct( | ||||
|                     'ProductVersion', f'{version}{suffix} on Python {platform.python_version()}'), | ||||
|             ])]), VarFileInfo([VarStruct('Translation', [0, 1200])]) | ||||
|         ] | ||||
|     )) | ||||
|  | ||||
|  | ||||
| if __name__ == '__main__': | ||||
|     main() | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 pukkandan
					pukkandan