Browse Source

Merge branch 'develop'

pull/5327/head
Ruud 10 years ago
parent
commit
48601a134d
  1. 46
      couchpotato/core/media/_base/providers/torrent/thepiratebay.py
  2. 14
      couchpotato/core/media/movie/_base/static/details.js
  3. 4
      couchpotato/core/media/movie/_base/static/list.js
  4. 19
      couchpotato/core/media/movie/_base/static/movie.actions.js
  5. 51
      couchpotato/core/media/movie/_base/static/movie.js
  6. 142
      couchpotato/core/media/movie/_base/static/movie.scss
  7. 9
      couchpotato/core/media/movie/charts/__init__.py
  8. 34
      couchpotato/core/media/movie/charts/static/charts.js
  9. 2
      couchpotato/core/media/movie/providers/automation/bluray.py
  10. 179
      couchpotato/core/media/movie/providers/automation/crowdai.py
  11. 2
      couchpotato/core/media/movie/providers/automation/imdb.py
  12. 2
      couchpotato/core/media/movie/providers/automation/popularmovies.py
  13. 6
      couchpotato/core/media/movie/providers/userscript/trakt.py
  14. 24
      couchpotato/core/media/movie/suggestion.py
  15. 25
      couchpotato/core/notifications/pushbullet.py
  16. 2
      couchpotato/core/plugins/base.py
  17. 2
      couchpotato/core/plugins/category/static/category.js
  18. 68
      couchpotato/core/plugins/category/static/category.scss
  19. 2
      couchpotato/core/plugins/profile/static/profile.js
  20. 15
      couchpotato/core/plugins/profile/static/profile.scss
  21. 2
      couchpotato/core/plugins/release/main.py
  22. 52
      couchpotato/core/plugins/userscript/static/userscript.js
  23. 1
      couchpotato/core/plugins/userscript/static/userscript.scss
  24. 12
      couchpotato/static/scripts/combined.base.min.js
  25. 93
      couchpotato/static/scripts/combined.plugins.min.js
  26. 52
      couchpotato/static/scripts/couchpotato.js
  27. 8
      couchpotato/static/scripts/page/settings.js
  28. 152
      couchpotato/static/style/combined.min.css
  29. 7
      couchpotato/static/style/main.scss
  30. 85
      couchpotato/static/style/settings.scss

46
couchpotato/core/media/_base/providers/torrent/thepiratebay.py

