Browse Source

Merge c3386a768b into f0d7eddcfb

pull/7122/merge
geogolem 8 years ago
committed by GitHub
parent
commit
7bfe8f81b8
  1. 8
      couchpotato/core/media/movie/_base/static/details.js
  2. 64
      couchpotato/core/media/movie/_base/static/movie.js
  3. 15
      couchpotato/core/media/movie/_base/static/movie.scss
  4. 57
      couchpotato/core/media/movie/providers/info/couchpotatoapi.py
  5. 51
      couchpotato/static/scripts/combined.plugins.min.js
  6. 2
      couchpotato/static/scripts/combined.vendor.min.js
  7. 8
      couchpotato/static/scripts/page/home.js

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

@ -36,14 +36,18 @@ var MovieDetails = new Class({
) )
); );
var eta_date = parent.getETA('%b %Y') ; var eta_date = parent.getETA('%b %d, %Y') ;
var dvd_date = parent.getDVDRelease('%b %d, %Y') ;
var theater_date = parent.getTheaterRelease('%b %d, %Y') ;
self.addSection('description', new Element('div').adopt( self.addSection('description', new Element('div').adopt(
new Element('div', { new Element('div', {
'text': parent.get('plot') 'text': parent.get('plot')
}), }),
new Element('div.meta', { new Element('div.meta', {
'html': 'html':
(eta_date ? ('<span>ETA:' + eta_date + '</span>') : '') + (theater_date ? ('<span>Theatrical Release: ' + theater_date + '<span>') : '') +
(dvd_date ? ('<span>DVD Release: ' + dvd_date + '<span>') : '') +
//(eta_date ? ('<span>ETA: ' + eta_date + '</span>') : '') +
'<span>' + (parent.get('genres') || []).join(', ') + '</span>' '<span>' + (parent.get('genres') || []).join(', ') + '</span>'
}) })
)); ));

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

