Merge branch 'release/0.12.0'
3
.gitignore
vendored
|
@ -13,9 +13,10 @@ restore/
|
|||
|
||||
######################
|
||||
# SB Test Related #
|
||||
tests/cache/*
|
||||
tests/Logs/*
|
||||
tests/sickbeard.*
|
||||
tests/cache.db
|
||||
tests/*.db
|
||||
|
||||
######################
|
||||
# Compiled source #
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
language: python
|
||||
sudo: false
|
||||
python:
|
||||
- 2.6
|
||||
- 2.7
|
||||
|
||||
install:
|
||||
|
|
275
CHANGES.md
|
@ -1,4 +1,270 @@
|
|||
### 0.11.16 (2016-10-16 17:30:00 UTC)
|
||||
### 0.12.0 (2016-12-19 03:00:00 UTC)
|
||||
|
||||
* Add strict Python version check (equal to, or higher than 2.7.9 and less than 3.0), **exit** if incorrect version
|
||||
* Update unidecode library 0.04.11 to 0.04.18 (fd57cbf)
|
||||
* Update xmltodict library 0.9.2 (579a005) to 0.9.2 (eac0031)
|
||||
* Update Tornado Web Server 4.3.dev1 (1b6157d) to 4.5.dev1 (92f29b8)
|
||||
* Update change to suppress reporting of Tornado exception error 1 to updated package (ref:hacks.txt)
|
||||
* Change API response header for JSON content type and the return of JSONP data
|
||||
* Remove redundant MultipartPostHandler
|
||||
* Update Beautiful Soup 4.4.0 (r390) to 4.4.0 (r397)
|
||||
* Update backports/ssl_match_hostname 3.4.0.2 to 3.5.0.1 (r18)
|
||||
* Update cachecontrol library 0.11.2 to 0.11.5
|
||||
* Update Certifi to 2015.11.20.1 (385476b)
|
||||
* Update chardet packages 2.3.0 (26982c5) to 2.3.0 (d7fae98)
|
||||
* Update dateutil library 2.4.2 (083f666) to 2.4.2 (d4baf97)
|
||||
* Update Hachoir library 1.3.4 (r1383) to 1.3.4 (r1435)
|
||||
* Update html5lib 0.999 to 0.99999999/1.0b9 (46dae3d)
|
||||
* Update IMDb 5.0 to 5.1dev20160106
|
||||
* Update moment.js 2.6 to 2.15.1
|
||||
* Update PNotify library 2.0.1 to 2.1.0
|
||||
* Update profilehooks 1.4 to 1.8.2.dev0 (ee3f1a8)
|
||||
* Update Requests library 2.7.0 (5d6d1bc) to 2.9.1 (a1c9b84)
|
||||
* Update SimpleJSON library 3.8.0 (a37a9bd) to 3.8.1 (6022794)
|
||||
* Update Six compatibility library 1.9.0 (r400) to 1.10.0 (r405)
|
||||
* Add backports_abc 0.4
|
||||
* Add singledispatch 3.4.0.3
|
||||
* Change refactor email notifier
|
||||
* Change emails to Unicode aware
|
||||
* Add force episode recent search to API
|
||||
* Change process episodes with utf8 dir and nzb names, handle failed episodes without a dir, add log output streaming
|
||||
* Change move dateutil-zoneinfo.tar.gz file to data files /cache
|
||||
* Change handle all Hachoir library parser errors and replace its Unicode enforcement
|
||||
* Allow episode status "Skipped" to be changed to "Downloaded"
|
||||
* Allow found "Skipped" episode files to be set "Unknown" quality
|
||||
* Add CPU throttling preset "Disabled" to config/General/Advanced Settings
|
||||
* Change overhaul Kodi notifier and tidy up config/notification/KodiNotifier ui
|
||||
* Add passthru of param "post_json" to Requests() "json" in helpers.getURL
|
||||
* Add search show Name to Show List Layout: Poster
|
||||
* Change indicate when not sorting with article by dimming ("The", "A", "An") on Show List, Episode, History,
|
||||
Bulk Change, Add with Browse and from Existing views
|
||||
* Add Emby notifier to config/Notifications
|
||||
* Use a subprocess and cp for copying files on posix systems to preserve file metadata
|
||||
* Fix alternative unicode show names from breaking search
|
||||
* Change show update, set shows with newly added airdate or existing episodes with future or never dates, to "Wanted"
|
||||
* Fix rare NameParser case where numeric episode name was parsed as episode number
|
||||
* Change improve management of Transmission config/Search/Torrent Search "Downloaded files location"
|
||||
* Add network logos ABC News 24 and Chiller
|
||||
* Update network logos to their current logo
|
||||
* Remove redundant Adult Swim logos
|
||||
* Add scene qualities WEB.h264 to SDTV, 720p.WEB.h264 to WEB DL 720p, and 1080p.WEB.h264 to WEB DL 1080p
|
||||
* Change improve handling when provider PiSexy is missing expected data
|
||||
* Change Show List second level sort criteria
|
||||
* Change Show List sort Next Ep, and restore sort on Downloads
|
||||
* Add sort by quality to Poster layout
|
||||
* Change +n snatches to links on all Show List layouts
|
||||
* Change adding show processing to be highest priority
|
||||
* Use timezones to check unaired status during show update/adding
|
||||
* Fix syntax error causing renamer to error out
|
||||
* Change storing metadata nfo vars from int to strings to resolve lxml type exceptions that don't occur with etree
|
||||
* Add visual indicator for upcoming or started shows on Add Browse Shows
|
||||
* Add IMDb Watchlists to 'View' drop down on the 'Add from IMDb' page
|
||||
* Add 5 decades of 'IMDb Popular' selections to 'View' drop down on 'Add from... Browse Shows'
|
||||
* Add 'Other Services' to 'View' drop down on 'Add from... Browse Shows'
|
||||
* Add enable, disable and delete public IMDb watchlists to Config/General/Interface with a default 'SickGear' list
|
||||
* Change ensure English data from IMDb
|
||||
* Change prevent duplicate show ids from presenting items on 'Add from... Browse Shows'
|
||||
* Change add 'nocache' kwarg to helpers.getURL to facilitate non-cached requests
|
||||
* Change instantly use saved value from Search Settings/Episode Search/"Check propers every" instead of after a restart
|
||||
* Change include OSError system messages in file system failure logs during post process
|
||||
* Fix find associated meta files to prevent orphan episode images
|
||||
* Add HD4Free torrent provider
|
||||
* Change validate and improve specific Torrent provider connections, IPT, SCC, TPB, TB, TD, TT
|
||||
* Change refactor cache for torrent providers to reduce code
|
||||
* Change improve search category selection BMTV, FSH, FF, TB
|
||||
* Change identify more SD release qualities
|
||||
* Change update SpeedCD, MoreThan, TVChaosuk
|
||||
* Change only create threads for providers needing a recent search instead of for all enabled
|
||||
* Add 4489 as experimental value to "Recent search frequency" to use provider freqs instead of fixed width for all
|
||||
* Change remove some logging cruft
|
||||
* Fix post processing "Force already processed" processing only the first of multiple files
|
||||
* Add FileList torrent provider
|
||||
* Add provider Anizb
|
||||
* Change TorrentDay to use its 2.x interface
|
||||
* Add button 'Discover' Emby server to notifications
|
||||
* Add Bit-HDTV torrent provider
|
||||
* Add PrivateHD torrent provider
|
||||
* Add Zooqle torrent provider
|
||||
* Add 2160p UHD 4K WEB quality
|
||||
* Add DigitalHive torrent provider
|
||||
* Add RevTT torrent provider
|
||||
* Add PTF torrent provider
|
||||
* Add Fano torrent provider
|
||||
* Add BTScene torrent provider
|
||||
* Add Extratorrent provider
|
||||
* Add Limetorrents provider
|
||||
* Add HD-Torrents provider
|
||||
* Add nCore torrent provider
|
||||
* Add TorLock provider
|
||||
* Add Torrentz2 provider
|
||||
* Add freeleech options to fano, freshon, hdspace, phd, ptf providers
|
||||
* Change SceneTime to cookie auth
|
||||
* Change improve parser tolerance for torrent providers
|
||||
* Change disable TorrentBytes provider, over 90s for a response is not good
|
||||
* Remove Usenet-Crawler provider
|
||||
* Change CPU throttling on General Config/Advanced to "Disabled" by default for new installs
|
||||
* Change provider OMGWTFNZBS api url and auto reject nuked releases
|
||||
* Change Search Provider page to load torrent settings only when Search torrents is enabled in Search Settings
|
||||
* Add "Order" table column and list failed from newest to oldest wherever possible on Manage Failed Downloads
|
||||
* Add number of items shown to Manage Failed Downloads table footer and indicate if number of shown items is limited
|
||||
* Add sorting to "Provider" column and fix sorting of "Remove" column on Manage Failed Downloads
|
||||
* Fix "Limit" drop down on Manage Failed Downloads
|
||||
* Change nzbs.org anime search category and fix newznab anime backlog search
|
||||
* Change improve nzbgeek search response
|
||||
* Change use query search at 6box (id search fails)
|
||||
* Change "Add New Show" results sorted newest show to oldest from top
|
||||
* Change add show genre, network, and overview to "Add New Show" results
|
||||
* Change improve highlight of shows found in database in "Add New Show" results
|
||||
* Change use full first aired date where available in "Add New Show" results
|
||||
* Change prevent duplicate results in "Add New Show"
|
||||
* Add qBitTorrent to Search Settings/Torrent Search
|
||||
* Add "Test NZBGet" client to Search Settings/NZB Search/NZBGet
|
||||
* Change include x265 category when searching IPT provider
|
||||
* Change init.systemd to use python2 binary and recommended installation paths
|
||||
* Change improve handling of SIGINT CTRL+C, SIGINT CTRL+BREAK(Windows) and SIGTERM
|
||||
* Change add three IPTorrents fallback urls
|
||||
* Change remove one dead and add three fallback magnet torcaches for blackhole use
|
||||
* Change increase delay between requests to nnab servers to over 2 seconds
|
||||
* Change set Specials to status "Skipped" not "Wanted" during show updates
|
||||
* Change improve debug log message for CloudFlare response that indicate website is offline
|
||||
* Add handling for 'part' numbered new releases and also for specific existing 'part' numbered releases
|
||||
* Add detection of password protected rars with config/Post Processing/'Unpack downloads' enabled
|
||||
* Change post process to cleanup filenames with config/Post Processing/'Unpack downloads' enabled
|
||||
* Change post process to join incrementally named (i.e. file.001 to file.nnn) split files
|
||||
* Change replace unrar2 lib with rarfile 3.0 and UnRAR.exe 5.40 freeware
|
||||
* Change post process "Copy" to delete redundant files after use
|
||||
* Add indicator for public access media providers
|
||||
* Change improve probability selecting most seeded release
|
||||
* Change add the TorrentDay x265 category to search
|
||||
* Add smart logic to reduce api hits to newznab server types and improve how nzbs are downloaded
|
||||
* Add newznab smart logic to avoid missing releases when there are a great many recent releases
|
||||
* Change improve performance by using newznab server advertised capabilities
|
||||
* Change config/providers newznab to display only non-default categories
|
||||
* Change use scene season for wanted segment in backlog if show is scene numbering
|
||||
* Change combine Media Search / Backlog Search / Limited and Full to Force
|
||||
* Change consolidate limited and full backlog
|
||||
* Change config / Search / Backlog search frequency to instead spread backlog searches over a number of days
|
||||
* Change migrate minimum used value for search frequency into new minimum 7 for search spread
|
||||
* Change restrict nzb providers to 1 backlog batch run per day
|
||||
* Add to Config/Search/Unaired episodes/Allow episodes that are released early
|
||||
* Add to Config/Search/Unaired episodes/Use specific api requests to search for early episode releases
|
||||
* Add use related ids for newznab searches to increase search efficiency
|
||||
* Add periodic update of related show ids
|
||||
* Change terminology Edit Show/"Post processing" tab name to "Other"
|
||||
* Add advanced feature "Related show IDs" to Edit Show/Other used for finding episodes and TV info
|
||||
* Add search info source image links to those that have zero id under Edit Show/Other/"Related show IDs"
|
||||
* Add "set master" button to Edit Show/Other/"Related show IDs" for info source that can be changed
|
||||
* Change displayShow terminology "Indexers" to "Links" to cover internal and web links
|
||||
* Change add related show info sources on displayShow page
|
||||
* Change don't display "temporarily" defunct TVRage image link on displayShow pages unless it is master info source
|
||||
* Change if a defunct info source is the master of a show then present a link on displayShow to edit related show IDs
|
||||
* Change simplify the next backlog search run time display in the page footer
|
||||
* Change try ssl when fetching data thetvdb, imdb, trakt, scene exception
|
||||
* Change improve reliability to Trakt notifier by using show related id support
|
||||
* Change improve config/providers newznab categories layout
|
||||
* Change show loaded log message at start up and include info source
|
||||
* Change if episode has no airdate then set status to unaired (was skipped)
|
||||
* Fix only replace initial quality releases from the upgrade to list
|
||||
* Change optimise TheTVDB processes, 40% to 66% saved adding new and existing shows, 40% to 50% saved per show update
|
||||
* Change improve shows with more episodes gain largest reductions in time spent processing
|
||||
* Change when using "Add new show" reduce search time outs
|
||||
* Change always allow incomplete show data
|
||||
* Remove redundant config/general/"Allow incomplete show data"
|
||||
* Fix status reset of a snatched, downloaded, or archived episode when its date is set to never (no date) on the info
|
||||
source and there is no media file
|
||||
* Change only show unaired episodes on Manage/Backlog Overview and Manage/Episode Status where relevant
|
||||
* Change locally cache Trakt/IMDb/Anime show cards
|
||||
* Change allow pp to replace files with a repack or proper of same quality
|
||||
* Fix ensure downloaded eps are not shown on episode view
|
||||
* Fix allow propers to pp when show marked upgrade once
|
||||
* Fix never set episodes without airdate to wanted
|
||||
* Change improve getting the local timezone information
|
||||
* Change hachoir_parser to close input stream if no parser is found e.g. due to file corruption
|
||||
* Change improve fault tolerance of Hachoir jpeg parser
|
||||
* Change reduce time taken to parse avi RIFF metadata during post processing and other times
|
||||
* Change avi metadata extraction is more fault tolerant and the chance of hanging due to corrupt avi files is reduced
|
||||
* Change fuzzyMoment to handle air dates before ~1970 on display show page
|
||||
* Change limit availability of fuzzy date functions on General Config/Interface to English locale systems
|
||||
* Add Plex notifications secure connect where available (PMS 1.1.4.2757 and newer with username and password)
|
||||
* Add if all torrent caches fail, save magnets from RARBG and TPB as files for clients (or plugins) that now support it
|
||||
* Add advice to logs if all caches fail to switch to direct client connect instead of the basic blackhole method
|
||||
* Add search setting "Disable auto full backlog"
|
||||
* Change improve performance and reduce start up time
|
||||
* Fix button "Checkout branch" when stuck on disabled
|
||||
* Add 'Download Log' to 'Logs & Errors' page
|
||||
* Change consolidate shutdown with restart, improve systemd support, bring order to on-init globals
|
||||
* Change speed improvement in finding needed categories/qualities (sd, hd, uhd)
|
||||
* Change add guidance when using the "unknown" quality selection
|
||||
* Change prevent browser auto completing password fields on config pages
|
||||
* Change refresh page when torrent providers are enabled/disabled
|
||||
* Change only display Search Settings/"Usenet retention" if Search NZBs is enabled
|
||||
* Change sab API request to prevent naming mismatch
|
||||
* Change update rTorrent systems
|
||||
* Change logger to properly cleanup used resources
|
||||
* Add fanart to Episodes View, Display Show, and Edit Show page
|
||||
* Add path used for fanart images <Cache Dir>/images/fanart (<Cache Dir> value on Help page)
|
||||
* Add populate images when the daily show updater is run with default maximum 3 images per show
|
||||
* Change force full update in a show will replace existing images with new
|
||||
* Add "Maximum fanart image files per show to cache" to config General/Interface
|
||||
* Add fanart livepanel to lower right of Episodes View and Display Show page
|
||||
* Add highlight panel red on Episodes view until button is clicked a few times
|
||||
* Add flick through multiple background images on Episodes View and Display Show page
|
||||
* Add persistent move poster image to right hand side or hide on Display Show page (multi-click the eye)
|
||||
* Add persistent translucency of background images on Episodes View and Display Show page
|
||||
* Add persistent fanart rating to avoid art completely, random display, random from a group, or display fave always
|
||||
* Add persistent views of the show detail on Display Show page
|
||||
* Add persistent views on Episodes View
|
||||
* Add persistent button to collapse and expand card images on Episode View/Layout daybyday
|
||||
* Add non persistent "Open gear" and "Backart only" image views to Episodes View and Display Show page
|
||||
* Add "smart" selection of fanart image to display on Episode view
|
||||
* Change insert [!] and change text shade of ended shows in drop down show list on Display Show page
|
||||
* Change button graphic for next and previous show of show list on Display Show page
|
||||
* Add logic to hide some livepanel buttons until artwork becomes available or in other circumstances
|
||||
* Add "(Ended)" where appropriate to show title on Display Show page
|
||||
* Change use tense for label "Airs" or "Aired" depending on if show ended
|
||||
* Change display "No files" instead of "0 files" and "Upgrade once" instead of "End upgrade on first match"
|
||||
* Add persistent button to newest season to "Show all" episodes
|
||||
* Add persistent button to all shown seasons to "Hide most" episodes
|
||||
* Add button to older seasons to toggle "Show Season n" or "Show Specials" with "Hide..." episodes
|
||||
* Add season level status counts next to each season header on display show page
|
||||
* Add sorting to season table headers on display show page
|
||||
* Add filename and size to quality badge on display show page, removed its redundant "downloaded" text
|
||||
* Remove redundant "Add show" buttons
|
||||
* Change combine the NFO and TBN columns into a single Meta column
|
||||
* Change reduce screen estate used by episode numbers columns
|
||||
* Change improve clarity of text on Add Show page
|
||||
* Change rename Edit show/"Post-Processing" tab to "Other"
|
||||
* Add "Reset fanart ratings" to show Edit/Other tab
|
||||
* Add fanart keys guide to show Edit/Other tab
|
||||
* Change add placeholder tip to "Alternative release name(s)" on show Edit
|
||||
* Change add placeholder tip to search box on shows Search
|
||||
* Change hide Anime tips on show Edit when selecting its mutually exclusive options
|
||||
* Change label "End upgrade on first match" to "Upgrade once" on show Edit
|
||||
* Change improve performance rendering displayShow
|
||||
* Add total episodes to start of show description (excludes specials if those are hidden)
|
||||
* Add "Add show" actions i.e. "Search", "Trakt cards", "IMDb cards", and "Anime" to Shows menu
|
||||
* Add "Import (existing)" action to Tools menu
|
||||
* Change SD quality from red to dark green, 2160p UHD 4K is red
|
||||
* Change relocate the functions of Logs & Errors to the right side Tools menu -> View Log File
|
||||
* Add warning indicator to the Tools menu in different colour depending on error count (green through red)
|
||||
* Change View Log error item output from reversed to natural order
|
||||
* Change View Log File add a typeface and some colour to improve readability
|
||||
* Change View Log File/Errors only display "Clear Errors" button when there are errors to clear
|
||||
* Change improve performance of View Log File
|
||||
* Change fanart images to not use cache as cache is not required
|
||||
* Change rename "Manual Post-Processing" menu item to "Process Media"
|
||||
* Change rename "Search Providers" -> "Media Providers"
|
||||
* Change rename "Manage Searches" -> "Media Search"
|
||||
* Change rename "Episode Status Management" -> "Episode Status"
|
||||
* Change rename "Mass Update" -> "Bulk Change"
|
||||
* Change indicate default home on "Shows Menu"
|
||||
* Change relocate "Episodes" menu to "Shows"/"Episode Schedule"
|
||||
* Change relocate "History" menu to "Shows"/"History"
|
||||
* Change remove restart/shutdown buttons from "Show List"
|
||||
* Change remove superfluous buttons from all submenus
|
||||
|
||||
|
||||
### 0.11.16 (2016-10-16 17:30:00 UTC)
|
||||
|
||||
* Change ensure a cache.db table does exist on migration
|
||||
|
||||
|
@ -81,7 +347,7 @@
|
|||
* Fix issue with "Add Existing Shows" on new installations
|
||||
|
||||
|
||||
### 0.11.1 (2016-01-12 20:00:00 UTC)
|
||||
### 0.11.1 (2016-01-12 22:20:00 UTC)
|
||||
|
||||
* Fix handling non-numeric IMDb popular ratings
|
||||
|
||||
|
@ -119,7 +385,7 @@
|
|||
* Fix post processing season pack folders
|
||||
* Fix saving torrent provider option "Seed until ratio" after recent refactor
|
||||
* Change white text in light theme on Manage / Episode Status Management page to black for better readability
|
||||
* Change displayShow page episode colours when a minimum quality is met with "End upgrade on first match"
|
||||
* Change displayShow page episode colours when a minimum quality is met with "Upgrade once"
|
||||
* Add seed time per provider for torrent clients that support seed time per torrent, i.e. currently only uTorrent
|
||||
* Remove seed time display for Transmission in config/Torrent Search page because the torrent client doesn't support it
|
||||
* Add PreToMe torrent provider
|
||||
|
@ -199,6 +465,7 @@
|
|||
* Fix provider MTV download URL
|
||||
* Change give provider OMGWTFNZBS more time to respond
|
||||
* Change file browser to permit manually entering a path
|
||||
* Fix updating Trakt collection from Unix
|
||||
|
||||
|
||||
### 0.10.0 (2015-08-06 11:05:00 UTC)
|
||||
|
@ -306,7 +573,7 @@
|
|||
* Change Trakt url to fix baseline uses (e.g. add from trending)
|
||||
* Fix edit on show page for shows that have anime enabled in mass edit
|
||||
* Fix issue parsing items in ToktoToshokan provider
|
||||
* Change to only show option "End upgrade on first match" on edit show page if quality custom is selected
|
||||
* Change to only show option "Upgrade once" on edit show page if quality custom is selected
|
||||
* Change label "Show is grouped in" in edit show page to "Show is in group" and move the section higher
|
||||
* Fix post processing of anime with version tags
|
||||
* Change accept SD titles that contain audio quality
|
||||
|
|
14
HACKS.txt
|
@ -1,10 +1,18 @@
|
|||
Libs with customisations...
|
||||
|
||||
/lib/cachecontrol/caches/file_cache.py
|
||||
/lib/dateutil/zoneinfo/__init__.py
|
||||
/lib/hachoir_core/config.py
|
||||
/lib/hachoir_core/stream/input_helpers.py
|
||||
/lib/hachoir_metadata/jpeg.py
|
||||
/lib/hachoir_metadata/metadata.py
|
||||
/lib/hachoir_metadata/riff.py
|
||||
/lib/hachoir_parser/guess.py
|
||||
/lib/lockfile/mkdirlockfile.py
|
||||
/lib/pynma/pynma.py
|
||||
/lib/requests/packages/urllib3/connectionpool.py
|
||||
/lib/requests/packages/urllib3/util/ssl_.py
|
||||
/tornado
|
||||
/lib/unrar2/unix.py
|
||||
/lib/tvdb/tvdb_api.py
|
||||
/lib/tmdb_api/tmdb_api.py
|
||||
/lib/tornado
|
||||
/lib/tvdb_api/tvdb_api.py
|
||||
/lib/tzlocal/unix.py
|
||||
|
|
302
SickBeard.py
|
@ -21,19 +21,21 @@
|
|||
from __future__ import print_function
|
||||
from __future__ import with_statement
|
||||
|
||||
import time
|
||||
import datetime
|
||||
import errno
|
||||
import getopt
|
||||
import locale
|
||||
import os
|
||||
import signal
|
||||
import sys
|
||||
import shutil
|
||||
import subprocess
|
||||
import os
|
||||
import locale
|
||||
import datetime
|
||||
import time
|
||||
import threading
|
||||
import getopt
|
||||
|
||||
if sys.version_info < (2, 6):
|
||||
print('Sorry, requires Python 2.6 or 2.7.')
|
||||
if not (2, 7, 9) <= sys.version_info < (3, 0):
|
||||
print('Python %s.%s.%s detected.' % sys.version_info[:3])
|
||||
print('Sorry, SickGear requires Python 2.7.9 or higher. Python 3 is not supported.')
|
||||
sys.exit(1)
|
||||
|
||||
try:
|
||||
|
@ -61,12 +63,15 @@ from sickbeard.tv import TVShow
|
|||
from sickbeard.webserveInit import WebServer
|
||||
from sickbeard.databases.mainDB import MIN_DB_VERSION, MAX_DB_VERSION
|
||||
from sickbeard.event_queue import Events
|
||||
from sickbeard.exceptions import ex
|
||||
from lib.configobj import ConfigObj
|
||||
|
||||
throwaway = datetime.datetime.strptime('20110101', '%Y%m%d')
|
||||
|
||||
signal.signal(signal.SIGINT, sickbeard.sig_handler)
|
||||
signal.signal(signal.SIGTERM, sickbeard.sig_handler)
|
||||
if 'win32' == sys.platform:
|
||||
signal.signal(signal.SIGBREAK, sickbeard.sig_handler)
|
||||
|
||||
|
||||
class SickGear(object):
|
||||
|
@ -75,48 +80,69 @@ class SickGear(object):
|
|||
sickbeard.events = Events(self.shutdown)
|
||||
|
||||
# daemon constants
|
||||
self.runAsDaemon = False
|
||||
self.CREATEPID = False
|
||||
self.PIDFILE = ''
|
||||
self.run_as_daemon = False
|
||||
self.create_pid = False
|
||||
self.pid_file = ''
|
||||
|
||||
self.run_as_systemd = False
|
||||
self.console_logging = False
|
||||
|
||||
# webserver constants
|
||||
self.webserver = None
|
||||
self.forceUpdate = False
|
||||
self.forcedPort = None
|
||||
self.noLaunch = False
|
||||
self.force_update = False
|
||||
self.forced_port = None
|
||||
self.no_launch = False
|
||||
|
||||
self.web_options = None
|
||||
self.webhost = None
|
||||
self.start_port = None
|
||||
self.log_dir = None
|
||||
|
||||
@staticmethod
|
||||
def help_message():
|
||||
"""
|
||||
print help message for commandline options
|
||||
"""
|
||||
help_msg = '\n'
|
||||
help_msg += 'Usage: %s <option> <another option>\n' % sickbeard.MY_FULLNAME
|
||||
help_msg += '\n'
|
||||
help_msg += 'Options:\n'
|
||||
help_msg += '\n'
|
||||
help_msg += ' -h --help Prints this message\n'
|
||||
help_msg += ' -f --forceupdate Force update all shows in the DB (from tvdb) on startup\n'
|
||||
help_msg += ' -q --quiet Disables logging to console\n'
|
||||
help_msg += ' --nolaunch Suppress launching web browser on startup\n'
|
||||
help_msg = ['']
|
||||
help_msg += ['Usage: %s <option> <another option>\n' % sickbeard.MY_FULLNAME]
|
||||
help_msg += ['Options:\n']
|
||||
|
||||
if sys.platform == 'win32':
|
||||
help_msg += ' -d --daemon Running as real daemon is not supported on Windows\n'
|
||||
help_msg += ' On Windows, --daemon is substituted with: --quiet --nolaunch\n'
|
||||
help_tmpl = ' %-10s%-17s%s'
|
||||
for ln in [
|
||||
('-h', '--help', 'Prints this message'),
|
||||
('-f', '--forceupdate', 'Force update all shows in the DB (from tvdb) on startup'),
|
||||
('-q', '--quiet', 'Disables logging to console'),
|
||||
('', '--nolaunch', 'Suppress launching web browser on startup')
|
||||
]:
|
||||
help_msg += [help_tmpl % ln]
|
||||
|
||||
if 'win32' == sys.platform:
|
||||
for ln in [
|
||||
('-d', '--daemon', 'Running as daemon is not supported on Windows'),
|
||||
('', '', 'On Windows, --daemon is substituted with: --quiet --nolaunch')
|
||||
]:
|
||||
help_msg += [help_tmpl % ln]
|
||||
else:
|
||||
help_msg += ' -d --daemon Run as double forked daemon (includes options --quiet --nolaunch)\n'
|
||||
help_msg += ' --pidfile=<path> Combined with --daemon creates a pidfile (full path including filename)\n'
|
||||
for ln in [
|
||||
('-d', '--daemon', 'Run as double forked daemon (includes options --quiet --nolaunch)'),
|
||||
('-s', '--systemd', 'Run as systemd service (includes options --quiet --nolaunch)'),
|
||||
('', '--pidfile=<path>', 'Combined with --daemon creates a pidfile (full path including filename)')
|
||||
]:
|
||||
help_msg += [help_tmpl % ln]
|
||||
|
||||
help_msg += ' -p <port> --port=<port> Override default/configured port to listen on\n'
|
||||
help_msg += ' --datadir=<path> Override folder (full path) as location for\n'
|
||||
help_msg += ' storing database, configfile, cache, logfiles \n'
|
||||
help_msg += ' Default: %s\n' % sickbeard.PROG_DIR
|
||||
help_msg += ' --config=<path> Override config filename (full path including filename)\n'
|
||||
help_msg += ' to load configuration from \n'
|
||||
help_msg += ' Default: config.ini in %s or --datadir location\n' % sickbeard.PROG_DIR
|
||||
help_msg += ' --noresize Prevent resizing of the banner/posters even if PIL is installed\n'
|
||||
for ln in [
|
||||
('-p <port>', '--port=<port>', 'Override default/configured port to listen on'),
|
||||
('', '--datadir=<path>', 'Override folder (full path) as location for'),
|
||||
('', '', 'storing database, configfile, cache, logfiles'),
|
||||
('', '', 'Default: %s' % sickbeard.PROG_DIR),
|
||||
('', '--config=<path>', 'Override config filename (full path including filename)'),
|
||||
('', '', 'to load configuration from'),
|
||||
('', '', 'Default: config.ini in %s or --datadir location' % sickbeard.PROG_DIR),
|
||||
('', '--noresize', 'Prevent resizing of the banner/posters even if PIL is installed')
|
||||
]:
|
||||
help_msg += [help_tmpl % ln]
|
||||
|
||||
return help_msg
|
||||
return '\n'.join(help_msg)
|
||||
|
||||
def start(self):
|
||||
# do some preliminary stuff
|
||||
|
@ -145,23 +171,23 @@ class SickGear(object):
|
|||
|
||||
try:
|
||||
# pylint: disable=E1101
|
||||
# On non-unicode builds this will raise an AttributeError, if encoding type is not valid it throws a LookupError
|
||||
# On non-unicode builds this raises an AttributeError, if encoding type is not valid it throws a LookupError
|
||||
sys.setdefaultencoding(sickbeard.SYS_ENCODING)
|
||||
except:
|
||||
except (StandardError, Exception):
|
||||
print('Sorry, you MUST add the SickGear folder to the PYTHONPATH environment variable')
|
||||
print('or find another way to force Python to use %s for string encoding.' % sickbeard.SYS_ENCODING)
|
||||
sys.exit(1)
|
||||
|
||||
# Need console logging for SickBeard.py and SickBeard-console.exe
|
||||
self.consoleLogging = (not hasattr(sys, 'frozen')) or (sickbeard.MY_NAME.lower().find('-console') > 0)
|
||||
self.console_logging = (not hasattr(sys, 'frozen')) or (sickbeard.MY_NAME.lower().find('-console') > 0)
|
||||
|
||||
# Rename the main thread
|
||||
threading.currentThread().name = 'MAIN'
|
||||
|
||||
try:
|
||||
opts, args = getopt.getopt(sys.argv[1:], 'hfqdp::',
|
||||
['help', 'forceupdate', 'quiet', 'nolaunch', 'daemon', 'pidfile=', 'port=',
|
||||
'datadir=', 'config=', 'noresize']) # @UnusedVariable
|
||||
opts, args = getopt.getopt(sys.argv[1:], 'hfqdsp::',
|
||||
['help', 'forceupdate', 'quiet', 'nolaunch', 'daemon', 'systemd', 'pidfile=',
|
||||
'port=', 'datadir=', 'config=', 'noresize']) # @UnusedVariable
|
||||
except getopt.GetoptError:
|
||||
sys.exit(self.help_message())
|
||||
|
||||
|
@ -172,43 +198,50 @@ class SickGear(object):
|
|||
|
||||
# For now we'll just silence the logging
|
||||
if o in ('-q', '--quiet'):
|
||||
self.consoleLogging = False
|
||||
self.console_logging = False
|
||||
|
||||
# Should we update (from indexer) all shows in the DB right away?
|
||||
if o in ('-f', '--forceupdate'):
|
||||
self.forceUpdate = True
|
||||
self.force_update = True
|
||||
|
||||
# Suppress launching web browser
|
||||
# Needed for OSes without default browser assigned
|
||||
# Prevent duplicate browser window when restarting in the app
|
||||
if o in ('--nolaunch',):
|
||||
self.noLaunch = True
|
||||
self.no_launch = True
|
||||
|
||||
# Override default/configured port
|
||||
if o in ('-p', '--port'):
|
||||
try:
|
||||
self.forcedPort = int(a)
|
||||
self.forced_port = int(a)
|
||||
except ValueError:
|
||||
sys.exit('Port: %s is not a number. Exiting.' % a)
|
||||
|
||||
# Run as a double forked daemon
|
||||
if o in ('-d', '--daemon'):
|
||||
self.runAsDaemon = True
|
||||
# When running as daemon disable consoleLogging and don't start browser
|
||||
self.consoleLogging = False
|
||||
self.noLaunch = True
|
||||
self.run_as_daemon = True
|
||||
# When running as daemon disable console_logging and don't start browser
|
||||
self.console_logging = False
|
||||
self.no_launch = True
|
||||
|
||||
if sys.platform == 'win32':
|
||||
self.runAsDaemon = False
|
||||
if 'win32' == sys.platform:
|
||||
self.run_as_daemon = False
|
||||
|
||||
# Run as a systemd service
|
||||
if o in ('-s', '--systemd') and 'win32' != sys.platform:
|
||||
self.run_as_systemd = True
|
||||
self.run_as_daemon = False
|
||||
self.console_logging = False
|
||||
self.no_launch = True
|
||||
|
||||
# Write a pidfile if requested
|
||||
if o in ('--pidfile',):
|
||||
self.CREATEPID = True
|
||||
self.PIDFILE = str(a)
|
||||
self.create_pid = True
|
||||
self.pid_file = str(a)
|
||||
|
||||
# If the pidfile already exists, sickbeard may still be running, so exit
|
||||
if os.path.exists(self.PIDFILE):
|
||||
sys.exit('PID file: %s already exists. Exiting.' % self.PIDFILE)
|
||||
if os.path.exists(self.pid_file):
|
||||
sys.exit('PID file: %s already exists. Exiting.' % self.pid_file)
|
||||
|
||||
# Specify folder to load the config file from
|
||||
if o in ('--config',):
|
||||
|
@ -223,19 +256,19 @@ class SickGear(object):
|
|||
sickbeard.NO_RESIZE = True
|
||||
|
||||
# The pidfile is only useful in daemon mode, make sure we can write the file properly
|
||||
if self.CREATEPID:
|
||||
if self.runAsDaemon:
|
||||
pid_dir = os.path.dirname(self.PIDFILE)
|
||||
if self.create_pid:
|
||||
if self.run_as_daemon:
|
||||
pid_dir = os.path.dirname(self.pid_file)
|
||||
if not os.access(pid_dir, os.F_OK):
|
||||
sys.exit(u"PID dir: %s doesn't exist. Exiting." % pid_dir)
|
||||
if not os.access(pid_dir, os.W_OK):
|
||||
sys.exit(u'PID dir: %s must be writable (write permissions). Exiting.' % pid_dir)
|
||||
|
||||
else:
|
||||
if self.consoleLogging:
|
||||
if self.console_logging:
|
||||
print(u'Not running in daemon mode. PID file creation disabled')
|
||||
|
||||
self.CREATEPID = False
|
||||
self.create_pid = False
|
||||
|
||||
# If they don't specify a config file then put it in the data dir
|
||||
if not sickbeard.CONFIG_FILE:
|
||||
|
@ -261,7 +294,7 @@ class SickGear(object):
|
|||
% os.path.dirname(sickbeard.CONFIG_FILE))
|
||||
os.chdir(sickbeard.DATA_DIR)
|
||||
|
||||
if self.consoleLogging:
|
||||
if self.console_logging:
|
||||
print(u'Starting up SickGear from %s' % sickbeard.CONFIG_FILE)
|
||||
|
||||
# Load the config and publish it to the sickbeard package
|
||||
|
@ -302,19 +335,19 @@ class SickGear(object):
|
|||
print(u'Rollback of [%s] successful.' % d)
|
||||
|
||||
# Initialize the config and our threads
|
||||
sickbeard.initialize(consoleLogging=self.consoleLogging)
|
||||
sickbeard.initialize(console_logging=self.console_logging)
|
||||
|
||||
if self.runAsDaemon:
|
||||
if self.run_as_daemon:
|
||||
self.daemonize()
|
||||
|
||||
# Get PID
|
||||
sickbeard.PID = os.getpid()
|
||||
|
||||
if self.forcedPort:
|
||||
logger.log(u'Forcing web server to port %s' % self.forcedPort)
|
||||
self.startPort = self.forcedPort
|
||||
if self.forced_port:
|
||||
logger.log(u'Forcing web server to port %s' % self.forced_port)
|
||||
self.start_port = self.forced_port
|
||||
else:
|
||||
self.startPort = sickbeard.WEB_PORT
|
||||
self.start_port = sickbeard.WEB_PORT
|
||||
|
||||
if sickbeard.WEB_LOG:
|
||||
self.log_dir = sickbeard.LOG_DIR
|
||||
|
@ -333,7 +366,7 @@ class SickGear(object):
|
|||
|
||||
# web server options
|
||||
self.web_options = {
|
||||
'port': int(self.startPort),
|
||||
'port': int(self.start_port),
|
||||
'host': self.webhost,
|
||||
'data_root': os.path.join(sickbeard.PROG_DIR, 'gui', sickbeard.GUI_NAME),
|
||||
'web_root': sickbeard.WEB_ROOT,
|
||||
|
@ -353,24 +386,26 @@ class SickGear(object):
|
|||
|
||||
self.webserver = WebServer(self.web_options)
|
||||
self.webserver.start()
|
||||
except Exception:
|
||||
logger.log(u'Unable to start web server, is something else running on port %d?' % self.startPort,
|
||||
except (StandardError, Exception):
|
||||
logger.log(u'Unable to start web server, is something else running on port %d?' % self.start_port,
|
||||
logger.ERROR)
|
||||
if sickbeard.LAUNCH_BROWSER and not self.runAsDaemon:
|
||||
if self.run_as_systemd:
|
||||
self.exit(0)
|
||||
if sickbeard.LAUNCH_BROWSER and not self.no_launch:
|
||||
logger.log(u'Launching browser and exiting', logger.ERROR)
|
||||
sickbeard.launch_browser(self.startPort)
|
||||
os._exit(1)
|
||||
sickbeard.launch_browser(self.start_port)
|
||||
self.exit(1)
|
||||
|
||||
# Check if we need to perform a restore first
|
||||
restoreDir = os.path.join(sickbeard.DATA_DIR, 'restore')
|
||||
if os.path.exists(restoreDir):
|
||||
if self.restore(restoreDir, sickbeard.DATA_DIR):
|
||||
restore_dir = os.path.join(sickbeard.DATA_DIR, 'restore')
|
||||
if os.path.exists(restore_dir):
|
||||
if self.restore(restore_dir, sickbeard.DATA_DIR):
|
||||
logger.log(u'Restore successful...')
|
||||
else:
|
||||
logger.log_error_and_exit(u'Restore FAILED!')
|
||||
|
||||
# Build from the DB to start with
|
||||
self.loadShowsFromDB()
|
||||
self.load_shows_from_db()
|
||||
|
||||
# Fire up all our threads
|
||||
sickbeard.start()
|
||||
|
@ -390,12 +425,12 @@ class SickGear(object):
|
|||
failed_history.trimHistory()
|
||||
|
||||
# Start an update if we're supposed to
|
||||
if self.forceUpdate or sickbeard.UPDATE_SHOWS_ON_START:
|
||||
if self.force_update or sickbeard.UPDATE_SHOWS_ON_START:
|
||||
sickbeard.showUpdateScheduler.action.run(force=True) # @UndefinedVariable
|
||||
|
||||
# Launch browser
|
||||
if sickbeard.LAUNCH_BROWSER and not (self.noLaunch or self.runAsDaemon):
|
||||
sickbeard.launch_browser(self.startPort)
|
||||
if sickbeard.LAUNCH_BROWSER and not self.no_launch:
|
||||
sickbeard.launch_browser(self.start_port)
|
||||
|
||||
# main loop
|
||||
while True:
|
||||
|
@ -410,9 +445,9 @@ class SickGear(object):
|
|||
try:
|
||||
pid = os.fork() # @UndefinedVariable - only available in UNIX
|
||||
if pid != 0:
|
||||
os._exit(0)
|
||||
except OSError as e:
|
||||
sys.stderr.write('fork #1 failed: %d (%s)\n' % (e.errno, e.strerror))
|
||||
self.exit(0)
|
||||
except OSError as er:
|
||||
sys.stderr.write('fork #1 failed: %d (%s)\n' % (er.errno, er.strerror))
|
||||
sys.exit(1)
|
||||
|
||||
os.setsid() # @UndefinedVariable - only available in UNIX
|
||||
|
@ -425,20 +460,20 @@ class SickGear(object):
|
|||
try:
|
||||
pid = os.fork() # @UndefinedVariable - only available in UNIX
|
||||
if pid != 0:
|
||||
os._exit(0)
|
||||
except OSError as e:
|
||||
sys.stderr.write('fork #2 failed: %d (%s)\n' % (e.errno, e.strerror))
|
||||
self.exit(0)
|
||||
except OSError as er:
|
||||
sys.stderr.write('fork #2 failed: %d (%s)\n' % (er.errno, er.strerror))
|
||||
sys.exit(1)
|
||||
|
||||
# Write pid
|
||||
if self.CREATEPID:
|
||||
if self.create_pid:
|
||||
pid = str(os.getpid())
|
||||
logger.log(u'Writing PID: %s to %s' % (pid, self.PIDFILE))
|
||||
logger.log(u'Writing PID: %s to %s' % (pid, self.pid_file))
|
||||
try:
|
||||
open(self.PIDFILE, 'w').write('%s\n' % pid)
|
||||
except IOError as e:
|
||||
logger.log_error_and_exit(
|
||||
u'Unable to write PID file: %s Error: %s [%s]' % (self.PIDFILE, e.strerror, e.errno))
|
||||
open(self.pid_file, 'w').write('%s\n' % pid)
|
||||
except IOError as er:
|
||||
logger.log_error_and_exit('Unable to write PID file: %s Error: %s [%s]' % (
|
||||
self.pid_file, er.strerror, er.errno))
|
||||
|
||||
# Redirect all output
|
||||
sys.stdout.flush()
|
||||
|
@ -453,10 +488,10 @@ class SickGear(object):
|
|||
os.dup2(stderr.fileno(), sys.stderr.fileno())
|
||||
|
||||
@staticmethod
|
||||
def remove_pid_file(PIDFILE):
|
||||
def remove_pid_file(pidfile):
|
||||
try:
|
||||
if os.path.exists(PIDFILE):
|
||||
os.remove(PIDFILE)
|
||||
if os.path.exists(pidfile):
|
||||
os.remove(pidfile)
|
||||
|
||||
except (IOError, OSError):
|
||||
return False
|
||||
|
@ -464,43 +499,42 @@ class SickGear(object):
|
|||
return True
|
||||
|
||||
@staticmethod
|
||||
def loadShowsFromDB():
|
||||
def load_shows_from_db():
|
||||
"""
|
||||
Populates the showList with shows from the database
|
||||
"""
|
||||
|
||||
logger.log(u'Loading initial show list')
|
||||
|
||||
myDB = db.DBConnection()
|
||||
sqlResults = myDB.select('SELECT * FROM tv_shows')
|
||||
my_db = db.DBConnection()
|
||||
sql_results = my_db.select('SELECT * FROM tv_shows')
|
||||
|
||||
sickbeard.showList = []
|
||||
for sqlShow in sqlResults:
|
||||
for sqlShow in sql_results:
|
||||
try:
|
||||
curShow = TVShow(int(sqlShow['indexer']), int(sqlShow['indexer_id']))
|
||||
curShow.nextEpisode()
|
||||
sickbeard.showList.append(curShow)
|
||||
except Exception as e:
|
||||
logger.log(
|
||||
u'There was an error creating the show in %s: %s' % (sqlShow['location'], str(e).decode('utf-8',
|
||||
'replace')),
|
||||
logger.ERROR)
|
||||
cur_show = TVShow(int(sqlShow['indexer']), int(sqlShow['indexer_id']))
|
||||
cur_show.nextEpisode()
|
||||
sickbeard.showList.append(cur_show)
|
||||
except Exception as er:
|
||||
logger.log('There was an error creating the show in %s: %s' % (
|
||||
sqlShow['location'], str(er).decode('utf-8', 'replace')), logger.ERROR)
|
||||
|
||||
def restore(self, srcDir, dstDir):
|
||||
@staticmethod
|
||||
def restore(src_dir, dst_dir):
|
||||
try:
|
||||
for file in os.listdir(srcDir):
|
||||
srcFile = os.path.join(srcDir, file)
|
||||
dstFile = os.path.join(dstDir, file)
|
||||
bakFile = os.path.join(dstDir, file + '.bak')
|
||||
shutil.move(dstFile, bakFile)
|
||||
shutil.move(srcFile, dstFile)
|
||||
for filename in os.listdir(src_dir):
|
||||
src_file = os.path.join(src_dir, filename)
|
||||
dst_file = os.path.join(dst_dir, filename)
|
||||
bak_file = os.path.join(dst_dir, '%s.bak' % filename)
|
||||
shutil.move(dst_file, bak_file)
|
||||
shutil.move(src_file, dst_file)
|
||||
|
||||
os.rmdir(srcDir)
|
||||
os.rmdir(src_dir)
|
||||
return True
|
||||
except:
|
||||
except (StandardError, Exception):
|
||||
return False
|
||||
|
||||
def shutdown(self, type):
|
||||
def shutdown(self, ev_type):
|
||||
if sickbeard.started:
|
||||
# stop all tasks
|
||||
sickbeard.halt()
|
||||
|
@ -514,14 +548,15 @@ class SickGear(object):
|
|||
self.webserver.shutDown()
|
||||
try:
|
||||
self.webserver.join(10)
|
||||
except:
|
||||
except (StandardError, Exception):
|
||||
pass
|
||||
|
||||
# if run as daemon delete the pidfile
|
||||
if self.runAsDaemon and self.CREATEPID:
|
||||
self.remove_pid_file(self.PIDFILE)
|
||||
if self.run_as_daemon and self.create_pid:
|
||||
self.remove_pid_file(self.pid_file)
|
||||
|
||||
if sickbeard.events.SystemEvent.RESTART == ev_type:
|
||||
|
||||
if type == sickbeard.events.SystemEvent.RESTART:
|
||||
install_type = sickbeard.versionCheckScheduler.action.install_type
|
||||
|
||||
popen_list = []
|
||||
|
@ -531,6 +566,12 @@ class SickGear(object):
|
|||
|
||||
if popen_list:
|
||||
popen_list += sickbeard.MY_ARGS
|
||||
|
||||
if self.run_as_systemd:
|
||||
logger.log(u'Restarting SickGear with exit(1) handler and %s' % popen_list)
|
||||
logger.close()
|
||||
self.exit(1)
|
||||
|
||||
if '--nolaunch' not in popen_list:
|
||||
popen_list += ['--nolaunch']
|
||||
logger.log(u'Restarting SickGear with %s' % popen_list)
|
||||
|
@ -538,12 +579,21 @@ class SickGear(object):
|
|||
subprocess.Popen(popen_list, cwd=os.getcwd())
|
||||
|
||||
# system exit
|
||||
os._exit(0)
|
||||
self.exit(0)
|
||||
|
||||
@staticmethod
|
||||
def exit(code):
|
||||
os._exit(code)
|
||||
|
||||
if __name__ == '__main__':
|
||||
if sys.hexversion >= 0x020600F0:
|
||||
freeze_support()
|
||||
|
||||
# start SickGear
|
||||
SickGear().start()
|
||||
try:
|
||||
try:
|
||||
# start SickGear
|
||||
SickGear().start()
|
||||
except IOError as e:
|
||||
if e.errno != errno.EINTR:
|
||||
raise
|
||||
except Exception as e:
|
||||
logger.log('SickGear.Start() exception caught %s' % ex(e))
|
||||
|
|
BIN
gui/slick/css/fonts/Hack-Regular-mono.eot
Normal file
1543
gui/slick/css/fonts/Hack-Regular-mono.svg
Normal file
After Width: | Height: | Size: 3.4 MiB |
BIN
gui/slick/css/fonts/Hack-Regular-mono.ttf
Normal file
BIN
gui/slick/css/fonts/Hack-Regular-mono.woff
Normal file
Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 235 KiB |
18
gui/slick/css/lib/jquery-ui-1.10.4.custom.css
vendored
|
@ -853,3 +853,21 @@ button.ui-button::-moz-focus-inner {
|
|||
filter: Alpha(Opacity=35);
|
||||
border-radius: 8px;
|
||||
}
|
||||
|
||||
.ui-tooltip {
|
||||
padding:3px 6px;
|
||||
position:absolute;
|
||||
z-index:9999;
|
||||
max-width:300px;
|
||||
|
||||
-webkit-box-shadow:1px 1px 3px 1px rgba(0,0,0,.15);
|
||||
-moz-box-shadow:1px 1px 3px 1px rgba(0,0,0,.15);
|
||||
box-shadow:1px 1px 3px 1px rgba(0,0,0,.15)
|
||||
}
|
||||
body .ui-tooltip {
|
||||
font-size: 10px;
|
||||
border-radius: 5px 5px 5px 5px;
|
||||
border: 1px solid rgb(241, 208, 49);
|
||||
background-color: rgb(255, 255, 163);
|
||||
color: rgb(85, 85, 85)
|
||||
}
|
2
gui/slick/css/lib/pnotify.custom.min.css
vendored
|
@ -1 +1 @@
|
|||
.ui-pnotify{top:25px;right:25px;position:absolute;height:auto;z-index:9999}html>body>.ui-pnotify{position:fixed}.ui-pnotify .ui-pnotify-shadow{-webkit-box-shadow:0 2px 10px rgba(50,50,50,.5);-moz-box-shadow:0 2px 10px rgba(50,50,50,.5);box-shadow:0 2px 10px rgba(50,50,50,.5)}.ui-pnotify-container{background-position:0 0;padding:.8em;height:100%;margin:0}.ui-pnotify-sharp{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.ui-pnotify-title{display:block;margin-bottom:.4em;margin-top:0}.ui-pnotify-text{display:block}.ui-pnotify-icon,.ui-pnotify-icon span{display:block;float:left;margin-right:.2em}.ui-pnotify.stack-bottomleft,.ui-pnotify.stack-topleft{left:25px;right:auto}.ui-pnotify.stack-bottomleft,.ui-pnotify.stack-bottomright{bottom:25px;top:auto}.ui-pnotify-closer,.ui-pnotify-sticker{float:right;margin-left:.2em}
|
||||
.ui-pnotify{top:25px;right:25px;position:absolute;height:auto;z-index:9999}html>body>.ui-pnotify{position:fixed}.ui-pnotify .ui-pnotify-shadow{-webkit-box-shadow:0 2px 10px rgba(50,50,50,.5);-moz-box-shadow:0 2px 10px rgba(50,50,50,.5);box-shadow:0 2px 10px rgba(50,50,50,.5)}.ui-pnotify-container{background-position:0 0;padding:.8em;height:100%;margin:0}.ui-pnotify-container.ui-pnotify-sharp{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.ui-pnotify-title{display:block;margin-bottom:.4em;margin-top:0}.ui-pnotify-text{display:block}.ui-pnotify-icon,.ui-pnotify-icon span{display:block;float:left;margin-right:.2em}.ui-pnotify.stack-bottomleft,.ui-pnotify.stack-topleft{left:25px;right:auto}.ui-pnotify.stack-bottomleft,.ui-pnotify.stack-bottomright{bottom:25px;top:auto}.ui-pnotify-closer,.ui-pnotify-sticker{float:right;margin-left:.2em}.ui-pnotify-history-container{position:absolute;top:0;right:18px;width:70px;border-top:none;padding:0;-webkit-border-top-left-radius:0;-moz-border-top-left-radius:0;border-top-left-radius:0;-webkit-border-top-right-radius:0;-moz-border-top-right-radius:0;border-top-right-radius:0;z-index:10000}.ui-pnotify-history-container.ui-pnotify-history-fixed{position:fixed}.ui-pnotify-history-container .ui-pnotify-history-header{padding:2px;text-align:center}.ui-pnotify-history-container button{cursor:pointer;display:block;width:100%}.ui-pnotify-history-container .ui-pnotify-history-pulldown{display:block;margin:0 auto}
|
|
@ -1,14 +1,32 @@
|
|||
/* =======================================================================
|
||||
inc_top.tmpl
|
||||
========================================================================== */
|
||||
.navbar-default .navbar-nav .logger.errors.n,
|
||||
pre .prelight{
|
||||
color:#6f8c53
|
||||
}
|
||||
|
||||
.navbar-default .navbar-nav .logger.errors.nn,
|
||||
pre .prelight2{
|
||||
color:#b7b82c
|
||||
}
|
||||
|
||||
.navbar-default .navbar-nav .logger.errors.nnn,
|
||||
pre .prelight-num{
|
||||
color:#eaab52
|
||||
}
|
||||
|
||||
.navbar-default .navbar-nav .logger.errors.nnnn{
|
||||
color:#ff6d5e
|
||||
}
|
||||
|
||||
[class^="icon-"],
|
||||
[class*=" icon-"]{
|
||||
background-image:url("../images/glyphicons-halflings.png")
|
||||
background-image:url("../images/glyphicons-halflings-white.png")
|
||||
}
|
||||
|
||||
.icon-white{
|
||||
background-image:url("../images/glyphicons-halflings-white.png")
|
||||
background-image:url("../images/glyphicons-halflings.png")
|
||||
}
|
||||
|
||||
.ui-autocomplete-loading{
|
||||
|
@ -43,7 +61,7 @@ inc_top.tmpl
|
|||
}
|
||||
|
||||
.ui-widget-content a:hover{
|
||||
color:#09A2FF
|
||||
color:#09a2ff
|
||||
}
|
||||
|
||||
.ui-widget-header{
|
||||
|
@ -54,7 +72,7 @@ inc_top.tmpl
|
|||
.ui-widget-content .ui-state-default,
|
||||
.ui-widget-header .ui-state-default{
|
||||
background:#fff;
|
||||
border:1px solid #CCC
|
||||
border:1px solid #ccc
|
||||
}
|
||||
|
||||
.ui-state-hover,
|
||||
|
@ -69,7 +87,7 @@ inc_top.tmpl
|
|||
.ui-state-active,
|
||||
.ui-widget-content .ui-state-active,
|
||||
.ui-widget-header .ui-state-active{
|
||||
background:#F7F7F7
|
||||
background:#f7f7f7
|
||||
}
|
||||
|
||||
.ui-state-highlight,
|
||||
|
@ -124,7 +142,7 @@ inc_top.tmpl
|
|||
}
|
||||
|
||||
.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited{
|
||||
color:#140F06;
|
||||
color:#140f06;
|
||||
text-decoration:none
|
||||
}
|
||||
|
||||
|
@ -149,8 +167,8 @@ inc_top.tmpl
|
|||
}
|
||||
|
||||
.ui-tabs .ui-tabs-panel{
|
||||
background-color:#F7F7F7 !important;
|
||||
border:1px solid #CCC !important
|
||||
background-color:#f7f7f7 !important;
|
||||
border:1px solid #ccc !important
|
||||
}
|
||||
|
||||
.ui-tabs .ui-tabs-nav li.ui-tabs-active{
|
||||
|
@ -184,19 +202,30 @@ inc_bottom.tmpl
|
|||
========================================================================== */
|
||||
|
||||
.footerhighlight{
|
||||
color:#428BCA
|
||||
color:#428bca
|
||||
}
|
||||
|
||||
body#display-show.back-art .displayshow-wrapper a,
|
||||
body#display-show.back-art .footerhighlight a,
|
||||
body#display-show.back-art .footerhighlight{
|
||||
color:#c7db40
|
||||
color:#288536
|
||||
/* color:#c7db40
|
||||
*/
|
||||
}
|
||||
|
||||
body#display-show.back-art .displayshow-wrapper a:hover,
|
||||
body#display-show.back-art .displayshow-wrapper a:focus,
|
||||
body#display-show.back-art .footerhighlight a:hover,
|
||||
body#display-show.back-art .footerhighlight a:focus{
|
||||
color:#7C8119
|
||||
/* color:#c7db40
|
||||
*/
|
||||
}
|
||||
|
||||
body#display-show.back-art .displayshow-wrapper .label a{
|
||||
color:#c7db40
|
||||
}
|
||||
body#display-show.back-art .displayshow-wrapper .label a:hover,
|
||||
body#display-show.back-art .displayshow-wrapper .label a:focus{
|
||||
color:#9faf33
|
||||
}
|
||||
|
||||
|
@ -212,17 +241,19 @@ home.tmpl
|
|||
border:1px solid #ccc
|
||||
}
|
||||
|
||||
.progressbarText{
|
||||
.ui-font,
|
||||
a.ui-font{
|
||||
text-shadow:0 0 0.1em #fff;
|
||||
color:#000
|
||||
}
|
||||
|
||||
.show{
|
||||
background-color:#DFDACF;
|
||||
#show-list .show-card{
|
||||
background-color:#dfdacf;
|
||||
color:#666;
|
||||
border:1px solid #111
|
||||
}
|
||||
|
||||
.show .ui-widget-content{
|
||||
#show-list .show-card .ui-widget-content{
|
||||
border-top:1px solid #111;
|
||||
border-bottom:1px solid #111;
|
||||
border-left:0;
|
||||
|
@ -264,30 +295,20 @@ td.tvShow a{
|
|||
text-decoration:none
|
||||
}
|
||||
|
||||
td.tvShow a:hover span,
|
||||
td.tvShow a:hover{
|
||||
cursor:pointer;
|
||||
color:#428BCA
|
||||
color:#428bca
|
||||
}
|
||||
|
||||
/* =======================================================================
|
||||
home_addShows.tmpl
|
||||
========================================================================== */
|
||||
|
||||
.icon-addnewshow{
|
||||
background-image:url("../images/addshows/add-new32-black.png")
|
||||
}
|
||||
|
||||
.icon-addtrendingshow{
|
||||
background-image:url("../images/addshows/add-trending32-black.png")
|
||||
}
|
||||
|
||||
.icon-addrecommendedshow{
|
||||
background-image:url("../images/addshows/add-trakt32-black.png")
|
||||
}
|
||||
|
||||
.icon-addexistingshow{
|
||||
background-image:url("../images/addshows/add-existing32-black.png")
|
||||
}
|
||||
.icon-addnewshow{background-image:url("../images/addshows/add-new32-black.png")}
|
||||
.icon-addexistingshow{background-image:url("../images/addshows/add-existing32-black.png")}
|
||||
.icon-addrecommendedshow{background-image:url("../images/addshows/add-trakt32-black.png")}
|
||||
.icon-addtrendingshow{background-image:url("../images/addshows/add-trending32-black.png")}
|
||||
|
||||
/* =======================================================================
|
||||
home_newShow.tmpl
|
||||
|
@ -302,11 +323,14 @@ home_newShow.tmpl
|
|||
background-color:rgb(245, 245, 245)
|
||||
}
|
||||
|
||||
#addRootDirTable td label .filepath,
|
||||
.grey-text{
|
||||
color:#666
|
||||
.article{
|
||||
color:#909090
|
||||
}
|
||||
|
||||
#addRootDirTable td label .filepath,
|
||||
.grey-text{color:#666}
|
||||
.highlight-text{color:#000}
|
||||
|
||||
#newShowPortal #displayText .show-name,
|
||||
#newShowPortal #displayText .show-dest,
|
||||
#newShowPortal #displayText p{
|
||||
|
@ -323,15 +347,15 @@ home_addExistingShow.tmpl
|
|||
========================================================================== */
|
||||
|
||||
ul#rootDirStaticList li{
|
||||
background:url('../css/lib/images/ui-bg_highlight-soft_75_efefef_1x100.png') repeat-x scroll 50% 50% #EFEFEF
|
||||
background:url("../css/lib/images/ui-bg_highlight-soft_75_efefef_1x100.png") repeat-x scroll 50% 50% #efefef
|
||||
}
|
||||
|
||||
/* =======================================================================
|
||||
home_browseShows.tmpl
|
||||
========================================================================== */
|
||||
|
||||
.browse-container{
|
||||
background-color:#DFDACF;
|
||||
#browse-list .show-card{
|
||||
background-color:#dfdacf;
|
||||
border:1px solid #111
|
||||
}
|
||||
|
||||
|
@ -344,6 +368,21 @@ home_postprocess.tmpl
|
|||
========================================================================== */
|
||||
|
||||
|
||||
/* =======================================================================
|
||||
displayShow.tmpl and episodeView.tmpl
|
||||
========================================================================== */
|
||||
#episode-view.back-art .controlsBlock,
|
||||
#episode-view.back-art .h2footer,
|
||||
#episode-view.back-art.daybyday h1.header,
|
||||
#episode-view.back-art.pro .daybyday-show,
|
||||
#display-show.back-art #change-show,
|
||||
#display-show.back-art #change-status,
|
||||
#display-show.back-art #no-episode-data,
|
||||
body.back-art .footer,
|
||||
#display-show.back-art .sickbeardTable{
|
||||
background-color: rgba(239, 239, 239, 0.8)
|
||||
}
|
||||
|
||||
/* =======================================================================
|
||||
displayShow.tmpl
|
||||
========================================================================== */
|
||||
|
@ -362,23 +401,41 @@ tr.seasonheader{
|
|||
filter:url("data:image/svg+xml;utf8,<svg version='1.1' xmlns='http://www.w3.org/2000/svg' height='0'><filter id='greyscale'><feColorMatrix type='matrix' values='0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0' /></filter></svg>#greyscale")
|
||||
}
|
||||
|
||||
.tvshowImg{
|
||||
border:1px solid #ccc
|
||||
#posterCol .tvshowImg{
|
||||
border: 1px solid rgba(239, 239, 239, 0.8);
|
||||
}
|
||||
|
||||
.display-details{
|
||||
background-color:#efefef;
|
||||
border:1px solid #dfdede
|
||||
#edit-show.back-art .ui-tabs-nav > :not(.ui-tabs-active){
|
||||
background:rgba(239, 239, 239,0.4)
|
||||
}
|
||||
|
||||
.pro .details-title{
|
||||
#edit-show.back-art .ui-tabs-nav .ui-tabs-active,
|
||||
#edit-show.back-art .ui-tabs .ui-tabs-panel{
|
||||
background:rgba(239, 239, 239,0.8) !important
|
||||
}
|
||||
|
||||
#edit-show.back-art .header,
|
||||
#display-show.back-art #showCol{
|
||||
background:rgba(239, 239, 239, 0.8);
|
||||
border:1px solid rgba(239, 239, 239, 0.8)
|
||||
}
|
||||
|
||||
#livepanel .over-layer0,
|
||||
#showCol{
|
||||
background-color:#efefef
|
||||
}
|
||||
|
||||
#livepanel .over-layer0,
|
||||
#livepanel .over-layer1,
|
||||
#showCol{
|
||||
border-color:#dfdede
|
||||
}
|
||||
|
||||
.pro .details-title,
|
||||
.pro .hint{
|
||||
color:#666
|
||||
}
|
||||
|
||||
.back-art.pro .details-title{
|
||||
color:#bbb
|
||||
}
|
||||
|
||||
.back-art #details-top .label,
|
||||
.back-art #details-bottom .label{
|
||||
background-color:#215f2f
|
||||
|
@ -390,19 +447,24 @@ tr.seasonheader{
|
|||
}
|
||||
|
||||
.paused-highlight{
|
||||
color:#C7DB40
|
||||
color:#c7db40
|
||||
}
|
||||
|
||||
.sickbeardTable th{
|
||||
background-color:#333
|
||||
}
|
||||
|
||||
body#display-show.back-art,
|
||||
.displayshow-wrapper .sickbeardTable th.row-seasonheader{
|
||||
color:#000
|
||||
}
|
||||
|
||||
.translucent.pro .sickbeardTable th{
|
||||
background-color:rgba(51, 51, 51, 0.5)
|
||||
.back-art.pro.ii .navbar-default,
|
||||
.back-art.pro.ii .day-of-week .day-number,
|
||||
.translucent.pro.ii .day-of-week .day-number,
|
||||
.back-art.pro.ii .sickbeardTable .seasoncols th,
|
||||
.translucent.pro.ii .sickbeardTable .seasoncols th{
|
||||
background-color:rgba(51, 51, 51, 0.7)
|
||||
}
|
||||
|
||||
/* =======================================================================
|
||||
|
@ -410,7 +472,7 @@ episodeView.tmpl
|
|||
========================================================================== */
|
||||
|
||||
h2.day, h2.network{
|
||||
color:#FFF;
|
||||
color:#fff;
|
||||
text-shadow:-1px -1px 0 rgba(0, 0, 0, 0.3);
|
||||
background-color:#333
|
||||
}
|
||||
|
@ -421,7 +483,7 @@ h2.day, h2.network{
|
|||
}
|
||||
|
||||
.tvshowDiv a:hover{
|
||||
color:#428BCA
|
||||
color:#428bca
|
||||
}
|
||||
|
||||
.tvshowTitle a{
|
||||
|
@ -455,15 +517,15 @@ h2.day, h2.network{
|
|||
}
|
||||
|
||||
.odd .daybyday-show{
|
||||
background-color:#F5F1E4
|
||||
background-color:#f5f1e4
|
||||
}
|
||||
|
||||
.even .daybyday-show{
|
||||
background-color:#DFDACF
|
||||
background-color:#dfdacf
|
||||
}
|
||||
|
||||
.day-of-week .poster img{
|
||||
border-color:#CCC
|
||||
border-color:#ccc
|
||||
}
|
||||
|
||||
.over-layer0{
|
||||
|
@ -488,13 +550,25 @@ h2.day, h2.network{
|
|||
|
||||
.day-of-week .text .episode .season,
|
||||
.day-of-week .text .episode .number{
|
||||
color:rgb(9, 133, 225)
|
||||
color:#0985e1
|
||||
}
|
||||
|
||||
.day-of-week .text .episode{
|
||||
color:#888
|
||||
}
|
||||
|
||||
.daybyday-show .state{
|
||||
height:5px
|
||||
}
|
||||
|
||||
.daybyday-show .listing-current{
|
||||
border:1px solid #1d5068
|
||||
}
|
||||
|
||||
.daybyday-show .listing-overdue{
|
||||
border:1px solid #890000
|
||||
}
|
||||
|
||||
.episodeview-daybyday .time .time-hr-min,
|
||||
.episodeview-daybyday .time .time-am-pm{
|
||||
color:#666
|
||||
|
@ -506,8 +580,8 @@ h2.day, h2.network{
|
|||
}
|
||||
|
||||
.carousel-indicators .active{
|
||||
background:#C7DB40;
|
||||
border-color:#C7DB40
|
||||
background:#c7db40;
|
||||
border-color:#c7db40
|
||||
}
|
||||
|
||||
/* =======================================================================
|
||||
|
@ -536,7 +610,7 @@ config*.tmpl
|
|||
}
|
||||
|
||||
.testNotification{
|
||||
border:1px dotted #CCC
|
||||
border:1px dotted #ccc
|
||||
}
|
||||
|
||||
.infoTableSeperator{
|
||||
|
@ -557,6 +631,16 @@ config_postProcessing.tmpl
|
|||
border-color:rgb(204, 204, 204)
|
||||
}
|
||||
|
||||
.back-art #config .episode-sample{
|
||||
background:rgba(255,255,255,0.8);
|
||||
border-color:rgba(204,204,204,0.8)
|
||||
}
|
||||
.back-art #config .example{
|
||||
background:rgba(239,239,239,0.8);
|
||||
border-color:rgba(204,204,204,0.8);
|
||||
line-height: 24px
|
||||
}
|
||||
|
||||
.Key{
|
||||
background-color:#f4f4f4;
|
||||
border:1px solid #ccc
|
||||
|
@ -606,7 +690,7 @@ div.metadataDiv .disabled{
|
|||
}
|
||||
|
||||
.warning{
|
||||
border-color:#F89406;
|
||||
border-color:#f89406;
|
||||
background:url("../images/warning16.png") no-repeat right 5px center #fff
|
||||
}
|
||||
|
||||
|
@ -656,7 +740,8 @@ span.path{
|
|||
bootstrap Overrides
|
||||
========================================================================== */
|
||||
|
||||
body{
|
||||
body,
|
||||
.show-date{
|
||||
color:#000
|
||||
}
|
||||
|
||||
|
@ -668,7 +753,7 @@ input, textarea, select, .uneditable-input{
|
|||
/* navbar styling */
|
||||
.navbar-default{
|
||||
background-color:#333;
|
||||
filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#555555', endColorstr='#333333');
|
||||
filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#555555", endColorstr="#333333");
|
||||
background-image:-ms-linear-gradient(top, #555555 0%, #333333 100%);
|
||||
background-image:-moz-linear-gradient(top, #555555 0%, #333333 100%);
|
||||
background-image:-o-linear-gradient(top, #555555 0%, #333333 100%);
|
||||
|
@ -795,7 +880,7 @@ fieldset[disabled] .navbar-default .btn-link:focus{
|
|||
}
|
||||
|
||||
.dropdown-menu{
|
||||
background-color:#F5F1E4;
|
||||
background-color:#f5f1e4;
|
||||
border:1px solid rgba(0, 0, 0, 0.15);
|
||||
box-shadow:0 6px 12px rgba(0, 0, 0, 0.176)
|
||||
}
|
||||
|
@ -819,7 +904,7 @@ fieldset[disabled] .navbar-default .btn-link:focus{
|
|||
border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
|
||||
border-color:#e6e6e6 #e6e6e6 #bfbfbf;
|
||||
border-bottom-color:#b3b3b3;
|
||||
filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0);
|
||||
filter:progid:dximagetransform.microsoft.gradient(startColorstr="#ffffff", endColorstr="#e6e6e6", GradientType=0);
|
||||
filter:progid:dximagetransform.microsoft.gradient(enabled=false);
|
||||
-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
|
||||
-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
|
||||
|
@ -902,6 +987,8 @@ fieldset[disabled] .navbar-default .btn-link:focus{
|
|||
.btn-warning:hover,
|
||||
.btn-danger,
|
||||
.btn-danger:hover,
|
||||
.ui-widget-content .btn-danger,
|
||||
.ui-widget-content .btn-danger:hover,
|
||||
.btn-success,
|
||||
.btn-success:hover,
|
||||
.btn-info,
|
||||
|
@ -933,7 +1020,7 @@ fieldset[disabled] .navbar-default .btn-link:focus{
|
|||
background-repeat:repeat-x;
|
||||
border-color:#0055cc #0055cc #003580;
|
||||
border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
|
||||
filter:progid:dximagetransform.microsoft.gradient(startColorstr='#0088cc', endColorstr='#0055cc', GradientType=0);
|
||||
filter:progid:dximagetransform.microsoft.gradient(startColorstr="#0088cc", endColorstr="#0055cc", GradientType=0);
|
||||
filter:progid:dximagetransform.microsoft.gradient(enabled=false)
|
||||
}
|
||||
|
||||
|
@ -963,7 +1050,7 @@ fieldset[disabled] .navbar-default .btn-link:focus{
|
|||
background-repeat:repeat-x;
|
||||
border-color:#f89406 #f89406 #ad6704;
|
||||
border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
|
||||
filter:progid:dximagetransform.microsoft.gradient(startColorstr='#fbb450', endColorstr='#f89406', GradientType=0);
|
||||
filter:progid:dximagetransform.microsoft.gradient(startColorstr="#fbb450", endColorstr="#f89406", GradientType=0);
|
||||
filter:progid:dximagetransform.microsoft.gradient(enabled=false)
|
||||
}
|
||||
|
||||
|
@ -993,7 +1080,7 @@ fieldset[disabled] .navbar-default .btn-link:focus{
|
|||
background-repeat:repeat-x;
|
||||
border-color:#bd362f #bd362f #802420;
|
||||
border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
|
||||
filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#bd362f', GradientType=0);
|
||||
filter:progid:dximagetransform.microsoft.gradient(startColorstr="#ee5f5b", endColorstr="#bd362f", GradientType=0);
|
||||
filter:progid:dximagetransform.microsoft.gradient(enabled=false)
|
||||
}
|
||||
|
||||
|
@ -1023,7 +1110,7 @@ fieldset[disabled] .navbar-default .btn-link:focus{
|
|||
background-repeat:repeat-x;
|
||||
border-color:#51a351 #51a351 #387038;
|
||||
border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
|
||||
filter:progid:dximagetransform.microsoft.gradient(startColorstr='#62c462', endColorstr='#51a351', GradientType=0);
|
||||
filter:progid:dximagetransform.microsoft.gradient(startColorstr="#62c462", endColorstr="#51a351", GradientType=0);
|
||||
filter:progid:dximagetransform.microsoft.gradient(enabled=false)
|
||||
}
|
||||
|
||||
|
@ -1053,7 +1140,7 @@ fieldset[disabled] .navbar-default .btn-link:focus{
|
|||
background-repeat:repeat-x;
|
||||
border-color:#2f96b4 #2f96b4 #1f6377;
|
||||
border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
|
||||
filter:progid:dximagetransform.microsoft.gradient(startColorstr='#5bc0de', endColorstr='#2f96b4', GradientType=0);
|
||||
filter:progid:dximagetransform.microsoft.gradient(startColorstr="#5bc0de", endColorstr="#2f96b4", GradientType=0);
|
||||
filter:progid:dximagetransform.microsoft.gradient(enabled=false)
|
||||
}
|
||||
|
||||
|
@ -1083,7 +1170,7 @@ fieldset[disabled] .navbar-default .btn-link:focus{
|
|||
background-repeat:repeat-x;
|
||||
border-color:#222 #222 #000;
|
||||
border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
|
||||
filter:progid:dximagetransform.microsoft.gradient(startColorstr='#555555', endColorstr='#222222', GradientType=0);
|
||||
filter:progid:dximagetransform.microsoft.gradient(startColorstr="#555555", endColorstr="#222222", GradientType=0);
|
||||
filter:progid:dximagetransform.microsoft.gradient(enabled=false)
|
||||
}
|
||||
|
||||
|
@ -1115,16 +1202,16 @@ fieldset[disabled] .navbar-default .btn-link:focus{
|
|||
right:12px;
|
||||
display:inline-block;
|
||||
border-right:6px solid transparent;
|
||||
border-bottom:6px solid #F5F1E4;
|
||||
border-bottom:6px solid #f5f1e4;
|
||||
border-left:6px solid transparent;
|
||||
content:""
|
||||
}
|
||||
|
||||
.navbar-default .navbar-nav > .active > a{
|
||||
background-color:transparent;
|
||||
-webkit-box-shadow:inset 0px -5px 0px 0px #C7DB40;
|
||||
-moz-box-shadow:inset 0px -5px 0px 0px #C7DB40;
|
||||
box-shadow:inset 0px -5px 0px 0px #C7DB40
|
||||
-webkit-box-shadow:inset 0px -5px 0px 0px #c7db40;
|
||||
-moz-box-shadow:inset 0px -5px 0px 0px #c7db40;
|
||||
box-shadow:inset 0px -5px 0px 0px #c7db40
|
||||
}
|
||||
|
||||
.navbar-fixed-top{
|
||||
|
@ -1134,7 +1221,7 @@ fieldset[disabled] .navbar-default .btn-link:focus{
|
|||
|
||||
pre{
|
||||
color:#000;
|
||||
background-color:#F5F5F5;
|
||||
background-color:#f5f5f5;
|
||||
border-color:#ccc
|
||||
}
|
||||
|
||||
|
@ -1142,6 +1229,7 @@ pre{
|
|||
input sizing (for config pages)
|
||||
========================================================================== */
|
||||
|
||||
.showlist-select optgroup,
|
||||
#pickShow optgroup,
|
||||
#showfilter optgroup,
|
||||
#editAProvider optgroup{
|
||||
|
@ -1149,6 +1237,7 @@ input sizing (for config pages)
|
|||
background-color:#888
|
||||
}
|
||||
|
||||
.showlist-select optgroup option,
|
||||
#pickShow optgroup option,
|
||||
#showfilter optgroup option,
|
||||
#editAProvider optgroup option{
|
||||
|
@ -1162,7 +1251,7 @@ browser.css
|
|||
|
||||
#fileBrowserDialog ul li a:hover{
|
||||
color:#00f;
|
||||
background: rgb(220, 220, 220) none
|
||||
background:rgb(220, 220, 220) none
|
||||
}
|
||||
|
||||
.ui-menu .ui-menu-item{
|
||||
|
@ -1201,7 +1290,11 @@ div.stepsguide .disabledstep p{
|
|||
}
|
||||
|
||||
#newShowPortal #addShowForm .stepsguide .disabledstep:hover > .smalltext{
|
||||
color:#8a775e;
|
||||
color:#8a775e
|
||||
}
|
||||
|
||||
.stepDiv #searchResults div .exists-db{
|
||||
color:#1178B3
|
||||
}
|
||||
|
||||
div.formpaginate .prev, div.formpaginate .next{
|
||||
|
@ -1209,7 +1302,7 @@ div.formpaginate .prev, div.formpaginate .next{
|
|||
background:#57442b
|
||||
}
|
||||
|
||||
#customQualityWrapper div.component-group-desc p{
|
||||
#customQualityWrapper .tip-text p{
|
||||
color:#666
|
||||
}
|
||||
|
||||
|
@ -1240,18 +1333,18 @@ tablesorter.css
|
|||
}
|
||||
|
||||
.tablesorter .tablesorter-header{
|
||||
background:#333 url(data:image/gif;base64,R0lGODlhFQAJAIAAAP///////yH5BAEAAAEALAAAAAAVAAkAAAIXjI+AywnaYnhUMoqt3gZXPmVg94yJVQAAOw==) no-repeat center right;
|
||||
/* background-image:url(../images/tablesorter/bg.gif) */
|
||||
background:#333 url("data:image/gif;base64,R0lGODlhFQAJAIAAAP///////yH5BAEAAAEALAAAAAAVAAkAAAIXjI+AywnaYnhUMoqt3gZXPmVg94yJVQAAOw==") no-repeat center right;
|
||||
/* background-image:url("../images/tablesorter/bg.gif" */
|
||||
}
|
||||
|
||||
.tablesorter thead .tablesorter-headerDesc{
|
||||
background:#555 url(data:image/gif;base64,R0lGODlhFQAEAIAAAP///////yH5BAEAAAEALAAAAAAVAAQAAAINjB+gC+jP2ptn0WskLQA7) no-repeat center right;
|
||||
/* background-image:url(../images/tablesorter/asc.gif) */
|
||||
background:#555 url("data:image/gif;base64,R0lGODlhFQAEAIAAAP///////yH5BAEAAAEALAAAAAAVAAQAAAINjB+gC+jP2ptn0WskLQA7") no-repeat center right;
|
||||
/* background-image:url("../images/tablesorter/asc.gif" */
|
||||
}
|
||||
|
||||
.tablesorter thead .tablesorter-headerAsc{
|
||||
background:#555 url(data:image/gif;base64,R0lGODlhFQAEAIAAAP///////yH5BAEAAAEALAAAAAAVAAQAAAINjI8Bya2wnINUMopZAQA7) no-repeat center right;
|
||||
/* background-image:url(../images/tablesorter/desc.gif) */
|
||||
background:#555 url("data:image/gif;base64,R0lGODlhFQAEAIAAAP///////yH5BAEAAAEALAAAAAAVAAQAAAINjI8Bya2wnINUMopZAQA7") no-repeat center right;
|
||||
/* background-image:url("../images/tablesorter/desc.gif" */
|
||||
}
|
||||
|
||||
thead.tablesorter-stickyHeader{
|
||||
|
@ -1260,10 +1353,12 @@ thead.tablesorter-stickyHeader{
|
|||
}
|
||||
|
||||
/* Zebra Widget - row alternating colors */
|
||||
.ui-state-default.row-odd,
|
||||
.tablesorter tr.odd, .sickbeardTable tr.odd{
|
||||
background-color:#f5f1e4
|
||||
}
|
||||
|
||||
.ui-state-default.row-even,
|
||||
.tablesorter tr.even, .sickbeardTable tr.even{
|
||||
background-color:#dfdacf
|
||||
}
|
||||
|
@ -1352,14 +1447,14 @@ jquery.confirm.css
|
|||
========================================================================== */
|
||||
|
||||
#confirmOverlay{
|
||||
background:url('../images/bg.gif');
|
||||
background:url("../images/bg.gif");
|
||||
background:-moz-linear-gradient(rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0.5)) repeat-x rgba(0, 0, 0, 0.5);
|
||||
background:-webkit-gradient(linear, 0% 0%, 0% 100%, from(rgba(0, 0, 0, 0.5)), to(rgba(0, 0, 0, 0.5))) repeat-x rgba(0, 0, 0, 0.5);
|
||||
z-index:100000
|
||||
}
|
||||
|
||||
#confirmBox{
|
||||
background:#F5F1E4;
|
||||
background:#f5f1e4;
|
||||
border:1px solid #111;
|
||||
box-shadow:0 0 12px 0 rgba(0, 0, 0, 0.175)
|
||||
}
|
||||
|
@ -1389,17 +1484,17 @@ jquery.confirm.css
|
|||
}
|
||||
|
||||
#confirmBox .green{
|
||||
background-color:#3F7636
|
||||
background-color:#3f7636
|
||||
}
|
||||
|
||||
#confirmBox .green:hover{
|
||||
background-color:#48873E
|
||||
background-color:#48873e
|
||||
}
|
||||
|
||||
#confirmBox .red{
|
||||
background-color:#8D2D2B
|
||||
background-color:#8d2d2b
|
||||
}
|
||||
|
||||
#confirmBox .red:hover{
|
||||
background-color:#A13331
|
||||
background-color:#a13331
|
||||
}
|
||||
|
|
BIN
gui/slick/images/addshows/add-anime.gif
Normal file
After Width: | Height: | Size: 1.4 KiB |
BIN
gui/slick/images/addshows/add-existing16-black.png
Normal file
After Width: | Height: | Size: 3.1 KiB |
BIN
gui/slick/images/addshows/add-existing16-white.png
Normal file
After Width: | Height: | Size: 306 B |
BIN
gui/slick/images/addshows/add-imdb.gif
Normal file
After Width: | Height: | Size: 1.4 KiB |
BIN
gui/slick/images/addshows/anime16.png
Normal file
After Width: | Height: | Size: 691 B |
BIN
gui/slick/images/addshows/imdb16.png
Normal file
After Width: | Height: | Size: 250 B |
BIN
gui/slick/images/addshows/trakt16-black.png
Normal file
After Width: | Height: | Size: 477 B |
BIN
gui/slick/images/addshows/trakt16-white.png
Normal file
After Width: | Height: | Size: 496 B |
BIN
gui/slick/images/arrows2.png
Normal file
After Width: | Height: | Size: 1.8 KiB |
BIN
gui/slick/images/banner_thumb.jpg
Normal file
After Width: | Height: | Size: 7.3 KiB |
BIN
gui/slick/images/fanart.png
Normal file
After Width: | Height: | Size: 531 B |
Before Width: | Height: | Size: 8.6 KiB After Width: | Height: | Size: 15 KiB |
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 14 KiB |
BIN
gui/slick/images/imdb16.png
Normal file
After Width: | Height: | Size: 322 B |
Before Width: | Height: | Size: 4.8 KiB After Width: | Height: | Size: 1.1 KiB |
BIN
gui/slick/images/network/abc news 24.png
Normal file
After Width: | Height: | Size: 3.2 KiB |
Before Width: | Height: | Size: 5 KiB After Width: | Height: | Size: 2.8 KiB |
Before Width: | Height: | Size: 5 KiB After Width: | Height: | Size: 2.2 KiB |
Before Width: | Height: | Size: 4.7 KiB After Width: | Height: | Size: 2.3 KiB |
Before Width: | Height: | Size: 3 KiB After Width: | Height: | Size: 2.1 KiB |
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 2.5 KiB |
Before Width: | Height: | Size: 5.6 KiB After Width: | Height: | Size: 1.9 KiB |
Before Width: | Height: | Size: 5.6 KiB |
Before Width: | Height: | Size: 5.6 KiB |
Before Width: | Height: | Size: 4.4 KiB After Width: | Height: | Size: 892 B |
Before Width: | Height: | Size: 4.2 KiB After Width: | Height: | Size: 1.6 KiB |
Before Width: | Height: | Size: 4.9 KiB After Width: | Height: | Size: 2.7 KiB |
Before Width: | Height: | Size: 4.4 KiB After Width: | Height: | Size: 1.9 KiB |
Before Width: | Height: | Size: 4 KiB After Width: | Height: | Size: 1.5 KiB |
Before Width: | Height: | Size: 4.7 KiB After Width: | Height: | Size: 2.3 KiB |
Before Width: | Height: | Size: 4.4 KiB After Width: | Height: | Size: 1.9 KiB |
Before Width: | Height: | Size: 4.2 KiB After Width: | Height: | Size: 1.6 KiB |
Before Width: | Height: | Size: 5.6 KiB After Width: | Height: | Size: 2.7 KiB |
Before Width: | Height: | Size: 3.3 KiB After Width: | Height: | Size: 3 KiB |
Before Width: | Height: | Size: 3.3 KiB After Width: | Height: | Size: 1.7 KiB |
Before Width: | Height: | Size: 4.3 KiB After Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 5.7 KiB After Width: | Height: | Size: 2.3 KiB |
Before Width: | Height: | Size: 4.2 KiB After Width: | Height: | Size: 889 B |
BIN
gui/slick/images/network/channel 5.png
Normal file
After Width: | Height: | Size: 889 B |
Before Width: | Height: | Size: 5.4 KiB After Width: | Height: | Size: 2.8 KiB |
BIN
gui/slick/images/network/chiller.png
Normal file
After Width: | Height: | Size: 2.8 KiB |
Before Width: | Height: | Size: 5.1 KiB After Width: | Height: | Size: 2.7 KiB |
Before Width: | Height: | Size: 2.7 KiB After Width: | Height: | Size: 3.8 KiB |
Before Width: | Height: | Size: 5.1 KiB After Width: | Height: | Size: 3.9 KiB |
Before Width: | Height: | Size: 3.5 KiB After Width: | Height: | Size: 1.3 KiB |
Before Width: | Height: | Size: 4.5 KiB After Width: | Height: | Size: 2.6 KiB |
Before Width: | Height: | Size: 4.5 KiB After Width: | Height: | Size: 3.7 KiB |
Before Width: | Height: | Size: 2.7 KiB After Width: | Height: | Size: 4.5 KiB |
Before Width: | Height: | Size: 4.3 KiB After Width: | Height: | Size: 889 B |
Before Width: | Height: | Size: 3 KiB After Width: | Height: | Size: 2.5 KiB |
Before Width: | Height: | Size: 4.7 KiB After Width: | Height: | Size: 2.4 KiB |
Before Width: | Height: | Size: 5.7 KiB After Width: | Height: | Size: 3.1 KiB |
Before Width: | Height: | Size: 6.1 KiB After Width: | Height: | Size: 2.9 KiB |
Before Width: | Height: | Size: 5.1 KiB After Width: | Height: | Size: 4.1 KiB |
Before Width: | Height: | Size: 5.1 KiB After Width: | Height: | Size: 4.1 KiB |
Before Width: | Height: | Size: 5.1 KiB After Width: | Height: | Size: 2 KiB |
Before Width: | Height: | Size: 5.2 KiB After Width: | Height: | Size: 2.6 KiB |
Before Width: | Height: | Size: 4.5 KiB After Width: | Height: | Size: 1.8 KiB |
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 2.2 KiB |
Before Width: | Height: | Size: 4 KiB After Width: | Height: | Size: 1.4 KiB |
Before Width: | Height: | Size: 4.3 KiB After Width: | Height: | Size: 2.7 KiB |
Before Width: | Height: | Size: 4.2 KiB After Width: | Height: | Size: 2 KiB |
Before Width: | Height: | Size: 4.6 KiB After Width: | Height: | Size: 2.1 KiB |
Before Width: | Height: | Size: 3.6 KiB After Width: | Height: | Size: 2 KiB |
Before Width: | Height: | Size: 3.9 KiB After Width: | Height: | Size: 2.2 KiB |
Before Width: | Height: | Size: 3.6 KiB After Width: | Height: | Size: 2.2 KiB |
Before Width: | Height: | Size: 4.5 KiB After Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 4.5 KiB After Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 5.4 KiB After Width: | Height: | Size: 2.8 KiB |
Before Width: | Height: | Size: 7.8 KiB After Width: | Height: | Size: 5.2 KiB |
Before Width: | Height: | Size: 4.5 KiB After Width: | Height: | Size: 4 KiB |
Before Width: | Height: | Size: 5.4 KiB After Width: | Height: | Size: 3.2 KiB |
Before Width: | Height: | Size: 4 KiB After Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 5.4 KiB After Width: | Height: | Size: 1.8 KiB |
Before Width: | Height: | Size: 4.6 KiB After Width: | Height: | Size: 1,013 B |
Before Width: | Height: | Size: 4.5 KiB After Width: | Height: | Size: 1.5 KiB |
Before Width: | Height: | Size: 4.5 KiB After Width: | Height: | Size: 1.5 KiB |
Before Width: | Height: | Size: 4.6 KiB After Width: | Height: | Size: 2.6 KiB |
Before Width: | Height: | Size: 5.1 KiB After Width: | Height: | Size: 2 KiB |
Before Width: | Height: | Size: 5.1 KiB After Width: | Height: | Size: 2 KiB |
Before Width: | Height: | Size: 4 KiB After Width: | Height: | Size: 1.4 KiB |
Before Width: | Height: | Size: 4 KiB After Width: | Height: | Size: 2.5 KiB |