Merge branch 'release/0.12.0'

This commit is contained in:
JackDandy 2016-12-19 03:03:52 +00:00
commit 04c433c601
1172 changed files with 45148 additions and 14021 deletions

3
.gitignore vendored
View file

@ -13,9 +13,10 @@ restore/
######################
# SB Test Related #
tests/cache/*
tests/Logs/*
tests/sickbeard.*
tests/cache.db
tests/*.db
######################
# Compiled source #

View file

@ -1,7 +1,6 @@
language: python
sudo: false
python:
- 2.6
- 2.7
install:

View file

@ -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

View file

@ -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

View file

@ -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))

File diff suppressed because it is too large Load diff

Binary file not shown.

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 3.4 MiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 235 KiB

Binary file not shown.

Binary file not shown.

View file

@ -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)
}

View file

@ -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}

View file

@ -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
}

File diff suppressed because it is too large Load diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 306 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 691 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 250 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 477 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 496 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

BIN
gui/slick/images/fanart.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 531 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.6 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

BIN
gui/slick/images/imdb16.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 322 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5 KiB

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.7 KiB

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.6 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.4 KiB

After

Width:  |  Height:  |  Size: 892 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.9 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.4 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.7 KiB

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.4 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.6 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

After

Width:  |  Height:  |  Size: 3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.7 KiB

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

After

Width:  |  Height:  |  Size: 889 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 889 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.4 KiB

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.5 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.5 KiB

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 KiB

After

Width:  |  Height:  |  Size: 889 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.7 KiB

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.7 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.1 KiB

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

After

Width:  |  Height:  |  Size: 2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.2 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.5 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

After

Width:  |  Height:  |  Size: 2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.6 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 KiB

After

Width:  |  Height:  |  Size: 2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.5 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.5 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.4 KiB

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.8 KiB

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.5 KiB

After

Width:  |  Height:  |  Size: 4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.4 KiB

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.4 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.6 KiB

After

Width:  |  Height:  |  Size: 1,013 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.6 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

After

Width:  |  Height:  |  Size: 2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

After

Width:  |  Height:  |  Size: 2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

Some files were not shown because too many files have changed in this diff Show more