@@ -46,6 +46,8 @@ Linux:
|
|||||||
* (systemd) Enable it at boot with `sudo systemctl enable couchpotato`
|
* (systemd) Enable it at boot with `sudo systemctl enable couchpotato`
|
||||||
* Open your browser and go to `http://localhost:5050/`
|
* Open your browser and go to `http://localhost:5050/`
|
||||||
|
|
||||||
|
Docker:
|
||||||
|
* You can use [razorgirl's Dockerfile](https://github.com/razorgirl/docker-couchpotato) to quickly build your own isolated app container. It's based on the Linux instructions above. For more info about Docker check out the [official website](https://www.docker.com).
|
||||||
|
|
||||||
FreeBSD :
|
FreeBSD :
|
||||||
|
|
||||||
|
|||||||
@@ -21,7 +21,10 @@ class Base(TorrentProvider):
|
|||||||
|
|
||||||
http_time_between_calls = 1 # Seconds
|
http_time_between_calls = 1 # Seconds
|
||||||
only_tables_tags = SoupStrainer('table')
|
only_tables_tags = SoupStrainer('table')
|
||||||
|
|
||||||
|
torrent_name_cell = 1;
|
||||||
|
torrent_download_cell = 2;
|
||||||
|
|
||||||
def _searchOnTitle(self, title, movie, quality, results):
|
def _searchOnTitle(self, title, movie, quality, results):
|
||||||
|
|
||||||
url = self.urls['search'] % self.buildUrl(title, movie, quality)
|
url = self.urls['search'] % self.buildUrl(title, movie, quality)
|
||||||
@@ -40,8 +43,8 @@ class Base(TorrentProvider):
|
|||||||
|
|
||||||
all_cells = result.find_all('td')
|
all_cells = result.find_all('td')
|
||||||
|
|
||||||
torrent = all_cells[1].find('a')
|
torrent = all_cells[torrent_name_cell].find('a')
|
||||||
download = all_cells[3].find('a')
|
download = all_cells[torrent_download_cell].find('a')
|
||||||
|
|
||||||
torrent_id = torrent['href']
|
torrent_id = torrent['href']
|
||||||
torrent_id = torrent_id.replace('details.php?id=', '')
|
torrent_id = torrent_id.replace('details.php?id=', '')
|
||||||
@@ -49,9 +52,9 @@ class Base(TorrentProvider):
|
|||||||
|
|
||||||
torrent_name = torrent.getText()
|
torrent_name = torrent.getText()
|
||||||
|
|
||||||
torrent_size = self.parseSize(all_cells[7].getText())
|
torrent_size = self.parseSize(all_cells[8].getText())
|
||||||
torrent_seeders = tryInt(all_cells[9].getText())
|
torrent_seeders = tryInt(all_cells[10].getText())
|
||||||
torrent_leechers = tryInt(all_cells[10].getText())
|
torrent_leechers = tryInt(all_cells[11].getText())
|
||||||
torrent_url = self.urls['baseurl'] % download['href']
|
torrent_url = self.urls['baseurl'] % download['href']
|
||||||
torrent_detail_url = self.urls['baseurl'] % torrent['href']
|
torrent_detail_url = self.urls['baseurl'] % torrent['href']
|
||||||
|
|
||||||
|
|||||||
@@ -24,16 +24,16 @@ class Base(TorrentMagnetProvider):
|
|||||||
http_time_between_calls = 0
|
http_time_between_calls = 0
|
||||||
|
|
||||||
proxy_list = [
|
proxy_list = [
|
||||||
'https://nobay.net',
|
'https://www.dieroschtibay.org',
|
||||||
'https://thebay.al',
|
'https://thebay.al',
|
||||||
'https://thepiratebay.se',
|
'https://thepiratebay.se',
|
||||||
'http://thepiratebay.cd',
|
'http://thepiratebay.se.net',
|
||||||
'http://thebootlegbay.com',
|
'http://thebootlegbay.com',
|
||||||
'http://www.tpb.gr',
|
'http://tpb.ninja.so',
|
||||||
'http://tpbproxy.co.uk',
|
'http://proxybay.fr',
|
||||||
'http://pirateproxy.in',
|
'http://pirateproxy.in',
|
||||||
'http://www.getpirate.com',
|
'http://piratebay.skey.sk',
|
||||||
'http://piratebay.io',
|
'http://pirateproxy.be',
|
||||||
'http://bayproxy.li',
|
'http://bayproxy.li',
|
||||||
'http://proxybay.pw',
|
'http://proxybay.pw',
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -21,13 +21,6 @@ config = [{
|
|||||||
'type': 'int',
|
'type': 'int',
|
||||||
'description': 'Maximum number of items displayed from each chart.',
|
'description': 'Maximum number of items displayed from each chart.',
|
||||||
},
|
},
|
||||||
{
|
|
||||||
'name': 'update_interval',
|
|
||||||
'default': 12,
|
|
||||||
'type': 'int',
|
|
||||||
'advanced': True,
|
|
||||||
'description': '(hours)',
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
'name': 'hide_wanted',
|
'name': 'hide_wanted',
|
||||||
'default': False,
|
'default': False,
|
||||||
|
|||||||
@@ -13,13 +13,14 @@ log = CPLog(__name__)
|
|||||||
class Charts(Plugin):
|
class Charts(Plugin):
|
||||||
|
|
||||||
update_in_progress = False
|
update_in_progress = False
|
||||||
|
update_interval = 72 # hours
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
addApiView('charts.view', self.automationView)
|
addApiView('charts.view', self.automationView)
|
||||||
addEvent('app.load', self.setCrons)
|
addEvent('app.load', self.setCrons)
|
||||||
|
|
||||||
def setCrons(self):
|
def setCrons(self):
|
||||||
fireEvent('schedule.interval', 'charts.update_cache', self.updateViewCache, hours = self.conf('update_interval', default = 12))
|
fireEvent('schedule.interval', 'charts.update_cache', self.updateViewCache, hours = self.update_interval)
|
||||||
|
|
||||||
def automationView(self, force_update = False, **kwargs):
|
def automationView(self, force_update = False, **kwargs):
|
||||||
|
|
||||||
@@ -52,7 +53,7 @@ class Charts(Plugin):
|
|||||||
for chart in charts:
|
for chart in charts:
|
||||||
chart['hide_wanted'] = self.conf('hide_wanted')
|
chart['hide_wanted'] = self.conf('hide_wanted')
|
||||||
chart['hide_library'] = self.conf('hide_library')
|
chart['hide_library'] = self.conf('hide_library')
|
||||||
self.setCache('charts_cached', charts, timeout = 7200 * tryInt(self.conf('update_interval', default = 12)))
|
self.setCache('charts_cached', charts, timeout = self.update_interval * 3600)
|
||||||
except:
|
except:
|
||||||
log.error('Failed refreshing charts')
|
log.error('Failed refreshing charts')
|
||||||
|
|
||||||
|
|||||||
@@ -23,10 +23,9 @@ class FanartTV(MovieProvider):
|
|||||||
def __init__(self):
|
def __init__(self):
|
||||||
addEvent('movie.info', self.getArt, priority = 1)
|
addEvent('movie.info', self.getArt, priority = 1)
|
||||||
|
|
||||||
def getArt(self, identifier = None, **kwargs):
|
def getArt(self, identifier = None, extended = True, **kwargs):
|
||||||
|
|
||||||
log.debug("Getting Extra Artwork from Fanart.tv...")
|
if not identifier or not extended:
|
||||||
if not identifier:
|
|
||||||
return {}
|
return {}
|
||||||
|
|
||||||
images = {}
|
images = {}
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ class PassThePopcorn(MovieProvider, Base):
|
|||||||
'bd50': {'media': 'Blu-ray', 'format': 'BD50'},
|
'bd50': {'media': 'Blu-ray', 'format': 'BD50'},
|
||||||
'1080p': {'resolution': '1080p'},
|
'1080p': {'resolution': '1080p'},
|
||||||
'720p': {'resolution': '720p'},
|
'720p': {'resolution': '720p'},
|
||||||
'brrip': {'media': 'Blu-ray'},
|
'brrip': {'resolution': 'anyhd'},
|
||||||
'dvdr': {'resolution': 'anysd'},
|
'dvdr': {'resolution': 'anysd'},
|
||||||
'dvdrip': {'media': 'DVD'},
|
'dvdrip': {'media': 'DVD'},
|
||||||
'scr': {'media': 'DVD-Screener'},
|
'scr': {'media': 'DVD-Screener'},
|
||||||
@@ -27,7 +27,7 @@ class PassThePopcorn(MovieProvider, Base):
|
|||||||
'bd50': {'Codec': ['BD50']},
|
'bd50': {'Codec': ['BD50']},
|
||||||
'1080p': {'Resolution': ['1080p']},
|
'1080p': {'Resolution': ['1080p']},
|
||||||
'720p': {'Resolution': ['720p']},
|
'720p': {'Resolution': ['720p']},
|
||||||
'brrip': {'Source': ['Blu-ray'], 'Quality': ['High Definition'], 'Container': ['!ISO']},
|
'brrip': {'Quality': ['High Definition'], 'Container': ['!ISO']},
|
||||||
'dvdr': {'Codec': ['DVD5', 'DVD9']},
|
'dvdr': {'Codec': ['DVD5', 'DVD9']},
|
||||||
'dvdrip': {'Source': ['DVD'], 'Codec': ['!DVD5', '!DVD9']},
|
'dvdrip': {'Source': ['DVD'], 'Codec': ['!DVD5', '!DVD9']},
|
||||||
'scr': {'Source': ['DVD-Screener']},
|
'scr': {'Source': ['DVD-Screener']},
|
||||||
|
|||||||
@@ -847,7 +847,7 @@ Remove it if you want it to be renamed (again, or at least let it try again)
|
|||||||
|
|
||||||
replaces = [
|
replaces = [
|
||||||
('\.+', '.'), ('_+', '_'), ('-+', '-'), ('\s+', ' '), (' \\\\', '\\\\'), (' /', '/'),
|
('\.+', '.'), ('_+', '_'), ('-+', '-'), ('\s+', ' '), (' \\\\', '\\\\'), (' /', '/'),
|
||||||
('(\s\.)+', '.'), ('(-\.)+', '.'), ('(\s-)+', '-'),
|
('(\s\.)+', '.'), ('(-\.)+', '.'), ('(\s-)+', '-'), ('([\s\.\,\_\-\/\\]$)', ''),
|
||||||
]
|
]
|
||||||
|
|
||||||
for r in replaces:
|
for r in replaces:
|
||||||
|
|||||||
+3
-3
@@ -46,7 +46,7 @@ DESC=CouchPotato
|
|||||||
# Run CP as username
|
# Run CP as username
|
||||||
RUN_AS=${CP_USER-couchpotato}
|
RUN_AS=${CP_USER-couchpotato}
|
||||||
|
|
||||||
# Path to app
|
# Path to app
|
||||||
# CP_HOME=path_to_app_CouchPotato.py
|
# CP_HOME=path_to_app_CouchPotato.py
|
||||||
APP_PATH=${CP_HOME-/opt/couchpotato/}
|
APP_PATH=${CP_HOME-/opt/couchpotato/}
|
||||||
|
|
||||||
@@ -100,12 +100,12 @@ case "$1" in
|
|||||||
;;
|
;;
|
||||||
stop)
|
stop)
|
||||||
echo "Stopping $DESC"
|
echo "Stopping $DESC"
|
||||||
start-stop-daemon --stop --pidfile $PID_FILE --retry 15
|
start-stop-daemon --stop --pidfile $PID_FILE --retry 15 --oknodo
|
||||||
;;
|
;;
|
||||||
|
|
||||||
restart|force-reload)
|
restart|force-reload)
|
||||||
echo "Restarting $DESC"
|
echo "Restarting $DESC"
|
||||||
start-stop-daemon --stop --pidfile $PID_FILE --retry 15
|
start-stop-daemon --stop --pidfile $PID_FILE --retry 15 --oknodo
|
||||||
start-stop-daemon -d $APP_PATH -c $RUN_AS $EXTRA_SSD_OPTS --start --pidfile $PID_FILE --exec $DAEMON -- $DAEMON_OPTS
|
start-stop-daemon -d $APP_PATH -c $RUN_AS $EXTRA_SSD_OPTS --start --pidfile $PID_FILE --exec $DAEMON -- $DAEMON_OPTS
|
||||||
;;
|
;;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user