You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
324 lines
8.0 KiB
324 lines
8.0 KiB
#!/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 |
|
|
|
Build with updates disabled:: |
|
|
|
python setup.py build --no-updates |
|
|
|
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, log |
|
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: |
|
log.info("building MO file for '{}'".format(po_file)) |
|
call([self.exec_name, "-o", mo_file, po_file]) |
|
except OSError: |
|
log.error("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 |
|
|
|
build.user_options.append(("no-updates", None, "build with updates disabled")) |
|
|
|
def initialize_options(self): |
|
build.initialize_options(self) |
|
self.no_updates = None |
|
|
|
def run(self): |
|
build.run(self) |
|
|
|
if self.no_updates: |
|
self.__disable_updates() |
|
|
|
def __disable_updates(self): |
|
lib_dir = os.path.join(self.build_lib, __packagename__) |
|
target_file = "optionsmanager.py" |
|
|
|
# Options file should be available from previous build commands |
|
optionsfile = os.path.join(lib_dir, target_file) |
|
data = None |
|
|
|
with open(optionsfile, "r") as input_file: |
|
data = input_file.readlines() |
|
|
|
if data is None: |
|
log.error("building with updates disabled failed!") |
|
sys.exit(1) |
|
|
|
for index, line in enumerate(data): |
|
if "'disable_update': False" in line: |
|
log.info("disabling updates") |
|
data[index] = line.replace("False", "True") |
|
break |
|
|
|
with open(optionsfile, "w") as output_file: |
|
output_file.writelines(data) |
|
|
|
|
|
# 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 |
|
)
|
|
|