ČSFD Extended

Rozšíření profilů filmů na ČSFD o některé funkce jako jsou odkazy na Ulož.to či hodnocení IMDB.

当前为 2016-06-12 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name ČSFD Extended
  3. // @namespace CSFD-E
  4. // @version 0.6.3
  5. // @description Rozšíření profilů filmů na ČSFD o některé funkce jako jsou odkazy na Ulož.to či hodnocení IMDB.
  6. // @author Jakub Rychecký <jakub@rychecky.cz>
  7. // @license WTFPL 2
  8. // @include *csfd.cz/film/*
  9. // ==/UserScript==
  10.  
  11. var version = GM_info.script.version; // Verze skriptu vytažená z metadat
  12.  
  13.  
  14.  
  15.  
  16.  
  17.  
  18.  
  19.  
  20.  
  21. /**
  22. *
  23. * ..:: INSTANCE A KÓD ::..
  24. *
  25. */
  26.  
  27.  
  28. var cache = new Cache(); // Objekt pro práci s cache
  29.  
  30. var csfd = new Csfd(); // Instance třídy pro práci s profilem filmu na ČSFD
  31. var omdb = new OmdbApiWrapper(csfd.parseCsfdImdbCode()); // Instance třídy pro práci s API OMDB a stažení informací o filmu
  32. var imdb = new Imdb(csfd.parseCsfdImdbCode()); // Instance třídy s informacemi z IMDB
  33. var metacritic = new Metacritic(); // Instance třídy s informacemi z Metacritic
  34. var rotten_tomatoes = new RottenTomatoes(); // Instance třídy s informacemi z RottenTomatoes
  35. var box_office = new BoxOffice(); // Objekt celosvětových tržeb
  36.  
  37. var settings = new Settings(); // Objekt spravující nastavení ČSFD Extended
  38.  
  39. var html = new Html(); // Instance třídy pro práci s HTML a úpravou profilu filmu dle získaných dat
  40. var floating = new Floating(); // Instance třídy spravující plovoucí okno s náhledem posterů či fotek tvůrců
  41.  
  42.  
  43. settings.load(); // Načtení nastavení z local storage (nebo uložení, pokud není nalezeno)
  44.  
  45. html.cssInit(); // Přidání externího CSS do stránky
  46.  
  47. csfd.parseCsfdNameYear(); // Parsuje název filmu z profilu ČSFD.
  48. csfd.parseCsfdRating(); // Parsuje hodnocení ČSFDs
  49.  
  50. html.ratingTable(); // Předělání tabulky hodnocení na profilu filmu
  51. html.settingsForm();
  52.  
  53. if(settings.toolbar){ // Pokud je povolený panel s tlačítky...
  54. html.toolbar(); // Vytvoření tlačítek pro rychlé vyhledávání na profilu filmu
  55. }
  56.  
  57. html.myRatingDate(); // Zobrazení datumu mého hodnocení
  58. html.plotExpand(); // Zobrazení delší verze popisu (je-li)
  59.  
  60. omdb.fetchOmdbData(); // Stažení dat z API OMDB
  61.  
  62.  
  63. floating.init(); // Inicializace plovoucího okna
  64. floating.bindPoster(); // Bindování eventu najetí kurzoru na poster
  65. floating.bindCreator(); // Bindování eventu najetí kurzoru na odkaz na profil tvůrce
  66.  
  67.  
  68.  
  69. /*
  70. console.log(settings);
  71. console.log(html);
  72. console.log(csfd);
  73. console.log(omdb);
  74. console.log(imdb);
  75. console.log(metacritic);
  76. console.log(rotten_tomatoes);
  77. console.log(box_office);
  78. */;/**
  79. * @class BoxOffice
  80. * @classdesc Spravuje informace o US tržbách filmu.
  81. */
  82.  
  83. function BoxOffice(){
  84. /**
  85. * Hodnota celosvětových tržeb
  86. * @type {String}
  87. */
  88. var box_office;
  89. /**
  90. * Nastavuje hodnotu tržeb v HTML kódu ČSFD profilu filmu.
  91. * @returns {undefined}
  92. */
  93. this.insertBoxOfficeHtml = function(){
  94. if(typeof this.box_office !== 'undefined' && this.box_office !== 'N/A'){ // Pokud jsou nastavené nějaké US tržby...
  95. $('#csfd-e-rating .box-office .value').html(this.box_office.replace('.', ',')); // Vyplnění údaje do tabulky ČSFD Extended
  96. $('#csfd-e-rating .box-office').show(); // Zobrazení řádku v tabulce
  97. }
  98. };
  99. };/**
  100. * @class Cache
  101. * @classdesc Třída pro práci s cache v podobě local storage.
  102. */
  103.  
  104. function Cache(){
  105.  
  106. /**
  107. * Prefix názvu klíčů v local storage
  108. * @type String
  109. */
  110. this.prefix = 'csfd-e/';
  111.  
  112. /**
  113. * Jé :)
  114. * @type Cache
  115. */
  116. var parent = this;
  117.  
  118. /**
  119. * Nastavuje objekt (odpověď OMDb) do cache pod určitým kódem.
  120. * @param {String} key Název klíče pro uložení do cache
  121. * @param {Object} object Objekt pro uložení do cache
  122. * @returns {undefined}
  123. */
  124. this.set = function(key, object){
  125. localStorage.setItem(this.prefix+key, JSON.stringify(object)); // Nastavení JSON objektu do cache
  126. };
  127. /**
  128. * Získává objekt z cache.
  129. * @param {String} key Název klíče pro získání z cache
  130. * @returns {Boolean} Byly nalezeny informace z cache?
  131. */
  132. this.get = function(key){
  133. var response = localStorage.getItem(this.prefix+key); // Získání údajů z cache tam, kde by měly být
  134. response = $.parseJSON(response); // Snaha naparsovat JSON obsah cache
  135.  
  136. if(response === null || response.timestamp <= $.now() - settings.cache_expire * 60 * 60){ // Pokud nebylo nic nalezeno, či pokud je to starší než limit...
  137. return false; // Cache miss!
  138. }else if(cache.isCacheAllowed()){ // ...avšak když je povolená cache...
  139. return response; // Cache hit - vrací uložený objekt
  140. }else{
  141. return false; // Cache miss!
  142. }
  143. };
  144. /**
  145. * Vyčitění cache ČSFD Extended.
  146. * @returns {undefined}
  147. */
  148. this.clear = function(){
  149. for (var i = 0; i < localStorage.length; i++){ // Procházení jednotlivých krámů uložených v local storage...
  150. var key = localStorage.key(i); // Aktuální klíč
  151.  
  152. if(key.indexOf(this.prefix) === 0 && key.match(/tt\d+/)){ // Pokud odpovídá IMDB kódu (tt\d+)...
  153. localStorage.removeItem(key); // ...vymazání itemu
  154. }
  155. }
  156. };
  157.  
  158. /**
  159. * Zjišťuje, zda je povolená cache ČSFD Extended?
  160. * @returns {Boolean} Je povolená cache?
  161. */
  162. this.isCacheAllowed = function(){
  163. if(settings.cache_expire > 0){ // Pokud má cache nastavenou platnost...
  164. return true; // ...je povolená
  165. }else{ // ...platnost cache na 0 hodin nicméně znamená...
  166. return false; // ...že se cache nepoužívá
  167. }
  168. };
  169. };/**
  170. * @class Csfd
  171. * @classdesc Parsuje a zpracovává základní údaje z ČSFD profilu filmu.
  172. */
  173.  
  174. function Csfd(){
  175. /**
  176. * Originální název filmu
  177. * @type {String}
  178. */
  179. this.name;
  180.  
  181. /**
  182. * Rok vzniku filmu
  183. * @type {Integer}
  184. */
  185. this.year;
  186.  
  187. /**
  188. * Hodnocení ČSFD v procentech
  189. * @type {Integer}
  190. */
  191. this.rating;
  192.  
  193. /**
  194. * Počet hodnocení na ČSFD
  195. * @type {Integer}
  196. */
  197. this.votes;
  198. /**
  199. * Parsuje název filmu z profilu ČSFD.
  200. * @return {undefined}
  201. */
  202. this.parseCsfdNameYear = function(){
  203. var title = $('meta[property=\'og:title\']').attr('content'); // Získání popisu ČSFD profilu z metatagu Open Graph (OG) http://ogp.me/
  204. title = title.replace(/\(TV seriál\)/, ''); // Odstranění označení TV seriálů z názvu
  205. title = title.replace(/\(TV film\)/, ''); // Odstranění označení TV filmů z názvu
  206. var title_regex = title.match(/(.+)\((\d{4})\)/); // Rozdělení na název a rok v závorce
  207. this.name = title_regex[1]; // Název filmu
  208. this.name = this.name.replace(/.+\//, ''); // Získání čehokoliv před lomítkem (= originální název)
  209. this.name = $.trim(this.name); // Oříznutí mezer názvu filmu
  210. this.year = parseInt(title_regex[2]); // Rok názvu jako integer
  211. };
  212.  
  213. /**
  214. * Parsuje procentuální hodnocení a počet hlasů z profilu ČSFD.
  215. * @return {undefined}
  216. */
  217. this.parseCsfdRating = function(){
  218. this.rating = $('meta[itemprop="ratingValue"]').attr('content'); // Získání procentuálního hodnocení z metatagů
  219. this.rating = parseInt(this.rating); // Hodnocení v procentech jako integer
  220. this.votes = $('meta[itemprop="ratingCount"]').attr('content'); // Získání počtu hlasů z metatagů
  221. this.votes = parseInt(this.votes); // Počet hlasů jako integer
  222. };
  223. /**
  224. * Parsuje kód filmu na IMDB z tlačítka IMDB na profilu filmu na ČSFD.
  225. * @return {String} Kód filmu na IMDB
  226. */
  227. this.parseCsfdImdbCode = function(){
  228. var imdb_btn = $('#sidebar a[href*="imdb.com/title"]');
  229. if(imdb_btn.length > 0){
  230. var imdb_code = imdb_btn.attr('href').match(/(tt\d+)/); // Extrahování kódu filmu na IMDB
  231.  
  232. return imdb_code[1]; // Vrací extrahovaný kód IMDB
  233. }else{
  234. return '';
  235. }
  236. };
  237. /**
  238. * Získává barevné ladění ČSFD profilu filmu z boxu hodnocení.
  239. * @returns {jQuery} CSS barva profilu filmu. Červená pro kvalitní filmy, modrá po průměrné a černá pro Ulici. :)
  240. */
  241. this.color = function(){
  242. return $('#rating').css('background'); // Barva profilu filmu na ČSFD
  243. };
  244. }
  245. ;/**
  246. * @class Floating
  247. * @classdesc Základní třída, která generuje toolbar, šablonu tabulky hodnocení ČSFD Extended a nějaké další serepetičky.
  248. */
  249.  
  250. function Floating(){
  251. /**
  252. * jQuery objekt plovoucího rámečku
  253. * @type {jQuery}
  254. */
  255. this.floating;
  256. /**
  257. * jQuery objekt AJAX dotazu na obrázek tvůrce
  258. * @type {jQuery}
  259. */
  260. this.request;
  261. /**
  262. * Jé :)
  263. * @type Floating
  264. */
  265. var parent = this;
  266.  
  267.  
  268. /**
  269. * Inicializace plovoucího rámečku ČSFD Extended.
  270. * @returns {undefined}
  271. */
  272. this.init = function(){
  273. var html = '<img id="csfd-e-floating" src="" alt="" />'; // HTML plovoucího obrázku
  274. $('body').append(html); // Přidání na konec těla stránky
  275. this.floating = $('#csfd-e-floating'); // HTML objekt plovoucího obrázku
  276. };
  277.  
  278. /**
  279. * Obnovuje polohu plovoucího okna s tím, jak se kurzor myši pohybuje po objektu, který je v parametru této metody.
  280. * @param {jQuery} obj jQuery objekt, po kterém se pohybuje kurzor
  281. * @returns {undefined}
  282. */
  283. this.refresh = function(obj){
  284. obj.mousemove(function(e){ // Při každém pohybu kurzoru...
  285. parent.floating.css({'top': e.pageY + settings.floating_offset_y, 'left': e.pageX + settings.floating_offset_x, 'display': 'inline'}); // Opětovné nastavení polohy plovoucího rámečku vůči kurzoru myši
  286. });
  287. obj.mouseout(function(){ // Při opuštění kurzoru z objektu...
  288. parent.floating.hide(); // Skrytí plovoucího rámečku
  289. parent.floating.attr('src', ''); // Nastavneí obrázku na... nic
  290. parent.request.abort(); // Přerušení AJAXového dotazu
  291. });
  292. };
  293. /**
  294. * Zajišťuje zvětšený plovoucí náhled posteru filmu na profilu ČSFD.
  295. * @returns {undefined}
  296. */
  297. this.bindPoster = function(){
  298. var poster = $('#poster img, #posters img'); // Všechny postery...
  299.  
  300.  
  301. $('#show-all-posters').click(function(){ // Kliknutí na tlačítko "všechny plakáty" je stahuje AJAXem...
  302. parent.bindPoster(); // ...je třeba tedy kvůli selektroru tuto metodu znovu zavolat
  303. });
  304.  
  305.  
  306. poster.mouseenter(function(e){ // Najetí kurzorem na náhled posteru...
  307. var poster_url = $(this).attr('src'); // Získání URL obrázku
  308. poster_url = poster_url.replace(/\?.+/, ''); // Odstranění GET z URL
  309.  
  310. parent.floating.attr('src', poster_url); // Nastavení obrázku plného posteru do plovoucího rámečku
  311. });
  312.  
  313. this.refresh(poster); // Obnovování polohy s tím, jak jezdí kurzor po náhledu posteru
  314. };
  315. /**
  316. * Zajišťuje náhled profilové fotky tvůrce při najetí na jeho jméno na profilu filmu.
  317. * @returns {undefined}
  318. */
  319. this.bindCreator = function(){
  320. var links = $('.creators a'); // Odkaz na tvůrce (herci, režiséři...)
  321.  
  322. links.mouseenter(function(e){ // V okamžiku, kdy kurzor na jeden z odkazů vjede...
  323. var url = $(this).attr('href'); // Získání URL profilu
  324. parent.fetchCreatorHtml(url); // Stažení fotografie tvůrce
  325. parent.refresh(links); // Obnovování polohy s tím, jak jezdí kurzor po odkazu na tvůrce
  326. });
  327. };
  328. /**
  329. * Stahuje a nastavuje fotografii tvůrce do plovoucího rámečku.
  330. * @param {String} url Adresa stránky profilu tvůrce
  331. * @returns {undefined}
  332. */
  333. this.fetchCreatorHtml = function(url){
  334. parent.request = $.ajax({ // AJAXový dotaz pro získání HTML ze stránky tvůrce...
  335. method: 'GET',
  336. url: url // Adresa profilu tvůrce
  337. });
  338.  
  339. parent.request.done(function(response){ // Po úspěšném stažení HTML celé stránky tvůrce...
  340. if(response.redirect){ // Pokud se jedná o přesměrování (tj. nevyplněný profil tvůrce směruje na zajímavosti, galerii...)
  341. parent.fetchCreatorHtml(response.redirect); // Provede se celé toto stažení znovu
  342. }else{ // ...v opačném případě došlo k získání relevantních dat...
  343. var img = $(response).find('#profile .image img').attr('src'); // Nalezení URL profilového obrázku
  344.  
  345. parent.floating.attr('src', img); // Nastavení URL obrázku do plovoucího rámečku
  346. }
  347. });
  348. };
  349. };/**
  350. * @class Html
  351. * @classdesc Základní třída, která generuje toolbar, šablonu tabulky hodnocení ČSFD Extended a nějaké další serepetičky.
  352. */
  353.  
  354. function Html(){
  355. /**
  356. * jQuery objekt toolbaru ČSFD Extended
  357. * @type {jQuery}
  358. */
  359. this.toolbar;
  360.  
  361. /**
  362. * jQuery objekt tabulky hodnocení ČSFD Extended
  363. * @type {jQuery}
  364. */
  365. this.table;
  366.  
  367.  
  368.  
  369.  
  370.  
  371. /**
  372. * Inicializuje CSS pro skript ČSFD Extended.
  373. * @returns {undefined}
  374. */
  375. this.cssInit = function(){
  376. var css_url = 'http://csfd-extended.rychecky.cz/css/csfd-extended.css?v='+version; // URL adresa externího CSS
  377. var css_html = '<link rel="stylesheet" type="text/css" href="'+css_url+'" />'; // HTML kód pro vložení CSS
  378. $('head').append(css_html); // Vložení CSS do hlavičky HTML kódu
  379. };
  380. /**
  381. * Stará se o vyplnění potřebných údajů do šablony tabulky hodnocení ČSFD Extended.
  382. * @returns {undefined}
  383. */
  384. this.fillRatingTable = function(){
  385. imdb.insertRatingHtml(); // Vyplnění údajů IMDB
  386. metacritic.insertRatingHtml(); // Vypnění údajů Metacritic
  387. rotten_tomatoes.insertRatingHtml(); // Vyplnění údajů Rotten Tomatoes
  388.  
  389. this.table.show(); // Zobrazení tabulky
  390. };
  391.  
  392.  
  393.  
  394. /**
  395. * Generuje a vkládá do profilu filmu šablonu tabulky hodnocení ČSFD Extended pro IMDB, Metacritic a Rotten Tomatoes.
  396. * @returns {undefined}
  397. */
  398. this.ratingTable = function(){
  399. var html = '';
  400. html += '<div id="csfd-e-rating" class="ct-related" style="display: none;">'; // Začátek tabulky hodnocení ČSFD Extended
  401.  
  402. html += '<div class="header"><h3>ČSFD Extended</h3></div>'; // Nadpis ČSFD-like
  403.  
  404.  
  405. html += '<div class="content">';
  406.  
  407. html += '<table>'; // Tabulkáá
  408.  
  409. html += '<tr class="imdb" style="display: none;">'; // Řádek údajů IMDB
  410. html += '<td class="favicon"><img src="http://www.google.com/s2/favicons?domain=imdb.com" alt="" /></td>';
  411. html += '<td class="title"><a href="" class="link" title="Otevřít profil na IMDB">IMDB</a></td>';
  412. html += '<td class="rating"></td>';
  413. html += '<td class="votes"></td>';
  414. html += '</tr>';
  415.  
  416. html += '<tr class="metacritic" style="display: none;">'; // Řádek údajů Metacritic
  417. html += '<td class="favicon"><img src="http://www.google.com/s2/favicons?domain=metacritic.com" alt="" /></td>';
  418. html += '<td class="title"><a href="" class="link" title="Otevřít seznam recenzí Metacritic">Metacritic</a></td>';
  419. html += '<td class="rating help" title="Agregované skóre z profesionálních recenzí periodik a webů zapojených do Metacritic"></td>';
  420. html += '</tr>';
  421.  
  422. html += '<tr class="tomato tomato-critic" style="display: none;">'; // Řádek údajů Rotten Tomatoes (kritici)
  423. html += '<td class="favicon"><img src="http://www.google.com/s2/favicons?domain=rottentomatoes.com" alt="" /></td>';
  424. html += '<td class="title"><a href="" class="link" title="Otevřít profil na Rotten Tomatoes">RT: kritici</a></td>';
  425. html += '<td class="rating help" title="Poměr kritiků, kteří dali tomuto filmu pozitivní verdikt"></td>';
  426. html += '<td class="votes"></td>';
  427. html += '</tr>';
  428.  
  429. html += '<tr class="tomato tomato-audience" style="display: none;">'; // Řádek údajů Rotten Tomatoes (diváci)
  430. html += '<td class="favicon"><img src="http://www.google.com/s2/favicons?domain=rottentomatoes.com" alt="" /></td>';
  431. html += '<td class="title"><a href="" class="link" title="Otevřít profil na Rotten Tomatoes">RT: diváci</a></td>';
  432. html += '<td class="rating help" title="Poměr diváků, kteří dali filmu hodnocení 3,5 hvězdičky nebo vyšší z maximálního počtu 5 hvězdiček"></td>';
  433. html += '<td class="votes"></td>';
  434. html += '</tr>';
  435. html += '<tr class="box-office" style="display: none;">'; // Řádek údajů tržeb filmu
  436. html += '<td></td>';
  437. html += '<td class="title">US tržby</td>';
  438. html += '<td class="value help" title="Tržby filmu v USA (box office)"></td>';
  439. html += '<td></td>';
  440. html += '</tr>';
  441.  
  442. html += '</table>';
  443. html += '<div class="footer">'; // Drobné zápatí
  444. html += '<a href="javascript:void(0)" id="csfd-e-settings-btn">Nastavení</a> | '; // Tlačítko "Nastavení"
  445. html += 'by <a href="http://www.csfd.cz/uzivatel/99999-jacube/">jaCUBE</a> via <a href="https://greasyfork.org/cs/scripts/15784-%C4%8Csfd-extended">Greasy Fork</a>';
  446. html += '</div>';
  447. html += '</div>';
  448. html += '</div>';
  449.  
  450.  
  451. $('#ratings').before(html); // Vložení do profilu filmu na ČSFD hned pod tabulku hodnocení vpravo nahoře
  452. this.table = $('#csfd-e-rating'); // jQuery objekt tabulky hodnocení
  453. $('#csfd-e-settings-btn').click(function(){ // Kliknutí na tlačítko "Nastavení" v zápatí..
  454. $('#csfd-e-settings').slideToggle(); // Zobrazuje/skrývá formulář nastavení
  455. });
  456. };
  457. /**
  458. * Generuje HTML kód toolbaru ČSFD Exteded s rozličnými užitečnými odkazy.
  459. * @returns {undefined}
  460. */
  461. this.toolbar = function(){
  462. var name_url = encodeURIComponent(csfd.name); // Ošetřený název filmu
  463.  
  464. var html = '';
  465. html += '<div id="csfd-e-toolbar">';
  466.  
  467. html += '<a href="https://www.google.cz/search?q='+name_url+'" target="_blank">Google</a>'; // Tlačtíko Google
  468. html += '<a href="https://www.youtube.com/results?search_query='+name_url+'" target="_blank">YouTube</a>'; // Tlačítko YouTube
  469. html += '<a href="https://www.reddit.com/search?q='+name_url+'+subreddit%3Amovies+OR+subreddit%3Atelevision+OR+subreddit%3Atrailers&sort=relevance&t=all" target="_blank">Reddit</a>'; // Omezeno na r/movies, r/television a r/trailers
  470. html += '<a href="https://www.facebook.com/search/pages/?q='+name_url+'" target="_blank">Facebook</a>'; // Tlačítko Facebook
  471. html += '<a href="http://www.titulky.com/?Fulltext='+name_url+'" target="_blank">Titulky.com</a>'; // Tlačtíko Titulky.com
  472. html += '<a href="http://www.uloz.to/hledej?media=video&protected=notPassword&redir=0&q='+name_url+'" target="_blank">Ulož.to</a>'; // Tlačítko Ulož.to
  473. html += '<a href="https://www.google.cz/search?q='+name_url+' site:yify-movies.net OR site:yify-movie.com" target="_blank">YIFY</a>'; // Tlačítko vyhledávání YIFY releasů přes Google
  474. html += '<a href="https://torrentz.eu/search?q='+name_url+'" target="_blank">Torrentz</a>'; // Vyhledávání torrentů přes agregátor Torrentz.eu
  475. html += '<a href="http://www.boxofficemojo.com/search/?q='+name_url+'" target="_blank">BoxOffice</a>'; // Vyhledávání tržeb filmu
  476. html += '</div>';
  477.  
  478. $('#profile div.content').prepend(html); // Připojení toolbaru nad ČSFD profil filmu
  479.  
  480. this.toolbar = $('#csfd-e-toolbar'); // jQuery objekt toolbaru
  481.  
  482. this.colourToolbar(); // Obarvení toolbaru
  483. };
  484.  
  485. /**
  486. * Přidává do toolbaru odkaz na oficiální web filmu, jeho URL byla stažena z OMDb.
  487. * @param {String} www URL filmu/seriálu
  488. * @returns {undefined}
  489. */
  490. this.addWebsiteToToolbar = function(www){
  491. if(www !== '' && www !== 'N/A' && settings.toolbar){ // Pokud je uveden nějaký web...
  492. var html = '<a href="'+www+'" target="_blank" title="Oficiální web filmu/seriálu">WWW</a>'; // HTML kód tlačítka
  493. this.toolbar.prepend(html); // Přidání tlačítka na začátek toolbaru
  494.  
  495. this.colourToolbar(); // Opětovné obarvení toolbaru (včetně nového tlačítka)
  496. }
  497. };
  498. /**
  499. * Obarvuje tlačítka toolbaru dle barvy filmu na ČSFD (červená, modrá, černá, šedá) tak, aby toolbar zapadl. :)
  500. * @returns {undefined}
  501. */
  502. this.colourToolbar = function(){
  503. this.toolbar.find('a').css({background: csfd.color()}); // Obarvení tlačítek toolbaru barvou filmu ČSFD
  504. };
  505. /**
  506. * Vytahuje a zviditelňuje datum vložení vlastního hodnocení filmu.
  507. * @returns {undefined}
  508. */
  509. this.myRatingDate = function(){
  510. if(settings.my_rating_date){ // Pouze pokud je zobrazování datumu hodnocení zapnuto...
  511. var title = $('.my-rating > span').attr('title'); // Získání atributu title hvězdiček
  512.  
  513. if(typeof title !== 'undefined'){ // Pokud byl tento film už mnou hodnocen...
  514. title = title.replace('vloženo ', ''); // Odstranění slova "vloženo"
  515.  
  516. var html = '<div id="csfd-e-rating-date" title="Datum přidání mého hodnocení">'+title+'</div>'; // HTML kód datumu přidání mého hodnocení
  517.  
  518. $('#my-rating .content').append(html); // Přidání mého hodnocení pod hvězdičky
  519. }
  520. }
  521. };
  522.  
  523. /**
  524. * Generuje nastavení ČSFD Exteded a vkládá jej do stránky.
  525. * @returns {undefined}
  526. */
  527. this.settingsForm = function(){
  528. var html = ''; // Inicace proměnné
  529. html += '<div id="csfd-e-settings" class="ct-related" style="display: none">'; // Začátek nastavení ČSFD Extended
  530. html += '<div class="header"><h3>ČSFD Extended - Nastavení</h3></div>'; // Nadpis ČSFD-like
  531. html += '<div class="content">'; // HTML nastavení toolbaru
  532. html += '<div class="csfd-e-header">Obecné</div>';
  533. html += '<div class="csfd-e-section">';
  534. html += '<label for="csfd-e-settings-toolbar">Zobrazovat toolbar s tlačítky?</label>';
  535. html += '<input type="checkbox" id="csfd-e-settings-toolbar" />';
  536. html += '<br />';
  537. html += '<label for="csfd-e-settings-my-rating-date">Zobrazovat datum mého hodnocení?</label>';
  538. html += '<input type="checkbox" id="csfd-e-settings-my-rating-date" />';
  539. html += '<br />';
  540. html += '<label for="csfd-e-settings-plot-expand">Rozbalovat automaticky obsah filmu?</label>';
  541. html += '<input type="checkbox" id="csfd-e-settings-plot-expand" />';
  542. html += '</div>';
  543.  
  544. html += '<div class="csfd-e-header">Cache</div>'; // HTML nastavení cache
  545. html += '<div class="csfd-e-section">';
  546. html += '<label for="csfd-e-settings-cache-expire">Platnost cache:</label>';
  547. html += '<input type="number" id="csfd-e-settings-cache-expire" style="width: 50px; text-align: right" /> hod.';
  548. html += '<div>';
  549. html += '<a href="javascript:void(0)" id="csfd-e-cache-clear-btn" title="Jednorázově vymaže již stažené informace o hodnocení">Vyčistit cache</a> | '; // Tlačítko na vyčištění cache
  550. html += '<a href="javascript:void(0)" id="csfd-e-cache-disable-btn" title="Vypne používání cache pro ČSFD Extended (způsobuje delší načítání stránky)">Vypnout cache</a>'; // Tlačítko na vyčištění cache
  551. html += '</div>';
  552. html += '</div>';
  553. html += '<div class="csfd-e-header">Náhledy posterů &amp; fotek</div>'; // HTML nastavení cache
  554. html += '<div class="csfd-e-section">';
  555. html += '<label for="csfd-e-settings-floating-offset-x">Horizontální odsazení:</label>';
  556. html += '<input type="number" id="csfd-e-settings-floating-offset-x" style="width: 50px; text-align: right" /> px';
  557. html += '<br />';
  558. html += '<label for="csfd-e-settings-floating-offset-y">Vertikální odsazení:</label>';
  559. html += '<input type="number" id="csfd-e-settings-floating-offset-y" style="width: 50px; text-align: right" /> px';
  560. html += '</div>';
  561. html += '</div>';
  562. html += '</div>';
  563. html += '</div>';
  564. this.table.after(html); // Vložení za tabulku hodnocení ČSFD Extended
  565. settings.fillForm(); // Vyplnění vygenerovaného formuláře již nastavenými hodnotami
  566. settings.bind(); // Přiřazení dalších funkcí nejen tlačítek ve formuláři nastavneí
  567. };
  568.  
  569.  
  570. /**
  571. * Automaticky otevírá rozšířený popis filmu, je-li takový.
  572. * @returns {undefined}
  573. */
  574. this.plotExpand = function(){
  575. if(settings.plot_expand){ // Pokud je v nastavení povolené automatické rozbalování...
  576. $('#plots .content a').click(); // Pokud je tam tlačítko (více)... KLIK!
  577. }
  578. };
  579. };/**
  580. * @class Imdb
  581. * @classdesc Udržuje a zpracovává všechny údaje o filmu na webu IMDB: http://imdb.com/
  582. * @param {String} imdb_code IMDB kód filmu
  583. */
  584.  
  585. function Imdb(imdb_code){
  586. /**
  587. * IMDB kód filmu
  588. * @type {String}
  589. */
  590. this.imdb_code = imdb_code;
  591.  
  592. /**
  593. * Číselné hodnocení filmu na IMDB
  594. * @type {Float}
  595. */
  596. this.rating;
  597. /**
  598. * Počet hlasů na IMDB
  599. * @type {Integer}
  600. */
  601. this.votes;
  602.  
  603.  
  604.  
  605.  
  606. /**
  607. * Vyplňuje údaje z IMDB do tabulky hodnocení ČSFD Extended.
  608. * @returns {undefined}
  609. */
  610. this.insertRatingHtml = function(){
  611. if(this.rating > 0){ // Pouze pokud je film na IMDB hodnocený...
  612. $('#csfd-e-rating .imdb').show(); // Zobrazení řádku IMDB
  613. $('#csfd-e-rating .imdb .rating').html(imdb.rating.toLocaleString().replace('.', ',')); // Vložení hodnocení IMDB (nahrazení desetinné tečky desetinnou čárkou)
  614. $('#csfd-e-rating .imdb .votes').html(imdb.votes.toLocaleString()+'&nbsp;hlasů'); // Vložení počtu hlasů z IMDB
  615.  
  616. $('#csfd-e-rating .imdb a').attr('href', this.link()); // Vložení odkazu na IMDB
  617. }
  618. };
  619. /**
  620. * Generuje odkaz na IMDB profil filmu.
  621. * @returns {String} URL na IMDB profil filmu
  622. */
  623. this.link = function(){
  624. return 'http://www.imdb.com/title/'+this.imdb_code+'/'; // URL na IMDB profil filmu
  625. };
  626. }
  627. ;/**
  628. * @class Metacritic
  629. * @classdesc Udržuje a zpracovává všechny údaje o filmu na webu Metacritic: http://metacritic.com/
  630. */
  631.  
  632. function Metacritic(){
  633. /**
  634. * Metascore z Metacritic (agregované z profesionálních recenzí)
  635. * @type {Integer}
  636. */
  637. this.metascore;
  638.  
  639.  
  640.  
  641.  
  642.  
  643. /**
  644. * Vyplňuje údaje z Metacritic do tabulky hodnocení ČSFD Extended.
  645. * @returns {undefined}
  646. */
  647.  
  648. this.insertRatingHtml = function(){
  649. if(this.metascore > 0){ // Pouze pokud je získáno nějaké Metascore...
  650. $('#csfd-e-rating .metacritic').show(); // Zobrazení řádku Metacritic
  651. $('#csfd-e-rating .metacritic .rating').html(this.metascore); // Nastavneí hodnoty Metascore
  652. $('#csfd-e-rating .metacritic a').attr('href', this.link()); // Nastavení odkazu na profil IMDB s přehledem Metacritic recenzí
  653. }
  654. };
  655. /**
  656. * Generuje odkaz na IMDB stránku s přehledem Metacritic recenzí filmu.
  657. * @returns {String} URL IMDB stránky s přehledem Metacritic recenzí filmu
  658. */
  659. this.link = function(){
  660. return 'http://www.imdb.com/title/'+imdb.imdb_code+'/criticreviews'; // URL IMDB stránky s přehledem Metacritic recenzí filmu
  661. };
  662. };/**
  663. * @class OmdbApiWrapper
  664. * @classdesc Stahuje, parsuje a zpracovává údaje o filmu staženém z OMDB API http://www.omdbapi.com/
  665. * @param {String} imdb_code IMDB kód filmu
  666. */
  667.  
  668. function OmdbApiWrapper(imdb_code){
  669. /**
  670. * IMDB kód filmu
  671. * @type {String}
  672. */
  673. this.imdb_code = imdb_code;
  674. /**
  675. * Objekt odpovědí OMDb API s údaji o filmu
  676. * @type {object}
  677. */
  678. this.response;
  679. /**
  680. * Jé. :)
  681. * @type OmdbApiWrapper
  682. */
  683. var parent = this;
  684.  
  685.  
  686. /**
  687. * Snaží se získat údaje z cache, při neúspěchu stahuje údaje z OMDb API.
  688. * @returns {undefined}
  689. */
  690. this.fetchOmdbData = function(){
  691. var cache_data = cache.get(this.imdb_code); // Cache miss nebo hit?
  692. if(!cache.isCacheAllowed() || !cache_data){ // Pokud je cache zakázána, nebo údaje z cache nejsou dostupné...
  693. var request = $.ajax({ // AJAXový dotaz
  694. method: 'GET',
  695. url: 'http://www.omdbapi.com/',
  696. data: { // Dotaz pro OMDb API
  697. i: this.imdb_code,
  698. tomatoes: 'true',
  699. r: 'json'
  700. }
  701. });
  702.  
  703. request.done(function(response){ // Po stažení odpovědi...
  704. response.timestamp = $.now(); // Přidání aktuálního unixového času do objektu odpovědi
  705. parent.response = response; // Nastavení odpovědi do tohoto objektu
  706. parent.processOmdbData(); // Zpracování stažené odpovědi
  707.  
  708. if(cache.isCacheAllowed() && response.imdbRating > 0){ // Pokud je cache povolená a zároveň se podařilo stáhnout alespoň nějaké hodnocení IMDB...
  709. cache.set(parent.imdb_code, response); // Uloží odpověď do cache (local storage) s klíčem jako kódem filmu na IMDB
  710. }
  711. });
  712. }else{ // ...pokud se podařilo získat odpověď z cache...
  713. this.response = cache_data; // Nastavení odpovědi jako objektu získaného z cache
  714. this.processOmdbData(); // Zpracování odpovědi z cache
  715. }
  716. };
  717. /**
  718. * Zpracovává odpověď z OMDb API, ať už staženou nebo získanou z cache.
  719. * @returns {undefined}
  720. */
  721. this.processOmdbData = function(){
  722. var response = this.response; // Objekt odpovědi
  723.  
  724. imdb.rating = parseFloat(response.imdbRating); // Hodnocení na IMDB
  725. imdb.votes = response.imdbVotes.replace(/\,/g,''); // Počet hlasů IMDB (odstranění čárek v řádů tisíců)
  726. imdb.votes = parseInt(imdb.votes); // Počet hlasů IMDB (číslo)
  727.  
  728. metacritic.metascore = parseInt(response.Metascore); // Metascore z Metacritic
  729.  
  730. rotten_tomatoes.criticRating = parseInt(response.tomatoMeter); // Rotten Tomatoes: hodnocení kritiků
  731. rotten_tomatoes.criticReviews = parseInt(response.tomatoReviews); // Rotten Tomatoes: počet recenzí
  732. rotten_tomatoes.userRating = parseInt(response.tomatoUserMeter); // Rotten Tomatoes: hodnocení diváků
  733. rotten_tomatoes.userReviews = parseInt(response.tomatoUserReviews); // Rotten Tomatoes: počet hodnocení diváků
  734. rotten_tomatoes.url = response.tomatoURL; // Rotten Tomatoes: URL adresa
  735.  
  736. box_office.box_office = response.BoxOffice; // Nastavení tržeb dle objektu odpovědi
  737. box_office.insertBoxOfficeHtml(); // Vložení US tržeb na profil filmu
  738. html.addWebsiteToToolbar(response.Website); // Přidání oficiálního webu do toolbaru
  739. html.fillRatingTable(); // Vyplnění tabulky hodnocení ČSFD Extended
  740. };
  741. };/**
  742. * @class RottenTomato
  743. * @classdesc Udržuje a zpracovává všechny údaje o filmu na webu Rotten Tomatoes (RT): http://rottentomatoes.com/
  744. */
  745.  
  746. function RottenTomatoes(){
  747. /**
  748. * Hodnocení kritiků na Rotten Tomatoes
  749. * @type {Integer}
  750. */
  751. this.criticRating;
  752. /**
  753. * Počet recenzí kritiků na Rotten Tomatoes
  754. * @type {Integer}
  755. */
  756. this.criticReviews;
  757. /**
  758. * Hodnocení diváků na Rotten Tomatoes
  759. * @type {Integer}
  760. */
  761. this.userRating;
  762. /**
  763. * Počet hodnocení diváků na Rotten Tomatoes
  764. * @type {Integer}
  765. */
  766. this.userReviews;
  767. /**
  768. * URL profilu filmu na Rotten Tomatoes
  769. * @type {String}
  770. */
  771. this.url;
  772. /**
  773. * Vyplňuje údaje z Rotten Tomatoes do tabulky hodnocení ČSFD Extended.
  774. * @returns {undefined}
  775. */
  776. this.insertRatingHtml = function(){
  777. if(this.criticRating > 0){ // Pouze pokud má film hodnocení kritiků z Rotten Tomatoes...
  778. $('#csfd-e-rating .tomato').show(); // Zobrazení řádku Rotten Tomatoes
  779. $('#csfd-e-rating .tomato-critic .rating').html(this.criticRating+'&nbsp;%'); // Nastavení hodnocení kritiků RT
  780. $('#csfd-e-rating .tomato-critic .votes').html(this.criticReviews.toLocaleString()+'&nbsp;recenzí'); // Nastavení počtu recenzí kritiků RT
  781.  
  782. $('#csfd-e-rating .tomato-audience .rating').html(this.userRating+'&nbsp;%'); // Nastavení hodnocení diváků RT
  783. $('#csfd-e-rating .tomato-audience .votes').html(this.userReviews.toLocaleString()+'&nbsp;hodnocení'); // Nastavení počtu hodnocení diváků RT
  784.  
  785. $('#csfd-e-rating .tomato a').attr('href', this.link()); // Nastavení URL profilu filmu na Rotten Tomatoes
  786. }
  787. };
  788. /**
  789. * Generuje odkaz na profil filmu na Rotten Tomatoes.
  790. * @returns {String} URL profilu filmu na RT
  791. */
  792. this.link = function(){
  793. return this.url; // URL už je uložené v objektu, získané z OMDb API
  794. };
  795. };/**
  796. * @class Settings
  797. * @classdesc Zpracovává, načítá a ukládá nastavení ČSFD Extended.
  798. */
  799.  
  800. function Settings(){
  801. /**
  802. * Má se zobrazovat toolbar? (výchozí: ano)
  803. * @type Boolean
  804. */
  805. this.toolbar = true;
  806. /**
  807. * Má se zobrazovat datum mého hodnocení? (výchozí: ano)
  808. * @type Boolean
  809. */
  810. this.my_rating_date = true;
  811. /**
  812. * Má se rozjíždět kompletní osbah filmu (pokud je k dispozici)?
  813. * @type Boolean
  814. */
  815. this.plot_expand = true;
  816. /**
  817. * Doba platnosti cache v hodinách (výchozí: 48)
  818. * @type Boolean
  819. */
  820. this.cache_expire = 48;
  821. /**
  822. * Horizontální odsazení plovoucích objektů.
  823. * @type Integer
  824. */
  825. this.floating_offset_x = 20;
  826. /**
  827. * Vertikální odsazení plovoucích objektů.
  828. * @type Integer
  829. */
  830. this.floating_offset_y = 20;
  831. /**
  832. * Verze ČSFD Extended
  833. * @type String
  834. */
  835. this.version = version;
  836. /**
  837. * Unixový timestamp nastavení
  838. * @type Integer
  839. */
  840. this.timestamp = $.now();
  841. /**
  842. * Jé :)
  843. * @type Settings
  844. */
  845. var parent = this;
  846.  
  847.  
  848.  
  849.  
  850.  
  851. /**
  852. * Ukládá nastavení v tomto objektu do local storage prohlížeče.
  853. * @returns {undefined}
  854. */
  855. this.save = function(){
  856. this.version = version; // Nastavení aktuální verze skriptu při ukládání
  857. this.timestamp = $.now(); // Nastavení timestampu při ukládání
  858. localStorage.setItem('csfd-e-settings', JSON.stringify(this)); // Uložení JSON nastavení do local storage
  859. };
  860. /**
  861. * Načítá nastavení z local storage prohlížeče a ukládá jej do tohoto objektu.
  862. * @returns {undefined}
  863. */
  864. this.load = function(){
  865. if(localStorage.getItem('csfd-e-settings') !== null){ // Pokud se podařilo načíst nastavení z local storage...
  866. var settings_ls = JSON.parse(localStorage.getItem('csfd-e-settings')); // Převedení načteného JSON na objekt
  867. $.extend(this, settings_ls); // Nastavení atributů tohoto objektu dle údajů z local storage
  868. }else{ // ...jinak se načíst nastavení NEzdařilo (tj. první spuštění skriptu)...
  869. this.fillForm(); // Vyplnění formuláře daty
  870. this.save(); // Uložení nastavení do local storage prohlížeče
  871. }
  872. };
  873.  
  874. /**
  875. *
  876. * @returns {undefined}
  877. */
  878. this.getForm = function(){
  879. this.cache_expire = parseInt($('#csfd-e-settings-cache-expire').val());
  880. this.floating_offset_x = parseInt($('#csfd-e-settings-floating-offset-x').val());
  881. this.floating_offset_y = parseInt($('#csfd-e-settings-floating-offset-y').val());
  882. this.toolbar = $('#csfd-e-settings-toolbar').is(':checked');
  883. this.my_rating_date = $('#csfd-e-settings-my-rating-date').is(':checked');
  884. this.plot_expand = $('#csfd-e-settings-plot-expand').is(':checked');
  885. };
  886.  
  887. /**
  888. *
  889. * @returns {undefined}
  890. */
  891. this.fillForm = function(){
  892. $('#csfd-e-settings-cache-expire').val(this.cache_expire);
  893. $('#csfd-e-settings-floating-offset-x').val(this.floating_offset_x);
  894. $('#csfd-e-settings-floating-offset-y').val(this.floating_offset_y);
  895. if(this.toolbar){
  896. $('#csfd-e-settings-toolbar').attr('checked', true);
  897. }
  898. if(this.my_rating_date){
  899. $('#csfd-e-settings-my-rating-date').attr('checked', true);
  900. }
  901. if(this.plot_expand){
  902. $('#csfd-e-settings-plot-expand').attr('checked', true);
  903. }
  904. };
  905.  
  906. /**
  907. * Binduje akce na tlačítka v nastavení ČSFD Extended.
  908. * @returns {undefined}
  909. */
  910. this.bind = function(){
  911. $('#csfd-e-settings input').bind('change keyup', function(){
  912. parent.getForm();
  913. parent.save();
  914. });
  915. $('#csfd-e-cache-clear-btn').click(function(){ // Kliknutí na tlačítko vymazání cache...
  916. cache.clear(); // Vymazání cache ČSFD Extended
  917. location.reload(); // Refresh stránky
  918. });
  919. $('#csfd-e-cache-disable-btn').click(function(){ // Kliknutí na tlačítko vypnutí cache...
  920. $('#csfd-e-settings-cache-expire').val(0);
  921. $('#csfd-e-settings-cache-expire').change();
  922. });
  923. };
  924. }