TVShow Time Watch Online

Show links to watch tv shows on To-Watch page

  1. // ==UserScript==
  2. // @name TVShow Time Watch Online
  3. // @namespace dannieboi
  4. // @version 0.3
  5. // @description Show links to watch tv shows on To-Watch page
  6. // @author dannieboi
  7. // @match http://www.tvshowtime.com/en
  8. // @grant GM_addStyle
  9. // ==/UserScript==
  10.  
  11. "format register";
  12. (function(global) {
  13.  
  14. var defined = {};
  15.  
  16. // indexOf polyfill for IE8
  17. var indexOf = Array.prototype.indexOf || function(item) {
  18. for (var i = 0, l = this.length; i < l; i++)
  19. if (this[i] === item)
  20. return i;
  21. return -1;
  22. }
  23.  
  24. function dedupe(deps) {
  25. var newDeps = [];
  26. for (var i = 0, l = deps.length; i < l; i++)
  27. if (indexOf.call(newDeps, deps[i]) == -1)
  28. newDeps.push(deps[i])
  29. return newDeps;
  30. }
  31.  
  32. function register(name, deps, declare, execute) {
  33. if (typeof name != 'string')
  34. throw "System.register provided no module name";
  35.  
  36. var entry;
  37.  
  38. // dynamic
  39. if (typeof declare == 'boolean') {
  40. entry = {
  41. declarative: false,
  42. deps: deps,
  43. execute: execute,
  44. executingRequire: declare
  45. };
  46. }
  47. else {
  48. // ES6 declarative
  49. entry = {
  50. declarative: true,
  51. deps: deps,
  52. declare: declare
  53. };
  54. }
  55.  
  56. entry.name = name;
  57.  
  58. // we never overwrite an existing define
  59. if (!defined[name])
  60. defined[name] = entry;
  61.  
  62. entry.deps = dedupe(entry.deps);
  63.  
  64. // we have to normalize dependencies
  65. // (assume dependencies are normalized for now)
  66. // entry.normalizedDeps = entry.deps.map(normalize);
  67. entry.normalizedDeps = entry.deps;
  68. }
  69.  
  70. function buildGroups(entry, groups) {
  71. groups[entry.groupIndex] = groups[entry.groupIndex] || [];
  72.  
  73. if (indexOf.call(groups[entry.groupIndex], entry) != -1)
  74. return;
  75.  
  76. groups[entry.groupIndex].push(entry);
  77.  
  78. for (var i = 0, l = entry.normalizedDeps.length; i < l; i++) {
  79. var depName = entry.normalizedDeps[i];
  80. var depEntry = defined[depName];
  81.  
  82. // not in the registry means already linked / ES6
  83. if (!depEntry || depEntry.evaluated)
  84. continue;
  85.  
  86. // now we know the entry is in our unlinked linkage group
  87. var depGroupIndex = entry.groupIndex + (depEntry.declarative != entry.declarative);
  88.  
  89. // the group index of an entry is always the maximum
  90. if (depEntry.groupIndex === undefined || depEntry.groupIndex < depGroupIndex) {
  91.  
  92. // if already in a group, remove from the old group
  93. if (depEntry.groupIndex !== undefined) {
  94. groups[depEntry.groupIndex].splice(indexOf.call(groups[depEntry.groupIndex], depEntry), 1);
  95.  
  96. // if the old group is empty, then we have a mixed depndency cycle
  97. if (groups[depEntry.groupIndex].length == 0)
  98. throw new TypeError("Mixed dependency cycle detected");
  99. }
  100.  
  101. depEntry.groupIndex = depGroupIndex;
  102. }
  103.  
  104. buildGroups(depEntry, groups);
  105. }
  106. }
  107.  
  108. function link(name) {
  109. var startEntry = defined[name];
  110.  
  111. startEntry.groupIndex = 0;
  112.  
  113. var groups = [];
  114.  
  115. buildGroups(startEntry, groups);
  116.  
  117. var curGroupDeclarative = !!startEntry.declarative == groups.length % 2;
  118. for (var i = groups.length - 1; i >= 0; i--) {
  119. var group = groups[i];
  120. for (var j = 0; j < group.length; j++) {
  121. var entry = group[j];
  122.  
  123. // link each group
  124. if (curGroupDeclarative)
  125. linkDeclarativeModule(entry);
  126. else
  127. linkDynamicModule(entry);
  128. }
  129. curGroupDeclarative = !curGroupDeclarative;
  130. }
  131. }
  132.  
  133. // module binding records
  134. var moduleRecords = {};
  135. function getOrCreateModuleRecord(name) {
  136. return moduleRecords[name] || (moduleRecords[name] = {
  137. name: name,
  138. dependencies: [],
  139. exports: {}, // start from an empty module and extend
  140. importers: []
  141. })
  142. }
  143.  
  144. function linkDeclarativeModule(entry) {
  145. // only link if already not already started linking (stops at circular)
  146. if (entry.module)
  147. return;
  148.  
  149. var module = entry.module = getOrCreateModuleRecord(entry.name);
  150. var exports = entry.module.exports;
  151.  
  152. var declaration = entry.declare.call(global, function(name, value) {
  153. module.locked = true;
  154. exports[name] = value;
  155.  
  156. for (var i = 0, l = module.importers.length; i < l; i++) {
  157. var importerModule = module.importers[i];
  158. if (!importerModule.locked) {
  159. var importerIndex = indexOf.call(importerModule.dependencies, module);
  160. importerModule.setters[importerIndex](exports);
  161. }
  162. }
  163.  
  164. module.locked = false;
  165. return value;
  166. });
  167.  
  168. module.setters = declaration.setters;
  169. module.execute = declaration.execute;
  170.  
  171. if (!module.setters || !module.execute)
  172. throw new TypeError("Invalid System.register form for " + entry.name);
  173.  
  174. // now link all the module dependencies
  175. for (var i = 0, l = entry.normalizedDeps.length; i < l; i++) {
  176. var depName = entry.normalizedDeps[i];
  177. var depEntry = defined[depName];
  178. var depModule = moduleRecords[depName];
  179.  
  180. // work out how to set depExports based on scenarios...
  181. var depExports;
  182.  
  183. if (depModule) {
  184. depExports = depModule.exports;
  185. }
  186. else if (depEntry && !depEntry.declarative) {
  187. depExports = { 'default': depEntry.module.exports, __useDefault: true };
  188. }
  189. // in the module registry
  190. else if (!depEntry) {
  191. depExports = load(depName);
  192. }
  193. // we have an entry -> link
  194. else {
  195. linkDeclarativeModule(depEntry);
  196. depModule = depEntry.module;
  197. depExports = depModule.exports;
  198. }
  199.  
  200. // only declarative modules have dynamic bindings
  201. if (depModule && depModule.importers) {
  202. depModule.importers.push(module);
  203. module.dependencies.push(depModule);
  204. }
  205. else
  206. module.dependencies.push(null);
  207.  
  208. // run the setter for this dependency
  209. if (module.setters[i])
  210. module.setters[i](depExports);
  211. }
  212. }
  213.  
  214. // An analog to loader.get covering execution of all three layers (real declarative, simulated declarative, simulated dynamic)
  215. function getModule(name) {
  216. var exports;
  217. var entry = defined[name];
  218.  
  219. if (!entry) {
  220. exports = load(name);
  221. if (!exports)
  222. throw new Error("Unable to load dependency " + name + ".");
  223. }
  224.  
  225. else {
  226. if (entry.declarative)
  227. ensureEvaluated(name, []);
  228.  
  229. else if (!entry.evaluated)
  230. linkDynamicModule(entry);
  231.  
  232. exports = entry.module.exports;
  233. }
  234.  
  235. if ((!entry || entry.declarative) && exports && exports.__useDefault)
  236. return exports['default'];
  237.  
  238. return exports;
  239. }
  240.  
  241. function linkDynamicModule(entry) {
  242. if (entry.module)
  243. return;
  244.  
  245. var exports = {};
  246.  
  247. var module = entry.module = { exports: exports, id: entry.name };
  248.  
  249. // AMD requires execute the tree first
  250. if (!entry.executingRequire) {
  251. for (var i = 0, l = entry.normalizedDeps.length; i < l; i++) {
  252. var depName = entry.normalizedDeps[i];
  253. var depEntry = defined[depName];
  254. if (depEntry)
  255. linkDynamicModule(depEntry);
  256. }
  257. }
  258.  
  259. // now execute
  260. entry.evaluated = true;
  261. var output = entry.execute.call(global, function(name) {
  262. for (var i = 0, l = entry.deps.length; i < l; i++) {
  263. if (entry.deps[i] != name)
  264. continue;
  265. return getModule(entry.normalizedDeps[i]);
  266. }
  267. throw new TypeError('Module ' + name + ' not declared as a dependency.');
  268. }, exports, module);
  269.  
  270. if (output)
  271. module.exports = output;
  272. }
  273.  
  274. /*
  275. * Given a module, and the list of modules for this current branch,
  276. * ensure that each of the dependencies of this module is evaluated
  277. * (unless one is a circular dependency already in the list of seen
  278. * modules, in which case we execute it)
  279. *
  280. * Then we evaluate the module itself depth-first left to right
  281. * execution to match ES6 modules
  282. */
  283. function ensureEvaluated(moduleName, seen) {
  284. var entry = defined[moduleName];
  285.  
  286. // if already seen, that means it's an already-evaluated non circular dependency
  287. if (entry.evaluated || !entry.declarative)
  288. return;
  289.  
  290. // this only applies to declarative modules which late-execute
  291.  
  292. seen.push(moduleName);
  293.  
  294. for (var i = 0, l = entry.normalizedDeps.length; i < l; i++) {
  295. var depName = entry.normalizedDeps[i];
  296. if (indexOf.call(seen, depName) == -1) {
  297. if (!defined[depName])
  298. load(depName);
  299. else
  300. ensureEvaluated(depName, seen);
  301. }
  302. }
  303.  
  304. if (entry.evaluated)
  305. return;
  306.  
  307. entry.evaluated = true;
  308. entry.module.execute.call(global);
  309. }
  310.  
  311. // magical execution function
  312. var modules = {};
  313. function load(name) {
  314. if (modules[name])
  315. return modules[name];
  316.  
  317. var entry = defined[name];
  318.  
  319. // first we check if this module has already been defined in the registry
  320. if (!entry)
  321. throw "Module " + name + " not present.";
  322.  
  323. // recursively ensure that the module and all its
  324. // dependencies are linked (with dependency group handling)
  325. link(name);
  326.  
  327. // now handle dependency execution in correct order
  328. ensureEvaluated(name, []);
  329.  
  330. // remove from the registry
  331. defined[name] = undefined;
  332.  
  333. var module = entry.declarative ? entry.module.exports : { 'default': entry.module.exports, '__useDefault': true };
  334.  
  335. // return the defined module object
  336. return modules[name] = module;
  337. };
  338.  
  339. return function(main, declare) {
  340.  
  341. var System;
  342.  
  343. // if there's a system loader, define onto it
  344. if (typeof System != 'undefined' && System.register) {
  345. declare(System);
  346. System['import'](main);
  347. }
  348. // otherwise, self execute
  349. else {
  350. declare(System = {
  351. register: register,
  352. get: load,
  353. set: function(name, module) {
  354. modules[name] = module;
  355. },
  356. newModule: function(module) {
  357. return module;
  358. },
  359. global: global
  360. });
  361. System.set('@empty', System.newModule({}));
  362. load(main);
  363. }
  364. };
  365.  
  366. })(typeof window != 'undefined' ? window : global)
  367. /* ('mainModule', function(System) {
  368. System.register(...);
  369. }); */
  370.  
  371. ('src/run.tvshowtime', function(System) {
  372.  
  373. System.register("src/core/TvShowInfo", [], function (_export) {
  374. var _createClass, _classCallCheck, TitleInfo, TvShowInfo;
  375.  
  376. return {
  377. setters: [],
  378. execute: function () {
  379. "use strict";
  380.  
  381. _createClass = (function () { function defineProperties(target, props) { for (var key in props) { var prop = props[key]; prop.configurable = true; if (prop.value) prop.writable = true; } Object.defineProperties(target, props); } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
  382.  
  383. _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } };
  384.  
  385. TitleInfo = (function () {
  386. function TitleInfo(title) {
  387. _classCallCheck(this, TitleInfo);
  388.  
  389. this.title = title;
  390. }
  391.  
  392. _createClass(TitleInfo, {
  393. raw: {
  394. get: function () {
  395. return this.title;
  396. }
  397. },
  398. clean: {
  399. get: function () {
  400. return this.title.replace(/[:,'()\.]/g, "").replace("&", "and");
  401. }
  402. },
  403. dash: {
  404. get: function () {
  405. return this.clean.replace(/\s/g, "-").toLowerCase();
  406. }
  407. },
  408. underscore: {
  409. get: function () {
  410. return this.clean.replace(/\s/g, "_").toLowerCase();
  411. }
  412. },
  413. plus: {
  414. get: function () {
  415. return this.clean.replace(/\s/g, "+").toLowerCase();
  416. }
  417. },
  418. space: {
  419. get: function () {
  420. return this.clean.replace(/\s/g, "%20").toLowerCase();
  421. }
  422. }
  423. });
  424.  
  425. return TitleInfo;
  426. })();
  427.  
  428. TvShowInfo = (function () {
  429. function TvShowInfo(title, season, episode, year) {
  430. _classCallCheck(this, TvShowInfo);
  431.  
  432. this.title = title;
  433. this.season = season;
  434. this.episode = episode;
  435. this.year = year;
  436. }
  437.  
  438. _createClass(TvShowInfo, {
  439. getTitleInfo: {
  440. value: function getTitleInfo() {
  441. return new TitleInfo(this.title);
  442. }
  443. },
  444. getSeasonString: {
  445. value: function getSeasonString(numDigits) {
  446. if (numDigits) {
  447. return this._pad(this.season, numDigits);
  448. }
  449. return this.season.toString();
  450. }
  451. },
  452. getEpisodeString: {
  453. value: function getEpisodeString(numDigits) {
  454. if (numDigits) {
  455. return this._pad(this.episode, numDigits);
  456. }
  457. return this.episode.toString();
  458. }
  459. },
  460. _pad: {
  461. value: function _pad(num, size) {
  462. var s = num + "";
  463. while (s.length < size) s = "0" + s;
  464. return s;
  465. }
  466. }
  467. });
  468.  
  469. return TvShowInfo;
  470. })();
  471.  
  472. _export("default", TvShowInfo);
  473. }
  474. };
  475. });
  476. System.register("src/core/TvShowSiteInfo", [], function (_export) {
  477. var _classCallCheck, TvShowSiteInfo;
  478.  
  479. return {
  480. setters: [],
  481. execute: function () {
  482. "use strict";
  483.  
  484. _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } };
  485.  
  486. TvShowSiteInfo = function TvShowSiteInfo(siteName, options) {
  487. _classCallCheck(this, TvShowSiteInfo);
  488.  
  489. this.siteName = siteName;
  490. this.tvShowPageUrl = options.tvShowPageUrl;
  491. this.episodePageUrl = options.episodePageUrl;
  492. this.searchUrl = options.searchUrl;
  493. this.logoUrl = options.logoUrl;
  494. };
  495.  
  496. _export("default", TvShowSiteInfo);
  497. }
  498. };
  499. });
  500. System.register("src/core/tvShowSitesArray", ["src/core/TvShowSiteInfo"], function (_export) {
  501. var TvShowSiteInfo;
  502. return {
  503. setters: [function (_srcCoreTvShowSiteInfo) {
  504. TvShowSiteInfo = _srcCoreTvShowSiteInfo["default"];
  505. }],
  506. execute: function () {
  507. "use strict";
  508.  
  509. // tv show sites
  510.  
  511. _export("default", [
  512.  
  513. // PutLocker TV Shows
  514. new TvShowSiteInfo("PutLocker TV Shows", {
  515. logoUrl: "http://www.iconj.com/ico/3/s/3s61b5mccc.ico",
  516. tvShowPageUrl: "http://putlockertvshows.me/watch/{TITLE_DASH}/",
  517. episodePageUrl: "http://putlockertvshows.me/watch/{TITLE_DASH}/s{SEASON_2}e{EPISODE_2}.html"
  518. }),
  519.  
  520. // watch series
  521. new TvShowSiteInfo("Watch Series", {
  522. logoUrl: "http://watchseriesfree.to/favicon.ico",
  523. tvShowPageUrl: "http://watchseriesfree.to/serie/{TITLE_UNDERSCORE}",
  524. episodePageUrl: "http://watchseriesfree.to/episode/{TITLE_UNDERSCORE}_s{SEASON}_e{EPISODE}.html",
  525. searchUrl: "http://watchseriesfree.to/search/{TITLE_RAW}"
  526. }),
  527.  
  528. // project free tV
  529. new TvShowSiteInfo("Project Free TV", {
  530. logoUrl: "http://cdn4.projectfreetv.so/wp-content/uploads/2015/01/favicon.ico",
  531. tvShowPageUrl: "http://projectfreetv.ch/free/{TITLE_DASH}/",
  532. episodePageUrl: "http://projectfreetv.ch/{TITLE_DASH}-season-{SEASON}-episode-{EPISODE}/",
  533. searchUrl: "http://projectfreetv.ch/search/{TITLE_SPACE}"
  534. }),
  535.  
  536. // netflix
  537. new TvShowSiteInfo("Netflix", {
  538. logoUrl: "http://www.netflix.com/favicon.ico",
  539. searchUrl: "http://www.netflix.com/search/{TITLE_SPACE}"
  540. }),
  541.  
  542. // amazon
  543. new TvShowSiteInfo("Amazon", {
  544. logoUrl: "http://www.amazon.com/favicon.ico",
  545. searchUrl: "http://www.amazon.com/s/ref=nb_sb_noss?url=search-alias%3Dinstant-video&field-keywords={TITLE_PLUS}&rh=n%3A2858778011%2Ck%3A{TITLE_PLUS}"
  546. }),
  547.  
  548. // hulu
  549. new TvShowSiteInfo("Hulu", {
  550. logoUrl: "http://www.hulu.com/favicon.ico",
  551. searchUrl: "http://www.hulu.com/{TITLE_DASH}"
  552. })]);
  553. }
  554. };
  555. });
  556. System.register("src/renderers/IconRenderer", [], function (_export) {
  557. var _createClass, _classCallCheck, IconRenderer;
  558.  
  559. return {
  560. setters: [],
  561. execute: function () {
  562. "use strict";
  563.  
  564. _createClass = (function () { function defineProperties(target, props) { for (var key in props) { var prop = props[key]; prop.configurable = true; if (prop.value) prop.writable = true; } Object.defineProperties(target, props); } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
  565.  
  566. _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } };
  567.  
  568. //import $ from "jquery";
  569.  
  570. IconRenderer = (function () {
  571. function IconRenderer() {
  572. _classCallCheck(this, IconRenderer);
  573. }
  574.  
  575. _createClass(IconRenderer, null, {
  576. render: {
  577. value: function render(tvShowlinks, tvLinksContainSelector) {
  578.  
  579. var $container = $(tvLinksContainSelector);
  580.  
  581. var iconsHtml = [];
  582. for (var i = 0; i < tvShowlinks.length; i++) {
  583. var linkData = tvShowlinks[i];
  584. var pageUrl = linkData.episodePageUrl || linkData.tvShowPageUrl || linkData.searchUrl;
  585. var iconHtml = "<a href='" + pageUrl + "' title='" + linkData.siteName + "' class='tv-link' target='_blank'>\n <img src='" + linkData.logoUrl + "'/>\n </a>";
  586. iconsHtml.push(iconHtml);
  587. }
  588. $container.append(iconsHtml.join(""));
  589. }
  590. },
  591. addPageStyles: {
  592. value: function addPageStyles() {
  593. var css = "\n a.tv-link {\n padding-right: 2px;\n }\n\n a.tv-link img {\n width: 16px;\n height: 16px;\n -webkit-filter: grayscale(1);\n -webkit-filter: grayscale(100%);\n filter: grayscale(100%);\n filter: url(#greyscale);\n filter: gray;\n }\n\n a.tv-link img:hover {\n -webkit-filter: none;\n filter: none;\n }\n ";
  594.  
  595. GM_addStyle(css);
  596. }
  597. }
  598. });
  599.  
  600. return IconRenderer;
  601. })();
  602.  
  603. _export("default", IconRenderer);
  604. }
  605. };
  606. });
  607. System.register("src/core/getTvShowLinksFromInfo", ["src/core/TvShowInfo", "src/core/TvShowSiteInfo", "src/core/tvShowSitesArray"], function (_export) {
  608. var TvShowInfo, TvShowSiteInfo, siteInfoArray;
  609.  
  610. function setTitlePlaceholderData(str, tvShowInfo) {
  611. if (!str) {
  612. return null;
  613. }var titleInfo = tvShowInfo.getTitleInfo();
  614.  
  615. str = str.replace("{TITLE_PLUS}", titleInfo.plus);
  616. str = str.replace("{TITLE_CLEAN}", titleInfo.clean);
  617. str = str.replace("{TITLE_DASH}", titleInfo.dash);
  618. str = str.replace("{TITLE_UNDERSCORE}", titleInfo.underscore);
  619. str = str.replace("{TITLE_RAW}", titleInfo.raw);
  620. str = str.replace("{TITLE_SPACE}", titleInfo.space);
  621. str = str.replace("{SEASON}", tvShowInfo.getSeasonString());
  622. str = str.replace("{SEASON_2}", tvShowInfo.getSeasonString(2));
  623. str = str.replace("{EPISODE}", tvShowInfo.getEpisodeString());
  624. str = str.replace("{EPISODE_2}", tvShowInfo.getEpisodeString(2));
  625.  
  626. return str;
  627. }
  628.  
  629. return {
  630. setters: [function (_srcCoreTvShowInfo) {
  631. TvShowInfo = _srcCoreTvShowInfo["default"];
  632. }, function (_srcCoreTvShowSiteInfo) {
  633. TvShowSiteInfo = _srcCoreTvShowSiteInfo["default"];
  634. }, function (_srcCoreTvShowSitesArray) {
  635. siteInfoArray = _srcCoreTvShowSitesArray["default"];
  636. }],
  637. execute: function () {
  638. "use strict";
  639.  
  640. _export("default", function (tvShowInfo) {
  641. return siteInfoArray.map(function (value, index, array) {
  642. return new TvShowSiteInfo(value.siteName, {
  643. tvShowPageUrl: setTitlePlaceholderData(value.tvShowPageUrl, tvShowInfo),
  644. episodePageUrl: setTitlePlaceholderData(value.episodePageUrl, tvShowInfo),
  645. searchUrl: setTitlePlaceholderData(value.searchUrl, tvShowInfo),
  646. logoUrl: value.logoUrl
  647. });
  648. });
  649. });
  650. }
  651. };
  652. });
  653. System.register("src/parsers/TvShowTimeParser", ["src/core/getTvShowLinksFromInfo", "src/core/TvShowInfo"], function (_export) {
  654. var getTvShowLinks, TvShowInfo, _createClass, _classCallCheck, TvShowTimeParser;
  655.  
  656. return {
  657. setters: [function (_srcCoreGetTvShowLinksFromInfo) {
  658. getTvShowLinks = _srcCoreGetTvShowLinksFromInfo["default"];
  659. }, function (_srcCoreTvShowInfo) {
  660. TvShowInfo = _srcCoreTvShowInfo["default"];
  661. }],
  662. execute: function () {
  663. "use strict";
  664.  
  665. _createClass = (function () { function defineProperties(target, props) { for (var key in props) { var prop = props[key]; prop.configurable = true; if (prop.value) prop.writable = true; } Object.defineProperties(target, props); } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
  666.  
  667. _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } };
  668.  
  669. TvShowTimeParser = (function () {
  670. function TvShowTimeParser(renderer) {
  671. _classCallCheck(this, TvShowTimeParser);
  672.  
  673. this.renderer = renderer;
  674. }
  675.  
  676. _createClass(TvShowTimeParser, {
  677. parse: {
  678. value: function parse() {
  679. this.renderer.addPageStyles();
  680.  
  681. this._parseElement($("ul.to-watch-list > li[id^='episode-item-']:not(.upcoming)"));
  682.  
  683. var self = this;
  684. // select the target node
  685. var target = document.querySelector("ul.to-watch-list");
  686. // configuration of the observer:
  687. var config = { childList: true };
  688. // create an observer instance
  689. var observer = new MutationObserver(function (mutations) {
  690. mutations.forEach(function (mutation) {
  691. var numAddedNodes = mutation.addedNodes.length;
  692. if (numAddedNodes > 0) {
  693. for (var i = 0; i < numAddedNodes; i++) {
  694. var $node = $(mutation.addedNodes.item(i));
  695. console.dir($node);
  696. if ($node.is("li") && $node.hasClass("episode-item") && !$node.hasClass("upcoming")) {
  697. self._parseElement($node).bind(self, $node)();
  698. }
  699. }
  700. }
  701. });
  702. });
  703. // pass in the target node, as well as the observer options
  704. observer.observe(target, config);
  705. }
  706. },
  707. _parseElement: {
  708. value: function _parseElement($element) {
  709. var _this = this;
  710.  
  711. $element.each(function (index, li) {
  712. var title, season, episode, year;
  713.  
  714. var $li = $(li);
  715.  
  716. var episodeDetails = $li.find("div.episode-details > h2 > a").text();
  717. var regExMatches = episodeDetails.match(/S(\d*)E(\d*)/i);
  718.  
  719. season = parseInt(regExMatches[1]);
  720. episode = parseInt(regExMatches[2]);
  721.  
  722. var titleDetails = $li.find("div.episode-details > a").text();
  723. var indexOfYear = titleDetails.lastIndexOf("(");
  724.  
  725. if (indexOfYear > 0) {
  726. title = titleDetails.substr(0, indexOfYear).trim();
  727. year = parseInt(titleDetails.substring(indexOfYear + 1, titleDetails.lastIndexOf(")")));
  728. } else {
  729. title = titleDetails;
  730. }
  731.  
  732. $li.find("div.nav").prepend("<div class='tv-links-container' style='float:left; width:157px; height:20px; text-align: left'></div>");
  733.  
  734. var tvShowInfo = new TvShowInfo(title, season, episode, year);
  735. var tvShowLinks = getTvShowLinks(tvShowInfo);
  736. var tvLinksContainSelector = "#" + $li.attr("id") + "> div.nav > div.tv-links-container";
  737.  
  738. _this.renderer.render(tvShowLinks, tvLinksContainSelector);
  739. });
  740. }
  741. }
  742. });
  743.  
  744. return TvShowTimeParser;
  745. })();
  746.  
  747. _export("default", TvShowTimeParser);
  748. }
  749. };
  750. });
  751. //import $ from "jquery";
  752. System.register("src/run.tvshowtime", ["src/parsers/TvShowTimeParser", "src/renderers/IconRenderer"], function (_export) {
  753. var Parser, renderer;
  754. return {
  755. setters: [function (_srcParsersTvShowTimeParser) {
  756. Parser = _srcParsersTvShowTimeParser["default"];
  757. }, function (_srcRenderersIconRenderer) {
  758. renderer = _srcRenderersIconRenderer["default"];
  759. }],
  760. execute: function () {
  761. "use strict";
  762.  
  763. new Parser(renderer).parse();
  764. }
  765. };
  766. });
  767. });
  768. //# sourceMappingURL=tvshowtime.js.map

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址