#!/usr/bin/env python2 # -*- coding: utf-8 -*- """Youtube-dlg setup file. 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 Build the translations:: python setup.py build_trans Requirements: * GNU gettext utilities Notes: If you get 'TypeError: decoding Unicode is not supported' when you run py2exe then apply the following patch:: 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) * Set up package level i18n files (*.mo) * Set up scripts (executables) (if supported by platform) * Run setup """ from distutils import cmd from distutils.core import setup from distutils.command.build import build import os import sys import glob from shutil import copyfile from subprocess import call PY2EXE = len(sys.argv) >= 2 and sys.argv[1] == "py2exe" if PY2EXE: try: import py2exe except ImportError as error: print(error) sys.exit(1) from youtube_dl_gui import ( __author__, __appname__, __contact__, __version__, __license__, __projecturl__, __description__, __packagename__, __descriptionfull__ ) # Setup can not handle unicode __packagename__ = str(__packagename__) def on_windows(): """Returns True if OS is Windows.""" return os.name == "nt" class BuildBin(cmd.Command): description = "build the youtube-dl-gui binary file" user_options = [] def initialize_options(self): self.scripts_dir = None def finalize_options(self): self.scripts_dir = os.path.join("build", "_scripts") def run(self): if not os.path.exists(self.scripts_dir): os.makedirs(self.scripts_dir) copyfile(os.path.join(__packagename__, "__main__.py"), os.path.join(self.scripts_dir, "youtube-dl-gui")) class BuildTranslations(cmd.Command): description = "build the translation files" user_options = [] def initialize_options(self): self.exec_name = None self.search_pattern = None def finalize_options(self): if on_windows(): self.exec_name = "msgfmt.exe" else: self.exec_name = "msgfmt" self.search_pattern = os.path.join(__packagename__, "locale", "*", "LC_MESSAGES", "youtube_dl_gui.po") def run(self): for po_file in glob.glob(self.search_pattern): mo_file = po_file.replace(".po", ".mo") try: print("building MO file for '{}'").format(po_file) call([self.exec_name, "-o", mo_file, po_file]) except OSError: print("could not locate file '{}', exiting...".format(self.exec_name)) sys.exit(1) class Build(build): """Overwrite the default 'build' behaviour.""" sub_commands = [ ("build_bin", None), ("build_trans", None) ] + build.sub_commands def run(self): build.run(self) # Overwrite cmds cmdclass = { "build": Build, "build_bin": BuildBin, "build_trans": BuildTranslations } def linux_setup(): scripts = [] data_files = [] package_data = {} # Add hicolor icons for path in glob.glob("youtube_dl_gui/data/icons/hicolor/*x*"): size = os.path.basename(path) 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])) # Add fallback icon, see issue #14 data_files.append( ("share/pixmaps", ["youtube_dl_gui/data/pixmaps/youtube-dl-gui.png"]) ) # Add man page data_files.append( ("share/man/man1", ["youtube-dl-gui.1"]) ) # Add pixmaps icons (*.png) & i18n files package_data[__packagename__] = [ "data/pixmaps/*.png", "locale/*/LC_MESSAGES/*.mo" ] # Add scripts scripts.append("build/_scripts/youtube-dl-gui") setup_params = { "scripts": scripts, "data_files": data_files, "package_data": package_data } return setup_params def windows_setup(): def normal_setup(): package_data = {} # Add pixmaps icons (*.png) & i18n files package_data[__packagename__] = [ "data\\pixmaps\\*.png", "locale\\*\\LC_MESSAGES\\*.mo" ] setup_params = { "package_data": package_data } return setup_params def py2exe_setup(): windows = [] data_files = [] # py2exe dependencies & options # TODO change directory for ffmpeg.exe & ffprobe.exe dependencies = [ "C:\\Windows\\System32\\ffmpeg.exe", "C:\\Windows\\System32\\ffprobe.exe", "C:\\python27\\DLLs\\MSVCP90.dll" ] options = { "includes": ["wx.lib.pubsub.*", "wx.lib.pubsub.core.*", "wx.lib.pubsub.core.arg1.*"] } ############################################# # Add py2exe deps & pixmaps icons (*.png) data_files.extend([ ("", dependencies), ("data\\pixmaps", glob.glob("youtube_dl_gui\\data\\pixmaps\\*.png")), ]) # 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") data_files.append((dst, [src])) # Add GUI executable details windows.append({ "script": "build\\_scripts\\youtube-dl-gui", "icon_resources": [(0, "youtube_dl_gui\\data\\pixmaps\\youtube-dl-gui.ico")] }) setup_params = { "windows": windows, "data_files": data_files, "options": {"py2exe": options} } return setup_params if PY2EXE: return py2exe_setup() return normal_setup() if on_windows(): params = windows_setup() else: params = linux_setup() setup( author = __author__, name = __appname__, version = __version__, license = __license__, author_email = __contact__, url = __projecturl__, description = __description__, long_description = __descriptionfull__, packages = [__packagename__], cmdclass = cmdclass, **params )