@ -2,6 +2,7 @@ import re
import traceback
from bs4 import BeautifulSoup
from couchpotato.core.event import addEvent
from couchpotato.core.helpers.encoding import toUnicode
from couchpotato.core.helpers.variable import tryInt
from couchpotato.core.logger import CPLog
@ -26,19 +27,40 @@ class Base(TorrentMagnetProvider):
proxy_list = [
'https://thepiratebay.mn',
'https://thepiratebay.gd',
'https://thepiratebay.bg',
'https://thepiratebay.la',
'https://thepiratebay.am',
'https://thepiratebay.gs',
'http://proxybay.fr',
'http://pirateproxy.in',
'http://proxybay.pw',
'https://pirateproxy.sx',
'https://piratebay.host',
'https://thepiratebay.expert',
'https://pirateproxy.wf',
'https://pirateproxy.tf',
'https://urbanproxy.eu',
'https://pirate.guru',
'https://piratebays.co',
'https://pirateproxy.yt',
'https://thepiratebay.uk.net',
'https://tpb.ninja',
'https://thehiddenbay.me',
'https://ukunlocked.com',
'https://thebay.tv',
'https://tpb.freed0m4all.net',
'https://piratebays.eu',
'https://thepirateproxy.co',
'https://thepiratebayz.com',
'https://zaatoka.eu',
'https://piratemirror.net',
'https://theproxypirate.pw',
'https://torrentdr.com',
'https://tpbproxy.co',
'https://arrr.xyz',
'https://www.cleantpbproxy.com',
'http://tpb.dashitz.com',
]
def __init__(self):
super(Base, self).__init__()
addEvent('app.test', self.doTest)
def _search(self, media, quality, results):
page = 0
@ -122,6 +144,18 @@ class Base(TorrentMagnetProvider):
item['description'] = description
return item
def doTest(self):
for url in self.proxy_list:
try:
data = self.urlopen(url + '/search/test+search')
if 'value="test+search"' in data:
log.info('Success %s', url)
continue
except:
log.error('%s', traceback.format_exc(0))
config = [{
'name': 'thepiratebay',

14
couchpotato/core/media/movie/_base/static/details.js

@ -37,9 +37,17 @@ var MovieDetails = new Class({
)
);
self.addSection('description', new Element('div', {
'text': parent.get('plot')
}));
var eta_date = parent.getETA('%b %Y') ;
self.addSection('description', new Element('div').adopt(
new Element('div', {
'text': parent.get('plot')
}),
new Element('div.meta', {
'html':
(eta_date ? ('<span>ETA:' + eta_date + '</span>') : '') +
'<span>' + (parent.get('genres') || []).join(', ') + '</span>'
})
));
// Title dropdown

4
couchpotato/core/media/movie/_base/static/list.js

@ -13,6 +13,7 @@ var MovieList = new Class({
force_view: false
},
available_views: ['thumb', 'list'],
movies: [],
movies_added: {},
total_movies: 0,
@ -530,6 +531,9 @@ var MovieList = new Class({
changeView: function(new_view){
var self = this;
if(self.available_views.indexOf(new_view) == -1)
new_view = 'thumb';
self.el
.removeClass(self.current_view+'_list')
.addClass(new_view+'_list');

19
couchpotato/core/media/movie/_base/static/movie.actions.js

@ -400,12 +400,17 @@ MA.Trailer = new Class({
new Request.JSONP({
'url': url,
'onComplete': function(json){
self.video_id = json.items[0].id.videoId;
self.container.grab(new Element('div.background', {
'styles': {
'background-image': 'url('+json.items[0].snippet.thumbnails.high.url+')'
}
}));
if(json.items.length > 0){
self.video_id = json.items[0].id.videoId;
self.container.grab(new Element('div.background', {
'styles': {
'background-image': 'url('+json.items[0].snippet.thumbnails.high.url+')'
}
}));
}
else {
self.container.getParent('.section').addClass('no_trailer');
}
}
}).send();
}
@ -416,13 +421,13 @@ MA.Trailer = new Class({
watch: function(){
var self = this;
self.container.set('html', '<iframe src="https://www.youtube-nocookie.com/embed/'+self.video_id+'?rel=0&showinfo=0&autoplay=1&showsearch=0&iv_load_policy=3&vq=hd720" />');
}
});
MA.Category = new Class({
Extends: MovieAction,

51
couchpotato/core/media/movie/_base/static/movie.js

@ -182,30 +182,11 @@ var Movie = new Class({
},
create: function(){
var self = this,
d = new Date();
var self = this;
self.el.addClass('status_'+self.get('status'));
var eta = null,
eta_date = null,
now = Math.round(+d/1000);
if(self.data.info.release_date)
[self.data.info.release_date.dvd, self.data.info.release_date.theater].each(function(timestamp){
if (timestamp > 0 && (eta === null || Math.abs(timestamp - now) < Math.abs(eta - now)))
eta = timestamp;
});
if(eta){
eta_date = new Date(eta * 1000);
if(+eta_date/1000 < now){
eta_date = null;
}
else {
eta_date = eta_date.format('%b') + (d.getFullYear() != eta_date.getFullYear() ? ' ' + eta_date.getFullYear() : '');
}
}
var eta_date = self.getETA();
var rating, stars;
if(['suggested','chart'].indexOf(self.data.status) > -1 && self.data.info && self.data.info.rating && self.data.info.rating.imdb){
@ -260,7 +241,7 @@ var Movie = new Class({
'text': self.data.info.year || 'n/a'
})
),
eta_date && (now+8035200 > eta) ? new Element('div.eta', {
eta_date ? new Element('div.eta', {
'text': eta_date,
'title': 'ETA'
}) : null,
@ -429,6 +410,32 @@ var Movie = new Class({
return self.get('imdb');
},
getETA: function(format){
var self = this,
d = new Date(),
now = Math.round(+d/1000),
eta = null,
eta_date = '';
if(self.data.info.release_date)
[self.data.info.release_date.dvd, self.data.info.release_date.theater].each(function(timestamp){
if (timestamp > 0 && (eta === null || Math.abs(timestamp - now) < Math.abs(eta - now)))
eta = timestamp;
});
if(eta){
eta_date = new Date(eta * 1000);
if(+eta_date/1000 < now){
eta_date = null;
}
else {
eta_date = format ? eta_date.format(format) : (eta_date.format('%b') + (d.getFullYear() != eta_date.getFullYear() ? ' ' + eta_date.getFullYear() : ''));
}
}
return (now+8035200 > eta) ? eta_date : '';
},
get: function(attr){
return this.data[attr] || this.data.info[attr];
},

142
couchpotato/core/media/movie/_base/static/movie.scss

@ -61,6 +61,10 @@ $mass_edit_height: 44px;
z-index: 2;
cursor: pointer;
@include media-phablet {
display: none;
}
&:hover {
opacity: 1 !important;
}
@ -115,7 +119,7 @@ $mass_edit_height: 44px;
display: block;
padding: $padding;
@include media-phablet {
@include media-tablet {
padding: $padding/2;
}
@ -124,6 +128,15 @@ $mass_edit_height: 44px;
}
}
.message {
padding: $padding 0;
text-align: center;
a {
color: $primary_color;
}
}
> .description {
position: absolute;
top: 0;
@ -157,7 +170,7 @@ $mass_edit_height: 44px;
}
}
.actions {
.movie .actions {
transform: rotateY(360deg);
@include media-phablet {
@ -225,7 +238,7 @@ $mass_edit_height: 44px;
flex-flow: row nowrap;
align-items: center;
@include media-phablet {
@include media-tablet {
display: block;
padding: $padding/2;
}
@ -233,7 +246,7 @@ $mass_edit_height: 44px;
.title {
flex: 1 auto;
@include media-phablet {
@include media-tablet {
display: flex;
flex-flow: row nowrap;
}
@ -244,7 +257,7 @@ $mass_edit_height: 44px;
text-overflow: ellipsis;
white-space: nowrap;
@include media-phablet {
@include media-tablet {
width: 100%;
}
@ -272,7 +285,7 @@ $mass_edit_height: 44px;
font-size: .7em;
margin: 2px 0 0 2px;
@include media-phablet {
@include media-tablet {
margin: 2px 2px 0 0;
}
}
@ -323,7 +336,7 @@ $mass_edit_height: 44px;
&:hover .actions {
display: block;
@include media-phablet {
@include media-tablet {
display: none;
}
}
@ -333,6 +346,10 @@ $mass_edit_height: 44px;
&:hover, &.checked {
.info .title span {
margin-left: $padding;
@include media-tablet {
margin-left: 0;
}
}
}
}
@ -340,6 +357,11 @@ $mass_edit_height: 44px;
.thumb_list {
$max-split: 20;
$split-jump: 225px;
padding: 0 $padding/4;
> div:last-child {
padding: 0 ($padding/2)+2px;
@include media-phablet {
@ -347,47 +369,30 @@ $mass_edit_height: 44px;
}
}
@include media-tablet {
padding: 0 $padding/4;
}
@include media-phablet {
padding: 0 $padding/6;
}
> div {
display: flex;
flex-flow: row wrap;
align-items: stretch;
}
.movie {
display: inline-block;
vertical-align: top;
margin-bottom: $padding;
position: relative;
cursor: pointer;
flex: 1 auto;
width: 150px;
max-width: 16.666666667%;
border: 0 solid transparent;
border-width: 0 $padding/2;
border-width: 0 $padding/3;
@include media-desktop-plus {
max-width: 20%;
border-width: 0 $padding/2.5;
}
@include media-desktop {
max-width: 33.333%;
border-width: 0 $padding/3;
@while $max-split > 0 {
@media (min-width : $split-jump * ($max-split - 1)) and (max-width : $split-jump * $max-split) {
width: 100% / $max-split;
}
$max-split: $max-split - 1;
}
@include media-tablet {
max-width: 50%;
width: 33.333%;
border-width: 0 $padding/4;
}
@include media-phablet {
max-width: 50%;
width: 50%;
border-width: 0 $padding/5;
}
@ -465,10 +470,9 @@ $mass_edit_height: 44px;
.action {
position: relative;
display: block;
margin-bottom: 1px;
width: auto;
margin-right: $padding/2;
float: right;
clear: both;
&:first-child {
margin-top: $padding/2;
@ -476,7 +480,7 @@ $mass_edit_height: 44px;
a {
transition: all 150ms $cubic;
display: inline-block;
display: block;
width: auto;
padding: $padding / 3;
color: #FFF;
@ -526,7 +530,6 @@ $mass_edit_height: 44px;
border-radius: $border_radius 0 0 $border_radius;
opacity: 0;
transform: rotateY(360deg);
backface-visibility: hidden;
transition: opacity 300ms ease 400ms;
z-index: 1;
@ -548,7 +551,6 @@ $mass_edit_height: 44px;
width: 100%;
height: 100%;
opacity: 0;
backface-visibility: hidden;
transition: opacity 300ms ease 200ms;
&:before {
@ -585,6 +587,7 @@ $mass_edit_height: 44px;
padding: 0 $padding;
position: relative;
z-index: 2;
transform: rotateY(360deg);
@include media-phablet {
padding: 0;
@ -746,6 +749,7 @@ $mass_edit_height: 44px;
.section {
padding: $padding;
border-top: 1px solid rgba(0,0,0,.1);
transform: rotateY(360deg);
@include media-phablet {
padding: $padding/2;
@ -768,7 +772,24 @@ $mass_edit_height: 44px;
.scroll_content {
transition-delay: 200ms;
transform: translateX(0);
transform: translateX(0) rotateY(360deg);
}
}
.section_description {
.meta {
text-align: right;
font-style: italic;
font-size: .90em;
span {
display: inline-block;
margin: $padding/2 $padding/2 0;
&:last-child {
margin-right: 0;
}
}
}
}
@ -979,6 +1000,10 @@ $mass_edit_height: 44px;
}
.section_trailer.no_trailer {
display: none;
}
.trailer_container {
$play-size: 110px;
@ -1085,10 +1110,6 @@ $mass_edit_height: 44px;
.alph_nav {
position: relative;
@include media-phablet {
display: none;
}
.mass_edit_form {
display: flex;
background: $background_color;
@ -1114,6 +1135,10 @@ $mass_edit_height: 44px;
.select {
margin: 0 $padding/2 0 $padding;
@include media-phablet {
margin: 0 $padding/4 0 $padding/2;
}
input, .count {
margin-right: $padding/4;
}
@ -1132,6 +1157,11 @@ $mass_edit_height: 44px;
.counter, .more_menu, .actions {
float: left;
.wrapper {
transform-origin: 92% 0;
right: -7px;
}
> a {
display: inline-block;
width: 30px;
@ -1147,16 +1177,19 @@ $mass_edit_height: 44px;
.counter {
line-height: $header_height;
padding: 0 $padding/2;
@include media-tablet {
display: none;
}
}
.actions {
a {
display: none;
display: inline-block;
}
.active {
display: inline-block;
display: none;
}
}
@ -1164,6 +1197,15 @@ $mass_edit_height: 44px;
.filter {
.wrapper {
width: 320px;
@include media-phablet {
right: -70px;
transform-origin: 75% 0;
&:before {
right: 83px !important;
}
}
}
.button {
@ -1188,6 +1230,10 @@ $mass_edit_height: 44px;
background: $background_color;
border: none;
border-bottom: 1px solid $theme_off;
@include media-phablet {
font-size: 1.2em;
}
}
}

9
couchpotato/core/media/movie/charts/__init__.py

@ -14,14 +14,7 @@ config = [{
'type': 'list',
'name': 'charts_providers',
'tab': 'display',
'options': [
{
'name': 'max_items',
'default': 5,
'type': 'int',
'description': 'Maximum number of items displayed from each chart.',
},
],
'options': [],
},
],
}]

34
couchpotato/core/media/movie/charts/static/charts.js

@ -14,28 +14,8 @@ var Charts = new Class({
create: function(){
var self = this;
self.el = new Element('div.charts').adopt(
self.el_no_charts_enabled = new Element('p.no_charts_enabled', {
'html': 'Hey, it looks like you have no charts enabled at the moment. If you\'d like some great movie suggestions you can go to <a href="' + App.createUrl('settings/display') + '">settings</a> and turn on some charts of your choice.'
}),
self.el_refresh_container = new Element('div.refresh').adopt(
self.el_refresh_link = new Element('a.refresh.icon2', {
'href': '#',
'events': {
'click': function(e) {
e.preventDefault();
self.el.getElements('.chart').destroy();
self.el_refreshing_text.show();
self.el_refresh_link.hide();
self.api_request = Api.request('charts.view', {
'data': { 'force_update': 1 },
'onComplete': self.fill.bind(self)
});
}
}
}),
self.el = new Element('div.charts').grab(
self.el_refresh_container = new Element('div.refresh').grab(
self.el_refreshing_text = new Element('span.refreshing', {
'text': 'Refreshing charts...'
})
@ -52,16 +32,8 @@ var Charts = new Class({
var self = this;
self.el_refreshing_text.hide();
self.el_refresh_link.show();
if(!json || json.count === 0){
self.el_no_charts_enabled.show();
self.el_refresh_link.show();
self.el_refreshing_text.hide();
}
else {
self.el_no_charts_enabled.hide();
if(json && json.count > 0){
json.charts.sort(function(a, b) {
return a.order - b.order;
});

2
couchpotato/core/media/movie/providers/automation/bluray.py

@ -116,7 +116,7 @@ class Bluray(Automation, RSS):
if not movie_list['list']:
movie_ids = []
max_items = int(self.conf('max_items', section='charts', default=5))
max_items = 10
rss_movies = self.getRSSData(self.rss_url)
for movie in rss_movies:

179
couchpotato/core/media/movie/providers/automation/crowdai.py

@ -1,89 +1,90 @@
import re
from couchpotato.core.helpers.rss import RSS
from couchpotato.core.helpers.variable import tryInt, splitString
from couchpotato.core.logger import CPLog
from couchpotato.core.media.movie.providers.automation.base import Automation
log = CPLog(__name__)
autoload = 'CrowdAI'
class CrowdAI(Automation, RSS):
interval = 1800
def getIMDBids(self):
movies = []
urls = dict(zip(splitString(self.conf('automation_urls')), [tryInt(x) for x in splitString(self.conf('automation_urls_use'))]))
for url in urls:
if not urls[url]:
continue
rss_movies = self.getRSSData(url)
for movie in rss_movies:
description = self.getTextElement(movie, 'description')
grabs = 0
for item in movie:
if item.attrib.get('name') == 'grabs':
grabs = item.attrib.get('value')
break
if int(grabs) > tryInt(self.conf('number_grabs')):
title = re.match(r'.*Title: .a href.*/">(.*) \(\d{4}\).*', description).group(1)
log.info2('%s grabs for movie: %s, enqueue...', (grabs, title))
year = re.match(r'.*Year: (\d{4}).*', description).group(1)
imdb = self.search(title, year)
if imdb and self.isMinimalMovie(imdb):
movies.append(imdb['imdb'])
return movies
config = [{
'name': 'crowdai',
'groups': [
{
'tab': 'automation',
'list': 'automation_providers',
'name': 'crowdai_automation',
'label': 'CrowdAI',
'description': 'Imports from any newznab powered NZB providers RSS feed depending on the number of grabs per movie. Go to your newznab site and find the RSS section. Then copy the copy paste the link under "Movies > x264 feed" here.',
'options': [
{
'name': 'automation_enabled',
'default': False,
'type': 'enabler',
},
{
'name': 'automation_urls_use',
'label': 'Use',
'default': '1',
},
{
'name': 'automation_urls',
'label': 'url',
'type': 'combined',
'combine': ['automation_urls_use', 'automation_urls'],
'default': 'http://YOUR_PROVIDER/rss?t=THE_MOVIE_CATEGORY&i=YOUR_USER_ID&r=YOUR_API_KEY&res=2&rls=2&num=100',
},
{
'name': 'number_grabs',
'default': '500',
'label': 'Grab threshold',
'description': 'Number of grabs required',
},
],
},
],
}]
import re
from couchpotato.core.helpers.rss import RSS
from couchpotato.core.helpers.variable import tryInt, splitString
from couchpotato.core.logger import CPLog
from couchpotato.core.media.movie.providers.automation.base import Automation
log = CPLog(__name__)
autoload = 'CrowdAI'
class CrowdAI(Automation, RSS):
interval = 1800
def getIMDBids(self):
movies = []
urls = dict(zip(splitString(self.conf('automation_urls')), [tryInt(x) for x in splitString(self.conf('automation_urls_use'))]))
for url in urls:
if not urls[url]:
continue
rss_movies = self.getRSSData(url)
for movie in rss_movies:
description = self.getTextElement(movie, 'description')
grabs = 0
for item in movie:
if item.attrib.get('name') == 'grabs':
grabs = item.attrib.get('value')
break
if int(grabs) > tryInt(self.conf('number_grabs')):
title = re.match(r'.*Title: .a href.*/">(.*) \(\d{4}\).*', description).group(1)
log.info2('%s grabs for movie: %s, enqueue...', (grabs, title))
year = re.match(r'.*Year: (\d{4}).*', description).group(1)
imdb = self.search(title, year)
if imdb and self.isMinimalMovie(imdb):
movies.append(imdb['imdb'])
return movies
config = [{
'name': 'crowdai',
'groups': [
{
'tab': 'automation',
'list': 'automation_providers',
'name': 'crowdai_automation',
'label': 'CrowdAI',
'description': ('Imports from any newznab powered NZB providers RSS feed depending on the number of grabs per movie.',
'Go to your newznab site and find the RSS section. Then copy the copy paste the link under "Movies > x264 feed" here.'),
'options': [
{
'name': 'automation_enabled',
'default': False,
'type': 'enabler',
},
{
'name': 'automation_urls_use',
'label': 'Use',
'default': '1',
},
{
'name': 'automation_urls',
'label': 'url',
'type': 'combined',
'combine': ['automation_urls_use', 'automation_urls'],
'default': 'http://YOUR_PROVIDER/rss?t=THE_MOVIE_CATEGORY&i=YOUR_USER_ID&r=YOUR_API_KEY&res=2&rls=2&num=100',
},
{
'name': 'number_grabs',
'default': '500',
'label': 'Grab threshold',
'description': 'Number of grabs required',
},
],
},
],
}]

2
couchpotato/core/media/movie/providers/automation/imdb.py

@ -181,7 +181,7 @@ class IMDBCharts(IMDBBase):
def getChartList(self):
# Nearly identical to 'getIMDBids', but we don't care about minimalMovie and return all movie data (not just id)
movie_lists = []
max_items = int(self.conf('max_items', section = 'charts', default=5))
max_items = 10
for name in self.charts:
chart = self.charts[name].copy()

2
couchpotato/core/media/movie/providers/automation/popularmovies.py

@ -18,7 +18,7 @@ class PopularMovies(Automation):
retrieved_movies = self.getJsonData(self.url)
if retrieved_movies:
for movie in retrieved_movies.get('movies'):
for movie in retrieved_movies:
imdb_id = movie.get('imdb_id')
info = fireEvent('movie.info', identifier = imdb_id, extended = False, merge = True)
if self.isMinimalMovie(info):

6
couchpotato/core/media/movie/providers/userscript/trakt.py

@ -5,5 +5,7 @@ autoload = 'Trakt'
class Trakt(UserscriptBase):
includes = ['http://trakt.tv/movie/*', 'http://*.trakt.tv/movie/*']
excludes = ['http://trakt.tv/movie/*/*', 'http://*.trakt.tv/movie/*/*']
version = 2
includes = ['*://trakt.tv/movies/*', '*://*.trakt.tv/movies/*']
excludes = ['*://trakt.tv/movies/*/*', '*://*.trakt.tv/movies/*/*']

24
couchpotato/core/media/movie/suggestion.py

@ -23,6 +23,11 @@ class Suggestion(Plugin):
addEvent('app.load', test)
def suggestView(self, limit = 6, **kwargs):
if self.isDisabled():
return {
'success': True,
'movies': []
}
movies = splitString(kwargs.get('movies', ''))
ignored = splitString(kwargs.get('ignored', ''))
@ -139,3 +144,22 @@ class Suggestion(Plugin):
self.setCache('suggestion_cached', new_suggestions, timeout = 3024000)
return new_suggestions
config = [{
'name': 'suggestion',
'groups': [
{
'label': 'Suggestions',
'description': 'Displays suggestions on the home page',
'name': 'suggestions',
'tab': 'display',
'options': [
{
'name': 'enabled',
'default': True,
'type': 'enabler',
},
],
},
],
}]

25
couchpotato/core/notifications/pushbullet.py

@ -1,6 +1,3 @@
import base64
import json
from couchpotato.core.helpers.encoding import toUnicode
from couchpotato.core.helpers.variable import splitString
from couchpotato.core.logger import CPLog
@ -20,12 +17,11 @@ class Pushbullet(Notification):
if not data: data = {}
# Get all the device IDs linked to this user
devices = self.getDevices() or []
devices = self.getDevices() or [None]
successful = 0
for device in devices:
response = self.request(
'pushes',
cache = False,
device_iden = device,
type = 'note',
title = self.default_title,
@ -38,9 +34,8 @@ class Pushbullet(Notification):
log.error('Unable to push notification to Pushbullet device with ID %s' % device)
for channel in self.getChannels():
response = self.request(
self.request(
'pushes',
cache = False,
channel_tag = channel,
type = 'note',
title = self.default_title,
@ -55,19 +50,17 @@ class Pushbullet(Notification):
def getChannels(self):
return splitString(self.conf('channels'))
def request(self, method, cache = True, **kwargs):
def request(self, method, **kwargs):
try:
base64string = base64.encodestring('%s:' % self.conf('api_key'))[:-1]
headers = {
'Authorization': 'Basic %s' % base64string
'Access-Token': self.conf('api_key')
}
if cache:
return self.getJsonData(self.url % method, headers = headers, data = kwargs)
else:
data = self.urlopen(self.url % method, headers = headers, data = kwargs)
return json.loads(data)
if kwargs.get('device_iden') is None:
try: del kwargs['device_iden']
except: pass
return self.getJsonData(self.url % method, cache_timeout = -1, headers = headers, data = kwargs)
except Exception as ex:
log.error('Pushbullet request failed')

2
couchpotato/core/plugins/base.py

@ -33,7 +33,7 @@ class Plugin(object):
_locks = {}
user_agent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:34.0) Gecko/20100101 Firefox/34.0'
user_agent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:40.0) Gecko/20100101 Firefox/40.0'
http_last_use = {}
http_last_use_queue = {}
http_time_between_calls = 0

2
couchpotato/core/plugins/category/static/category.js

@ -185,7 +185,7 @@ var Category = new Class({
var data = self.data;
self.el = new Element('div.category').adopt(
self.delete_button = new Element('span.delete.icon2', {
self.delete_button = new Element('span.delete.icon-delete', {
'events': {
'click': self.del.bind(self)
}

68
couchpotato/core/plugins/category/static/category.scss

@ -10,66 +10,68 @@
.category {
margin-bottom: 20px;
position: relative;
}
.category > .delete {
> .delete {
position: absolute;
padding: 16px;
padding: $padding/3 $padding;
right: 0;
cursor: pointer;
opacity: 0.6;
color: #fd5353;
}
.category > .delete:hover {
font-size: 1.5em;
z-index: 2;
&:hover {
opacity: 1;
}
}
.category .ctrlHolder:hover {
.ctrlHolder:hover {
background: none;
}
.category .formHint {
.formHint {
opacity: 0.1;
}
.category:hover .formHint {
&:hover .formHint {
opacity: 1;
}
}
#category_ordering {
}
#category_ordering ul {
ul {
float: left;
margin: 0;
width: 275px;
padding: 0;
}
#category_ordering li {
cursor: grab;
border-bottom: 1px solid $theme_off;
padding: 5px;
list-style: none;
}
#category_ordering li:last-child { border: 0; }
li {
cursor: grab;
border-bottom: 1px solid $theme_off;
padding: 5px;
list-style: none;
#category_ordering li .check {
margin: 2px 10px 0 0;
vertical-align: top;
}
&:last-child { border: 0; }
#category_ordering li > span {
display: inline-block;
height: 20px;
vertical-align: top;
line-height: 20px;
}
.check {
margin: 2px 10px 0 0;
vertical-align: top;
}
#category_ordering li .handle {
width: 20px;
float: right;
}
> span {
display: inline-block;
height: 20px;
vertical-align: top;
line-height: 20px;
}
#category_ordering .formHint {
.handle {
width: 20px;
float: right;
}
}
}

2
couchpotato/core/plugins/profile/static/profile.js

@ -24,7 +24,7 @@ var Profile = new Class({
var data = self.data;
self.el = new Element('div.profile').adopt(
self.delete_button = new Element('span.delete.icon2', {
self.delete_button = new Element('span.delete.icon-delete', {
'events': {
'click': self.del.bind(self)
}

15
couchpotato/core/plugins/profile/static/profile.scss

@ -15,6 +15,21 @@
font-weight: bold;
}
> .delete {
position: absolute;
padding: $padding/3 $padding;
right: 0;
cursor: pointer;
opacity: 0.6;
color: #fd5353;
font-size: 1.5em;
z-index: 2;
&:hover {
opacity: 1;
}
}
.ctrlHolder {
.types {

2
couchpotato/core/plugins/release/main.py

@ -342,7 +342,7 @@ class Release(Plugin):
db.update(rls)
log_movie = '%s (%s) in %s' % (getTitle(media), media['info'].get('year'), rls['quality'])
snatch_message = 'Snatched "%s": %s' % (data.get('name'), log_movie)
snatch_message = 'Snatched "%s": %s from %s' % (data.get('name'), log_movie, (data.get('provider', '') + data.get('provider_extra', '')))
log.info(snatch_message)
fireEvent('%s.snatched' % data['type'], message = snatch_message, data = media)

52
couchpotato/core/plugins/userscript/static/userscript.js

@ -71,32 +71,34 @@ var UserscriptSettingTab = new Class({
'label': 'Install the browser extension or bookmarklet',
'description': 'Easily add movies via imdb.com, appletrailers and more'
}).inject(self.settings.tabs.automation.content, 'top').adopt(
new Element('a.userscript.button', {
'text': 'Install extension',
'href': 'https://couchpota.to/extension/',
'target': '_blank'
}),
new Element('span.or[text=or]'),
new Element('span.bookmarklet').adopt(
new Element('a.button.green', {
'text': '+CouchPotato',
/* jshint ignore:start */
'href': "javascript:void((function(){var e=document.createElement('script');e.setAttribute('type','text/javascript');e.setAttribute('charset','UTF-8');e.setAttribute('src','" +
host_url + Api.createUrl('userscript.bookmark') +
"?host="+ encodeURI(host_url + Api.createUrl('userscript.get')+randomString()+'/') +
"&r='+Math.random()*99999999);document.body.appendChild(e)})());",
/* jshint ignore:end */
'target': '',
'events': {
'click': function(e){
(e).stop();
alert('Drag it to your bookmark ;)');
}
}
new Element('div').adopt(
new Element('a.userscript.button', {
'text': 'Install extension',
'href': 'https://couchpota.to/extension/',
'target': '_blank'
}),
new Element('span', {
'text': '⇽ Drag this to your bookmarks'
})
new Element('span.or[text=or]'),
new Element('span.bookmarklet').adopt(
new Element('a.button.green', {
'text': '+CouchPotato',
/* jshint ignore:start */
'href': "javascript:void((function(){var e=document.createElement('script');e.setAttribute('type','text/javascript');e.setAttribute('charset','UTF-8');e.setAttribute('src','" +
host_url + Api.createUrl('userscript.bookmark') +
"?host="+ encodeURI(host_url + Api.createUrl('userscript.get')+randomString()+'/') +
"&r='+Math.random()*99999999);document.body.appendChild(e)})());",
/* jshint ignore:end */
'target': '',
'events': {
'click': function(e){
(e).stop();
alert('Drag it to your bookmark ;)');
}
}
}),
new Element('span', {
'text': '⇽ Drag this to your bookmarks'
})
)
),
new Element('img', {
'src': 'https://couchpota.to/media/images/userscript.gif'

1
couchpotato/core/plugins/userscript/static/userscript.scss

@ -109,6 +109,7 @@
}
img {
clear: both;
margin: $padding;
width: 100%;
max-width: 600px;

12
couchpotato/static/scripts/combined.base.min.js

@ -433,7 +433,7 @@ var CouchPotato = new Class({
},
createUserscriptButtons: function() {
var host_url = window.location.protocol + "//" + window.location.host;
return new Element("div.group_userscript").adopt(new Element("a.userscript.button", {
return new Element("div.group_userscript").adopt(new Element("div").adopt(new Element("a.userscript.button", {
text: "Install extension",
href: "https://couchpota.to/extension/",
target: "_blank"
@ -449,7 +449,7 @@ var CouchPotato = new Class({
}
}), new Element("span", {
text: "⇽ Drag this to your bookmarks"
})), new Element("img", {
}))), new Element("img", {
src: "https://couchpota.to/media/images/userscript.gif"
}));
},
@ -1296,7 +1296,7 @@ Page.Settings = new Class({
hint = new Element("span.hint.more_hint", {
html: group.description[0]
});
createTooltip(group.description[1]).inject(hint, "top");
createTooltip(group.description[1]).inject(hint);
} else {
hint = new Element("span.hint", {
html: group.description || ""
@ -1362,7 +1362,7 @@ var OptionBase = new Class({
var hint = new Element("p.formHint.more_hint", {
html: self.options.description[0]
}).inject(self.el);
createTooltip(self.options.description[1]).inject(hint, "top");
createTooltip(self.options.description[1]).inject(hint);
} else {
new Element("p.formHint", {
html: self.options.description || ""
@ -1771,7 +1771,7 @@ Option.Directories = new Class({
$(dir).getElement(".formHint").destroy();
$(dir).addClass("multi_directory");
if (!value) $(dir).addClass("is_empty");
new Element("a.icon2.delete", {
new Element("a.icon-delete.delete", {
events: {
click: self.delItem.bind(self, dir)
}
@ -1954,7 +1954,7 @@ var createTooltip = function(description) {
tip.removeClass("shown");
}
}
}).adopt(new Element("a.icon2.info"), new Element("div.tip", {
}).adopt(new Element("a.icon-info.info"), new Element("div.tip", {
html: description
}));
return tip;

93
couchpotato/static/scripts/combined.plugins.min.js

@ -338,9 +338,12 @@ var MovieDetails = new Class({
button_text: parent.getTitle() + (parent.get("year") ? " (" + parent.get("year") + ")" : ""),
button_class: "icon-dropdown"
})), self.buttons = new Element("div.buttons"))));
self.addSection("description", new Element("div", {
var eta_date = parent.getETA("%b %Y");
self.addSection("description", new Element("div").adopt(new Element("div", {
text: parent.get("plot")
}));
}), new Element("div.meta", {
html: (eta_date ? "<span>ETA:" + eta_date + "</span>" : "") + "<span>" + (parent.get("genres") || []).join(", ") + "</span>"
})));
var titles = parent.get("info").titles;
$(self.title_dropdown).addEvents({
"click:relay(li a)": function(e, el) {
@ -437,6 +440,7 @@ var MovieList = new Class({
add_new: false,
force_view: false
},
available_views: [ "thumb", "list" ],
movies: [],
movies_added: {},
total_movies: 0,
@ -807,6 +811,7 @@ var MovieList = new Class({
},
changeView: function(new_view) {
var self = this;
if (self.available_views.indexOf(new_view) == -1) new_view = "thumb";
self.el.removeClass(self.current_view + "_list").addClass(new_view + "_list");
self.current_view = new_view;
Cookie.write(self.options.identifier + "_view", new_view, {
@ -1305,12 +1310,16 @@ MA.Trailer = new Class({
new Request.JSONP({
url: url,
onComplete: function(json) {
self.video_id = json.items[0].id.videoId;
self.container.grab(new Element("div.background", {
styles: {
"background-image": "url(" + json.items[0].snippet.thumbnails.high.url + ")"
}
}));
if (json.items.length > 0) {
self.video_id = json.items[0].id.videoId;
self.container.grab(new Element("div.background", {
styles: {
"background-image": "url(" + json.items[0].snippet.thumbnails.high.url + ")"
}
}));
} else {
self.container.getParent(".section").addClass("no_trailer");
}
}
}).send();
}
@ -1878,20 +1887,9 @@ var Movie = new Class({
self.busy(false);
},
create: function() {
var self = this, d = new Date();
var self = this;
self.el.addClass("status_" + self.get("status"));
var eta = null, eta_date = null, now = Math.round(+d / 1e3);
if (self.data.info.release_date) [ self.data.info.release_date.dvd, self.data.info.release_date.theater ].each(function(timestamp) {
if (timestamp > 0 && (eta === null || Math.abs(timestamp - now) < Math.abs(eta - now))) eta = timestamp;
});
if (eta) {
eta_date = new Date(eta * 1e3);
if (+eta_date / 1e3 < now) {
eta_date = null;
} else {
eta_date = eta_date.format("%b") + (d.getFullYear() != eta_date.getFullYear() ? " " + eta_date.getFullYear() : "");
}
}
var eta_date = self.getETA();
var rating, stars;
if ([ "suggested", "chart" ].indexOf(self.data.status) > -1 && self.data.info && self.data.info.rating && self.data.info.rating.imdb) {
rating = self.data.info.rating.imdb;
@ -1922,7 +1920,7 @@ var Movie = new Class({
text: self.getTitle() || "n/a"
}), new Element("div.year", {
text: self.data.info.year || "n/a"
})), eta_date && now + 8035200 > eta ? new Element("div.eta", {
})), eta_date ? new Element("div.eta", {
text: eta_date,
title: "ETA"
}) : null, self.quality = new Element("div.quality"), rating ? new Element("div.rating[title=" + rating[0] + "]").adopt(stars, new Element("span.votes[text=(" + rating.join(" / ") + ")][title=Votes]")) : null));
@ -2032,6 +2030,21 @@ var Movie = new Class({
} catch (e) {}
return self.get("imdb");
},
getETA: function(format) {
var self = this, d = new Date(), now = Math.round(+d / 1e3), eta = null, eta_date = "";
if (self.data.info.release_date) [ self.data.info.release_date.dvd, self.data.info.release_date.theater ].each(function(timestamp) {
if (timestamp > 0 && (eta === null || Math.abs(timestamp - now) < Math.abs(eta - now))) eta = timestamp;
});
if (eta) {
eta_date = new Date(eta * 1e3);
if (+eta_date / 1e3 < now) {
eta_date = null;
} else {
eta_date = format ? eta_date.format(format) : eta_date.format("%b") + (d.getFullYear() != eta_date.getFullYear() ? " " + eta_date.getFullYear() : "");
}
}
return now + 8035200 > eta ? eta_date : "";
},
get: function(attr) {
return this.data[attr] || this.data.info[attr];
},
@ -2349,25 +2362,7 @@ var Charts = new Class({
},
create: function() {
var self = this;
self.el = new Element("div.charts").adopt(self.el_no_charts_enabled = new Element("p.no_charts_enabled", {
html: "Hey, it looks like you have no charts enabled at the moment. If you'd like some great movie suggestions you can go to <a href=\"" + App.createUrl("settings/display") + '">settings</a> and turn on some charts of your choice.'
}), self.el_refresh_container = new Element("div.refresh").adopt(self.el_refresh_link = new Element("a.refresh.icon2", {
href: "#",
events: {
click: function(e) {
e.preventDefault();
self.el.getElements(".chart").destroy();
self.el_refreshing_text.show();
self.el_refresh_link.hide();
self.api_request = Api.request("charts.view", {
data: {
force_update: 1
},
onComplete: self.fill.bind(self)
});
}
}
}), self.el_refreshing_text = new Element("span.refreshing", {
self.el = new Element("div.charts").grab(self.el_refresh_container = new Element("div.refresh").grab(self.el_refreshing_text = new Element("span.refreshing", {
text: "Refreshing charts..."
})));
self.show();
@ -2376,13 +2371,7 @@ var Charts = new Class({
fill: function(json) {
var self = this;
self.el_refreshing_text.hide();
self.el_refresh_link.show();
if (!json || json.count === 0) {
self.el_no_charts_enabled.show();
self.el_refresh_link.show();
self.el_refreshing_text.hide();
} else {
self.el_no_charts_enabled.hide();
if (json && json.count > 0) {
json.charts.sort(function(a, b) {
return a.order - b.order;
});
@ -2833,7 +2822,7 @@ var Category = new Class({
create: function() {
var self = this;
var data = self.data;
self.el = new Element("div.category").adopt(self.delete_button = new Element("span.delete.icon2", {
self.el = new Element("div.category").adopt(self.delete_button = new Element("span.delete.icon-delete", {
events: {
click: self.del.bind(self)
}
@ -3178,7 +3167,7 @@ var Profile = new Class({
create: function() {
var self = this;
var data = self.data;
self.el = new Element("div.profile").adopt(self.delete_button = new Element("span.delete.icon2", {
self.el = new Element("div.profile").adopt(self.delete_button = new Element("span.delete.icon-delete", {
events: {
click: self.del.bind(self)
}
@ -3656,7 +3645,7 @@ var UserscriptSettingTab = new Class({
name: "userscript",
label: "Install the browser extension or bookmarklet",
description: "Easily add movies via imdb.com, appletrailers and more"
}).inject(self.settings.tabs.automation.content, "top").adopt(new Element("a.userscript.button", {
}).inject(self.settings.tabs.automation.content, "top").adopt(new Element("div").adopt(new Element("a.userscript.button", {
text: "Install extension",
href: "https://couchpota.to/extension/",
target: "_blank"
@ -3672,7 +3661,7 @@ var UserscriptSettingTab = new Class({
}
}), new Element("span", {
text: "⇽ Drag this to your bookmarks"
})), new Element("img", {
}))), new Element("img", {
src: "https://couchpota.to/media/images/userscript.gif"
}));
});

52
couchpotato/static/scripts/couchpotato.js

@ -395,32 +395,34 @@
var host_url = window.location.protocol + '//' + window.location.host;
return new Element('div.group_userscript').adopt(
new Element('a.userscript.button', {
'text': 'Install extension',
'href': 'https://couchpota.to/extension/',
'target': '_blank'
}),
new Element('span.or[text=or]'),
new Element('span.bookmarklet').adopt(
new Element('a.button', {
'text': '+CouchPotato',
/* jshint ignore:start */
'href': "javascript:void((function(){var e=document.createElement('script');e.setAttribute('type','text/javascript');e.setAttribute('charset','UTF-8');e.setAttribute('src','" +
host_url + Api.createUrl('userscript.bookmark') +
"?host="+ encodeURI(host_url + Api.createUrl('userscript.get')+randomString()+'/') +
"&r='+Math.random()*99999999);document.body.appendChild(e)})());",
/* jshint ignore:end */
'target': '',
'events': {
'click': function(e){
(e).stop();
alert('Drag it to your bookmark ;)');
}
}
new Element('div').adopt(
new Element('a.userscript.button', {
'text': 'Install extension',
'href': 'https://couchpota.to/extension/',
'target': '_blank'
}),
new Element('span', {
'text': '⇽ Drag this to your bookmarks'
})
new Element('span.or[text=or]'),
new Element('span.bookmarklet').adopt(
new Element('a.button', {
'text': '+CouchPotato',
/* jshint ignore:start */
'href': "javascript:void((function(){var e=document.createElement('script');e.setAttribute('type','text/javascript');e.setAttribute('charset','UTF-8');e.setAttribute('src','" +
host_url + Api.createUrl('userscript.bookmark') +
"?host="+ encodeURI(host_url + Api.createUrl('userscript.get')+randomString()+'/') +
"&r='+Math.random()*99999999);document.body.appendChild(e)})());",
/* jshint ignore:end */
'target': '',
'events': {
'click': function(e){
(e).stop();
alert('Drag it to your bookmark ;)');
}
}
}),
new Element('span', {
'text': '⇽ Drag this to your bookmarks'
})
)
),
new Element('img', {
'src': 'https://couchpota.to/media/images/userscript.gif'

8
couchpotato/static/scripts/page/settings.js

@ -291,7 +291,7 @@ Page.Settings = new Class({
'html': group.description[0]
});
createTooltip(group.description[1]).inject(hint, 'top');
createTooltip(group.description[1]).inject(hint);
}
else {
hint = new Element('span.hint', {
@ -386,7 +386,7 @@ var OptionBase = new Class({
'html': self.options.description[0]
}).inject(self.el);
createTooltip(self.options.description[1]).inject(hint, 'top');
createTooltip(self.options.description[1]).inject(hint);
}
else {
new Element('p.formHint', {
@ -992,7 +992,7 @@ Option.Directories = new Class({
$(dir).addClass('is_empty');
// Add remove button
new Element('a.icon2.delete', {
new Element('a.icon-delete.delete', {
'events': {
'click': self.delItem.bind(self, dir)
}
@ -1249,7 +1249,7 @@ var createTooltip = function(description){
}
}
}).adopt(
new Element('a.icon2.info'),
new Element('a.icon-info.info'),
new Element('div.tip', {
'html': description
})

152
couchpotato/static/style/combined.min.css

@ -102,6 +102,8 @@
.page.movies_manage .empty_manage .after_manage,.page.movies_wanted .empty_manage .after_manage{margin-top:20px}
.movie .ripple,.movie input[type=checkbox]{display:none}
.with_navigation .movie input[type=checkbox]{display:inline-block;position:absolute;transition:opacity 200ms;opacity:0;z-index:2;cursor:pointer}
@media (max-width:480px){.with_navigation .movie input[type=checkbox]{display:none}
}
.with_navigation .movie input[type=checkbox]:hover{opacity:1!important}
.with_navigation .movie:hover input[type=checkbox]{opacity:.5}
.with_navigation .movie.checked input[type=checkbox]{opacity:1}
@ -111,11 +113,14 @@
.movie .quality span.available{color:#009902;border-color:#009902;background:#FFF}
.movie .quality span.snatched{background:#568f99;color:#FFF}
.movie .quality span.done,.movie .quality span.downloaded{background:#009902;color:#FFF}
.movies .message a,.movies .no_movies a{color:#ac0000}
.movie .rating .votes{opacity:.7;margin-left:4px}
.movie.status_suggested .quality{display:none}
.movies{position:relative}
.movies .no_movies{display:block;padding:20px}
.movies .no_movies a{color:#ac0000}
@media (max-width:768px){.movies .no_movies{padding:10px}
}
.movies .message{padding:20px 0;text-align:center}
.movies>.description{position:absolute;top:0;right:20px;width:auto;line-height:80px}
@media (max-width:768px){.movies>.description{display:none}
}
@ -123,13 +128,8 @@
.movies>.loading{background:#FFF}
.movies>.loading .message{color:#000}
.movies>.loading .spinner{background-color:#000}
.movies .actions{-webkit-transform:rotateY(360deg);transform:rotateY(360deg)}
@media (max-width:480px){.movies .no_movies{padding:10px}
.movies .actions{pointer-events:none}
}
.movies .movie .actions{-webkit-transform:rotateY(360deg);transform:rotateY(360deg)}
.movies .progress div{width:50%;padding:5px 10px;display:-webkit-flex;display:-ms-flexbox;display:flex}
@media (max-width:768px){.movies .progress div{width:100%}
}
.movies .progress div .folder{-webkit-flex:1 auto;-ms-flex:1 auto;flex:1 auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;margin-right:10px}
.movies .progress div .percentage{font-weight:700}
.list_list{font-weight:300}
@ -138,11 +138,11 @@
.list_list .movie:hover{background:rgba(0,0,0,.1)}
.list_list .movie input[type=checkbox]{left:20px;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%)}
.list_list .movie .poster{display:none}
.list_list .movie .info,.thumb_list>div{display:-webkit-flex;display:-ms-flexbox}
.list_list .movie .info{padding:10px 20px;display:flex;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-align-items:center;-ms-flex-align:center;align-items:center}
.list_list .movie .info{padding:10px 20px;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-align-items:center;-ms-flex-align:center;align-items:center}
.list_list .movie .info .title{-webkit-flex:1 auto;-ms-flex:1 auto;flex:1 auto}
.list_list .movie .info .title span{transition:margin 200ms cubic-bezier(.9,0,.1,1);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
@media (max-width:480px){.list_list .movie .info{display:block;padding:10px}
@media (max-width:768px){.movies .progress div{width:100%}
.list_list .movie .info{display:block;padding:10px}
.list_list .movie .info .title{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap}
.list_list .movie .info .title span{width:100%}
}
@ -157,24 +157,59 @@
.list_list .movie .actions a .icon,.list_list .movie .actions a:before{display:none}
.list_list .movie .actions a:hover{color:#ac0000}
.list_list .movie:hover .actions{display:block}
@media (max-width:480px){.list_list .movie .info .quality span{margin:2px 2px 0 0}
@media (max-width:768px){.list_list .movie .info .quality span{margin:2px 2px 0 0}
.list_list .movie:hover .actions{display:none}
}
.list_list.with_navigation .movie.checked .info .title span,.list_list.with_navigation .movie:hover .info .title span{margin-left:20px}
.thumb_list{padding:0 5px}
.thumb_list>div:last-child{padding:0 12px}
@media (max-width:480px){.thumb_list>div:last-child{padding:0 3.33px}
.thumb_list .movie{display:inline-block;vertical-align:top;margin-bottom:20px;position:relative;cursor:pointer;width:150px;border:0 solid transparent;border-width:0 6.67px}
@media (min-width:4275px) and (max-width:4500px){.thumb_list .movie{width:5%}
}
@media (min-width:4050px) and (max-width:4275px){.thumb_list .movie{width:5.26316%}
}
@media (min-width:3825px) and (max-width:4050px){.thumb_list .movie{width:5.55556%}
}
@media (min-width:3600px) and (max-width:3825px){.thumb_list .movie{width:5.88235%}
}
@media (min-width:3375px) and (max-width:3600px){.thumb_list .movie{width:6.25%}
}
@media (min-width:3150px) and (max-width:3375px){.thumb_list .movie{width:6.66667%}
}
@media (min-width:2925px) and (max-width:3150px){.thumb_list .movie{width:7.14286%}
}
@media (min-width:2700px) and (max-width:2925px){.thumb_list .movie{width:7.69231%}
}
@media (min-width:2475px) and (max-width:2700px){.thumb_list .movie{width:8.33333%}
}
@media (min-width:2250px) and (max-width:2475px){.thumb_list .movie{width:9.09091%}
}
@media (min-width:2025px) and (max-width:2250px){.thumb_list .movie{width:10%}
}
@media (min-width:1800px) and (max-width:2025px){.thumb_list .movie{width:11.11111%}
}
.thumb_list>div{display:flex;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch}
.thumb_list .movie{margin-bottom:20px;position:relative;cursor:pointer;-webkit-flex:1 auto;-ms-flex:1 auto;flex:1 auto;width:150px;max-width:16.666666667%;border:0 solid transparent;border-width:0 10px}
@media (max-width:1382px){.thumb_list .movie{max-width:20%;border-width:0 8px}
@media (min-width:1575px) and (max-width:1800px){.thumb_list .movie{width:12.5%}
}
@media (max-width:1024px){.thumb_list .movie{max-width:33.333%;border-width:0 6.67px}
@media (min-width:1350px) and (max-width:1575px){.thumb_list .movie{width:14.28571%}
}
@media (max-width:768px){.thumb_list{padding:0 5px}
.thumb_list .movie{max-width:50%;border-width:0 5px}
@media (min-width:1125px) and (max-width:1350px){.thumb_list .movie{width:16.66667%}
}
@media (max-width:480px){.thumb_list{padding:0 3.33px}
.thumb_list .movie{max-width:50%;border-width:0 4px}
@media (min-width:900px) and (max-width:1125px){.thumb_list .movie{width:20%}
}
@media (min-width:675px) and (max-width:900px){.thumb_list .movie{width:25%}
}
@media (min-width:450px) and (max-width:675px){.thumb_list .movie{width:33.33333%}
}
@media (min-width:225px) and (max-width:450px){.thumb_list .movie{width:50%}
}
@media (min-width:0px) and (max-width:225px){.thumb_list .movie{width:100%}
}
@media (max-width:768px){.list_list.with_navigation .movie.checked .info .title span,.list_list.with_navigation .movie:hover .info .title span{margin-left:0}
.thumb_list .movie{width:33.333%;border-width:0 5px}
}
@media (max-width:480px){.movies .movie .actions{pointer-events:none}
.thumb_list>div:last-child{padding:0 3.33px}
.thumb_list .movie{width:50%;border-width:0 4px}
}
.thumb_list .movie input[type=checkbox]{top:10px;left:10px}
.thumb_list .movie .poster_container{border-radius:3px;position:relative;width:100%;padding-bottom:150%;overflow:hidden}
@ -187,9 +222,9 @@
.thumb_list .movie .info .quality{white-space:nowrap;overflow:hidden}
.thumb_list .movie .info .quality span{font-size:.8em;margin-right:2px}
.thumb_list .movie .actions{background-image:linear-gradient(25deg,rgba(172,0,0,0) 0,#ac0000 80%);transition:opacity 400ms;opacity:0;position:absolute;top:0;right:0;bottom:0;left:0;text-align:right}
.thumb_list .movie .actions .action{position:relative;display:block;margin-bottom:1px;width:auto;margin-right:10px}
.thumb_list .movie .actions .action{position:relative;margin-right:10px;float:right;clear:both}
.thumb_list .movie .actions .action:first-child{margin-top:10px}
.thumb_list .movie .actions .action a{transition:all 150ms cubic-bezier(.9,0,.1,1);display:inline-block;width:auto;padding:6.67px;color:#FFF;border-radius:2px}
.thumb_list .movie .actions .action a{transition:all 150ms cubic-bezier(.9,0,.1,1);display:block;width:auto;padding:6.67px;color:#FFF;border-radius:2px}
.thumb_list .movie .actions .action a:hover{background:#FFF;color:#ac0000}
.thumb_list .movie:hover .actions{opacity:1}
.thumb_list .movie .mask{bottom:44px;border-radius:3px;transition:opacity 30ms}
@ -197,15 +232,15 @@
@media (max-width:480px){.thumb_list .movie:hover .actions{display:none}
.page.movie_details{left:0}
}
.page.movie_details .overlay{position:fixed;top:0;bottom:0;right:0;left:132px;background:rgba(0,0,0,.6);border-radius:3px 0 0 3px;opacity:0;-webkit-transform:rotateY(360deg);transform:rotateY(360deg);-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:opacity 300ms ease 400ms;z-index:1}
.page.movie_details .overlay{position:fixed;top:0;bottom:0;right:0;left:132px;background:rgba(0,0,0,.6);border-radius:3px 0 0 3px;opacity:0;-webkit-transform:rotateY(360deg);transform:rotateY(360deg);transition:opacity 300ms ease 400ms;z-index:1}
.page.movie_details .overlay .ripple{background:#FFF}
.page.movie_details .overlay .close{display:inline-block;text-align:center;font-size:60px;line-height:80px;color:#FFF;width:100%;height:100%;opacity:0;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:opacity 300ms ease 200ms}
.page.movie_details .overlay .close{display:inline-block;text-align:center;font-size:60px;line-height:80px;color:#FFF;width:100%;height:100%;opacity:0;transition:opacity 300ms ease 200ms}
.page.movie_details .overlay .close:before{display:block;width:44px}
@media (max-width:480px){.page.movie_details .overlay{left:0;border-radius:0}
.page.movie_details .overlay .close{width:44px}
}
.page.movie_details .scroll_content{position:fixed;z-index:2;top:0;bottom:0;right:0;left:176px;background:#FFF;border-radius:3px 0 0 3px;overflow-y:auto;-webkit-transform:translateX(100%) rotateY(360deg);transform:translateX(100%) rotateY(360deg);transition:-webkit-transform 350ms cubic-bezier(.9,0,.1,1);transition:transform 350ms cubic-bezier(.9,0,.1,1)}
.page.movie_details .scroll_content>.head{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap;padding:0 20px;position:relative;z-index:2}
.page.movie_details .scroll_content>.head{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap;padding:0 20px;position:relative;z-index:2;-webkit-transform:rotateY(360deg);transform:rotateY(360deg)}
.page.movie_details .scroll_content>.head h1{-webkit-flex:1 auto;-ms-flex:1 auto;flex:1 auto;margin:0;font-size:24px;color:rgba(0,0,0,.5);font-weight:300;max-width:100%}
@media (max-width:480px){.page.movie_details .scroll_content{left:44px}
.page.movie_details .scroll_content>.head{padding:0;line-height:1em}
@ -235,7 +270,7 @@
.page.movie_details .scroll_content>.head .buttons{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}
.page.movie_details .scroll_content>.head .buttons>a{display:inline-block;padding:0 10px;color:#ac0000;line-height:80px}
.page.movie_details .scroll_content>.head .buttons>a:hover{color:#000}
.page.movie_details .scroll_content .section{padding:20px;border-top:1px solid rgba(0,0,0,.1)}
.page.movie_details .scroll_content .section{padding:20px;border-top:1px solid rgba(0,0,0,.1);-webkit-transform:rotateY(360deg);transform:rotateY(360deg)}
@media (max-width:480px){.page.movie_details .scroll_content>.head .more_menu.title .wrapper{top:30px;max-width:240px}
.page.movie_details .scroll_content>.head .buttons{margin:0}
.page.movie_details .scroll_content>.head .buttons>a{line-height:22px}
@ -245,7 +280,10 @@
.page.movie_details.show{pointer-events:auto}
.page.movie_details.show .overlay{opacity:1;transition-delay:0s}
.page.movie_details.show .overlay .close{opacity:1;transition-delay:300ms}
.page.movie_details.show .scroll_content{transition-delay:200ms;-webkit-transform:translateX(0);transform:translateX(0)}
.page.movie_details.show .scroll_content{transition-delay:200ms;-webkit-transform:translateX(0) rotateY(360deg);transform:translateX(0) rotateY(360deg)}
.page.movie_details .section_description .meta{text-align:right;font-style:italic;font-size:.9em}
.page.movie_details .section_description .meta span{display:inline-block;margin:10px 10px 0}
.page.movie_details .section_description .meta span:last-child{margin-right:0}
.page.movie_details .section_add{background:#eaeaea}
.page.movie_details .section_add .options>div{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-ms-flex-align:center;align-items:center}
.page.movie_details .section_add .options>div select{display:block;width:100%}
@ -298,6 +336,7 @@
.page.movie_details .releases .provider{min-width:110px;max-width:110px}
.page.movie_details .releases .provider:before{content:"Provider:"}
.page.movie_details .releases .actions{min-width:80px;max-width:80px}
.page.movie_details .section_trailer.no_trailer{display:none}
.page.movie_details .trailer_container{background:#000;position:relative;padding-bottom:56.25%;height:0;overflow:hidden;max-width:100%;cursor:pointer}
.alph_nav .menus .button,.alph_nav .menus .counter{line-height:80px;padding:0 10px}
.page.movie_details .trailer_container .background{opacity:.3;transition:all 300ms;-webkit-transform:scale(1.05) rotateY(360deg);transform:scale(1.05) rotateY(360deg);background:center no-repeat;background-size:cover;position:absolute;top:0;right:0;bottom:0;left:0;z-index:1}
@ -314,30 +353,38 @@
.page.movie_details .trailer_container .icon-play span:first-child{margin-left:-55px;-webkit-transform:translate(-100%,-54%);transform:translate(-100%,-54%)}
@media (max-width:1024px){.page.movie_details .trailer_container .icon-play span:first-child{margin-left:-27.5px}
}
@media (max-width:480px){.page.movie_details .trailer_container .icon-play span:first-child{margin-left:-15.71px}
}
.page.movie_details .trailer_container:hover{color:#ac0000}
.page.movie_details .trailer_container:hover .icon-play,.page.movie_details .trailer_container:hover .icon-play span{opacity:1}
.page.movie_details .trailer_container iframe{position:absolute;top:0;left:0;width:100%;height:100%;border:0}
.alph_nav{position:relative}
@media (max-width:480px){.page.movie_details .trailer_container .icon-play span:first-child{margin-left:-15.71px}
.alph_nav{display:none}
}
.alph_nav .mass_edit_form{display:-webkit-flex;display:-ms-flexbox;display:flex;background:#FFF;position:fixed;top:80px;right:0;left:132px;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-align-items:center;-ms-flex-align:center;align-items:center;transition:max-height 300ms cubic-bezier(.9,0,.1,1);max-height:0;overflow:hidden}
.mass_editing .alph_nav .mass_edit_form{max-height:44px}
.alph_nav .mass_edit_form>*{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-ms-flex-align:center;align-items:center}
.alph_nav .mass_edit_form .select{margin:0 10px 0 20px}
@media (max-width:480px){.alph_nav .mass_edit_form .select{margin:0 5px 0 10px}
}
.alph_nav .mass_edit_form .select .count,.alph_nav .mass_edit_form .select input{margin-right:5px}
.alph_nav .menus .button{color:rgba(0,0,0,.5)}
.alph_nav .menus .actions,.alph_nav .menus .counter,.alph_nav .menus .more_menu{float:left}
.alph_nav .menus .actions .wrapper,.alph_nav .menus .counter .wrapper,.alph_nav .menus .more_menu .wrapper{-webkit-transform-origin:92% 0;transform-origin:92% 0;right:-7px}
.alph_nav .menus .actions>a,.alph_nav .menus .counter>a,.alph_nav .menus .more_menu>a{display:inline-block;width:30px;line-height:80px;text-align:center}
.alph_nav .menus .actions>a:hover,.alph_nav .menus .counter>a:hover,.alph_nav .menus .more_menu>a:hover{color:#ac0000}
.alph_nav .menus .actions a{display:none}
.alph_nav .menus .actions .active,.charts .chart{display:inline-block}
@media (max-width:768px){.alph_nav .menus .counter{display:none}
}
.alph_nav .menus .actions a{display:inline-block}
.alph_nav .menus .actions .active{display:none}
.alph_nav .menus .filter .wrapper{width:320px}
.alph_nav .menus .filter .button{margin-top:-2px}
.alph_nav .menus .filter .search{position:relative}
.alph_nav .menus .filter .search:before{position:absolute;height:100%;line-height:38px;padding-left:10px;font-size:16px;opacity:.5}
.alph_nav .menus .filter .search input{width:100%;padding:10px 10px 10px 30px;background:#FFF;border:none;border-bottom:1px solid #eaeaea}
.alph_nav .menus .filter .numbers li.active,.alph_nav .menus .filter .numbers li.available:hover{background:#eaeaea}
@media (max-width:480px){.alph_nav .menus .filter .wrapper{right:-70px;-webkit-transform-origin:75% 0;transform-origin:75% 0}
.alph_nav .menus .filter .wrapper:before{right:83px!important}
.alph_nav .menus .filter .search input{font-size:1.2em}
}
.alph_nav .menus .filter .numbers{padding:10px}
.alph_nav .menus .filter .numbers li{float:left;width:10%;height:30px;line-height:30px;text-align:center;color:rgba(0,0,0,.2);cursor:default;border:0}
.alph_nav .menus .filter .numbers li.available{color:#000;cursor:pointer}
@ -347,7 +394,7 @@
.alph_nav .menus .more_menu .wrapper ul{border-radius:3px 3px 0 0}
.charts{clear:both;margin-bottom:30px}
.charts>h2{height:40px}
.charts .chart{width:50%;vertical-align:top;max-height:510px;scrollbar-base-color:#4e5969}
.charts .chart{display:inline-block;width:50%;vertical-align:top;max-height:510px;scrollbar-base-color:#4e5969}
.charts .chart .media_result.hidden{display:none}
.charts .refresh{clear:both;position:relative}
.charts .refresh .refreshing{display:block;padding:20px;font-size:20px;text-align:center}
@ -394,7 +441,7 @@
}
.add_new_category{padding:20px;display:block;text-align:center;font-size:20px}
.category{margin-bottom:20px;position:relative}
.category>.delete{position:absolute;padding:16px;right:0;cursor:pointer;opacity:.6;color:#fd5353}
.category>.delete{position:absolute;padding:6.67px 20px;right:0;cursor:pointer;opacity:.6;color:#fd5353;font-size:1.5em;z-index:2}
.category>.delete:hover{opacity:1}
.category .ctrlHolder:hover{background:0 0}
.page.log .nav li.active,.page.log .nav li:hover:not(.active):not(.filter){background:rgba(255,255,255,.1)}
@ -434,6 +481,8 @@
.add_new_profile{padding:20px;display:block;text-align:center;font-size:20px;border-bottom:1px solid #eaeaea}
.profile{margin-bottom:20px}
.profile .quality_label input{font-weight:700}
.profile>.delete{position:absolute;padding:6.67px 20px;right:0;cursor:pointer;opacity:.6;color:#fd5353;font-size:1.5em;z-index:2}
.profile>.delete:hover{opacity:1}
.profile .ctrlHolder .types{-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;min-width:360px}
.profile .ctrlHolder .types .type{display:-webkit-flex;display:-ms-flexbox;display:flex;flex-row:row nowrap;-webkit-align-items:center;-ms-flex-align:center;align-items:center;padding:2px 0}
.profile .ctrlHolder .types .type label{min-width:0;margin-left:10px}
@ -480,7 +529,7 @@
}
.wgroup_automation .group_userscript.group_userscript .userscript{margin-left:0}
.group_userscript.group_userscript .bookmarklet span{margin-left:10px;display:inline-block}
.group_userscript.group_userscript img{margin:20px;width:100%;max-width:600px}
.group_userscript.group_userscript img{clear:both;margin:20px;width:100%;max-width:600px}
@media (max-width:768px){.group_userscript.group_userscript img{margin:10px}
}
.wgroup_automation .group_userscript.group_userscript img{margin-left:0}
@ -647,14 +696,15 @@ input,select,textarea{font-size:1em;font-weight:300;padding:6.67px;background:#F
.more_menu .button,.more_menu a,.page .navigation ul li{display:inline-block}
.more_menu,.more_menu .button:before{position:relative}
@media (max-width:480px){.page h2{font-size:18px;padding:10px}
.page .navigation{height:44px;left:64px}
.page .navigation{height:44px;left:54px;right:10px}
}
.page .navigation ul{-webkit-flex:1 auto;-ms-flex:1 auto;flex:1 auto;list-style:none}
.page .navigation ul li a{display:inline-block;font-size:24px;line-height:80px;padding:0 20px;color:rgba(0,0,0,.5)}
@media (max-width:480px){.page .navigation ul li a{font-size:18px;line-height:44px;padding:10px}
}
.page .navigation ul .active a{color:#000}
.page .navigation>ul>li:first-child{margin-left:-20px}
@media (max-width:480px){.page .navigation ul li a{font-size:18px;line-height:44px;padding:10px}
.page .navigation>ul>li:first-child{margin-left:-10px}
}
.page .navigation h2{padding:20px 20px 20px 0}
.level_1{z-index:10}
.level_2{z-index:20}
@ -725,17 +775,23 @@ input,select,textarea{font-size:1em;font-weight:300;padding:6.67px;background:#F
.page.settings .tabs li a{color:rgba(0,0,0,.5)}
.page.settings .tabs li.active a{color:#000}
.page.settings form.containers{margin:0 20px 0 0;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}
.page.settings fieldset{border:0;margin-bottom:20px;position:relative}
.page.settings fieldset h2{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:baseline;-ms-flex-align:baseline;align-items:baseline;padding:0 0 0 20px}
.page.settings fieldset h2 .icon{margin-right:10px}
.page.settings fieldset h2 .group_label,.page.settings fieldset h2 .icon{margin-right:10px}
.page.settings fieldset{border:0;padding:10px 0;position:relative}
.page.settings fieldset h2{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-align-items:baseline;-ms-flex-align:baseline;align-items:baseline;padding:0 0 0 20px}
.page.settings fieldset h2 .icon img{vertical-align:middle;position:relative;top:-1px}
.page.settings fieldset h2 .hint{-webkit-flex:1;-ms-flex:1;flex:1;margin-left:10px;font-size:1rem}
.page.settings fieldset h2 .hint{-webkit-flex:1;-ms-flex:1;flex:1;font-size:1rem}
@media (max-width:480px){.page.settings fieldset h2{display:block}
.page.settings fieldset h2 .hint{margin:0;display:block}
}
.page.settings fieldset h2 .hint a{font-weight:400;color:#ac0000;text-decoration:underline;display:inline}
.page.settings fieldset .more_hint{position:relative}
.page.settings fieldset .more_hint .tooltip{display:inline;padding:10px}
.page.settings fieldset .more_hint .tooltip .icon-info{vertical-align:middle;display:inline-block;text-align:center;border:1px solid #ac0000;border-radius:50%;width:18px;height:18px;line-height:16px;font-size:.8em;text-decoration:none}
.page.settings fieldset .more_hint .tooltip .tip{bottom:100%;left:0;right:0;position:absolute;background:#eaeaea;z-index:20;display:none;padding:10px;margin-left:-10px}
.page.settings fieldset .more_hint .tooltip:hover .tip{display:block}
.page.settings fieldset .ctrlHolder{padding:6.67px 20px;border-bottom:1px solid #eaeaea;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-align-items:center;-ms-flex-align:center;align-items:center}
.page.settings fieldset .ctrlHolder:last-child{border-bottom:0}
.page.settings fieldset .ctrlHolder:nth-child(2){margin-top:10px}
.page.settings fieldset .ctrlHolder label{display:inline-block;min-width:150px}
.page.settings fieldset .ctrlHolder input,.page.settings fieldset .ctrlHolder select,.page.settings fieldset .ctrlHolder textarea{min-width:200px}
.page.settings fieldset .ctrlHolder input[type=checkbox]{width:auto;min-width:0}
@ -757,11 +813,13 @@ input,select,textarea{font-size:1em;font-weight:300;padding:6.67px;background:#F
.page.settings fieldset.disabled .ctrlHolder{display:none}
.page.settings fieldset.disabled>.ctrlHolder:first-child{display:-webkit-flex;display:-ms-flexbox;display:flex}
.page.settings fieldset.enabler{display:block}
.page.settings fieldset.enabler.disabled:hover{background:rgba(234,234,234,.2)}
.page.settings fieldset.enabler>:first-child{position:absolute;right:0;border:0;padding:0}
.page.settings fieldset.enabler>:first-child~h2{margin-right:86px}
@media (max-width:480px){.page.settings fieldset.enabler>:first-child~h2{margin-right:0}
}
.page.settings fieldset.enabler>:nth-child(3){margin-top:20px}
.page.settings fieldset.enabler>:nth-child(2){margin-top:0}
.page.settings fieldset.enabler>:nth-child(3){margin-top:10px}
.page.settings fieldset .ctrlHolder.advanced,.page.settings fieldset.advanced{display:none;color:#ac0000}
.page.settings.show_advanced fieldset.advanced{display:block}
.page.settings.show_advanced fieldset:not(.disabled)>.ctrlHolder.advanced{display:-webkit-flex;display:-ms-flexbox;display:flex}
@ -771,11 +829,11 @@ input,select,textarea{font-size:1em;font-weight:300;padding:6.67px;background:#F
.page.settings fieldset.enabler.disabled .switch,.page.settings:not(.show_advanced) .advanced_toggle .switch{background:#eaeaea;border-color:#eaeaea}
.page.settings fieldset.enabler.disabled .switch .toggle,.page.settings:not(.show_advanced) .advanced_toggle .switch .toggle{-webkit-transform:translateX(0);transform:translateX(0)}
.page.settings fieldset.enabler.disabled .switch:hover,.page.settings:not(.show_advanced) .advanced_toggle .switch:hover{background:#b7b7b7;border-color:#b7b7b7}
.page.settings .option_list{background:#FFF}
.page.settings .option_list{background:#FFF;margin-top:10px}
.page.settings .option_list fieldset{position:relative}
.page.settings .option_list fieldset h2 .group_label{min-width:100px}
.page.settings .option_list fieldset.disabled h2{padding:0 20px}
.page.settings .option_list fieldset:after{position:absolute;content:'';display:block;width:100%;border-bottom:1px solid #eaeaea;bottom:-10px}
.page.settings .option_list fieldset:after{position:absolute;content:'';display:block;width:100%;border-bottom:1px solid #eaeaea;bottom:0}
.page.settings .option_list fieldset:after:last-child{border-bottom:0}
.page.settings .option_list h2{font-size:1em;font-weight:400}
.page.settings .option_list h2 .hint{font-weight:300}
@ -791,8 +849,8 @@ input,select,textarea{font-size:1em;font-weight:300;padding:6.67px;background:#F
.page.settings .combined_table .ctrlHolder{margin:0 0 0 20px;padding-left:0}
.page.settings .combined_table .ctrlHolder .delete{display:none;font-size:20px;width:22px;height:22px;line-height:20px;text-align:center;vertical-align:middle}
.page.settings .combined_table .ctrlHolder:hover .delete{display:inline-block}
.page.settings .disabled .combined_table,.page.settings .multi_directory.is_empty .delete{display:none}
.page.settings .combined_table .ctrlHolder.is_empty .delete,.page.settings .combined_table .ctrlHolder.is_empty input[type=checkbox]{visibility:hidden}
.page.settings .disabled .combined_table{display:none}
.page.settings .tab_about .usenet{padding:20px 20px 0;font-size:1.5em;line-height:1.3em}
.page.settings .tab_about .usenet a{color:#ac0000;padding:0 5px}
.page.settings .tab_about .usenet ul{list-style:none;float:left;width:50%;margin:10px 0;padding:0}
@ -809,6 +867,8 @@ input,select,textarea{font-size:1em;font-weight:300;padding:6.67px;background:#F
@media (max-width:480px){.page.settings .directory{width:100%}
}
.page.settings .directory input{width:100%}
.page.settings .multi_directory .delete{color:#ac0000;padding:0 10px;opacity:.6;font-size:1.5em}
.page.settings .multi_directory .delete:hover{opacity:1}
.page.settings .choice .select_wrapper{margin-left:20px;width:120px;min-width:120px}
@media (max-width:480px){.page.settings .choice .select_wrapper{margin:10px 0 0}
}

7
couchpotato/static/style/main.scss

@ -458,7 +458,8 @@ input, textarea, select {
@include media-phablet {
height: $header_width_mobile;
left: $header_width_mobile + $padding;
left: $header_width_mobile + $padding/2;
right: $padding/2;
}
ul {
@ -490,6 +491,10 @@ input, textarea, select {
> ul > li:first-child {
margin-left: -$padding;
@include media-phablet {
margin-left: -$padding/2;
}
}
h2 {

85
couchpotato/static/style/settings.scss

@ -68,11 +68,12 @@
fieldset {
border: 0;
margin-bottom: $padding;
padding: $padding/2 0;
position: relative;
h2 {
display: flex;
flex-flow: row wrap;
align-items: baseline;
padding: 0 0 0 $padding;
@ -90,9 +91,12 @@
}
}
.group_label {
margin-right: $padding/2;
}
.hint {
flex: 1;
margin-left: $padding/2;
font-size: 1rem;
@include media-phablet {
@ -106,6 +110,48 @@
text-decoration: underline;
display: inline;
}
}
}
.more_hint {
position: relative;
.tooltip {
display: inline;
padding: $padding/2;
.icon-info {
vertical-align: middle;
display: inline-block;
text-align: center;
border: 1px solid $primary_color;
border-radius: 50%;
width: 18px;
height: 18px;
line-height: 16px;
font-size: .8em;
text-decoration: none;
}
.tip {
bottom: 100%;
left: 0;
right: 0;
position: absolute;
background: $theme_off;
z-index: 20;
display: none;
padding: $padding/2;
margin-left: -$padding/2;
}
&:hover {
.tip {
display: block;
}
}
}
}
@ -125,6 +171,10 @@
border-bottom: 0;
}
&:nth-child(2) {
margin-top: $padding/2;
}
label {
display: inline-block;
min-width: 150px;
@ -226,6 +276,10 @@
&.enabler {
display: block;
&.disabled:hover {
background: rgba($theme_off, .2);
}
> :first-child {
position: absolute;
right: 0;
@ -241,8 +295,12 @@
}
}
> :nth-child(2){
margin-top: 0;
}
> :nth-child(3){
margin-top: $padding;
margin-top: $padding/2;
}
}
@ -310,6 +368,7 @@
/** Options list **/
.option_list {
background: #FFF;
margin-top: $padding/2;
fieldset {
position: relative;
@ -333,7 +392,7 @@
display: block;
width: 100%;
border-bottom: 1px solid $theme_off;
bottom: -$padding/2;
bottom: 0;
&:last-child {
border-bottom: 0;
@ -504,6 +563,24 @@
}
}
.multi_directory {
.delete {
color: $primary_color;
padding: 0 $padding/2;
opacity: .6;
font-size: 1.5em;
&:hover {
opacity: 1;
}
}
&.is_empty .delete {
display: none;
}
}
.choice {
.select_wrapper {
margin-left: $padding;

Loading…
Cancel
Save