mirror of
				https://github.com/yt-dlp/yt-dlp.git
				synced 2025-10-31 22:55:18 +00:00 
			
		
		
		
	[build] Move bundle scripts into bundle submodule
				
					
				
			Authored by: bashonly
This commit is contained in:
		
							
								
								
									
										1
									
								
								bundle/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								bundle/__init__.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | ||||
| # Empty file | ||||
							
								
								
									
										59
									
								
								bundle/py2exe.py
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										59
									
								
								bundle/py2exe.py
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,59 @@ | ||||
| #!/usr/bin/env python3 | ||||
| 
 | ||||
| # Allow execution from anywhere | ||||
| import os | ||||
| import sys | ||||
| 
 | ||||
| sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) | ||||
| 
 | ||||
| import warnings | ||||
| 
 | ||||
| from py2exe import freeze | ||||
| 
 | ||||
| from devscripts.utils import read_version | ||||
| 
 | ||||
| VERSION = read_version() | ||||
| 
 | ||||
| 
 | ||||
| def main(): | ||||
|     warnings.warn( | ||||
|         'py2exe builds do not support pycryptodomex and needs VC++14 to run. ' | ||||
|         'It is recommended to run "pyinst.py" to build using pyinstaller instead') | ||||
| 
 | ||||
|     return freeze( | ||||
|         console=[{ | ||||
|             'script': './yt_dlp/__main__.py', | ||||
|             'dest_base': 'yt-dlp', | ||||
|             'icon_resources': [(1, 'devscripts/logo.ico')], | ||||
|         }], | ||||
|         version_info={ | ||||
|             'version': VERSION, | ||||
|             'description': 'A youtube-dl fork with additional features and patches', | ||||
|             'comments': 'Official repository: <https://github.com/yt-dlp/yt-dlp>', | ||||
|             'product_name': 'yt-dlp', | ||||
|             'product_version': VERSION, | ||||
|         }, | ||||
|         options={ | ||||
|             'bundle_files': 0, | ||||
|             'compressed': 1, | ||||
|             'optimize': 2, | ||||
|             'dist_dir': './dist', | ||||
|             'excludes': [ | ||||
|                 # py2exe cannot import Crypto | ||||
|                 'Crypto', | ||||
|                 'Cryptodome', | ||||
|                 # py2exe appears to confuse this with our socks library. | ||||
|                 # We don't use pysocks and urllib3.contrib.socks would fail to import if tried. | ||||
|                 'urllib3.contrib.socks' | ||||
|             ], | ||||
|             'dll_excludes': ['w9xpopen.exe', 'crypt32.dll'], | ||||
|             # Modules that are only imported dynamically must be added here | ||||
|             'includes': ['yt_dlp.compat._legacy', 'yt_dlp.compat._deprecated', | ||||
|                          'yt_dlp.utils._legacy', 'yt_dlp.utils._deprecated'], | ||||
|         }, | ||||
|         zipfile=None, | ||||
|     ) | ||||
| 
 | ||||
| 
 | ||||
| if __name__ == '__main__': | ||||
|     main() | ||||
							
								
								
									
										132
									
								
								bundle/pyinstaller.py
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										132
									
								
								bundle/pyinstaller.py
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,132 @@ | ||||
| #!/usr/bin/env python3 | ||||
| 
 | ||||
| # Allow direct execution | ||||
| import os | ||||
| import sys | ||||
| 
 | ||||
| sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) | ||||
| 
 | ||||
| import platform | ||||
| 
 | ||||
| from PyInstaller.__main__ import run as run_pyinstaller | ||||
| 
 | ||||
| from devscripts.utils import read_version | ||||
| 
 | ||||
| OS_NAME, MACHINE, ARCH = sys.platform, platform.machine().lower(), platform.architecture()[0][:2] | ||||
| if MACHINE in ('x86', 'x86_64', 'amd64', 'i386', 'i686'): | ||||
|     MACHINE = 'x86' if ARCH == '32' else '' | ||||
| 
 | ||||
| 
 | ||||
| def main(): | ||||
|     opts, version = parse_options(), read_version() | ||||
| 
 | ||||
|     onedir = '--onedir' in opts or '-D' in opts | ||||
|     if not onedir and '-F' not in opts and '--onefile' not in opts: | ||||
|         opts.append('--onefile') | ||||
| 
 | ||||
|     name, final_file = exe(onedir) | ||||
|     print(f'Building yt-dlp v{version} for {OS_NAME} {platform.machine()} 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"  to build lazy extractors', file=sys.stderr) | ||||
|     print(f'Destination: {final_file}\n') | ||||
| 
 | ||||
|     opts = [ | ||||
|         f'--name={name}', | ||||
|         '--icon=devscripts/logo.ico', | ||||
|         '--upx-exclude=vcruntime140.dll', | ||||
|         '--noconfirm', | ||||
|         '--additional-hooks-dir=yt_dlp/__pyinstaller', | ||||
|         *opts, | ||||
|         'yt_dlp/__main__.py', | ||||
|     ] | ||||
| 
 | ||||
|     print(f'Running PyInstaller with {opts}') | ||||
|     run_pyinstaller(opts) | ||||
|     set_version_info(final_file, version) | ||||
| 
 | ||||
| 
 | ||||
| def parse_options(): | ||||
|     # Compatibility 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 | ||||
| 
 | ||||
| 
 | ||||
| def exe(onedir): | ||||
|     """@returns (name, path)""" | ||||
|     name = '_'.join(filter(None, ( | ||||
|         'yt-dlp', | ||||
|         {'win32': '', 'darwin': 'macos'}.get(OS_NAME, OS_NAME), | ||||
|         MACHINE, | ||||
|     ))) | ||||
|     return name, ''.join(filter(None, ( | ||||
|         'dist/', | ||||
|         onedir and f'{name}/', | ||||
|         name, | ||||
|         OS_NAME == 'win32' and '.exe' | ||||
|     ))) | ||||
| 
 | ||||
| 
 | ||||
| def version_to_list(version): | ||||
|     version_list = version.split('.') | ||||
|     return list(map(int, version_list)) + [0] * (4 - len(version_list)) | ||||
| 
 | ||||
| 
 | ||||
| def set_version_info(exe, version): | ||||
|     if OS_NAME == 'win32': | ||||
|         windows_set_version(exe, version) | ||||
| 
 | ||||
| 
 | ||||
| def windows_set_version(exe, version): | ||||
|     from PyInstaller.utils.win32.versioninfo import ( | ||||
|         FixedFileInfo, | ||||
|         StringFileInfo, | ||||
|         StringStruct, | ||||
|         StringTable, | ||||
|         VarFileInfo, | ||||
|         VarStruct, | ||||
|         VSVersionInfo, | ||||
|     ) | ||||
| 
 | ||||
|     try: | ||||
|         from PyInstaller.utils.win32.versioninfo import SetVersion | ||||
|     except ImportError:  # Pyinstaller >= 5.8 | ||||
|         from PyInstaller.utils.win32.versioninfo import write_version_info_to_executable as SetVersion | ||||
| 
 | ||||
|     version_list = version_to_list(version) | ||||
|     suffix = MACHINE and f'_{MACHINE}' | ||||
|     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' % (MACHINE and f' ({MACHINE})')), | ||||
|                 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
	 bashonly
					bashonly