91f82fd6d3
* Tweaked search string based on new comic vine search behavior Placated Beaufitul Soup by passing the parser * First cut at porting to Python 3 and PyQt5 * remove debug print * tweaked progress dialog handling for issues on ubuntu gui * Handle bad key more gracefullu * More integration of unrarlib into settings and rest of app * Better handling of "personal" unrar lib setting * PEP 440-compliant version string * Tuned linux rar help strings * Got setup working again * Attempts to build unrar on install * Some minimal desktop integration on various platforms * Fix wrong shortfile * More setup.py enhancements * Use proper temp file * Added comment block at top * Comment out desktop integration attempt for now * Updated some links and info * Fixed the html a bit * Repaired some images that caused libpng to complain * update readme re: py3qt5 branch changes * another note * #108 feat: try to simplify windows build using only pip and python3 * #108 feat: fix python location on appveyor (try 1) * #108 feat: use venv (try 2) * #108 feat: use venv (try 3) * #108 feat: update to latest pyinstaller develop branch * #108 feat: update to latest pyinstaller develop branch (again) * #108: add ssl libraries for windows packaging * #108: refresh env in win build to pick the right mingw * #108: change order of win build script operations * #113: fix subprocess usage in pyinstaller package * bump version
242 lines
9.7 KiB
Python
242 lines
9.7 KiB
Python
# Setup file for comictagger python source (no wheels yet)
|
|
#
|
|
# The install process will attempt to compile the unrar lib from source.
|
|
# If it succeeds, the unrar lib binary will be installed with the python
|
|
# source. If it fails, install will just continue. On most Linux systems it
|
|
# should just work. (Tested on a Mac system with homebrew, as well)
|
|
#
|
|
# An entry point script called "comictagger" will be created
|
|
#
|
|
# Currently commented out, an experiment at desktop integration.
|
|
# It seems that post installation tweaks are broken by wheel files.
|
|
# Kept here for further research
|
|
|
|
from __future__ import print_function
|
|
from setuptools import setup
|
|
from setuptools import dist
|
|
from setuptools import Command
|
|
import setuptools.command.build_py
|
|
import setuptools.command.install
|
|
import subprocess
|
|
import os
|
|
import sys
|
|
import shutil
|
|
import platform
|
|
import tempfile
|
|
import comictaggerlib.ctversion
|
|
|
|
python_requires='>=3',
|
|
|
|
|
|
with open('requirements.txt') as f:
|
|
required = f.read().splitlines()
|
|
# Always require PyQt5 on Windows and Mac
|
|
if platform.system() in [ "Windows", "Darwin" ]:
|
|
required.append("PyQt5")
|
|
|
|
platform_data_files = []
|
|
|
|
"""
|
|
if platform.system() in [ "Windows" ]:
|
|
required.append("winshell")
|
|
|
|
# Some files to install on different platforms
|
|
|
|
if platform.system() == "Linux":
|
|
linux_desktop_shortcut = "/usr/local/share/applications/ComicTagger.desktop"
|
|
platform_data_files = [("/usr/local/share/applications",
|
|
["desktop-integration/linux/ComicTagger.desktop"]),
|
|
("/usr/local/share/comictagger",
|
|
["comictaggerlib/graphics/app.png"]),
|
|
]
|
|
|
|
if platform.system() == "Windows":
|
|
win_desktop_folder = os.path.join(os.environ["USERPROFILE"], "Desktop")
|
|
win_appdata_folder = os.path.join(os.environ["APPDATA"], "comictagger")
|
|
win_desktop_shortcut = os.path.join(win_desktop_folder, "ComicTagger-pip.lnk")
|
|
platform_data_files = [(win_desktop_folder,
|
|
["desktop-integration/windows/ComicTagger-pip.lnk"]),
|
|
(win_appdata_folder,
|
|
["windows/app.ico"]),
|
|
]
|
|
|
|
if platform.system() == "Darwin":
|
|
mac_app_folder = "/Applications"
|
|
ct_app_name = "ComicTagger-pip.app"
|
|
mac_app_infoplist = os.path.join(mac_app_folder, ct_app_name, "Contents", "Info.plist")
|
|
mac_app_main = os.path.join(mac_app_folder, ct_app_name, "MacOS", "main.sh")
|
|
mac_python_link = os.path.join(mac_app_folder, ct_app_name, "MacOS", "ComicTagger")
|
|
platform_data_files = [(os.path.join(mac_app_folder, ct_app_name, "Contents"),
|
|
["desktop-integration/mac/Info.plist"]),
|
|
(os.path.join(mac_app_folder, ct_app_name, "Contents/Resources"),
|
|
["mac/app.icns"]),
|
|
(os.path.join(mac_app_folder, ct_app_name, "Contents/MacOS"),
|
|
["desktop-integration/mac/main.sh",
|
|
"desktop-integration/mac/ComicTagger"]),
|
|
]
|
|
|
|
def fileTokenReplace(filename, token, replacement):
|
|
with open(filename, "rt") as fin:
|
|
fd, tmpfile = tempfile.mkstemp()
|
|
with open(tmpfile, "wt") as fout:
|
|
for line in fin:
|
|
fout.write(line.replace('%%{}%%'.format(token), replacement))
|
|
os.close(fd)
|
|
# fix permissions of temp file
|
|
os.chmod(tmpfile, 420) #Octal 0o644
|
|
os.rename(tmpfile, filename)
|
|
|
|
def postInstall(scripts_folder):
|
|
entry_point_script = os.path.join(scripts_folder, "comictagger")
|
|
|
|
if platform.system() == "Windows":
|
|
# doctor the shortcut for this windows system after deployment
|
|
import winshell
|
|
winshell.CreateShortcut(
|
|
Path=os.path.abspath(win_desktop_shortcut),
|
|
Target=entry_point_script + ".exe",
|
|
Icon=(os.path.join(win_appdata_folder, 'app.ico'), 0),
|
|
Description="Launch ComicTagger as installed by PIP"
|
|
)
|
|
|
|
if platform.system() == "Linux":
|
|
# doctor the script path in the desktop file
|
|
fileTokenReplace(linux_desktop_shortcut,
|
|
"CTSCRIPT",
|
|
entry_point_script)
|
|
|
|
if platform.system() == "Darwin":
|
|
# doctor the plist app version
|
|
fileTokenReplace(mac_app_infoplist,
|
|
"CTVERSION",
|
|
comictaggerlib.ctversion.version)
|
|
# doctor the script path in main.sh
|
|
fileTokenReplace(mac_app_main,
|
|
"CTSCRIPT",
|
|
entry_point_script)
|
|
# Make the launcher script executable
|
|
os.chmod(mac_app_main, 509) #Octal 0o775
|
|
|
|
# Final install step: create a symlink to Python OS X application
|
|
punt = False
|
|
pythonpath,top = os.path.split(os.path.realpath(sys.executable))
|
|
while top:
|
|
if 'Resources' in pythonpath:
|
|
pass
|
|
elif os.path.exists(os.path.join(pythonpath,'Resources')):
|
|
break
|
|
pythonpath,top = os.path.split(pythonpath)
|
|
else:
|
|
print("Failed to find a Resources directory associated with ", str(sys.executable))
|
|
punt = True
|
|
|
|
if not punt:
|
|
pythonapp = os.path.join(pythonpath, 'Resources','Python.app','Contents','MacOS','Python')
|
|
if not os.path.exists(pythonapp):
|
|
print("Failed to find a Python app in ", str(pythonapp))
|
|
punt = True
|
|
|
|
# remove the placeholder
|
|
os.remove(mac_python_link)
|
|
if not punt:
|
|
os.symlink(pythonapp, mac_python_link)
|
|
else:
|
|
# We failed, but we can still be functional
|
|
os.symlink(sys.executable, mac_python_link)
|
|
"""
|
|
|
|
class BuildUnrarCommand(Command):
|
|
description = 'build unrar library'
|
|
user_options = []
|
|
|
|
def initialize_options(self):
|
|
pass
|
|
def finalize_options(self):
|
|
pass
|
|
|
|
def run(self):
|
|
try:
|
|
if not os.path.exists("comictaggerlib/libunrar.so"):
|
|
if not os.path.exists("unrar/libunrar.so"):
|
|
print("Building C++ unrar library....")
|
|
subprocess.call(['make', '-C', 'unrar', 'lib'])
|
|
print("Copying .so file to comictaggerlib folder")
|
|
shutil.copyfile("unrar/libunrar.so", "comictaggerlib/libunrar.so")
|
|
except Exception as e:
|
|
print(e)
|
|
print("WARNING ---- Unrar library build/deploy failed. User will have to self-install libunrar.")
|
|
|
|
|
|
class BuildPyCommand(setuptools.command.build_py.build_py):
|
|
"""Custom build command."""
|
|
|
|
def run(self):
|
|
self.run_command('build_unrar')
|
|
setuptools.command.build_py.build_py.run(self)
|
|
|
|
class customInstall(setuptools.command.install.install):
|
|
"""Custom install command."""
|
|
|
|
def run(self):
|
|
|
|
# Do the standard install
|
|
setuptools.command.install.install.run(self)
|
|
|
|
# Custom post install
|
|
#postInstall(self.install_scripts)
|
|
|
|
#----------------------------------------------------
|
|
setup(name="comictagger",
|
|
install_requires=required,
|
|
cmdclass={
|
|
'build_unrar': BuildUnrarCommand,
|
|
'build_py': BuildPyCommand,
|
|
'install': customInstall,
|
|
},
|
|
version=comictaggerlib.ctversion.version,
|
|
description="A cross-platform GUI/CLI app for writing metadata to comic archives",
|
|
author="ComicTagger team",
|
|
author_email="comictagger@gmail.com",
|
|
url="https://github.com/davide-romanini/comictagger",
|
|
download_url="https://pypi.python.org/packages/source/c/comictagger/comictagger-{0}.zip".format(comictaggerlib.ctversion.version),
|
|
packages=["comictaggerlib", "comicapi"],
|
|
package_data={
|
|
'comictaggerlib': ['ui/*', 'graphics/*', '*.so'],
|
|
},
|
|
entry_points=dict(console_scripts=['comictagger=comictaggerlib.main:ctmain']),
|
|
data_files=platform_data_files,
|
|
classifiers=[
|
|
"Development Status :: 4 - Beta",
|
|
"Environment :: Console",
|
|
"Environment :: Win32 (MS Windows)",
|
|
"Environment :: MacOS X",
|
|
"Environment :: X11 Applications :: Qt",
|
|
"Intended Audience :: End Users/Desktop",
|
|
"License :: OSI Approved :: Apache Software License",
|
|
"Natural Language :: English",
|
|
"Operating System :: OS Independent",
|
|
"Programming Language :: Python :: 3.5",
|
|
"Programming Language :: Python :: 3.6",
|
|
"Topic :: Utilities",
|
|
"Topic :: Other/Nonlisted Topic",
|
|
"Topic :: Multimedia :: Graphics"
|
|
],
|
|
keywords=['comictagger', 'comics', 'comic', 'metadata', 'tagging', 'tagger'],
|
|
license="Apache License 2.0",
|
|
|
|
long_description="""
|
|
ComicTagger is a multi-platform app for writing metadata to digital comics, written in Python and PyQt.
|
|
|
|
Features:
|
|
|
|
* Runs on Mac OSX, Microsoft Windows, and Linux systems
|
|
* Communicates with an online database (Comic Vine) for acquiring metadata
|
|
* Uses image processing to automatically match a given archive with the correct issue data
|
|
* Batch processing in the GUI for tagging hundreds or more comics at a time
|
|
* Reads and writes multiple tagging schemes ( ComicBookLover and ComicRack).
|
|
* Reads and writes RAR and Zip archives (external tools needed for writing RAR)
|
|
* Command line interface (CLI) on all platforms (including Windows), which supports batch operations, and which can be used in native scripts for complex operations.
|
|
* Can run without PyQt5 installed
|
|
"""
|
|
)
|