@ -190,7 +190,20 @@ var Movie = new Class({
self.el.addClass('status_'+self.get('status')); self.el.addClass('status_'+self.get('status'));
var eta_date = self.getETA(); var eta_date = self.getETA("%b %d, %Y");
var dvd_date = self.getDVDRelease("%b %d, %Y");
var theater_date = self.getTheaterRelease("%b %d, %Y");
var eta_type = "ETA: "
if (eta_date)
eta_type = eta_date == dvd_date ? "DVD ETA: " : "Theatrical ETA ";
else if (dvd_date){
eta_type = "DVD released: ";
eta_date = dvd_date;
}
else if (theater_date){
eta_type = "Theatrically released: ";
eta_date = theater_date;
}
var rating, stars; var rating, stars;
if(['suggested','chart'].indexOf(self.data.status) > -1 && self.data.info && self.data.info.rating && self.data.info.rating.imdb){ if(['suggested','chart'].indexOf(self.data.status) > -1 && self.data.info && self.data.info.rating && self.data.info.rating.imdb){
@ -245,8 +258,16 @@ var Movie = new Class({
'text': self.data.info.year || 'n/a' 'text': self.data.info.year || 'n/a'
}) })
), ),
//theater_date ? new Element('div.theaterdate', {
// 'text': "Theatrical Release: " +theater_date,
// 'title': 'TheaterDate'
//}) : null,
//dvd_date ? new Element('div.dvddate', {
// 'text': "DVD Release: "+dvd_date,
// 'title': 'DVDDate'
//}) : null,
eta_date ? new Element('div.eta', { eta_date ? new Element('div.eta', {
'text': eta_date, 'text': eta_type+eta_date,
'title': 'ETA' 'title': 'ETA'
}) : null, }) : null,
self.quality = new Element('div.quality'), self.quality = new Element('div.quality'),
@ -411,6 +432,38 @@ var Movie = new Class({
return self.get('imdb'); return self.get('imdb');
}, },
getDVDRelease: function(format){
var self = this,
d=null,
d_date = '';
if (self.data.info.release_date)
[self.data.info.release_date.dvd].each(function(timestamp){
if (timestamp > 0)
d = timestamp;
});
if (d){
d_date = new Date (d*1000);
d_date = d_date.format(format);
}
return d_date;
},
getTheaterRelease: function(format){
var self = this,
d=null,
d_date = '';
if (self.data.info.release_date)
[self.data.info.release_date.theater].each(function(timestamp){
if (timestamp > 0)
d = timestamp;
});
if (d){
d_date = new Date (d*1000);
d_date = d_date.format(format);
}
return d_date;
},
getETA: function(format){ getETA: function(format){
var self = this, var self = this,
d = new Date(), d = new Date(),
@ -430,11 +483,12 @@ var Movie = new Class({
eta_date = null; eta_date = null;
} }
else { else {
eta_date = format ? eta_date.format(format) : (eta_date.format('%b') + (d.getFullYear() != eta_date.getFullYear() ? ' ' + eta_date.getFullYear() : '')); eta_date = format ? eta_date.format(format) : (eta_date.format('%b %d'));
} }
} }
return eta_date;
return (now+8035200 > eta) ? eta_date : ''; //removing below line since this only returns if movie's ETA is within the next 93 days - we want to always return, then decide when to display it
//return (now+8035200 > eta) ? eta_date : '';
}, },
get: function(attr){ get: function(attr){

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

@ -315,7 +315,6 @@ $mass_edit_height: 44px;
display: none; display: none;
} }
} }
.quality { .quality {
clear: both; clear: both;
overflow: hidden; overflow: hidden;
@ -468,16 +467,19 @@ $mass_edit_height: 44px;
} }
.info { .info {
display :flex;
flex-direction : column;
clear: both; clear: both;
font-size: .9em; font-size: .9em;
.title { .title {
order : 1;
display: flex; display: flex;
padding: 3px 0; padding: 3px 0;
font-weight: 400; font-weight: 400;
span { span {
flex: 1 auto; //flex: 1 auto;
white-space: nowrap; white-space: nowrap;
overflow: hidden; overflow: hidden;
text-overflow: ellipsis; text-overflow: ellipsis;
@ -491,12 +493,19 @@ $mass_edit_height: 44px;
} }
.eta { .eta {
order : 3;
font-size: .9em;
opacity: .5; opacity: .5;
float: right; float: right;
margin-left: 4px; margin-left: 4px;
span {
flex: 1 auto;
white-space: nowrap;
overflow: hidden;
}
} }
.quality { .quality {
order: 2;
white-space: nowrap; white-space: nowrap;
overflow: hidden; overflow: hidden;
font-size: .9em; font-size: .9em;

57
couchpotato/core/media/movie/providers/info/couchpotatoapi.py

@ -1,5 +1,6 @@
import base64 import base64
import time import time
import json
from couchpotato.core.event import addEvent, fireEvent from couchpotato.core.event import addEvent, fireEvent
from couchpotato.core.helpers.encoding import tryUrlencode, ss from couchpotato.core.helpers.encoding import tryUrlencode, ss
@ -106,8 +107,62 @@ class CouchPotatoApi(MovieProvider):
if identifier is None: return {} if identifier is None: return {}
dates = self.getJsonData(self.urls['eta'] % identifier, headers = self.getRequestHeaders()) dates = self.getJsonData(self.urls['eta'] % identifier, headers = self.getRequestHeaders())
log.debug('Found ETA for %s: %s', (identifier, dates))
#This grabs release date info from omdbapi/rottentomatoes
temp2 = self.getJsonData("http://www.omdbapi.com/?i=%s&tomatoes=true&plot=short&r=json" % identifier)
#log.debug(temp2)
ddate=0 #throw away what couchpotatoai is returning since it is garbage at this time
tdate=0
dvd_date= temp2['DVD']
theater_date=temp2['Released']
if theater_date != 'N/A':
p='%d %b %Y'
tdate=int(time.mktime(time.strptime(theater_date,p)))
if dvd_date != 'N/A':
p='%d %b %Y'
ddate=int(time.mktime(time.strptime(dvd_date,p)))
if (ddate !=0):
if ddate < tdate:
ddate = 0 #if the dvd release date occurs before the theater release date, assume the data is wrong
tdate = 0
dates['dvd']=ddate
dates['theater']=tdate
"""
#This grabs release date info for US from themoviedb - one must replace xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx with their themoviedb api key
#note - if more than one release date of a particular type is found, the last one found will be used
#im just throwing this code in here because obviously the couchpotato api method of grabbing release date info and eta's is broken
#or not working
#perhaps the fix shouldnt be done right here; however, I am just checking this code in because perhaps someone who knows
#how couchpotato works better can use this code in a more appropriate way to make couchpotato eta more robust.
#temp = self.getJsonData("https://api.themoviedb.org/3/movie/%s/release_dates?api_key=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" % identifier)
results = temp['results']
theater_rel=''
dvd_rel=''
p='%Y-%m-%d'
for result in results:
country = result['iso_3166_1']
if country == 'US':
rds = result['release_dates']
for rd in rds:
rd_type=rd['type']
if rd_type ==2 or rd_type==3: #is theatrical release date
theater_rel = rd['release_date']
elif rd_type == 4 or rd_type == 5: #is digital or dvd release date
dvd_rel = rd['release_date']
if theater_rel != '':
tdate=int(time.mktime(time.strptime(theater_rel[:10],p)))
if dvd_rel !='':
ddate=int(time.mktime(time.strptime(dvd_rel[:10],p)))
if tdate > ddate: #dont write the data unless its good and makes sense
dates['theater']=tdate
dates['dvd']=ddate
#"""
log.debug('Found ETA for %s: %s', (identifier, dates))
return dates return dates
def getSuggestions(self, movies = None, ignore = None): def getSuggestions(self, movies = None, ignore = None):

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

@ -340,11 +340,13 @@ var MovieDetails = new Class({
button_text: parent.getTitle() + (parent.get("year") ? " (" + parent.get("year") + ")" : ""), button_text: parent.getTitle() + (parent.get("year") ? " (" + parent.get("year") + ")" : ""),
button_class: "icon-dropdown" button_class: "icon-dropdown"
})), self.buttons = new Element("div.buttons")))); })), self.buttons = new Element("div.buttons"))));
var eta_date = parent.getETA("%b %Y"); var eta_date = parent.getETA("%b %d, %Y");
var dvd_date = parent.getDVDRelease("%b %d, %Y");
var theater_date = parent.getTheaterRelease("%b %d, %Y");
self.addSection("description", new Element("div").adopt(new Element("div", { self.addSection("description", new Element("div").adopt(new Element("div", {
text: parent.get("plot") text: parent.get("plot")
}), new Element("div.meta", { }), new Element("div.meta", {
html: (eta_date ? "<span>ETA:" + eta_date + "</span>" : "") + "<span>" + (parent.get("genres") || []).join(", ") + "</span>" html: (theater_date ? "<span>Theatrical Release: " + theater_date + "<span>" : "") + (dvd_date ? "<span>DVD Release: " + dvd_date + "<span>" : "") + "<span>" + (parent.get("genres") || []).join(", ") + "</span>"
}))); })));
var titles = parent.get("info").titles; var titles = parent.get("info").titles;
$(self.title_dropdown).addEvents({ $(self.title_dropdown).addEvents({
@ -435,6 +437,11 @@ var MovieList = new Class({
styles: { styles: {
display: "none" display: "none"
} }
}) : null, self.description2 = self.options.description ? new Element("div.description", {
html: self.options.description,
styles: {
display: "none"
}
}) : null, self.movie_list = new Element("div", { }) : null, self.movie_list = new Element("div", {
events: { events: {
"click:relay(.movie)": function(e, el) { "click:relay(.movie)": function(e, el) {
@ -1860,7 +1867,17 @@ var Movie = new Class({
create: function() { create: function() {
var self = this; var self = this;
self.el.addClass("status_" + self.get("status")); self.el.addClass("status_" + self.get("status"));
var eta_date = self.getETA(); var eta_date = self.getETA("%b %d, %Y");
var dvd_date = self.getDVDRelease("%b %d, %Y");
var theater_date = self.getTheaterRelease("%b %d, %Y");
var eta_type = "ETA: ";
if (eta_date) eta_type = eta_date == dvd_date ? "DVD ETA: " : "Theatrical ETA "; else if (dvd_date) {
eta_type = "DVD released: ";
eta_date = dvd_date;
} else if (theater_date) {
eta_type = "Theatrically released: ";
eta_date = theater_date;
}
var rating, stars; var rating, stars;
if ([ "suggested", "chart" ].indexOf(self.data.status) > -1 && self.data.info && self.data.info.rating && self.data.info.rating.imdb) { if ([ "suggested", "chart" ].indexOf(self.data.status) > -1 && self.data.info && self.data.info.rating && self.data.info.rating.imdb) {
rating = Array.prototype.slice.call(self.data.info.rating.imdb); rating = Array.prototype.slice.call(self.data.info.rating.imdb);
@ -1892,7 +1909,7 @@ var Movie = new Class({
}), new Element("div.year", { }), new Element("div.year", {
text: self.data.info.year || "n/a" text: self.data.info.year || "n/a"
})), eta_date ? new Element("div.eta", { })), eta_date ? new Element("div.eta", {
text: eta_date, text: eta_type + eta_date,
title: "ETA" 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)); }) : 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));
if (!thumbnail) self.el.addClass("no_thumbnail"); if (!thumbnail) self.el.addClass("no_thumbnail");
@ -1998,6 +2015,28 @@ var Movie = new Class({
} catch (e) {} } catch (e) {}
return self.get("imdb"); return self.get("imdb");
}, },
getDVDRelease: function(format) {
var self = this, d = null, d_date = "";
if (self.data.info.release_date) [ self.data.info.release_date.dvd ].each(function(timestamp) {
if (timestamp > 0) d = timestamp;
});
if (d) {
d_date = new Date(d * 1e3);
d_date = d_date.format(format);
}
return d_date;
},
getTheaterRelease: function(format) {
var self = this, d = null, d_date = "";
if (self.data.info.release_date) [ self.data.info.release_date.theater ].each(function(timestamp) {
if (timestamp > 0) d = timestamp;
});
if (d) {
d_date = new Date(d * 1e3);
d_date = d_date.format(format);
}
return d_date;
},
getETA: function(format) { getETA: function(format) {
var self = this, d = new Date(), now = Math.round(+d / 1e3), eta = null, eta_date = ""; 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 (self.data.info.release_date) [ self.data.info.release_date.dvd, self.data.info.release_date.theater ].each(function(timestamp) {
@ -2008,10 +2047,10 @@ var Movie = new Class({
if (+eta_date / 1e3 < now) { if (+eta_date / 1e3 < now) {
eta_date = null; eta_date = null;
} else { } else {
eta_date = format ? eta_date.format(format) : eta_date.format("%b") + (d.getFullYear() != eta_date.getFullYear() ? " " + eta_date.getFullYear() : ""); eta_date = format ? eta_date.format(format) : eta_date.format("%b %d");
} }
} }
return now + 8035200 > eta ? eta_date : ""; return eta_date;
}, },
get: function(attr) { get: function(attr) {
return this.data[attr] || this.data.info[attr]; return this.data[attr] || this.data.info[attr];

2
couchpotato/static/scripts/combined.vendor.min.js

@ -4201,7 +4201,7 @@ if (typeof JSON == "undefined") this.JSON = {};
(function() { (function() {
var special = { var special = {
"\b": "\\b", "\b": "\\b",
" ": "\\t", "\t": "\\t",
"\n": "\\n", "\n": "\\n",
"\f": "\\f", "\f": "\\f",
"\r": "\\r", "\r": "\\r",

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

@ -56,7 +56,7 @@ Page.Home = new Class({
'view': 'list', 'view': 'list',
'actions': [MA.MarkAsDone, MA.IMDB, MA.Release, MA.Trailer, MA.Refresh, MA.Readd, MA.Delete, MA.Category, MA.Profile], 'actions': [MA.MarkAsDone, MA.IMDB, MA.Release, MA.Trailer, MA.Refresh, MA.Readd, MA.Delete, MA.Category, MA.Profile],
'title': 'Snatched & Available', 'title': 'Snatched & Available',
'description': 'These movies have been snatched or have finished downloading', 'description': 'Releases available to snatch, have been snatched and/or finished downloading',
'on_empty_element': new Element('div').adopt( 'on_empty_element': new Element('div').adopt(
new Element('h2', {'text': 'Snatched & Available'}), new Element('h2', {'text': 'Snatched & Available'}),
new Element('span.no_movies', { new Element('span.no_movies', {
@ -105,7 +105,7 @@ Page.Home = new Class({
'identifier': 'soon', 'identifier': 'soon',
'limit': 12, 'limit': 12,
'title': 'Available soon', 'title': 'Available soon',
'description': 'Should be available soon as they will be released on DVD/Blu-ray in the coming weeks.', 'description': 'DVD/Blu-ray release date: past 3 months or next 4 weeks',
'filter': { 'filter': {
'random': true 'random': true
}, },
@ -168,8 +168,8 @@ Page.Home = new Class({
'navigation': false, 'navigation': false,
'identifier': 'late', 'identifier': 'late',
'limit': 50, 'limit': 50,
'title': 'Still not available', 'title': 'Missed',
'description': 'Try another quality profile or maybe add more providers in <a href="' + App.createUrl('settings/searcher/providers/') + '">Settings</a>.', 'description': 'DVD release > 3 months ago, Theatrical release > 12 weeks ago. Try another quality profile? <a href="' + App.createUrl('settings/searcher/providers/') + '">Settings</a>.',
'filter': { 'filter': {
'late': true 'late': true
}, },

Loading…
Cancel
Save