From c3386a768b4bcb2cb5cb3626a9934c48a5d9dd2c Mon Sep 17 00:00:00 2001 From: geogolem Date: Fri, 11 Nov 2016 03:23:43 -0500 Subject: [PATCH] update couchpotato to display more information regarding ETA's also bypass the couchpotato api for ETA release dates since it is not returning proper information --- .../core/media/movie/_base/static/details.js | 8 ++- couchpotato/core/media/movie/_base/static/movie.js | 64 ++++++++++++++++++++-- .../core/media/movie/_base/static/movie.scss | 15 ++++- .../media/movie/providers/info/couchpotatoapi.py | 57 ++++++++++++++++++- couchpotato/static/scripts/combined.plugins.min.js | 51 +++++++++++++++-- couchpotato/static/scripts/combined.vendor.min.js | 2 +- couchpotato/static/scripts/page/home.js | 8 +-- 7 files changed, 183 insertions(+), 22 deletions(-) diff --git a/couchpotato/core/media/movie/_base/static/details.js b/couchpotato/core/media/movie/_base/static/details.js index 127e260..7f310f3 100644 --- a/couchpotato/core/media/movie/_base/static/details.js +++ b/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( new Element('div', { 'text': parent.get('plot') }), new Element('div.meta', { 'html': - (eta_date ? ('ETA:' + eta_date + '') : '') + + (theater_date ? ('Theatrical Release: ' + theater_date + '') : '') + + (dvd_date ? ('DVD Release: ' + dvd_date + '') : '') + + //(eta_date ? ('ETA: ' + eta_date + '') : '') + '' + (parent.get('genres') || []).join(', ') + '' }) )); diff --git a/couchpotato/core/media/movie/_base/static/movie.js b/couchpotato/core/media/movie/_base/static/movie.js index 4801184..e5527d6 100644 --- a/couchpotato/core/media/movie/_base/static/movie.js +++ b/couchpotato/core/media/movie/_base/static/movie.js @@ -190,7 +190,20 @@ var Movie = new Class({ 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; 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' }) ), + //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', { - 'text': eta_date, + 'text': eta_type+eta_date, 'title': 'ETA' }) : null, self.quality = new Element('div.quality'), @@ -411,6 +432,38 @@ var Movie = new Class({ 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){ var self = this, d = new Date(), @@ -430,11 +483,12 @@ var Movie = new Class({ eta_date = null; } 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; + //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){ diff --git a/couchpotato/core/media/movie/_base/static/movie.scss b/couchpotato/core/media/movie/_base/static/movie.scss index 108ca2b..afa64f4 100644 --- a/couchpotato/core/media/movie/_base/static/movie.scss +++ b/couchpotato/core/media/movie/_base/static/movie.scss @@ -315,7 +315,6 @@ $mass_edit_height: 44px; display: none; } } - .quality { clear: both; overflow: hidden; @@ -468,16 +467,19 @@ $mass_edit_height: 44px; } .info { + display :flex; + flex-direction : column; clear: both; font-size: .9em; .title { + order : 1; display: flex; padding: 3px 0; font-weight: 400; span { - flex: 1 auto; + //flex: 1 auto; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; @@ -491,12 +493,19 @@ $mass_edit_height: 44px; } .eta { + order : 3; + font-size: .9em; opacity: .5; float: right; margin-left: 4px; + span { + flex: 1 auto; + white-space: nowrap; + overflow: hidden; + } } - .quality { + order: 2; white-space: nowrap; overflow: hidden; font-size: .9em; diff --git a/couchpotato/core/media/movie/providers/info/couchpotatoapi.py b/couchpotato/core/media/movie/providers/info/couchpotatoapi.py index c271a9e..3baccfb 100644 --- a/couchpotato/core/media/movie/providers/info/couchpotatoapi.py +++ b/couchpotato/core/media/movie/providers/info/couchpotatoapi.py @@ -1,5 +1,6 @@ import base64 import time +import json from couchpotato.core.event import addEvent, fireEvent from couchpotato.core.helpers.encoding import tryUrlencode, ss @@ -106,8 +107,62 @@ class CouchPotatoApi(MovieProvider): if identifier is None: return {} 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 def getSuggestions(self, movies = None, ignore = None): diff --git a/couchpotato/static/scripts/combined.plugins.min.js b/couchpotato/static/scripts/combined.plugins.min.js index dcc7da3..835718e 100644 --- a/couchpotato/static/scripts/combined.plugins.min.js +++ b/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_class: "icon-dropdown" })), 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", { text: parent.get("plot") }), new Element("div.meta", { - html: (eta_date ? "ETA:" + eta_date + "" : "") + "" + (parent.get("genres") || []).join(", ") + "" + html: (theater_date ? "Theatrical Release: " + theater_date + "" : "") + (dvd_date ? "DVD Release: " + dvd_date + "" : "") + "" + (parent.get("genres") || []).join(", ") + "" }))); var titles = parent.get("info").titles; $(self.title_dropdown).addEvents({ @@ -435,6 +437,11 @@ var MovieList = new Class({ styles: { 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", { events: { "click:relay(.movie)": function(e, el) { @@ -1860,7 +1867,17 @@ var Movie = new Class({ create: function() { var self = this; 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; 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); @@ -1892,7 +1909,7 @@ var Movie = new Class({ }), new Element("div.year", { text: self.data.info.year || "n/a" })), eta_date ? new Element("div.eta", { - text: eta_date, + text: eta_type + 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)); if (!thumbnail) self.el.addClass("no_thumbnail"); @@ -1998,6 +2015,28 @@ var Movie = new Class({ } catch (e) {} 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) { 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) { @@ -2008,10 +2047,10 @@ var Movie = new Class({ 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() : ""); + eta_date = format ? eta_date.format(format) : eta_date.format("%b %d"); } } - return now + 8035200 > eta ? eta_date : ""; + return eta_date; }, get: function(attr) { return this.data[attr] || this.data.info[attr]; diff --git a/couchpotato/static/scripts/combined.vendor.min.js b/couchpotato/static/scripts/combined.vendor.min.js index cbc329c..bb4f0c7 100644 --- a/couchpotato/static/scripts/combined.vendor.min.js +++ b/couchpotato/static/scripts/combined.vendor.min.js @@ -4201,7 +4201,7 @@ if (typeof JSON == "undefined") this.JSON = {}; (function() { var special = { "\b": "\\b", - " ": "\\t", + "\t": "\\t", "\n": "\\n", "\f": "\\f", "\r": "\\r", diff --git a/couchpotato/static/scripts/page/home.js b/couchpotato/static/scripts/page/home.js index cddea44..4d1b608 100644 --- a/couchpotato/static/scripts/page/home.js +++ b/couchpotato/static/scripts/page/home.js @@ -56,7 +56,7 @@ Page.Home = new Class({ 'view': 'list', 'actions': [MA.MarkAsDone, MA.IMDB, MA.Release, MA.Trailer, MA.Refresh, MA.Readd, MA.Delete, MA.Category, MA.Profile], '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( new Element('h2', {'text': 'Snatched & Available'}), new Element('span.no_movies', { @@ -105,7 +105,7 @@ Page.Home = new Class({ 'identifier': 'soon', 'limit': 12, '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': { 'random': true }, @@ -168,8 +168,8 @@ Page.Home = new Class({ 'navigation': false, 'identifier': 'late', 'limit': 50, - 'title': 'Still not available', - 'description': 'Try another quality profile or maybe add more providers in Settings.', + 'title': 'Missed', + 'description': 'DVD release > 3 months ago, Theatrical release > 12 weeks ago. Try another quality profile? Settings.', 'filter': { 'late': true },