Compare commits
172 Commits
develop
...
build/2.5.2
| Author | SHA1 | Date | |
|---|---|---|---|
| 6772b9d965 | |||
| 5df14d67e1 | |||
| 73abd1f022 | |||
| e75a8529c9 | |||
| 07a7f8cbcf | |||
| 9b35a0fb20 | |||
| 0622e6e5ab | |||
| f16931906f | |||
| 68dcba8853 | |||
| ae8f66df1a | |||
| 5237ead5cb | |||
| 45b2dff6d2 | |||
| 30d56b5d2c | |||
| 5ff6824ae9 | |||
| 0210859155 | |||
| 665478db13 | |||
| 84c366ab54 | |||
| 908e5eae77 | |||
| c4aaa10308 | |||
| d10536a829 | |||
| 1e7fa82e11 | |||
| 1d448f3d9c | |||
| 338b5f427a | |||
| 59e3e73c4c | |||
| cb2614127c | |||
| fdbd826917 | |||
| 31daf4915e | |||
| 4ca7691afd | |||
| 64d3ecd9b8 | |||
| d55df3240f | |||
| 52214e4938 | |||
| b45307e493 | |||
| 4320369448 | |||
| f560dc093c | |||
| d26a2b1480 | |||
| e11b07b559 | |||
| b6ee8ef4d4 | |||
| f80559d380 | |||
| 8530b00e7b | |||
| 5851e1e69f | |||
| 686bfd62eb | |||
| 9b82603c26 | |||
| f41792915f | |||
| 2fa77fb610 | |||
| e64d0e33fc | |||
| b168643600 | |||
| 240283405e | |||
| b69f8b7ed5 | |||
| fbccba77a7 | |||
| d3efda74b2 | |||
| 66b849cb29 | |||
| b19f98ef5b | |||
| c389790cf2 | |||
| d7445dfa80 | |||
| 36782768a4 | |||
| 2c9d487614 | |||
| b9a724c8bb | |||
| 68d826ca1c | |||
| d6921882e1 | |||
| 2cfff73486 | |||
| 0c7dda8d44 | |||
| dbaa377770 | |||
| 47d2b81d1c | |||
| f79fcda27f | |||
| cdbcad2238 | |||
| 5d913e87c3 | |||
| 16f02bda27 | |||
| 8d108b92bf | |||
| 46783028b1 | |||
| d08c7c57a8 | |||
| eeeb845ef3 | |||
| 651a063f94 | |||
| f20aaa2d9d | |||
| ba925ec191 | |||
| 3b7376fd18 | |||
| c31b10c798 | |||
| acda664686 | |||
| e2852407ea | |||
| 88e738c6cd | |||
| eaae8bdb0b | |||
| 821f68909d | |||
| 2b8dfed475 | |||
| 607b5ea766 | |||
| 88579cd71a | |||
| 6c57316ce6 | |||
| 6702683da3 | |||
| 1ed58586a1 | |||
| f08ccd4fd8 | |||
| 312562a9f5 | |||
| 9e260a89af | |||
| d233e4d22e | |||
| 23893dbcb9 | |||
| 506871b506 | |||
| 6115917660 | |||
| 21df8819d3 | |||
| fb3f3e11f6 | |||
| 178c8942c3 | |||
| 51e747049d | |||
| 0582f7d694 | |||
| fa7cac7538 | |||
| 9a314cfbc4 | |||
| 5941d0bf77 | |||
| d326c1c25c | |||
| 96472a9a8f | |||
| 27252561e2 | |||
| c9e732651f | |||
| 7849e7170d | |||
| 087894eb4e | |||
| 25f1b8c7a7 | |||
| e71da1f14d | |||
| 938b14ba18 | |||
| d6522d8f38 | |||
| 78eab890e7 | |||
| 1a56191f83 | |||
| 41c0f34d95 | |||
| 37bf205d7a | |||
| aa1fa3eb9a | |||
| 0e2f8a612c | |||
| 465e7b2abc | |||
| 578fb45785 | |||
| 96995bbbe5 | |||
| 4cfdafebbc | |||
| b97acb8ef5 | |||
| d68d2dfdb6 | |||
| 39b269a454 | |||
| ac081d3e10 | |||
| 5d4efb60cf | |||
| cc408b980c | |||
| 59590b3ac9 | |||
| ff759dacf3 | |||
| a328e44130 | |||
| 7924cac5f9 | |||
| 1cef3b0c93 | |||
| 3cd59edc8b | |||
| 0d624af01d | |||
| a09132570c | |||
| ee3fc38432 | |||
| dbf0192c8e | |||
| 6962cfc3f5 | |||
| e096ec3b5b | |||
| b30a74ae0c | |||
| 978eeb16c9 | |||
| e5c9d91657 | |||
| fa81c3a07a | |||
| 9cdd520d41 | |||
| 55d7898771 | |||
| b8256bef97 | |||
| 5be9dc0b4a | |||
| 7d0be0cefb | |||
| f7ce1edb13 | |||
| 5ad9280b60 | |||
| 2b353f1b20 | |||
| 75ab90b87b | |||
| 0219296120 | |||
| 20032b3a31 | |||
| ea9e9a8c90 | |||
| f7b0ee145b | |||
| cc866738ee | |||
| eadccf6e33 | |||
| b70b66e567 | |||
| 5b6792dc20 | |||
| f498e7343a | |||
| 6962f441e6 | |||
| 1def62b1b1 | |||
| a4a4a6a185 | |||
| d4c9469c1a | |||
| 3e2d4c5d7b | |||
| d03f711d69 | |||
| 44dd8d9b96 | |||
| 549a3be0d8 | |||
| 1bb2edf8ec | |||
| 84c6f36315 |
+235
@@ -0,0 +1,235 @@
|
|||||||
|
from esky.util import appdir_from_executable #@UnresolvedImport
|
||||||
|
from threading import Thread
|
||||||
|
from version import VERSION
|
||||||
|
from wx.lib.softwareupdate import SoftwareUpdate
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
import time
|
||||||
|
import webbrowser
|
||||||
|
import wx
|
||||||
|
|
||||||
|
# Include proper dirs
|
||||||
|
if hasattr(sys, 'frozen'):
|
||||||
|
import libs
|
||||||
|
base_path = os.path.dirname(os.path.dirname(os.path.abspath(libs.__file__)))
|
||||||
|
else:
|
||||||
|
base_path = os.path.dirname(os.path.abspath(__file__))
|
||||||
|
|
||||||
|
lib_dir = os.path.join(base_path, 'libs')
|
||||||
|
|
||||||
|
sys.path.insert(0, base_path)
|
||||||
|
sys.path.insert(0, lib_dir)
|
||||||
|
|
||||||
|
from couchpotato.environment import Env
|
||||||
|
|
||||||
|
class TaskBarIcon(wx.TaskBarIcon):
|
||||||
|
|
||||||
|
TBMENU_OPEN = wx.NewId()
|
||||||
|
TBMENU_SETTINGS = wx.NewId()
|
||||||
|
TBMENU_EXIT = wx.ID_EXIT
|
||||||
|
|
||||||
|
closed = False
|
||||||
|
menu = False
|
||||||
|
enabled = False
|
||||||
|
|
||||||
|
def __init__(self, frame):
|
||||||
|
wx.TaskBarIcon.__init__(self)
|
||||||
|
self.frame = frame
|
||||||
|
|
||||||
|
icon = wx.Icon('icon.png', wx.BITMAP_TYPE_PNG)
|
||||||
|
self.SetIcon(icon)
|
||||||
|
|
||||||
|
self.Bind(wx.EVT_TASKBAR_LEFT_UP, self.OnTaskBarClick)
|
||||||
|
self.Bind(wx.EVT_TASKBAR_RIGHT_UP, self.OnTaskBarClick)
|
||||||
|
|
||||||
|
self.Bind(wx.EVT_MENU, self.onOpen, id = self.TBMENU_OPEN)
|
||||||
|
self.Bind(wx.EVT_MENU, self.onSettings, id = self.TBMENU_SETTINGS)
|
||||||
|
self.Bind(wx.EVT_MENU, self.onTaskBarClose, id = self.TBMENU_EXIT)
|
||||||
|
|
||||||
|
def OnTaskBarClick(self, evt):
|
||||||
|
menu = self.CreatePopupMenu()
|
||||||
|
self.PopupMenu(menu)
|
||||||
|
menu.Destroy()
|
||||||
|
|
||||||
|
def enable(self):
|
||||||
|
self.enabled = True
|
||||||
|
|
||||||
|
if self.menu:
|
||||||
|
self.open_menu.Enable(True)
|
||||||
|
self.setting_menu.Enable(True)
|
||||||
|
|
||||||
|
self.open_menu.SetText('Open')
|
||||||
|
|
||||||
|
def CreatePopupMenu(self):
|
||||||
|
|
||||||
|
if not self.menu:
|
||||||
|
self.menu = wx.Menu()
|
||||||
|
self.open_menu = self.menu.Append(self.TBMENU_OPEN, 'Open')
|
||||||
|
self.setting_menu = self.menu.Append(self.TBMENU_SETTINGS, 'About')
|
||||||
|
self.exit_menu = self.menu.Append(self.TBMENU_EXIT, 'Quit')
|
||||||
|
|
||||||
|
if not self.enabled:
|
||||||
|
self.open_menu.Enable(False)
|
||||||
|
self.setting_menu.Enable(False)
|
||||||
|
|
||||||
|
self.open_menu.SetText('Loading...')
|
||||||
|
|
||||||
|
return self.menu
|
||||||
|
|
||||||
|
def onOpen(self, event):
|
||||||
|
url = self.frame.parent.getSetting('base_url')
|
||||||
|
webbrowser.open(url)
|
||||||
|
|
||||||
|
def onSettings(self, event):
|
||||||
|
url = self.frame.parent.getSetting('base_url') + 'settings/about/'
|
||||||
|
webbrowser.open(url)
|
||||||
|
|
||||||
|
def onTaskBarClose(self, evt):
|
||||||
|
if self.closed:
|
||||||
|
return
|
||||||
|
|
||||||
|
self.closed = True
|
||||||
|
|
||||||
|
self.RemoveIcon()
|
||||||
|
wx.CallAfter(self.frame.Close)
|
||||||
|
|
||||||
|
|
||||||
|
def makeIcon(self, img):
|
||||||
|
if "wxMSW" in wx.PlatformInfo:
|
||||||
|
img = img.Scale(16, 16)
|
||||||
|
elif "wxGTK" in wx.PlatformInfo:
|
||||||
|
img = img.Scale(22, 22)
|
||||||
|
|
||||||
|
icon = wx.IconFromBitmap(img.CopyFromBitmap())
|
||||||
|
return icon
|
||||||
|
|
||||||
|
|
||||||
|
class MainFrame(wx.Frame):
|
||||||
|
|
||||||
|
def __init__(self, parent):
|
||||||
|
wx.Frame.__init__(self, None, style = wx.FRAME_NO_TASKBAR)
|
||||||
|
|
||||||
|
self.parent = parent
|
||||||
|
self.tbicon = TaskBarIcon(self)
|
||||||
|
|
||||||
|
|
||||||
|
class WorkerThread(Thread):
|
||||||
|
|
||||||
|
def __init__(self, desktop):
|
||||||
|
Thread.__init__(self)
|
||||||
|
self.daemon = True
|
||||||
|
self._desktop = desktop
|
||||||
|
|
||||||
|
self.start()
|
||||||
|
|
||||||
|
def run(self):
|
||||||
|
|
||||||
|
# Get options via arg
|
||||||
|
from couchpotato.runner import getOptions
|
||||||
|
args = ['--quiet']
|
||||||
|
self.options = getOptions(args)
|
||||||
|
|
||||||
|
# Load settings
|
||||||
|
settings = Env.get('settings')
|
||||||
|
settings.setFile(self.options.config_file)
|
||||||
|
|
||||||
|
# Create data dir if needed
|
||||||
|
self.data_dir = os.path.expanduser(Env.setting('data_dir'))
|
||||||
|
if self.data_dir == '':
|
||||||
|
from couchpotato.core.helpers.variable import getDataDir
|
||||||
|
self.data_dir = getDataDir()
|
||||||
|
|
||||||
|
if not os.path.isdir(self.data_dir):
|
||||||
|
os.makedirs(self.data_dir)
|
||||||
|
|
||||||
|
# Create logging dir
|
||||||
|
self.log_dir = os.path.join(self.data_dir, 'logs');
|
||||||
|
if not os.path.isdir(self.log_dir):
|
||||||
|
os.mkdir(self.log_dir)
|
||||||
|
|
||||||
|
try:
|
||||||
|
from couchpotato.runner import runCouchPotato
|
||||||
|
runCouchPotato(self.options, base_path, args, data_dir = self.data_dir, log_dir = self.log_dir, Env = Env, desktop = self._desktop)
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
|
self._desktop.frame.Close()
|
||||||
|
self._desktop.ExitMainLoop()
|
||||||
|
|
||||||
|
|
||||||
|
class CouchPotatoApp(wx.App, SoftwareUpdate):
|
||||||
|
|
||||||
|
settings = {}
|
||||||
|
events = {}
|
||||||
|
restart = False
|
||||||
|
closing = False
|
||||||
|
triggered_onClose = False
|
||||||
|
|
||||||
|
def OnInit(self):
|
||||||
|
|
||||||
|
# Updater
|
||||||
|
base_url = 'https://api.couchpota.to/updates/%s'
|
||||||
|
self.InitUpdates(base_url % VERSION + '/', 'https://couchpota.to/updates/%s' % 'changelog.html',
|
||||||
|
icon = wx.Icon('icon.png'))
|
||||||
|
|
||||||
|
self.frame = MainFrame(self)
|
||||||
|
self.frame.Bind(wx.EVT_CLOSE, self.onClose)
|
||||||
|
|
||||||
|
# CouchPotato thread
|
||||||
|
self.worker = WorkerThread(self)
|
||||||
|
|
||||||
|
return True
|
||||||
|
|
||||||
|
def onAppLoad(self):
|
||||||
|
self.frame.tbicon.enable()
|
||||||
|
|
||||||
|
def setSettings(self, settings = {}):
|
||||||
|
self.settings = settings
|
||||||
|
|
||||||
|
def getSetting(self, name):
|
||||||
|
return self.settings.get(name)
|
||||||
|
|
||||||
|
def addEvents(self, events = {}):
|
||||||
|
for name in events.iterkeys():
|
||||||
|
self.events[name] = events[name]
|
||||||
|
|
||||||
|
def onClose(self, event):
|
||||||
|
|
||||||
|
if not self.closing:
|
||||||
|
self.closing = True
|
||||||
|
self.frame.tbicon.onTaskBarClose(event)
|
||||||
|
|
||||||
|
onClose = self.events.get('onClose')
|
||||||
|
if onClose and not self.triggered_onClose:
|
||||||
|
self.triggered_onClose = True
|
||||||
|
onClose(event)
|
||||||
|
|
||||||
|
def afterShutdown(self, restart = False):
|
||||||
|
self.frame.Destroy()
|
||||||
|
self.restart = restart
|
||||||
|
self.ExitMainLoop()
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
|
||||||
|
app = CouchPotatoApp(redirect = False)
|
||||||
|
app.MainLoop()
|
||||||
|
|
||||||
|
time.sleep(1)
|
||||||
|
|
||||||
|
if app.restart:
|
||||||
|
|
||||||
|
def appexe_from_executable(exepath):
|
||||||
|
appdir = appdir_from_executable(exepath)
|
||||||
|
exename = os.path.basename(exepath)
|
||||||
|
|
||||||
|
if sys.platform == "darwin":
|
||||||
|
if os.path.isdir(os.path.join(appdir, "Contents", "MacOS")):
|
||||||
|
return os.path.join(appdir, "Contents", "MacOS", exename)
|
||||||
|
|
||||||
|
return os.path.join(appdir, exename)
|
||||||
|
|
||||||
|
exe = appexe_from_executable(sys.executable)
|
||||||
|
os.chdir(os.path.dirname(exe))
|
||||||
|
|
||||||
|
os.execv(exe, [exe] + sys.argv[1:])
|
||||||
@@ -143,7 +143,7 @@ class Updater(Plugin):
|
|||||||
}
|
}
|
||||||
|
|
||||||
def doShutdown(self, *args, **kwargs):
|
def doShutdown(self, *args, **kwargs):
|
||||||
if not Env.get('dev'):
|
if not Env.get('dev') and not Env.get('desktop'):
|
||||||
removePyc(Env.get('app_dir'), show_logs = False)
|
removePyc(Env.get('app_dir'), show_logs = False)
|
||||||
|
|
||||||
return super(Updater, self).doShutdown(*args, **kwargs)
|
return super(Updater, self).doShutdown(*args, **kwargs)
|
||||||
|
|||||||
@@ -3,10 +3,11 @@ import os
|
|||||||
import time
|
import time
|
||||||
import traceback
|
import traceback
|
||||||
|
|
||||||
|
from CodernityDB.database import RecordNotFound
|
||||||
from CodernityDB.index import IndexException, IndexNotFoundException, IndexConflict
|
from CodernityDB.index import IndexException, IndexNotFoundException, IndexConflict
|
||||||
from couchpotato import CPLog
|
from couchpotato import CPLog
|
||||||
from couchpotato.api import addApiView
|
from couchpotato.api import addApiView
|
||||||
from couchpotato.core.event import addEvent, fireEvent
|
from couchpotato.core.event import addEvent, fireEvent, fireEventAsync
|
||||||
from couchpotato.core.helpers.encoding import toUnicode, sp
|
from couchpotato.core.helpers.encoding import toUnicode, sp
|
||||||
from couchpotato.core.helpers.variable import getImdb, tryInt
|
from couchpotato.core.helpers.variable import getImdb, tryInt
|
||||||
|
|
||||||
@@ -226,6 +227,34 @@ class Database(object):
|
|||||||
from couchpotato import Env
|
from couchpotato import Env
|
||||||
|
|
||||||
db = self.getDB()
|
db = self.getDB()
|
||||||
|
|
||||||
|
# Try fix for migration failures on desktop
|
||||||
|
if Env.get('desktop'):
|
||||||
|
try:
|
||||||
|
list(db.all('profile', with_doc = True))
|
||||||
|
except RecordNotFound:
|
||||||
|
|
||||||
|
failed_location = '%s_failed' % db.path
|
||||||
|
old_db = os.path.join(Env.get('data_dir'), 'couchpotato.db.old')
|
||||||
|
|
||||||
|
if not os.path.isdir(failed_location) and os.path.isfile(old_db):
|
||||||
|
log.error('Corrupt database, trying migrate again')
|
||||||
|
db.close()
|
||||||
|
|
||||||
|
# Rename database folder
|
||||||
|
os.rename(db.path, '%s_failed' % db.path)
|
||||||
|
|
||||||
|
# Rename .old database to try another migrate
|
||||||
|
os.rename(old_db, old_db[:-4])
|
||||||
|
|
||||||
|
fireEventAsync('app.restart')
|
||||||
|
else:
|
||||||
|
log.error('Migration failed and couldn\'t recover database. Please report on GitHub, with this message.')
|
||||||
|
db.reindex()
|
||||||
|
|
||||||
|
return
|
||||||
|
|
||||||
|
# Check size and compact if needed
|
||||||
size = db.get_db_details().get('size')
|
size = db.get_db_details().get('size')
|
||||||
prop_name = 'last_db_compact'
|
prop_name = 'last_db_compact'
|
||||||
last_check = int(Env.prop(prop_name, default = 0))
|
last_check = int(Env.prop(prop_name, default = 0))
|
||||||
@@ -303,6 +332,8 @@ class Database(object):
|
|||||||
log.info('Getting data took %s', time.time() - migrate_start)
|
log.info('Getting data took %s', time.time() - migrate_start)
|
||||||
|
|
||||||
db = self.getDB()
|
db = self.getDB()
|
||||||
|
if not db.opened:
|
||||||
|
return
|
||||||
|
|
||||||
# Use properties
|
# Use properties
|
||||||
properties = migrate_data['properties']
|
properties = migrate_data['properties']
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ autoload = 'FanartTV'
|
|||||||
class FanartTV(MovieProvider):
|
class FanartTV(MovieProvider):
|
||||||
|
|
||||||
urls = {
|
urls = {
|
||||||
'api': 'http://api.fanart.tv/webservice/movie/b28b14e9be662e027cfbc7c3dd600405/%s/JSON/all/1/2'
|
'api': 'http://webservice.fanart.tv/v3/movies/%s?api_key=b28b14e9be662e027cfbc7c3dd600405'
|
||||||
}
|
}
|
||||||
|
|
||||||
MAX_EXTRAFANART = 20
|
MAX_EXTRAFANART = 20
|
||||||
@@ -36,9 +36,8 @@ class FanartTV(MovieProvider):
|
|||||||
fanart_data = self.getJsonData(url)
|
fanart_data = self.getJsonData(url)
|
||||||
|
|
||||||
if fanart_data:
|
if fanart_data:
|
||||||
name, resource = fanart_data.items()[0]
|
log.debug('Found images for %s', fanart_data.get('name'))
|
||||||
log.debug('Found images for %s', name)
|
images = self._parseMovie(fanart_data)
|
||||||
images = self._parseMovie(resource)
|
|
||||||
|
|
||||||
except:
|
except:
|
||||||
log.error('Failed getting extra art for %s: %s',
|
log.error('Failed getting extra art for %s: %s',
|
||||||
@@ -95,7 +94,7 @@ class FanartTV(MovieProvider):
|
|||||||
for image in images:
|
for image in images:
|
||||||
if tryInt(image.get('likes')) > highscore:
|
if tryInt(image.get('likes')) > highscore:
|
||||||
highscore = tryInt(image.get('likes'))
|
highscore = tryInt(image.get('likes'))
|
||||||
image_url = image.get('url')
|
image_url = image.get('url') or image.get('href')
|
||||||
|
|
||||||
return image_url
|
return image_url
|
||||||
|
|
||||||
@@ -118,7 +117,9 @@ class FanartTV(MovieProvider):
|
|||||||
if tryInt(image.get('likes')) > highscore:
|
if tryInt(image.get('likes')) > highscore:
|
||||||
highscore = tryInt(image.get('likes'))
|
highscore = tryInt(image.get('likes'))
|
||||||
best = image
|
best = image
|
||||||
image_urls.append(best.get('url'))
|
url = best.get('url') or best.get('href')
|
||||||
|
if url:
|
||||||
|
image_urls.append(url)
|
||||||
pool.remove(best)
|
pool.remove(best)
|
||||||
|
|
||||||
return image_urls
|
return image_urls
|
||||||
|
|||||||
@@ -87,6 +87,13 @@ def runCouchPotato(options, base_path, args, data_dir = None, log_dir = None, En
|
|||||||
|
|
||||||
# Do db stuff
|
# Do db stuff
|
||||||
db_path = sp(os.path.join(data_dir, 'database'))
|
db_path = sp(os.path.join(data_dir, 'database'))
|
||||||
|
old_db_path = os.path.join(data_dir, 'couchpotato.db')
|
||||||
|
|
||||||
|
# Remove database folder if both exists
|
||||||
|
if os.path.isdir(db_path) and os.path.isfile(old_db_path):
|
||||||
|
db = SuperThreadSafeDatabase(db_path)
|
||||||
|
db.open()
|
||||||
|
db.destroy()
|
||||||
|
|
||||||
# Check if database exists
|
# Check if database exists
|
||||||
db = SuperThreadSafeDatabase(db_path)
|
db = SuperThreadSafeDatabase(db_path)
|
||||||
|
|||||||
@@ -117,7 +117,7 @@ var AboutSettingTab = new Class({
|
|||||||
var self = this;
|
var self = this;
|
||||||
var date = new Date(json.version.date * 1000);
|
var date = new Date(json.version.date * 1000);
|
||||||
self.version_text.set('text', json.version.hash + (json.version.date ? ' ('+date.toLocaleString()+')' : ''));
|
self.version_text.set('text', json.version.hash + (json.version.date ? ' ('+date.toLocaleString()+')' : ''));
|
||||||
self.updater_type.set('text', json.version.type + ', ' + json.branch);
|
self.updater_type.set('text', (json.version.type != json.branch) ? (json.version.type + ', ' + json.branch) : json.branch);
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -0,0 +1,52 @@
|
|||||||
|
#define MyAppName "CouchPotato"
|
||||||
|
#define MyAppVer "2.5.2"
|
||||||
|
#define MyAppBit "win32"
|
||||||
|
//#define MyAppBit "win-amd64"
|
||||||
|
|
||||||
|
[Setup]
|
||||||
|
AppName={#MyAppName}
|
||||||
|
AppVersion=2
|
||||||
|
AppVerName={#MyAppName}
|
||||||
|
DefaultDirName={userappdata}\{#MyAppName}\application
|
||||||
|
DisableProgramGroupPage=yes
|
||||||
|
DisableDirPage=yes
|
||||||
|
UninstallDisplayIcon=./icon.ico
|
||||||
|
SetupIconFile=./icon.ico
|
||||||
|
OutputDir=./dist
|
||||||
|
OutputBaseFilename={#MyAppName}-{#MyAppVer}.{#MyAppBit}.installer
|
||||||
|
AppPublisher=Your Mom
|
||||||
|
AppPublisherURL=http://couchpota.to
|
||||||
|
PrivilegesRequired=none
|
||||||
|
WizardSmallImageFile=installer_icon.bmp
|
||||||
|
WizardImageFile=installer_banner.bmp
|
||||||
|
UsePreviousAppDir=no
|
||||||
|
|
||||||
|
[Messages]
|
||||||
|
WelcomeLabel1=Installing [name]!
|
||||||
|
WelcomeLabel2=This wizard will install [name] to your AppData folder. It does this so it can use the build in updater without needing admin rights.
|
||||||
|
|
||||||
|
[CustomMessages]
|
||||||
|
LaunchProgram=Launch {#MyAppName} right now.
|
||||||
|
|
||||||
|
[Files]
|
||||||
|
Source: "./dist/{#MyAppName}-{#MyAppVer}.{#MyAppBit}/*"; Flags: recursesubdirs; DestDir: "{app}"
|
||||||
|
|
||||||
|
[Icons]
|
||||||
|
Name: "{commonprograms}\{#MyAppName}"; Filename: "{app}\{#MyAppName}.exe"
|
||||||
|
Name: "{userstartup}\{#MyAppName}"; Filename: "{app}\{#MyAppName}.exe"; Tasks: startup
|
||||||
|
|
||||||
|
[Tasks]
|
||||||
|
Name: "startup"; Description: "Run {#MyAppName} at startup"; Flags: unchecked
|
||||||
|
|
||||||
|
[Run]
|
||||||
|
Filename: {app}\{#MyAppName}.exe; Description: {cm:LaunchProgram,{#MyAppName}}; Flags: nowait postinstall skipifsilent
|
||||||
|
|
||||||
|
|
||||||
|
[UninstallDelete]
|
||||||
|
Type: filesandordirs; Name: "{app}\appdata"
|
||||||
|
Type: filesandordirs; Name: "{app}\Microsoft.VC90.CRT"
|
||||||
|
Type: filesandordirs; Name: "{app}\updates"
|
||||||
|
Type: filesandordirs; Name: "{app}\CouchPotato*"
|
||||||
|
Type: filesandordirs; Name: "{app}\python27.dll"
|
||||||
|
Type: filesandordirs; Name: "{app}\unins000.dat"
|
||||||
|
Type: filesandordirs; Name: "{app}\unins000.exe"
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 151 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 9.6 KiB |
@@ -0,0 +1,109 @@
|
|||||||
|
from esky import bdist_esky
|
||||||
|
from setuptools import setup
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
import version
|
||||||
|
|
||||||
|
|
||||||
|
# Include proper dirs
|
||||||
|
base_path = os.path.dirname(os.path.abspath(__file__))
|
||||||
|
lib_dir = os.path.join(base_path, 'libs')
|
||||||
|
|
||||||
|
sys.path.insert(0, base_path)
|
||||||
|
sys.path.insert(0, lib_dir)
|
||||||
|
|
||||||
|
def getDataFiles(dirs):
|
||||||
|
data_files = []
|
||||||
|
for directory in dirs:
|
||||||
|
for root, dirs, files in os.walk(directory):
|
||||||
|
if files:
|
||||||
|
for filename in files:
|
||||||
|
if filename[:-4] is not '.pyc':
|
||||||
|
data_files.append((root, [os.path.join(root, filename)]))
|
||||||
|
|
||||||
|
return data_files
|
||||||
|
|
||||||
|
includes = [
|
||||||
|
'telnetlib',
|
||||||
|
'xml.etree.ElementTree',
|
||||||
|
'xml.etree.cElementTree',
|
||||||
|
'xml.dom',
|
||||||
|
'xml.dom.minidom',
|
||||||
|
'netrc',
|
||||||
|
'csv',
|
||||||
|
'HTMLParser',
|
||||||
|
'version',
|
||||||
|
'distutils',
|
||||||
|
]
|
||||||
|
|
||||||
|
# Windows
|
||||||
|
if sys.platform == "win32":
|
||||||
|
import py2exe
|
||||||
|
|
||||||
|
FREEZER = 'py2exe'
|
||||||
|
FREEZER_OPTIONS = dict(
|
||||||
|
compressed = 0,
|
||||||
|
bundle_files = 3,
|
||||||
|
dll_excludes = [
|
||||||
|
'MSVCP90.dll',
|
||||||
|
'mswsock.dll',
|
||||||
|
'powrprof.dll',
|
||||||
|
'USP10.dll',
|
||||||
|
],
|
||||||
|
packages = ['couchpotato', 'libs'],
|
||||||
|
includes = includes,
|
||||||
|
skip_archive = 1,
|
||||||
|
)
|
||||||
|
exeICON = os.path.join(base_path, 'icon.ico')
|
||||||
|
DATA_FILES = getDataFiles([r'.\\couchpotato', r'.\\libs'])
|
||||||
|
DATA_FILES.append('icon.png')
|
||||||
|
file_ext = 'win32.zip'
|
||||||
|
|
||||||
|
|
||||||
|
# OSX
|
||||||
|
elif sys.platform == "darwin":
|
||||||
|
import py2app
|
||||||
|
|
||||||
|
FREEZER = 'py2app'
|
||||||
|
FREEZER_OPTIONS = dict(
|
||||||
|
optimize = 2,
|
||||||
|
strip = True,
|
||||||
|
argv_emulation = False,
|
||||||
|
site_packages = False,
|
||||||
|
iconfile = 'icon.icns',
|
||||||
|
plist = dict(
|
||||||
|
LSUIElement = True,
|
||||||
|
),
|
||||||
|
packages = ['couchpotato', 'libs'],
|
||||||
|
includes = includes,
|
||||||
|
)
|
||||||
|
exeICON = None
|
||||||
|
DATA_FILES = ['icon.png']
|
||||||
|
|
||||||
|
file_ext = 'macosx-10_6-intel.zip'
|
||||||
|
|
||||||
|
# Common
|
||||||
|
NAME = "CouchPotato"
|
||||||
|
APP = [bdist_esky.Executable("Desktop.py", name = NAME, icon = exeICON, gui_only = True,)]
|
||||||
|
ESKY_OPTIONS = dict(
|
||||||
|
freezer_module = FREEZER,
|
||||||
|
freezer_options = FREEZER_OPTIONS,
|
||||||
|
bundle_msvcrt = True,
|
||||||
|
)
|
||||||
|
|
||||||
|
# Build the app and the esky bundle
|
||||||
|
setup(
|
||||||
|
name = NAME,
|
||||||
|
scripts = APP,
|
||||||
|
version = version.VERSION,
|
||||||
|
author = "Ruud",
|
||||||
|
author_email = "info@couchpota.to",
|
||||||
|
description = 'CouchPotato %s' % version.VERSION,
|
||||||
|
data_files = DATA_FILES,
|
||||||
|
options = dict(bdist_esky = ESKY_OPTIONS),
|
||||||
|
)
|
||||||
|
|
||||||
|
#distpath = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'dist')
|
||||||
|
#zipfilename = os.path.join(distpath, '%s-%s.%s' % (NAME, version.VERSION, file_ext))
|
||||||
|
#zfile = zipfile.ZipFile(zipfilename, "r")
|
||||||
|
#zfile.extractall(distpath)
|
||||||
+2
-2
@@ -1,2 +1,2 @@
|
|||||||
VERSION = None
|
VERSION = '2.5.2'
|
||||||
BRANCH = 'develop'
|
BRANCH = 'desktop'
|
||||||
|
|||||||
Reference in New Issue
Block a user