From a1c33c4b3a398a8f46ade9fc9f94da675adbacbf Mon Sep 17 00:00:00 2001 From: MrS0m30n3 Date: Fri, 16 Dec 2016 23:49:46 +0200 Subject: [PATCH] Update setup.py to handle new UI changes --- setup.py | 227 ++++++++++++++++++++++++++++++++----------------------- 1 file changed, 132 insertions(+), 95 deletions(-) diff --git a/setup.py b/setup.py index e66c02a..a5d18e1 100644 --- a/setup.py +++ b/setup.py @@ -3,19 +3,50 @@ """Youtube-dlg setup file. -Note: +Examples: + Windows:: + + python setup.py py2exe + + Linux:: + + python setup.py install + + Build source distribution:: + + python setup.py sdist + + Build platform distribution:: + + python setup.py bdist + +Notes: If you get 'TypeError: decoding Unicode is not supported' when you run - py2exe then apply the following patch: + py2exe then apply the following patch:: + + http://sourceforge.net/p/py2exe/patches/28/ - http://sourceforge.net/p/py2exe/patches/28/ + Basic steps of the setup:: + + * Run pre-build tasks + * Call setup handler based on OS & options + * Set up hicolor icons (if supported by platform) + * Set up fallback pixmaps icon (if supported by platform) + * Set up package level pixmaps icons (*.png, *.ico) + * Set up package level i18n files (*.mo) + * Set up scripts (executables) (if supported by platform) + * Run setup """ +from distutils.core import setup + import os import sys -import shutil +import glob +from shutil import copyfile -PY2EXE = len(sys.argv) >= 2 and sys.argv[1] == 'py2exe' +PY2EXE = len(sys.argv) >= 2 and sys.argv[1] == "py2exe" if PY2EXE: try: @@ -24,9 +55,6 @@ if PY2EXE: print error sys.exit(1) -from distutils.core import setup -from distutils.sysconfig import get_python_lib - from youtube_dl_gui import ( __author__, __appname__, @@ -35,129 +63,138 @@ from youtube_dl_gui import ( __license__, __projecturl__, __description__, + __packagename__, __descriptionfull__ ) -ICONS_SIZES = ('16x16', '32x32', '48x48', '64x64', '128x128', '256x256') -ICONS_TEMPLATE = 'youtube_dl_gui/icons/youtube-dl-gui_{size}.png' - -ICONS_LIST = [ICONS_TEMPLATE.format(size=size) for size in ICONS_SIZES] - - -# Set icons path -PY2EXE_ICONS = 'icons' -WINDOWS_ICONS = os.path.join(get_python_lib(), 'youtube_dl_gui', 'icons') -LINUX_ICONS = '/usr/share/icons/hicolor/' - -LINUX_FALLBACK_ICONS = '/usr/share/pixmaps/' +# Helper functions +def create_scripts(): + """Create the binary scripts.""" + dest_dir = os.path.join("build", "_scripts") + if not os.path.exists(dest_dir): + os.makedirs(dest_dir) -# Set localization files path -LOCALE_PATH = os.path.join('youtube_dl_gui', 'locale') + copyfile(os.path.join(__packagename__, "__main__.py"), + os.path.join(dest_dir, "youtube-dl-gui")) -PY2EXE_LOCALE_DIR = 'locale' -WIN_LOCALE_DIR = os.path.join(get_python_lib(), 'youtube_dl_gui', 'locale') -LINUX_LOCALE_DIR = '/usr/share/{app_name}/locale/'.format(app_name=__appname__.lower()) +################################## -def create_scripts(): - dest_dir = os.path.join('build', '_scripts') +def linux_setup(): + scripts = [] + data_files = [] + package_data = {} - dest_file = os.path.join(dest_dir, 'youtube-dl-gui') - src_file = os.path.join('youtube_dl_gui', '__main__.py') + # Add hicolor icons + for path in glob.glob("youtube_dl_gui/data/icons/hicolor/*x*"): + size = os.path.basename(path) - if not os.path.exists(dest_dir): - os.makedirs(dest_dir) - - shutil.copyfile(src_file, dest_file) + dst = "share/icons/hicolor/{size}/apps".format(size=size) + src = "{icon_path}/apps/youtube-dl-gui.png".format(icon_path=path) + data_files.append((dst, [src])) -def set_locale_files(data_files): - for directory in os.listdir(LOCALE_PATH): - locale_lang = os.path.join(directory, 'LC_MESSAGES') + # Add fallback icon, see issue #14 + data_files.append( + ("share/pixmaps", ["youtube_dl_gui/data/pixmaps/youtube-dl-gui.png"]) + ) - src = os.path.join(LOCALE_PATH, locale_lang, 'youtube_dl_gui.mo') + # Add other package data + package_data[__packagename__] = [ + "data/pixmaps/*.png", + "data/pixmaps/*.ico", + "locale/*/LC_MESSAGES/*.mo" + ] - if PY2EXE: - dst = os.path.join(PY2EXE_LOCALE_DIR, locale_lang) - elif os.name == 'nt': - dst = os.path.join(WIN_LOCALE_DIR, locale_lang) - else: - dst = os.path.join(LINUX_LOCALE_DIR, locale_lang) + # Add scripts + scripts.append("build/_scripts/youtube-dl-gui") - data_files.append((dst, [src])) + setup_params = { + "scripts": scripts, + "data_files": data_files, + "package_data": package_data + } + return setup_params -def py2exe_setup(): - create_scripts() - py2exe_dependencies = [ - 'C:\\Windows\\System32\\ffmpeg.exe', - 'C:\\Windows\\System32\\ffprobe.exe', - 'C:\\python27\\DLLs\\MSVCP90.dll' - ] +def windows_setup(): + def normal_setup(): + package_data = {} - py2exe_data_files = [ - ('', py2exe_dependencies), - (PY2EXE_ICONS, ICONS_LIST) - ] + # On Windows we dont use the icons under hicolor + package_data[__packagename__] = [ + "data\\pixmaps\\*.png", + "data\\pixmaps\\*.ico", + "locale\\*\\LC_MESSAGES\\*.mo" + ] - set_locale_files(py2exe_data_files) + setup_params = { + "package_data": package_data + } - py2exe_options = { - 'includes': ['wx.lib.pubsub.*', - 'wx.lib.pubsub.core.*', - 'wx.lib.pubsub.core.arg1.*'] - } + return setup_params - py2exe_windows = { - 'script': 'build\\_scripts\\youtube-dl-gui', - 'icon_resources': [(0, 'youtube_dl_gui\\icons\\youtube-dl-gui.ico')] - } + def py2exe_setup(): + windows = [] + data_files = [] - params = { - 'data_files': py2exe_data_files, - 'windows': [py2exe_windows], - 'options': {'py2exe': py2exe_options} - } + # Py2exe dependencies & options + dependencies = [ + "C:\\Windows\\System32\\ffmpeg.exe", + "C:\\Windows\\System32\\ffprobe.exe", + "C:\\python27\\DLLs\\MSVCP90.dll" + ] - return params + options = { + "includes": ["wx.lib.pubsub.*", + "wx.lib.pubsub.core.*", + "wx.lib.pubsub.core.arg1.*"] + } + ############################################# -def normal_setup(): - data_files = list() + # Add package data + data_files.extend([ + ("", dependencies), + ("data\\pixmaps", glob.glob("youtube_dl_gui\\data\\pixmaps\\*.*")), + ]) - if os.name == 'nt': - icons_dir = (WINDOWS_ICONS, ICONS_LIST) - data_files.append(icons_dir) + # We have to manually add the translation files since py2exe cant do it + for lang in os.listdir("youtube_dl_gui\\locale"): + dst = os.path.join("locale", lang, "LC_MESSAGES") + src = os.path.join("youtube_dl_gui", dst, "youtube_dl_gui.mo") - set_locale_files(data_files) + data_files.append((dst, [src])) - params = {'data_files': data_files} - else: - # Create all the hicolor icons - for index, size in enumerate(ICONS_SIZES): - icons_dest = os.path.join(LINUX_ICONS, size, 'apps') - icons_dir = (icons_dest, [ICONS_LIST[index]]) + # Add GUI executable details + windows.append({ + "script": "build\\_scripts\\youtube-dl-gui", + "icon_resources": [(0, "youtube_dl_gui\\data\\pixmaps\\youtube-dl-gui.ico")] + }) - data_files.append(icons_dir) + setup_params = { + "windows": windows, + "data_files": data_files, + "options": {"py2exe": options} + } - # Add the 48x48 icon as fallback - fallback_icon = (LINUX_FALLBACK_ICONS, [ICONS_LIST[2]]) - data_files.append(fallback_icon) + return setup_params - set_locale_files(data_files) + if PY2EXE: + return py2exe_setup() - create_scripts() - params = {'data_files': data_files, 'scripts': ['build/_scripts/youtube-dl-gui']} + return normal_setup() - return params +# Execute pre-build stuff +create_scripts() -if PY2EXE: - params = py2exe_setup() +if os.name == "nt": + params = windows_setup() else: - params = normal_setup() + params = linux_setup() setup( @@ -169,7 +206,7 @@ setup( url = __projecturl__, description = __description__, long_description = __descriptionfull__, - packages = ['youtube_dl_gui'], + packages = [str(__packagename__)], **params )