BT MetaSearch

Searches across multiple sources at once.

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

  1. // ==UserScript==
  2. // @name BT MetaSearch
  3. // @description Searches across multiple sources at once.
  4. // @namespace BlackNullerNS
  5. // @include file:///*/btsearch.html*
  6. // @include http*://blacknuller.github.io/btsearch.html*
  7. // @version 1.7
  8. // @grant GM_xmlhttpRequest
  9. // @grant GM_setValue
  10. // @grant GM_getValue
  11. // @require https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js
  12. // @require https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.5/js/bootstrap.min.js
  13. // @require https://cdnjs.cloudflare.com/ajax/libs/jquery.sticky/1.0.1/jquery.sticky.min.js
  14. // ==/UserScript==
  15.  
  16. "use strict";
  17.  
  18. //window.console = {
  19. // log: function () {},
  20. // warn: function () {},
  21. // error: function () {}
  22. //};
  23.  
  24. /*
  25. * jQuery Tiny Pub/Sub
  26. * https://github.com/cowboy/jquery-tiny-pubsub
  27. *
  28. * Copyright (c) 2013 "Cowboy" Ben Alman
  29. * Licensed under the MIT license.
  30. */
  31.  
  32. (function ($) {
  33.  
  34. var o = $({});
  35.  
  36. $.subscribe = function () {
  37. //console.log("Subscribed", arguments[0]);
  38. o.on.apply(o, arguments);
  39. };
  40.  
  41. $.unsubscribe = function () {
  42. //console.log("Unsubscribed", arguments[0]);
  43. o.off.apply(o, arguments);
  44. };
  45.  
  46. $.publish = function () {
  47. //console.log("Fired event", arguments[0]);
  48. return o.trigger.apply(o, arguments);
  49. };
  50.  
  51. }(jQuery));
  52.  
  53.  
  54. var SearchEngine = function () {
  55. var self = this;
  56.  
  57. self.sources = {};
  58. self.sourceCallbacks = {};
  59. self.pageId = false;
  60. self.categories = {};
  61. self.timeout = 8000;
  62. self.protocols = ["http", "https", "ftp", "magnet", "ed2k"];
  63. self.resolutions = ["480p","576p","720p","1080p","1080i"];
  64. self.all = "all";
  65. self.favorites = "favorites";
  66.  
  67. self.nonAlphaNumericRegex = /^[^\u00BF-\u1FFF\u2C00-\uD7FF\w]+$/;
  68. self.matchNonAlphaNumericRegex = /[^\u00BF-\u1FFF\u2C00-\uD7FF\w]+/g;
  69. self.matchFirstNonDigit = /[^\d]/;
  70. self.yearRegexSimple = /(([\ ]{1}|^)(19|20)[\d]{2}([\ ]{1}|$))/g;
  71. self.yearRegexAdvanced = /(([\ ]{1}|^)(19|20)[\d]{2}\-(19|20)[\d]{2}([\ ]{1}|$)|([\ ]{1}|^)\-(19|20)[\d]{2}([\ ]{1}|$)|([\ ]{1}|^)(19|20)[\d]{2}\-([\ ]{1}|$)|([\ ]{1}|^)(19|20)[\d]{2}([\ ]{1}|$))/g;
  72. self.imgTagRegex = /<img /g;
  73. self.dashRegex = /\-/g;
  74. self.queryRegex = /\{query\}/g;
  75. self.spacesRegex = /[ ]+/g;
  76.  
  77. document.head.innerHTML = "\
  78. <meta charset=\"utf-8\">\
  79. <title>BT MetaSearch</title>\
  80. <link rel=\"shortcut icon\" href=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAC5UlEQVQ4jXXR708SARgH8HsVoCjceQfIAYeKKZ5wdxC4stbWqq2t/gF9LW985Zt64Rs4r/EmzCN90dZW/4D/gD9w06mYiIIoWmqCwUZGq7XpC3XfXjQ3s/G8fZ7v58XzJUKhUElVVYyNjUFVVcTjcYiiGCKujSiKoat3qqpiYGCgRIyOjqJQKKBYLKJYLKJcLkMQhMh1QBCESKlUwuHhIY6OjlAoFBCLxUAoioL19XVkMhmsra0hl8vVBPL5PFKpFNLpNNLpNKLRKAhZljE9PY2pqSkkEgnMz8/XBFZWVjA7O4uZmRnMzc0hHA6D6Ovrg6IoGBkZgSzLUBSlJnC5j0QikGUZ/f39ICY8QVRsXTjmPPjOefHLFagJ/HYFccx5UbHzOOa8mPAEQYzzfuxSLPYYBw5MTlTb/DWBY6eAL+YWfKbt+EzbMd4pghjvvoV8kw07lA17DIeqU6wJVNv82Dc58Yl2IE+xGHdLIOJu/3mOYrFNsdijOVSdPvRI0n9AjyRFqi1+7DFObJEstigb4m7fOfGK95WyRis2SSt2KTtKlna8vPNgjed5/WWY53m9HLyfKlvd2CZZbBibsWGw4LU3UCKed/smt4wsUg0m5IxWHFAOfHMFzt7cfZR9FuiJPvUHourth9mKK3h2QDmw0WjGusGCrKEZL7p9k0SvIAzlae58tcGMlN6E7QYLjkgOP5kOnNr8OGUl/KDb8ZXkkG+0It1gxnI9gzzTcn5PEIYISZKYdy1d+8l6Ggs6Elm9GTt6CwqNVpQNNpQNNhw2NmNbb0JGb8ZiHYVkPY23zs59SZKYvw/yiIMJS+vJkpbCopZEUksio6OxVccgq6OxWcdgVdeEBS2JJR2FhKX1pMcjDv7z5V6PMPSB6yhn9JaL5A0jljUkkhoSyxojFjVGfNRQyNaZLt47Osq9HmHoekuXXbNPvOJw+Ca/EGvjK6qjA2N2F2JtfEVxexced3uHBUFgr2b+ALrXp0Lde/kOAAAAAElFTkSuQmCC\">\
  81. ";
  82.  
  83. var searchLink = document.createElement("link");
  84. searchLink.setAttribute("rel", "search");
  85. searchLink.setAttribute("type", "application/opensearchdescription+xml");
  86. $.each({
  87. "BT": "http://pastebin.com/raw.php?i=9qX0S4kh",
  88. "BT: Music": "http://pastebin.com/raw.php?i=WNgesQLe",
  89. "BT: Music FLAC": "http://pastebin.com/raw.php?i=kSia7hEU",
  90. "BT: Movies": "http://pastebin.com/raw.php?i=0HcBtLLY",
  91. "BT: TV": "http://pastebin.com/raw.php?i=hdpjxFh4",
  92. "BT: Magazines": "http://pastebin.com/raw.php?i=b75J8dpe",
  93. "BT: E-Books": "http://pastebin.com/raw.php?i=NKVLw6zT",
  94. "BT: Fiction": "http://pastebin.com/raw.php?i=rVYh6uyy",
  95. "BT: Audiobooks": "http://pastebin.com/raw.php?i=B5Q2X5F0",
  96. "BT: E-Learning": "http://pastebin.com/raw.php?i=9D2zZdiq",
  97. "BT: Comics": "http://pastebin.com/raw.php?i=dkBDPSGj",
  98. "BT: Windows Apps": "http://pastebin.com/raw.php?i=9hzeBKvh",
  99. "BT: Music Video": "http://pastebin.com/raw.php?i=dCjap9da",
  100. "BT: Documentaries": "http://pastebin.com/raw.php?i=xhSAM84F",
  101. "BT: Movies Blu-rays": "http://pastebin.com/raw.php?i=5p2eEUbt",
  102. "BT: Movies Remuxes": "http://pastebin.com/raw.php?i=4f0xB4w8",
  103. "BT: Movies 1080p": "http://pastebin.com/raw.php?i=3UzVniLr",
  104. "BT: Movies 720p": "http://pastebin.com/raw.php?i=5U0Yr40C",
  105. "BT: Movies DVD": "http://pastebin.com/raw.php?i=JsdRX4bb",
  106. "BT: XXX": "http://pastebin.com/raw.php?i=A2vzTfcC",
  107. "BT: PC Games": "http://pastebin.com/raw.php?i=G1kaLhVJ"
  108. }, function(title, href){
  109. var link = searchLink.cloneNode(false);
  110. link.setAttribute("title", title);
  111. link.setAttribute("href", href);
  112. document.head.appendChild(link);
  113. });
  114.  
  115. self.customCSS = document.createElement("style");
  116. self.customCSS.textContent = "\
  117. td { font-size: 90%; } \
  118. h2 { margin-top: 0; margin-bottom: 14px; } \
  119. #container { min-width: 980px; margin-top: 18px; } \
  120. #sidebar .btn-group { display:block; } \
  121. #search-buttons > div { display:block; margin-bottom:3px; } \
  122. #search-buttons > div::after { display: table; clear:both; content: \" \" } \
  123. #sticky > div { margin-bottom: 14px; } \
  124. #search { margin-bottom: 18px; width:100%; padding-right: 22px; } \
  125. #searchclear { position: absolute; right: 5px; top: 0; bottom: 0; height: 14px; margin: auto; font-size: 14px; cursor: pointer; color: #ccc; } \
  126. #searchclear:hover { color: #999; } \
  127. #app-buttons > * { margin-right:6px; } \
  128. #main .panel:last-of-type { margin-bottom:20px; } \
  129. .dropdown-menu { padding-left: 7px; padding-right: 7px; } \
  130. .dropdown-menu button { margin:0 1px 2px 0; } \
  131. #category-favorites > div { display: block; margin: 0 0 12px 0; }\
  132. .torrent-table { margin:0; } \
  133. .torrent-table tr:first-child td { border-top:0; } \
  134. .torrent-table td { font-size: 95%; padding: 2px !important; } \
  135. .torrent-group { padding-left: 0; } \
  136. .icon { background-position: left center; background-repeat: no-repeat; padding-left: 22px; } \
  137. .icon.link-icon { display: inline-block; margin-bottom: -3px; margin-right:8px; width: 16px; height: 16px; padding-left: 0; } \
  138. .btn:focus { outline: none; } \
  139. button.icon { border-radius: 0; border:0; width: 22px; background-position: center center; padding-left: 0; } \
  140. .failed { background-color: #c00; color: #fff } \
  141. .result-panel { margin-bottom: 10px; }\
  142. .result-panel > .panel-heading { padding:6px 8px; cursor: pointer; } \
  143. .result-panel > .panel-body { padding:0; } \
  144. .result-panel > .panel-body > table { margin:0; } \
  145. .result-panel > .panel-body td { padding:5px 8px; } \
  146. .result-panel > .panel-body td:first-child { width: 80%; word-break: break-all; -webkit-hyphens: auto; -moz-hyphens: auto; hyphens: auto; } \
  147. .result-panel > .panel-body td:last-child:not(:only-child) { text-align: center; } \
  148. .result-panel > .panel-body td:not(:first-child):not(:last-child) { text-align: center; color: #999; } \
  149. .result-panel .label { display: inline-block; margin:0; } \
  150. .result-panel .tr-title { font-weight:bold; }\
  151. #no-results::before { content: \"No results: \"; margin-right: 10px; } \
  152. .panel > .close { padding: 3px 12px; } \
  153. .panel-primary > .close { color: white; } \
  154. .cover { padding-left: 90px !important; background-size: 80px auto; background-position: left center; background-repeat: no-repeat; } \
  155. #source-buttons { margin-bottom:18px; line-height:200%; }\
  156. #source-buttons > .btn-group { margin-right: 5px; }\
  157. #source-buttons ul { line-height:150%; }\
  158. #source-buttons .dropdown-menu a { display:inline-block; font-size: 80%; margin-top:10px; }\
  159. ";
  160. document.head.appendChild(self.customCSS);
  161. self.customCSS = $(self.customCSS);
  162.  
  163. self.layout = $(
  164. '<div class="container" id="container">' +
  165. '<div class="row">' +
  166. '<div class="col-md-3 pull-left" id="sidebar">' +
  167. '<div id="sticky">' +
  168. '<div class="btn-group">' +
  169. '<input type="text" class="form-control" id="search">' +
  170. '<span id="searchclear" class="glyphicon glyphicon-remove-circle"></span>' +
  171. '</div>' +
  172. '<div id="search-buttons"></div>' +
  173. '<div id="app-buttons"></div>' +
  174. '</div>' +
  175. '</div>' +
  176. '<div class="col-md-9 pull-right" id="main"></div>' +
  177. '</div>' +
  178. '</div>'
  179. );
  180.  
  181. self.input = $('input', self.layout).first();
  182.  
  183. self.buttons = $('#search-buttons', self.layout);
  184.  
  185. self.mainColumn = $(self.layout[0].firstChild.lastChild)
  186. .on('click', '.close', function (e) {
  187. e.stopPropagation(e);
  188. $(this.parentNode).slideUp("fast", function () {
  189. $(this).remove();
  190. if ($('.close', self.mainColumn).length === 0) {
  191. resetContent();
  192. }
  193. });
  194. })
  195. .on('click', '.panel-title > a', function (e) {
  196. e.stopPropagation();
  197. })
  198. .on('click', '.result-panel > .panel-heading', function () {
  199. $(this.nextElementSibling).slideToggle("fast");
  200. });
  201.  
  202. $('#searchclear', self.layout)
  203. .on("click", function (e) {
  204. e.stopPropagation();
  205.  
  206. if (self.input.val() === "") {
  207. resetContent();
  208. } else {
  209. self.input.val('');
  210. }
  211.  
  212. self.input.val('').focus();
  213. document.location.hash = " ";
  214. });
  215.  
  216. self.div = $(document.createElement("div"));
  217. self.span = $(document.createElement("span"));
  218. self.table = $(document.createElement("table")).addClass("table");
  219. self.tableStriped = self.table.clone().addClass("table-striped");
  220. self.tr = $(document.createElement("tr"));
  221. self.td = $(document.createElement("td"));
  222. self.trtd = self.tr.clone().append(self.td.clone());
  223. self.h2 = $(document.createElement("h2"));
  224. self.h4 = $(document.createElement("h4"));
  225. self.a = $(document.createElement("a"));
  226. self.ab = self.a.clone().attr("target", "_blank");
  227.  
  228. self.iconLink = self.ab.clone().addClass("icon");
  229. self.iconBtn = $('<button type="button" class="btn btn-default btn-xs icon">&nbsp;</button>');
  230. self.categoryBtn = $('<div class="btn-group btn-group-xs"><button class="btn btn-primary"></button><button class="btn btn-primary dropdown-toggle" data-toggle="dropdown"><span class="caret"></span></button><div class="dropdown-menu"></div></div>');
  231. self.resultPanel = $('<div class="panel panel-primary result-panel"><div class="panel-heading"><h4 class="panel-title"></h4></div><div class="panel-body"></div></div>');
  232. self.closeBtn = $('<button type="button" class="close">&times;</button>');
  233. self.failAlert = $('<div class="alert alert-danger alert-dismissible errors"></div>').append(self.closeBtn.clone());
  234. self.warningAlert = $('<div id="no-results" class="alert alert-warning alert-dismissible"></div>').append(self.closeBtn.clone());
  235.  
  236. self.header = null;
  237. self.content = null;
  238.  
  239. self.persistentData = null;
  240. self.persistentDataId = "search-persistent-data";
  241.  
  242. $.subscribe('source-added', function (e, id) {
  243. console.log("Added", id);
  244.  
  245. if (sourceIsEnabled(id)) {
  246. self.enableSource(id);
  247. }
  248. });
  249.  
  250. $.subscribe('source-enabled', function (e, id, data) {
  251. console.log("Enabled", id);
  252.  
  253. data.url[self.favorites] = data.url[Object.keys(data.url)[0]];
  254.  
  255. self.sources[id] = $.extend(data, {
  256. name: id,
  257. iconCss: $(document.createElement('style'))
  258. .text('.icon-' + id + ' { background-image:url("' + data.icon + '"); }')
  259. .insertAfter(self.customCSS)
  260. });
  261.  
  262. var btn, btnId, categories = Object.keys(data.url),
  263. disabledCategories = getDisabledCategories(id);
  264.  
  265. for (var i = 0, len = categories.length; i < len; i++) {
  266. btnId = id + '__' + categories[i];
  267. if (disabledCategories.indexOf(categories[i]) === -1) {
  268. if ($('#' + btnId).length === 0) {
  269. btn = self.iconBtn
  270. .clone()
  271. .addClass('icon-' + id)
  272. .attr('id', btnId)
  273. .attr('title', id)
  274. .data('src', self.sources[id]);
  275. categories[i] === self.favorites ? btn.appendTo(getCategoryGroup(categories[i])[0].firstChild) : btn.appendTo(getCategoryGroup(categories[i])[0].lastChild);
  276. }
  277. } else {
  278. $('#' + btnId).remove();
  279. }
  280. }
  281.  
  282. self.buttons.children(':not(:has("button.icon"))').remove();
  283.  
  284. if ("onEnable" in self.sources[id]) {
  285. self.sources[id].onEnable();
  286. }
  287. });
  288.  
  289. $.subscribe('source-disabled', function (e, id) {
  290. console.log("Disabled", arguments);
  291.  
  292. $('button.icon-' + id, self.buttons).remove();
  293. self.buttons.children(':not(:has("button.icon"))').fadeOut(200, function () {
  294. $(this).remove();
  295. });
  296. self.sources[id].iconCss.remove();
  297.  
  298. delete self.sources[id];
  299. });
  300.  
  301. self.renderPage = function () {
  302. $('<link rel="stylesheet" type="text/css">')
  303. .prependTo(document.head)
  304. .attr('href', 'https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css').load(function () {
  305.  
  306. self.buttons
  307. .on('click', '.icon', onSourceButtonClick)
  308. .on('click', '> div > button:first-of-type', onCategoryButtonClick);
  309.  
  310. resetContent();
  311.  
  312. $.publish("layout-ready");
  313.  
  314. $(document.body).empty().append(self.layout);
  315.  
  316. $(function () {
  317. var sticky = $('#sticky', self.layout);
  318. if ($(window).height() > sticky.height()) {
  319. sticky
  320. .width(sticky.width())
  321. .css("paddingBottom", "20px")
  322. .sticky({topSpacing: 18});
  323. }
  324. self.input.select();
  325. });
  326.  
  327. $(window).on('beforeunload', function () {
  328. var data = getPersistentData();
  329. $.publish("persistent-save", [data]);
  330. GM_setValue(self.persistentDataId, data);
  331. });
  332.  
  333. $.publish("page-rendered");
  334. });
  335. };
  336.  
  337. var resetContent = function () {
  338. self.mainColumn.empty();
  339. self.header = self.h2.clone().hide().appendTo(self.mainColumn);
  340. self.content = self.div.clone().attr("id", "content").appendTo(self.mainColumn);
  341. $.publish("after-content-reset");
  342. };
  343.  
  344. var getEnabledSources = function () {
  345. return self.getPersistentValue("enabledSources", []);
  346. };
  347.  
  348. var sourceIsEnabled = function(id){
  349. return getEnabledSources().indexOf(id) !== -1;
  350. };
  351.  
  352. var getDisabledCategories = function(name){
  353. var disabledCategories = self.getPersistentValue("disabledCategories", {});
  354. return name ? (name in disabledCategories ? disabledCategories[name] : []) : disabledCategories;
  355. };
  356.  
  357. var getCategoryGroup = function (name) {
  358. var group = self.buttons.children('#category-' + name);
  359.  
  360. if (group.length > 0) {
  361. return group;
  362. } else {
  363. var catTitle = (name in self.categories) ? self.categories[name] : name;
  364.  
  365. group = self.categoryBtn
  366. .clone()
  367. .data("category", name)
  368. .data("categoryTitle", catTitle)
  369. .attr("id", "category-" + name);
  370.  
  371. group[0].firstChild.textContent = catTitle;
  372.  
  373. if (name === self.favorites) {
  374. group.removeClass("btn-group");
  375. $(group[0].lastChild).removeClass("dropdown-menu").prependTo(group);
  376. $(group[0].lastChild).remove();
  377. group.prependTo(self.buttons);
  378. } else {
  379. group.appendTo(self.buttons);
  380. }
  381.  
  382. return group;
  383. }
  384. };
  385.  
  386. self.addSource = function (id, callback) {
  387. if (id in self.sourceCallbacks) {
  388. console.warn(id + ' source is already registered, skipping to avoid overwriting.');
  389. return;
  390. }
  391.  
  392. self.sourceCallbacks[id] = callback;
  393.  
  394. $.publish('source-added', [id, callback]);
  395. };
  396.  
  397. self.enableSource = function (id) {
  398.  
  399. console.log("Enabling source " + id);
  400.  
  401. var data = self.sourceCallbacks[id]();
  402.  
  403. if (!('url' in data) || typeof data.url !== 'object') {
  404. console.warn('URL definition for ' + id + ' is missing or incorrect, skipping.');
  405. return;
  406. }
  407.  
  408. var enabledSources = getEnabledSources();
  409.  
  410. if (enabledSources.indexOf(id) === -1) {
  411. enabledSources.push(id);
  412. }
  413.  
  414. $.publish('source-enabled', [id, data]);
  415. };
  416.  
  417. self.disableSource = function (id) {
  418. console.log("Disabling source " + id);
  419.  
  420. var enabledSources = getEnabledSources();
  421. enabledSources.splice(enabledSources.indexOf(id), 1);
  422.  
  423. $.publish('source-disabled', [id]);
  424. };
  425.  
  426. var onCategoryButtonClick = function () {
  427. var btn = $(this);
  428. window.scrollTo(0, 0);
  429. resetContent();
  430.  
  431. self.pageId = Date.now();
  432.  
  433. self.header
  434. .html(btn.text() + ' / <i>' + self.input.val() + '</i>')
  435. .show();
  436.  
  437. var buttons = $(".icon", btn.parent());
  438. var category = btn.parent().data("category");
  439.  
  440. $.publish("batch-request", [category, buttons]);
  441.  
  442. buttons.each(function () {
  443. self.sendRequest($(this).data("src"), category, self.input.val());
  444. });
  445. };
  446.  
  447. var onSourceButtonClick = function (e) {
  448. e.stopPropagation();
  449.  
  450. window.scrollTo(0, 0);
  451.  
  452. if (self.pageId) {
  453. resetContent();
  454. self.pageId = false;
  455. }
  456.  
  457. var btn = $(this);
  458. var category = btn.parent().parent().data("category");
  459.  
  460. $.publish("single-request", [btn, category]);
  461.  
  462. self.sendRequest(btn.data("src"), category, self.input.val());
  463. };
  464.  
  465. self.sendRequest = function (src, category, query, retry) {
  466. if (typeof src === "string") {
  467. if (src in self.sources) {
  468. src = self.sources[src];
  469. } else {
  470. console.warn("Unrecognized source", src);
  471. return false;
  472. }
  473. }
  474.  
  475. if (!(category in src.url)) {
  476. console.warn("No " + category + " category found:", src.url);
  477. return;
  478. }
  479.  
  480. query = query.trim();
  481.  
  482. var i = 0, len = 0,
  483. method = ("method" in src) ? src.method : "GET",
  484. url = typeof src.url[category] === "string" ? [src.url[category]] : src.url[category].slice(),
  485. context = {
  486. valid: true,
  487. src: src,
  488. url: url,
  489. retry: !!retry,
  490. pageId: self.pageId,
  491. category: category,
  492. categoryTitle: (category in self.categories) ? self.categories[category] : category,
  493. originalQuery: query,
  494. query: query.replace(self.matchNonAlphaNumericRegex, ' ').replace(self.spacesRegex, ' ').trim()
  495. };
  496.  
  497. if ("onPrepareQuery" in src) {
  498. if (Array.isArray(src.onPrepareQuery)) {
  499. for (i = 0, len = src.onPrepareQuery.length; i < len; i++) {
  500. src.onPrepareQuery[i](context);
  501. }
  502. } else {
  503. src.onPrepareQuery(context);
  504. }
  505. }
  506.  
  507. var urlen = context.url.length;
  508.  
  509. for (i = 0; i < urlen; i++) {
  510. if (context.url[i].indexOf("{query}") > -1) {
  511. context.url[i] = context.url[i].replace(self.queryRegex, context.query);
  512. } else {
  513. context.url[i] += context.query;
  514. }
  515. context.url[i] = context.url[i].replace(self.spacesRegex, '%20');
  516. }
  517.  
  518. for (i = 0; i < urlen; i++) {
  519. var requestData = {
  520. method: method,
  521. url: context.url[i],
  522. context: context,
  523. timeout: self.timeout,
  524. onload: onRequestSuccess,
  525. onerror: onRequestFail,
  526. ontimeout: onRequestTimeout
  527. };
  528.  
  529. if ("onHttpRequest" in src) {
  530. if (src.onHttpRequest(requestData) === false) {
  531. continue;
  532. }
  533. }
  534.  
  535. console.log(requestData.method, requestData.url);
  536.  
  537. GM_xmlhttpRequest(requestData);
  538. }
  539. };
  540.  
  541. var onRequestSuccess = function (response) {
  542. if (typeof response !== "object" || !("context" in response)) {
  543. self.showFailAlert({});
  544. return;
  545. }
  546.  
  547. if (isOutOfDate(response)) return;
  548.  
  549. var i, data, html,
  550. src = response.context.src,
  551. originalQuery = response.context.originalQuery,
  552. pageId = response.context.pageId;
  553.  
  554. $.publish('request-finish', [response]);
  555.  
  556. if ("onValidate" in src) {
  557. response.context.valid = src.onValidate(response);
  558. }
  559.  
  560. if (response.finalUrl !== null && response.finalUrl.indexOf("/login") !== -1) {
  561. response.context.valid = "login needed";
  562. }
  563.  
  564. if (response.context.valid === false || typeof response.context.valid === "string" || !("finalUrl" in response) || typeof response.finalUrl !== "string") {
  565. self.showFailAlert(response, response.context.valid);
  566. return;
  567. }
  568.  
  569. if (typeof src.onParse === "function") {
  570. data = src.onParse(response);
  571. if (data === null) return;
  572. } else if (typeof src.onParse === "object") {
  573. if ("prepare" in src.onParse) {
  574. html = src.onParse.prepare(response);
  575. } else {
  576. html = response.responseText;
  577. }
  578.  
  579. html = self.replaceImages(html);
  580.  
  581. try {
  582. html = $(html);
  583. } catch (e) {
  584. console.error("Parsing failed", response.responseText);
  585. self.showFailAlert(response, "unexpected content");
  586. return;
  587. }
  588.  
  589. if ('cleanup' in src.onParse) {
  590. for (i = 0; i < src.onParse.cleanup.length; i++) {
  591. $(src.onParse.cleanup[i], html).remove();
  592. }
  593. }
  594.  
  595. data = $(src.onParse.row, html);
  596. } else {
  597. console.error("No parse configuration found for " + src.name, response);
  598. return;
  599. }
  600.  
  601. if ('onFilter' in src) {
  602. var filters = Array.isArray(src.onFilter) ? src.onFilter : [src.onFilter];
  603. for (i = 0; i < filters.length; i++) {
  604. data = filters[i](data, response);
  605. }
  606. }
  607.  
  608. var table = self.tableStriped.clone();
  609.  
  610. var renderFunction = 'onRender' in src ? src.onRender : renderResults;
  611. renderFunction(data, table, response);
  612.  
  613. var categoryTitle = response.context.categoryTitle;
  614. var searchUrl = ("searchUrl" in response.context) ? response.context.searchUrl : response.finalUrl;
  615. var resultLink = self.iconLink.clone()
  616. .attr("href", searchUrl)
  617. .addClass('icon-' + src.name);
  618.  
  619. if (table[0].childElementCount > 0) {
  620. var panel = self.resultPanel.clone()
  621. .addClass('panel-src-' + src.name);
  622.  
  623. resultLink.html(src.name + (pageId ? '' : ' / ' + categoryTitle + ' / <i>' + originalQuery + '</i>'));
  624.  
  625. if ("length" in data) {
  626. resultLink.append(' (' + data.length + ')');
  627. }
  628.  
  629. panel[0].firstChild.firstChild.appendChild(resultLink[0]);
  630. panel.prepend(self.closeBtn.clone());
  631. panel[0].lastChild.appendChild(table[0]);
  632.  
  633. (!response.context.pageId || response.context.retry)
  634. ? panel.prependTo(self.content)
  635. : panel.appendTo(self.content);
  636. } else {
  637. var noResults = $('#no-results');
  638. var alert = noResults.length === 0
  639. ? self.warningAlert.clone().insertBefore(self.content)
  640. : noResults.first();
  641.  
  642. resultLink
  643. .addClass("link-icon")
  644. .attr("title", src.name)
  645. .appendTo(alert);
  646. }
  647. };
  648.  
  649. var renderResults = function (data, table, response) {
  650. var src = response.context.src;
  651. var i = 0, len = 0;
  652.  
  653. data.each(function () {
  654. var n, nlen, context, that = $(this);
  655. var tr = self.tr.clone();
  656. var text = "", td, el, elen;
  657. var texts = [], link = "", linkTest = "", link_prepend = "";
  658. var freeleech = false, vod = false;
  659.  
  660. for (i = 0, len = src.onParse.sel.length; i < len; i++) {
  661. context = that;
  662. text = link = link_prepend = "";
  663. freeleech = vod = false;
  664. td = self.td.clone();
  665.  
  666. if ("class" in src.onParse.sel[i]) {
  667. td.addClass(src.onParse.sel[i].class);
  668. }
  669.  
  670. if ("width" in src.onParse.sel[i]) {
  671. td.width(src.onParse.sel[i].width);
  672. }
  673.  
  674. if ("align" in src.onParse.sel[i]) {
  675. td.css("textAlign", src.onParse.sel[i].align);
  676. }
  677.  
  678. if ("cleanup" in src.onParse.sel[i]) {
  679. context = context.clone();
  680. for (n = 0, nlen = src.onParse.sel[i].cleanup.length; n < nlen; n++) {
  681. $(src.onParse.sel[i].cleanup[n], context).remove();
  682. }
  683. }
  684.  
  685. if (typeof src.onParse.sel[i].text === "function") {
  686. el = src.onParse.sel[i].text(context);
  687. } else {
  688. el = $(src.onParse.sel[i].text, context);
  689. }
  690.  
  691. if (typeof el === "string") {
  692. text = el;
  693. } else if (el instanceof jQuery) {
  694. elen = el.length;
  695. if (elen === 0) {
  696. td.appendTo(tr);
  697. continue;
  698. } else if (elen === 1) {
  699. text = el.text();
  700. if (link === "" && el.prop("tagName") === "A") {
  701. link = el.attr("href");
  702. }
  703. } else {
  704. texts = [];
  705. for (n = 0; n < elen; n++) {
  706. texts.push(el.eq(n).text());
  707. }
  708. text = texts.join(" - ");
  709. }
  710. }
  711.  
  712. text = text.trim();
  713.  
  714. if (text === "") {
  715. td.appendTo(tr);
  716. continue;
  717. }
  718.  
  719. if ("freeleech" in src.onParse.sel[i]) {
  720. if (typeof src.onParse.sel[i].freeleech === "function") {
  721. freeleech = src.onParse.sel[i].freeleech(context);
  722. } else {
  723. freeleech = $(src.onParse.sel[i].freeleech, context).length > 0;
  724. }
  725. }
  726.  
  727. if ("vod" in src.onParse.sel[i]) {
  728. if (typeof src.onParse.sel[i].vod === "function") {
  729. vod = src.onParse.sel[i].vod(context);
  730. } else {
  731. vod = $(src.onParse.sel[i].vod, context).length > 0;
  732. }
  733. }
  734.  
  735. if ("link" in src.onParse.sel[i]) {
  736. if (typeof src.onParse.sel[i].link === "function") {
  737. link = src.onParse.sel[i].link(context);
  738. } else {
  739. link = $(src.onParse.sel[i].link, context);
  740. }
  741. }
  742.  
  743. if (link instanceof jQuery) {
  744. linkTest = link.attr("href");
  745. if (typeof linkTest === "string") {
  746. link = linkTest;
  747. } else if (link[0].textContent.indexOf("http") === 0) {
  748. link = link[0].textContent;
  749. }
  750. }
  751.  
  752. if (typeof link === "string" && link !== "") {
  753. if (self.protocols.indexOf(link.split(":")[0]) === -1) {
  754. if ("link_prepend" in src.onParse.sel[i]) {
  755. link_prepend = src.onParse.sel[i].link_prepend;
  756. } else if ("link_prepend" in src.onParse) {
  757. link_prepend = src.onParse.link_prepend;
  758. }
  759. }
  760. if (link_prepend !== "") {
  761. link = link_prepend + link;
  762. }
  763. td.html('<a href="' + link + '"' + (("noblank" in src.onParse.sel[i] && src.onParse.sel[i].noblank) ? '' : ' target="_blank"') + '>' + text + '</a>');
  764. } else {
  765. td.html(text);
  766. }
  767.  
  768. if (freeleech) {
  769. td.append(' <span class="label label-success">Freeleech</span>');
  770. } else if (vod) {
  771. td.append(' <span class="label label-warning">VOD</span>');
  772. }
  773.  
  774. td.appendTo(tr);
  775. }
  776.  
  777. tr.appendTo(table);
  778. });
  779. };
  780.  
  781. var isOutOfDate = function (response) {
  782. return (typeof response !== "object" || !("context" in response) || !("pageId" in response.context) || self.pageId !== response.context.pageId);
  783. };
  784.  
  785. self.showFailAlert = function (response, msg) {
  786. if (isOutOfDate(response)) return;
  787.  
  788. var errors = $('.errors', self.layout);
  789. var alert = errors.length === 0
  790. ? self.failAlert.clone().insertBefore(self.content)
  791. : errors.first();
  792.  
  793. if (!("context" in response)) {
  794. if (!msg) msg = "(error)";
  795. return alert.append(msg + '&nbsp;&nbsp; ');
  796. }
  797.  
  798. var url = "finalUrl" in response ? response.finalUrl : null;
  799. var srcName = response.context.src.name;
  800. var categoryTitle = response.context.pageId ? null : response.context.categoryTitle;
  801.  
  802. var target = 'target="_blank"';
  803.  
  804. if (url === null) {
  805. if ("url" in response.context && response.context.url.length > 0) {
  806. url = response.context.url[0];
  807. } else {
  808. url = "javascript:alert('Domain not resolved.');";
  809. target = '';
  810. }
  811. msg = 'domain error';
  812. }
  813.  
  814. if (!msg) msg = "error";
  815.  
  816. return alert.append('<a href="' + url + '" ' + target + ' class="icon icon-' + srcName + '">' + srcName + (categoryTitle ? ' / ' + categoryTitle + ' / <i>' + self.input.val() + '</i>' : '') + '</a>&nbsp;(', msg, ')&nbsp;&nbsp; ');
  817. };
  818.  
  819. var onRequestFail = function (response) {
  820. console.log(response);
  821. $.publish('request-finish', [response]);
  822. self.showFailAlert(response, "http request failed");
  823. };
  824.  
  825. var retryTimedOutRequest = function () {
  826. var context = $(this).data("context");
  827. self.sendRequest(context.src, context.category, context.query, true);
  828. $(this).replaceWith('retried');
  829. };
  830.  
  831. var onRequestTimeout = function (response) {
  832. console.log(response);
  833. $.publish('request-finish', [response]);
  834. var retry;
  835. if ("context" in response) {
  836. retry = $('<a href="javascript:void(0)" title="click to retry" class="timeout-link">timeout</a>')
  837. .data("context", response.context)
  838. .on("click", retryTimedOutRequest);
  839. } else {
  840. retry = "timeout";
  841. }
  842.  
  843. self.showFailAlert(response, retry);
  844. };
  845.  
  846. var getPersistentData = function () {
  847. if (!self.persistentData || typeof self.persistentData !== "object") {
  848. self.persistentData = GM_getValue(self.persistentDataId, {});
  849. if (!self.persistentData || typeof self.persistentData !== "object") {
  850. console.log("Invalid persistent data, resetting.");
  851. self.persistentData = {};
  852. }
  853. }
  854.  
  855. return self.persistentData;
  856. };
  857.  
  858. self.getPersistentValue = function (key, def) {
  859. if (typeof key === "string") {
  860. var persistentData = getPersistentData();
  861.  
  862. if (!(key in persistentData)) {
  863. persistentData[key] = def;
  864. }
  865.  
  866. return persistentData[key];
  867. }
  868. };
  869.  
  870. self.setPersistentValue = function (key, value) {
  871. if (typeof key === "string") {
  872. var persistentData = getPersistentData();
  873.  
  874. persistentData[key] = value;
  875.  
  876. return value;
  877. }
  878. };
  879.  
  880. self.humanizeSize = function (size) {
  881. size = parseInt(size);
  882. var i = Math.floor(Math.log(size) / Math.log(1024));
  883. return (size / Math.pow(1024, i)).toFixed(2) * 1 + ' ' + ['B', 'KB', 'MB', 'GB', 'TB'][i];
  884. };
  885.  
  886. self.requireAllWords = function (data, response) {
  887. if (typeof response.context.src.onParse !== "object") {
  888. return data;
  889. }
  890.  
  891. var words = response.context.query.toLowerCase().split(' ');
  892. var wordsLen = words.length;
  893. var sel = response.context.src.onParse.sel[0].text;
  894. var isFunction = typeof sel === "function";
  895.  
  896. return data.filter(function () {
  897. var text;
  898. if (isFunction) {
  899. text = sel($(this));
  900. if (text instanceof jQuery) {
  901. text = text.text();
  902. } else if (text instanceof HTMLElement) {
  903. text = text.textContent;
  904. } else if (typeof text !== "string") {
  905. return true;
  906. }
  907. text = text.toLowerCase();
  908. } else {
  909. text = $(sel, this)[0].textContent.toLowerCase();
  910. }
  911.  
  912. for (var i = 0; i < wordsLen; i++) {
  913. if (text.indexOf(words[i]) === -1) {
  914. return false;
  915. }
  916. }
  917.  
  918. return true;
  919. });
  920. };
  921.  
  922. self.filter3dMovies = function (data, response) {
  923. if (response.context.category.indexOf("movies") === 0 && response.context.category !== "movies_dvd" && response.context.category !== "movies_3d") {
  924. return data.filter(function(){
  925. return this.textContent.indexOf('3D') === -1;
  926. });
  927. } else {
  928. return data;
  929. }
  930. };
  931.  
  932. self.extractResolution = function (context) {
  933. for (var i = 0; i < self.resolutions.length; i++) {
  934. if (context.query.indexOf(self.resolutions[i]) !== -1) {
  935. context.query = context.query.replace(self.resolutions[i], "").replace(self.spacesRegex, ' ').trim();
  936. return self.resolutions[i];
  937. }
  938. }
  939.  
  940. return null;
  941. };
  942.  
  943. self.extractGazelleResolution = function (context) {
  944. var res = self.extractResolution(context);
  945.  
  946. if (res) {
  947. for (var i = 0; i < context.url.length; i++) {
  948. context.url[i] += "&resolution=" + res;
  949. }
  950. }
  951. };
  952.  
  953. self.extractYear = function (context, simple) {
  954. var re = simple ? self.yearRegexSimple : self.yearRegexAdvanced;
  955. var year = context.query.match(re);
  956.  
  957. if (year && year.length > 0) {
  958. year = year[year.length - 1].trim();
  959. context.query = context.query.replace(new RegExp(year.replace(self.dashRegex, '\\\-'), "g"), '').replace(self.spacesRegex, ' ').trim();
  960. } else {
  961. year = null;
  962. }
  963.  
  964. return year;
  965. };
  966.  
  967. self.replaceImages = function (text) {
  968. return text.replace(self.imgTagRegex, '<meta ');
  969. };
  970.  
  971. self.extractGazelleYear = function (context) {
  972. var year = self.extractYear(context);
  973.  
  974. if (year) {
  975. for (var i = 0, len = context.url.length; i < len; i++) {
  976. context.url[i] += "&year=" + year;
  977. }
  978. }
  979. };
  980.  
  981.  
  982.  
  983.  
  984. ////// SETTINGS
  985.  
  986. $.subscribe("layout-ready", function(){
  987. $("#app-buttons", self.layout)
  988. .append($('<button type="button" class="btn btn-default btn-xs"><span class="glyphicon glyphicon-cog"></span></button>').on("click", renderConfigPage))
  989. .append('<a class="btn btn-default btn-xs" href="https://greasyfork.org/en/scripts/12013-bt-metasearch" role="button" target="_blank"><span class="glyphicon glyphicon-globe"></span></a>');
  990. });
  991.  
  992. var renderConfigPage = function () {
  993. resetContent();
  994.  
  995. if (self.pageId === "Settings") {
  996. self.pageId = false;
  997. return;
  998. }
  999.  
  1000. self.pageId = "Settings";
  1001. self.header.text(self.pageId).show();
  1002.  
  1003. var sourceKeys = Object.keys(self.sourceCallbacks).sort(function (a, b) {
  1004. return a.toLowerCase().localeCompare(b.toLowerCase());
  1005. }),
  1006. srcButtons = self.div.clone().attr("id", "source-buttons").appendTo(self.content),
  1007. btnStub = $('<div class="btn-group"><button type="button" class="btn btn-xs"></button><button type="button" class="btn btn-xs dropdown-toggle" data-toggle="dropdown"><span class="caret"></span></button><ul class="dropdown-menu"></ul></div>'),
  1008. disabledCategories = getDisabledCategories(),
  1009. btn, buttonClass,
  1010. enabled = false,
  1011. partially = false;
  1012.  
  1013. for (var i = 0, len = sourceKeys.length; i < len; i++) {
  1014. enabled = sourceIsEnabled(sourceKeys[i]);
  1015. partially = (sourceKeys[i] in disabledCategories);
  1016.  
  1017. btn = btnStub.clone();
  1018. btn[0].firstChild.textContent = btn[0].dataset.src = sourceKeys[i];
  1019. buttonClass = enabled ? (partially ? "btn-warning" : "btn-success") : "btn-danger";
  1020. btn.children('button').addClass(buttonClass);
  1021.  
  1022. srcButtons.append(btn);
  1023.  
  1024. if (enabled) {
  1025. showSourceConfigBox(sourceKeys[i]);
  1026. }
  1027. }
  1028.  
  1029. $(".btn-group > button:first-child", srcButtons).on("click", function () {
  1030. var name = this.parentNode.dataset.src;
  1031. sourceIsEnabled(name) ? self.disableSource(name) : self.enableSource(name);
  1032. });
  1033.  
  1034. srcButtons.on("change", "input", function () {
  1035. var group = $(this).closest(".btn-group");
  1036. var srcName = group[0].dataset.src;
  1037. var checkboxes = $('input[type="checkbox"]', group);
  1038. var total = checkboxes.length;
  1039. var unchecked = checkboxes.filter(":not(:checked)").length;
  1040. var disabled = getDisabledCategories(srcName);
  1041.  
  1042. if (this.checked) {
  1043. if (disabled.indexOf(this.name) !== -1) {
  1044. disabledCategories[srcName].splice(disabledCategories[srcName].indexOf(this.name), 1);
  1045. if (disabledCategories[srcName].length === 0) {
  1046. delete disabledCategories[srcName];
  1047. }
  1048. }
  1049. self.enableSource(srcName);
  1050. } else {
  1051. if (disabled.indexOf(this.name) === -1) {
  1052. if (!(srcName in disabledCategories)) {
  1053. disabledCategories[srcName] = [];
  1054. }
  1055. disabledCategories[srcName].push(this.name);
  1056. }
  1057. total === unchecked
  1058. ? self.disableSource(srcName)
  1059. : self.enableSource(srcName);
  1060. }
  1061. });
  1062.  
  1063. $(".btn-group", srcButtons).on("show.bs.dropdown", function () {
  1064. if (this.lastChild.textContent === "") {
  1065. var data = self.sourceCallbacks[this.textContent]();
  1066. var cats = Object.keys(data.url);
  1067. cats.unshift(self.favorites);
  1068.  
  1069. var disabled = this.textContent in disabledCategories ? disabledCategories[this.textContent] : [];
  1070. var catsHTML = '';
  1071. for (var i = 0, len = cats.length; i < len; i++) {
  1072. catsHTML += '<label class="checkbox-inline"><input type="checkbox" name="' + cats[i] + '"' + (disabled.indexOf(cats[i]) === -1 ? ' checked="checked"' : '') + '> ' + (cats[i] in self.categories ? self.categories[cats[i]] : cats[i]) + '</label><br>';
  1073. }
  1074. //if ("website" in data && data.website) {
  1075. // catsHTML += '<a href="' + data.website + '" target="_blank">Visit website</a>';
  1076. //}
  1077. this.lastChild.innerHTML = catsHTML;
  1078. }
  1079. });
  1080.  
  1081. $(".dropdown-menu", srcButtons).on("click", function (e) {
  1082. e.stopPropagation();
  1083. });
  1084. };
  1085.  
  1086. var showSourceConfigBox = function (name, buttons) {
  1087. if (!("config" in self.sources[name])) return;
  1088.  
  1089. var box = $("#config-" + name);
  1090.  
  1091. if (box.length === 0) {
  1092. box = $('<div id="config-' + name + '" class="panel panel-default"><div class="panel-heading">' + name + '</div><div class="panel-body"></div></div>')
  1093. .insertAfter($("#source-buttons", self.content));
  1094.  
  1095. $(box[0].lastChild)
  1096. .empty()
  1097. .append(self.sources[name].config());
  1098. }
  1099. };
  1100.  
  1101. $.subscribe("source-disabled", function (e, id) {
  1102. if (self.pageId === "Settings") {
  1103. $('#source-buttons', self.content).children('[data-src="' + id + '"]').children("button").addClass("btn-danger").removeClass("btn-success btn-warning");
  1104. $("#config-" + id, self.content).remove();
  1105. }
  1106. });
  1107.  
  1108. $.subscribe("source-enabled", function (e, id, data) {
  1109. if (self.pageId === "Settings") {
  1110. var className = getDisabledCategories(id).length > 0 ? "btn-warning" : "btn-success";
  1111. $('#source-buttons', self.content).children('[data-src="' + id + '"]').children("button").removeClass("btn-danger btn-warning btn-success").addClass(className);
  1112. showSourceConfigBox(id);
  1113. }
  1114. });
  1115.  
  1116. /////// PERSISTENT CONTENT
  1117.  
  1118. var loadPersistentContent = function () {
  1119. if (self.getPersistentValue("query", "")) {
  1120. self.input.val(self.getPersistentValue("query", ""));
  1121. }
  1122.  
  1123. if (self.getPersistentValue("content", "")) {
  1124.  
  1125. self.mainColumn.html(self.getPersistentValue("content", ""));
  1126.  
  1127. $(".timeout-link", self.mainColumn).replaceWith("timeout");
  1128.  
  1129. self.header = $('h2', self.mainColumn);
  1130. if (self.header.length === 0) {
  1131. self.header = self.h2.clone().hide().appendTo(self.mainColumn)
  1132. } else {
  1133. self.header = self.header.first();
  1134. }
  1135.  
  1136. self.content = $('#content', self.mainColumn);
  1137. if (self.content.length === 0) {
  1138. self.content = self.div.clone().attr("id", "content").appendTo(self.mainColumn);
  1139. } else {
  1140. self.content = self.content.first();
  1141. }
  1142.  
  1143. if (self.header.css("display") !== "none") {
  1144. self.pageId = true;
  1145. }
  1146. if (self.header.text() === "Settings") {
  1147. renderConfigPage();
  1148. }
  1149. }
  1150. };
  1151.  
  1152. $.subscribe('layout-ready', loadPersistentContent);
  1153.  
  1154. $.subscribe('persistent-save', function (e, data) {
  1155. data.query = self.input.val().trim();
  1156. data.content = self.mainColumn.html();
  1157. });
  1158.  
  1159.  
  1160. //////// PROGRESS BAR
  1161.  
  1162. var progressBar = null;
  1163. var progressFiller = null;
  1164. var progressSteps = 0;
  1165. var progressStyleSuccess = "progress-bar-success";
  1166. var progressStyleInProcess = "progress-bar-warning";
  1167.  
  1168. var initProgressBar = function () {
  1169. progressBar = $(".progress", self.mainColumn);
  1170. if (progressBar.length === 0) {
  1171. progressBar = $('<div class="progress pull-right"><div class="progress-bar"></div></div>').prependTo(self.mainColumn);
  1172. } else {
  1173. progressBar = progressBar.first();
  1174. }
  1175. progressFiller = $(progressBar[0].firstChild);
  1176. resetProgressBar(true);
  1177. };
  1178.  
  1179. var resetProgressBar = function (hide) {
  1180. if (hide) {
  1181. progressBar.hide();
  1182. }
  1183.  
  1184. progressFiller
  1185. .width(0)
  1186. .data("step", 0)
  1187. .removeClass(progressStyleSuccess)
  1188. .addClass(progressStyleInProcess)
  1189. .text("0%");
  1190. progressSteps = 0;
  1191. };
  1192.  
  1193. var startProgressCount = function (event, category, buttons) {
  1194. resetProgressBar();
  1195.  
  1196. progressSteps = 0;
  1197. buttons.each(function () {
  1198. var src = $(this).data('src');
  1199. if (category in src.url) {
  1200. progressSteps += typeof src.url[category] === "string" ? 1 : src.url[category].length;
  1201. }
  1202. });
  1203.  
  1204. progressBar.show();
  1205. };
  1206.  
  1207. var incrementProgressBar = function (event, response) {
  1208. if ("context" in response && isOutOfDate(response)) return;
  1209.  
  1210. var step = progressFiller.data("step");
  1211. step++;
  1212.  
  1213. if (step === progressSteps) {
  1214. progressFiller
  1215. .width('100%')
  1216. .removeClass(progressStyleInProcess)
  1217. .addClass(progressStyleSuccess)
  1218. .text(step + '/' + step);
  1219. // setTimeout(resetProgressBar, 3000);
  1220. } else {
  1221. var width = (100 / progressSteps * step).toFixed(2);
  1222. if (width > 100) width = 100;
  1223. progressFiller
  1224. .text(step + '/' + progressSteps)
  1225. .width(width + '%')
  1226. .data("step", step);
  1227. }
  1228. };
  1229.  
  1230.  
  1231. self.customCSS.append("\
  1232. .progress { width:120px; margin-top: 7px; margin-bottom:0; }\
  1233. .progress-bar { width:0px; transition: none; }\
  1234. ");
  1235.  
  1236. $.subscribe('layout-ready after-content-reset', initProgressBar);
  1237. $.subscribe('batch-request', startProgressCount);
  1238. $.subscribe('request-finish', incrementProgressBar);
  1239.  
  1240.  
  1241. ///////// HASH NAVIGATION
  1242.  
  1243. var parseQueryString = function (queryString) {
  1244. var params = {}, queries, temp, i, l;
  1245.  
  1246. // Split into key/value pairs
  1247. queries = queryString.split("&");
  1248.  
  1249. // Convert the array of strings into an object
  1250. for (i = 0, l = queries.length; i < l; i++) {
  1251. temp = queries[i].split('=');
  1252. params[temp[0]] = temp[1];
  1253. }
  1254.  
  1255. return params;
  1256. };
  1257.  
  1258. $.subscribe("layout-ready", function(){
  1259. if (document.location.hash.trim().length > 1 && document.location.hash !== self.getPersistentValue("hash", "#")) {
  1260. resetContent();
  1261. }
  1262. });
  1263.  
  1264. $.subscribe("page-rendered", function(){
  1265. if (document.location.hash.trim().length > 1 && document.location.hash !== self.getPersistentValue("hash", "#")) {
  1266. var params = parseQueryString(document.location.hash.slice(1));
  1267. if ("q" in params && params.q.trim() !== "") {
  1268. self.input.val(params.q.replace(/\+/g, ' '));
  1269.  
  1270. if ("cat" in params) {
  1271. if ("src" in params) {
  1272. $("#" + params.src + "__" + params.cat).click();
  1273. } else {
  1274. $("#category-" + params.cat).children('button').first().click();
  1275. }
  1276. } else if ("src" in params) {
  1277. $("#" + params.src + "__" + self.all).click();
  1278. }
  1279. }
  1280. self.setPersistentValue("hash", document.location.hash);
  1281. }
  1282. });
  1283.  
  1284. $.subscribe("batch-request", function (e, category) {
  1285. document.location.hash = "#cat=" + (category === self.favorites ? self.all : category) + "&q=" + self.input.val();
  1286. self.setPersistentValue("hash", document.location.hash);
  1287. });
  1288.  
  1289. $.subscribe("single-request", function(e, btn, category){
  1290. document.location.hash = "#cat=" + (category === self.favorites ? self.all : category) + "&src=" + btn.data("src").name + "&q=" + self.input.val();
  1291. self.setPersistentValue("hash", document.location.hash);
  1292. });
  1293. };
  1294.  
  1295. var bt = new SearchEngine();
  1296.  
  1297. /*
  1298. onHttpRequest(requestData): {}.abort()
  1299. onValidate(response): bool|string
  1300. onParse(response)|object: collection|array
  1301. onFilter(data, response): collection|array
  1302. onRender(data, table): void
  1303. */
  1304.  
  1305. bt.categories = {
  1306. all: "Everywhere",
  1307. favorites: "Favorites",
  1308. music: "Music",
  1309. music_flac: "Music / FLAC",
  1310. movies: "Movies",
  1311. // movies_hd: "Movies: HD",
  1312. movies_1080: "Movies / 1080p",
  1313. movies_720: "Movies / 720p",
  1314. movies_remux: "Movies / Remuxes",
  1315. movies_bluray: "Movies / Blu-rays",
  1316. movies_dvd: "Movies / DVD",
  1317. mvids: "MVids",
  1318. docs: "Docs",
  1319. tv: "TV",
  1320. elearning: "E-Learning",
  1321. ebooks: "E-Books",
  1322. games_pc: "Games / PC",
  1323. mags: "Magazines",
  1324. abooks: "Audiobooks",
  1325. fiction: "Fiction",
  1326. comics: "Comics",
  1327. apps_win: "Apps / Win",
  1328. xxx: "XXX"
  1329. };
  1330.  
  1331. bt.addSource("PTH", function () {
  1332. var wcd = "https://passtheheadphones.me/ajax.php?action=browse&searchstr={query}";
  1333.  
  1334. return {
  1335. website: "https://passtheheadphones.me/",
  1336. url: {
  1337. all: wcd,
  1338. music: wcd + "&filter_cat[1]=1",
  1339. music_flac: wcd + "&filter_cat[1]=1&format=FLAC",
  1340. // music_mp3: wcd + "&filter_cat[1]=1&format=AAC|MP3",
  1341. elearning: wcd + "&filter_cat[3]=1&filter_cat[4]=1&filter_cat[5]=1&filter_cat[7]=1",
  1342. mags: wcd + "&filter_cat[3]=1",
  1343. ebooks: wcd + "&filter_cat[3]=1",
  1344. fiction: wcd + "&filter_cat[3]=1",
  1345. abooks: wcd + "&filter_cat[4]=1",
  1346. comics: wcd + "&filter_cat[7]=1",
  1347. apps_win: wcd + "&filter_cat[2]=1"
  1348. },
  1349. onPrepareQuery: bt.extractGazelleYear,
  1350. onParse: function (response) {
  1351. try {
  1352. var data = JSON.parse(response.responseText);
  1353. } catch (e) {
  1354. bt.showFailAlert(response);
  1355. return null;
  1356. }
  1357.  
  1358. if (!('status' in data) || data.status !== 'success' || !('response' in data) || !('results' in data.response)) {
  1359. bt.showFailAlert(response, "unexpected data");
  1360. return null;
  1361. }
  1362.  
  1363. return data.response.results;
  1364. },
  1365. onFilter: function (data, response) {
  1366. var words = response.context.query.toLowerCase().split(' ');
  1367.  
  1368. response.context.searchUrl = response.finalUrl.replace('ajax.php?action=browse', 'torrents.php?action=basic');
  1369.  
  1370. return data.filter(function (value) {
  1371. for (var i = 0, l = words.length; i < l; i++) {
  1372. if ((('artist' in value && value.artist.toLowerCase().indexOf(words[i]) === -1) || !('artist' in value)) && value.groupName.toLowerCase().indexOf(words[i]) === -1) {
  1373. return false;
  1374. }
  1375. }
  1376.  
  1377. return true;
  1378. });
  1379. },
  1380. onRender: function (data, table) {
  1381. var nl, group, torrent, groupTable, groupTableHTML, torRow, tr, n, score, cue, ed = "", media = "", link, artist;
  1382.  
  1383. var torrentGroupHeader = bt.trtd.clone();
  1384. $(torrentGroupHeader[0].firstChild).append(
  1385. bt.h4.clone().addClass("torrent-group")
  1386. );
  1387.  
  1388. for (var i = 0, l = data.length; i < l; i++) {
  1389. ed = ""; media = "";
  1390. group = data[i];
  1391. link = "https://passtheheadphones.me/torrents.php?id=" + group.groupId;
  1392.  
  1393. if ("torrents" in group) {
  1394. artist = (group.artist === 'Various Artists')
  1395. ? 'Various Artists'
  1396. : bt.ab.clone().attr("href", "https://passtheheadphones.me/artist.php?id=" + group.torrents[0].artists[0].id).html(group.artist);
  1397.  
  1398. tr = torrentGroupHeader.clone();
  1399. tr[0].firstChild.setAttribute("colspan", "3");
  1400. $(tr[0].firstChild.firstChild).append(
  1401. artist,
  1402. " - ",
  1403. bt.ab.clone().attr("href", link).html(group.groupName),
  1404. ' [' + group.groupYear + '] [' + group.releaseType + ']'
  1405. );
  1406.  
  1407. if (group.cover) {
  1408. $(tr[0].firstChild)
  1409. .addClass('cover')
  1410. .css('backgroundImage', 'url(' + group.cover + ')');
  1411. }
  1412.  
  1413. groupTableHTML = "";
  1414. for (n = 0, nl = group.torrents.length; n < nl; n++) {
  1415. torrent = group.torrents[n];
  1416.  
  1417. if (ed !== torrent.remasterTitle || media !== torrent.media) {
  1418. ed = torrent.remasterTitle;
  1419. media = torrent.media;
  1420. groupTableHTML += '<tr><td colspan="3" class="tr-title">' + (ed ? ed : "Original Release") + ' ' + torrent.remasterCatalogueNumber + ' ' + (torrent.remasterYear ? torrent.remasterYear : "") + ' / ' + media + "</td></tr>";
  1421. }
  1422.  
  1423. score = torrent.hasLog ? ' / Log (' + torrent.logScore + '%)' : '';
  1424. cue = torrent.hasCue ? ' / Cue' : '';
  1425.  
  1426. groupTableHTML += '<tr><td><a href="https://passtheheadphones.me/torrents.php?torrentid=' + torrent.torrentId + '" target="_blank">' + torrent.format + ' / ' + torrent.encoding + score + cue + '</a>' + (torrent.isFreeleech ? ' <span class="label label-success">Freeleech</span>' : '') + '</td><td>' + torrent.seeders + '</td><td><a href="https://passtheheadphones.me/torrents.php?action=download&id=' + torrent.torrentId + '">' + bt.humanizeSize(torrent.size) + '</a></td></tr>';
  1427. }
  1428.  
  1429. groupTable = bt.table.clone()
  1430. .addClass("torrent-table")
  1431. .html(groupTableHTML);
  1432.  
  1433. torRow = bt.tr.clone().append(bt.td.clone().attr("colspan", "3"));
  1434. torRow[0].firstChild.appendChild(groupTable[0]);
  1435.  
  1436. table.append(tr, torRow);
  1437. } else {
  1438. table.append('<tr><td><a href="' + link + '" target="_blank">' + group.groupName + '</a></td><td>' + group.seeders + '</td><td><a href="https://passtheheadphones.me/torrents.php?action=download&id=' + group.torrentId + '">' + bt.humanizeSize(group.size) + '</a></td></tr>');
  1439. }
  1440. }
  1441. },
  1442. icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABtUlEQVQ4jd2PT0iTcRjHP6bw6qZIIHh4IXYaBq8YlUXuT6WmhGwXy+pQMRAEQQRpB4faQt4RFBWGGEgSRHTUg4jaJepiogi9bEWHPJiHBkERZHT5dnknc5t494HP6ff9fn7PA8VzFngOfAH+uXwGpoGWEvndKQcm6utNpVKPtbr6SdnsjrLZP1pZScu2H8k0jwmYBCpKCZ6Gw23KZLZl209kWadlGIYMw5Df36jhYVvp9De1tnYKeFZYPm+aPq2vb6q9vUtASZqbW7S2timfzy+gI1/wZnx8UgMDY/uWc8Rig3rwcEbA+1y5xuPxamk5o9raugMFHk+NFpfSqq4+KqAO4JJlBZS6/3pPsAx0w6WsQJK890InT7UJiAIMNp24qFB47+3XQT9cegoEweDlnOAOwN3KSq8i0dvq748rEAgXCa65xVDogoaGErra06uqKq+AJMBoR+dNzc45cpzvisdH9j0hkUhqa+u33r77qkgkJmAMIBmJ9hYJSpEv6L7St7vBIRDcajh+Ri9ffcgXbAAO8NfFATZygvmFj7IazwmIARwBpoBf7k8/gSDFE3Tf5GangPL/2aNkki5A3X4AAAAASUVORK5CYII="
  1443. };
  1444. });
  1445.  
  1446. bt.addSource("APR", function () {
  1447. var wcd = "https://apollo.rip/ajax.php?action=browse&searchstr={query}";
  1448.  
  1449. return {
  1450. website: "https://apollo.rip/",
  1451. url: {
  1452. all: wcd,
  1453. music: wcd + "&filter_cat[1]=1",
  1454. music_flac: wcd + "&filter_cat[1]=1&format=FLAC",
  1455. // music_mp3: wcd + "&filter_cat[1]=1&format=AAC|MP3",
  1456. elearning: wcd + "&filter_cat[3]=1&filter_cat[4]=1&filter_cat[5]=1&filter_cat[7]=1",
  1457. mags: wcd + "&filter_cat[3]=1",
  1458. ebooks: wcd + "&filter_cat[3]=1",
  1459. fiction: wcd + "&filter_cat[3]=1",
  1460. abooks: wcd + "&filter_cat[4]=1",
  1461. comics: wcd + "&filter_cat[7]=1",
  1462. apps_win: wcd + "&filter_cat[2]=1"
  1463. },
  1464. onPrepareQuery: bt.extractGazelleYear,
  1465. onParse: function (response) {
  1466. try {
  1467. var data = JSON.parse(response.responseText);
  1468. } catch (e) {
  1469. bt.showFailAlert(response);
  1470. return null;
  1471. }
  1472.  
  1473. if (!('status' in data) || data.status !== 'success' || !('response' in data) || !('results' in data.response)) {
  1474. bt.showFailAlert(response, "unexpected data");
  1475. return null;
  1476. }
  1477.  
  1478. return data.response.results;
  1479. },
  1480. onFilter: function (data, response) {
  1481. var words = response.context.query.toLowerCase().split(' ');
  1482.  
  1483. response.context.searchUrl = response.finalUrl.replace('ajax.php?action=browse', 'torrents.php?action=basic');
  1484.  
  1485. return data.filter(function (value) {
  1486. for (var i = 0, l = words.length; i < l; i++) {
  1487. if ((('artist' in value && value.artist.toLowerCase().indexOf(words[i]) === -1) || !('artist' in value)) && value.groupName.toLowerCase().indexOf(words[i]) === -1) {
  1488. return false;
  1489. }
  1490. }
  1491.  
  1492. return true;
  1493. });
  1494. },
  1495. onRender: function (data, table) {
  1496. var nl, group, torrent, groupTable, groupTableHTML, torRow, tr, n, score, cue, ed = "", media = "", link, artist;
  1497.  
  1498. var torrentGroupHeader = bt.trtd.clone();
  1499. $(torrentGroupHeader[0].firstChild).append(
  1500. bt.h4.clone().addClass("torrent-group")
  1501. );
  1502.  
  1503. for (var i = 0, l = data.length; i < l; i++) {
  1504. ed = ""; media = "";
  1505. group = data[i];
  1506. link = "https://apollo.rip/torrents.php?id=" + group.groupId;
  1507.  
  1508. if ("torrents" in group) {
  1509. artist = (group.artist === 'Various Artists')
  1510. ? 'Various Artists'
  1511. : bt.ab.clone().attr("href", "https://apollo.rip/artist.php?id=" + group.torrents[0].artists[0].id).html(group.artist);
  1512.  
  1513. tr = torrentGroupHeader.clone();
  1514. tr[0].firstChild.setAttribute("colspan", "3");
  1515. $(tr[0].firstChild.firstChild).append(
  1516. artist,
  1517. " - ",
  1518. bt.ab.clone().attr("href", link).html(group.groupName),
  1519. ' [' + group.groupYear + '] [' + group.releaseType + ']'
  1520. );
  1521.  
  1522. if (group.cover) {
  1523. $(tr[0].firstChild)
  1524. .addClass('cover')
  1525. .css('backgroundImage', 'url(' + group.cover + ')');
  1526. }
  1527.  
  1528. groupTableHTML = "";
  1529. for (n = 0, nl = group.torrents.length; n < nl; n++) {
  1530. torrent = group.torrents[n];
  1531.  
  1532. if (ed !== torrent.remasterTitle || media !== torrent.media) {
  1533. ed = torrent.remasterTitle;
  1534. media = torrent.media;
  1535. groupTableHTML += '<tr><td colspan="3" class="tr-title">' + (ed ? ed : "Original Release") + ' ' + torrent.remasterCatalogueNumber + ' ' + (torrent.remasterYear ? torrent.remasterYear : "") + ' / ' + media + "</td></tr>";
  1536. }
  1537.  
  1538. score = torrent.hasLog ? ' / Log (' + torrent.logScore + '%)' : '';
  1539. cue = torrent.hasCue ? ' / Cue' : '';
  1540.  
  1541. groupTableHTML += '<tr><td><a href="https://apollo.rip/torrents.php?torrentid=' + torrent.torrentId + '" target="_blank">' + torrent.format + ' / ' + torrent.encoding + score + cue + '</a>' + (torrent.isFreeleech ? ' <span class="label label-success">Freeleech</span>' : '') + '</td><td>' + torrent.seeders + '</td><td><a href="https://apollo.rip/torrents.php?action=download&id=' + torrent.torrentId + '">' + bt.humanizeSize(torrent.size) + '</a></td></tr>';
  1542. }
  1543.  
  1544. groupTable = bt.table.clone()
  1545. .addClass("torrent-table")
  1546. .html(groupTableHTML);
  1547.  
  1548. torRow = bt.tr.clone().append(bt.td.clone().attr("colspan", "3"));
  1549. torRow[0].firstChild.appendChild(groupTable[0]);
  1550.  
  1551. table.append(tr, torRow);
  1552. } else {
  1553. table.append('<tr><td><a href="' + link + '" target="_blank">' + group.groupName + '</a></td><td>' + group.seeders + '</td><td><a href="https://apollo.rip/torrents.php?action=download&id=' + group.torrentId + '">' + bt.humanizeSize(group.size) + '</a></td></tr>');
  1554. }
  1555. }
  1556. },
  1557. icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAA00lEQVQ4jWNgqDqqw1B7WB8FVx7SYkAH2NTVHNRkYGBgYGCsPf4fHaPqbmDCr6bmWCmGZM3xN3D52uNfMeSrj8aiWlJz7A+momPSDLVHtDHEa49/xfAiLq8Q9h4yqD5aRFBz9bFI3AYwMDAw1Bz/hVNz7bHP+DUT8ApRmhkqDgviNCBhPwfZthPnitpjpwgaUHN8K3bNlYfVMBVjpg3G2uP/Gar2iBPldAaH/SwMJTu5CXul9vhjLE5dDpevObYXi+suQyWPOhETWNi9ckgPf6ASAQASZ0Wj5NAOMQAAAABJRU5ErkJggg=="
  1558. };
  1559. });
  1560.  
  1561. bt.addSource("Spotify", function () {
  1562.  
  1563. var marketKey = "Spotify_Market";
  1564. var marketValue = bt.getPersistentValue(marketKey, "");
  1565.  
  1566. return {
  1567. url: {
  1568. music: "https://api.spotify.com/v1/search?type=artist,album&limit=50&q={query}"
  1569. },
  1570. onEnable: function () {
  1571. if (bt.customCSS.text().indexOf(".panel-src-Spotify") !== -1) return;
  1572.  
  1573. bt.customCSS.append("\
  1574. .panel-src-Spotify > .panel-body a {\
  1575. border:0;\
  1576. border-radius:6px;\
  1577. position:relative;\
  1578. display:inline-block;\
  1579. margin:0 8px 4px 0;\
  1580. overflow:hidden;\
  1581. color:#fff;\
  1582. padding:20px 10px;\
  1583. text-align:center;\
  1584. font-size:90%;\
  1585. font-weight: 600 !important;\
  1586. background-repeat:no-repeat;\
  1587. background-size:cover;\
  1588. color:#fff;\
  1589. width:150px;\
  1590. height:150px;\
  1591. min-height:150px;\
  1592. word-break:normal !important;\
  1593. }\
  1594. .panel-src-Spotify > .panel-body a:hover {\
  1595. text-decoration:none;\
  1596. }\
  1597. .panel-src-Spotify > .panel-body span {\
  1598. padding:3px 5px;\
  1599. background-color:rgba(0,0,0,0.6);\
  1600. border-radius:5px;\
  1601. }\
  1602. .panel-src-Spotify > .panel-body a:hover span {\
  1603. background-color:rgba(0,0,0,0.8);\
  1604. }\
  1605. .panel-src-Spotify > .panel-body a:focus {\
  1606. outline:none;\
  1607. }\
  1608. .panel-src-Spotify > .panel-body a:hover > span {\
  1609. bottom:2px;\
  1610. }\
  1611. ");
  1612. },
  1613. onPrepareQuery: function (context) {
  1614. bt.extractYear(context);
  1615. var market = bt.getPersistentValue(marketKey, "");
  1616.  
  1617. if (market !== "") {
  1618. for (var i = 0, l = context.url.length; i < l; i++) {
  1619. context.url[i] += "&market=" + market;
  1620. console.log(context.url[i]);
  1621. }
  1622. }
  1623. },
  1624. onParse: function (response) {
  1625. try {
  1626. var data = JSON.parse(response.responseText);
  1627. } catch (e) {
  1628. console.error("Unexpected Spotify response", response.responseText);
  1629. bt.showFailAlert(response, "unexpected response");
  1630. return null;
  1631. }
  1632.  
  1633. if (!('albums' in data) && !('artist' in data)) {
  1634. bt.showFailAlert(response, "unexpected data");
  1635. return null;
  1636. }
  1637.  
  1638. response.context.searchUrl = "https://play.spotify.com/search/" + encodeURIComponent(response.context.query);
  1639.  
  1640. return data;
  1641. },
  1642. onFilter: function (data) {
  1643. var filter = ["karaoke", "reproduction", "in the style of", "lullaby versions of", " tribute to "];
  1644. var filterLen = filter.length;
  1645. data.albums.items = data.albums.items.filter(function (album) {
  1646. var a = album.name.toLowerCase();
  1647. for (var i = 0; i < filterLen; i++) {
  1648. if (a.indexOf(filter[i]) !== -1) {
  1649. return false;
  1650. }
  1651. }
  1652. return true;
  1653. });
  1654.  
  1655. return data;
  1656. },
  1657. onRender: function (data, table) {
  1658. var dataTypes = ["albums", "artists"];
  1659.  
  1660. var releaseTypes = {
  1661. artist: "Artists",
  1662. album: "Albums",
  1663. single: "Singles",
  1664. compilation: "Compilations"
  1665. };
  1666.  
  1667. for (var i = 0, l = dataTypes.length; i < l; i++) {
  1668. $.each(data[dataTypes[i]].items, function (index, item) {
  1669. if (!("images" in item)) return;
  1670. var trhead, td;
  1671.  
  1672. var type = item.type === "album" ? item.album_type : item.type;
  1673.  
  1674. td = $(".spotify-type-" + type, table);
  1675.  
  1676. if (td.length === 0) {
  1677. var typeTitle = type in releaseTypes ? releaseTypes[type] : type;
  1678.  
  1679. trhead = bt.tr.clone().append(bt.td.clone().addClass("tr-title").text(typeTitle));
  1680.  
  1681. (type === "album" || type === "artist") ? trhead.prependTo(table) : trhead.appendTo(table);
  1682.  
  1683. td = $(bt.trtd.clone().insertAfter(trhead)[0].firstChild).addClass("spotify-covers spotify-type-" + type);
  1684. }
  1685.  
  1686. var link = bt.ab.clone()
  1687. .attr("href", item.external_urls.spotify)
  1688. .appendTo(td);
  1689.  
  1690. if (item.images.length === 0) {
  1691. link.css("border", "1px solid #ccc");
  1692. } else {
  1693. var img = item.type === "artist" ? 2 : 1;
  1694. link.css("backgroundImage", "url(" + item.images[img].url + ")");
  1695. }
  1696.  
  1697. bt.span.clone()
  1698. .text(item.name)
  1699. .appendTo(link);
  1700.  
  1701. });
  1702. }
  1703.  
  1704. },
  1705. config: function () {
  1706. var markets = ["AD", "AR", "AU", "BE", "BG", "BO", "BR", "CL", "CO", "CR", "CY", "CZ", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "UY"];
  1707.  
  1708. var select = $('<select class="form-control btn btn-xs"><option value="">Any</option></select>')
  1709. .on("change", function () {
  1710. bt.setPersistentValue(marketKey, $(this).val());
  1711. });
  1712.  
  1713. var current, opt = $(document.createElement('option'));
  1714.  
  1715. for (var i = 0, l = markets.length; i < l; i++) {
  1716. current = opt.clone().text(markets[i]).appendTo(select);
  1717. if (markets[i] === marketValue) {
  1718. current.prop("selected", 1);
  1719. }
  1720. }
  1721.  
  1722. return $('<div class="form-inline">Select your country:</div>').append(' ', select);
  1723. },
  1724. icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACiElEQVQ4jW2Ty0vUcRTFPwOtWkSblq0iaFOroCBrrEWQPahFtchFhbSQkAgqXaSlNs5vZtTB52ho5QNUwtGZdB6/eeQrm2bS1KjILBLmvxg5Lb4DpXTg8P1yOffec78P2IHW9K7S3owj3Jd15PtzbPXn2OrLOvK9GUe4Nb2rdKd+GzoXHKmBNTT0CY2soNerhqMraHgFDa6hzgVH6r/J7bNs9n9Er7JoZBkF19DUF8OJNTS6jAZy6MUS6phnc1uyf4bU8yx6mUMjq2jiK4quI/snsjdQ5Dsa/4yGl1B/Bj3PIv8MxoknjjOQQ52z6F4LulqJSi+hY6fRibOo7DqqqEZP+9Cr92aU3kXUk0WeOE58ScKBDCqvRmB45DgqvYhOnUcHD/+NAzp5EVkTqHsR+ZKEsWzybbOoex51JFBwHYV+oMlvaHoDRX+hqQ0UsFHFY1Nk7z4UyCBPkjyeOAV/2ti6VoX2H9jeEdCZK+hhGxpaQi8+oNYYanuLvHEKuKMUmpOoawGV3UR36tHTQdQ8idxj6GE7ulzxt9hdL+peQC0pZMUo4IqS9yWQP4V6FpE7iB51oSoPuu9HjcPmaodXUaUb3apF7bOoOYGaouRpnCbkTSD/W3TuJtq9B5VcMm7O3kCHjprOJReQFUIdc6jZRt4EaowQon4cpzeNrCjyp42ga84camAe9bxDHTOovAaV3TYaK4Z8aVQ/jhOAhjBJy0buCPLGkC+OWmzD1uLqT5m53RFk2aghTHLba3wS4ndTDLmmi6II8kSNMytiYq5p5I6jJyF+//c/1E2SdNtG6JpCz96Y1TWFXMXOdZM7Ou/EgzGctUFCdRPka4MUaoMUivtQzVhx5n/wB92/wL8+YspgAAAAAElFTkSuQmCC"
  1725. };
  1726. });
  1727.  
  1728. bt.addSource("WFL", function () {
  1729. var wfl = "https://www.waffles.fm/browse.php?q={query}";
  1730.  
  1731. return {
  1732. url: {
  1733. all: wfl,
  1734. music: wfl + ' (FLAC OR MP3 OR AAC)',
  1735. music_flac: wfl + ' FLAC',
  1736. fiction: wfl + "&c86=1",
  1737. mags: wfl + "&c87=1",
  1738. ebooks: wfl + "&c86=1&c87=1",
  1739. abooks: wfl + "&c89=1&c90=1",
  1740. comics: wfl + "&c88=1",
  1741. apps_win: wfl + "&c83=1",
  1742. elearning: wfl + "&c89=1&c90=1&c88=1&c86=1&c87=1&c93=1"
  1743. },
  1744. onParse: {
  1745. row: "#browsetable > tbody > tr:not(:first-child)",
  1746. link_prepend: "https://www.waffles.fm",
  1747. sel: [
  1748. {text: "> td:eq(1) a[href*='/details.php']:eq(0)"},
  1749. {text: "> td:eq(7)"},
  1750. {text: "> td:eq(5)", link: "a[href*='/download.php']:eq(0)", noblank: true}
  1751. ]
  1752. },
  1753. icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAP0lEQVQ4jWNgGF5g3969/9ExSZqxAaINgRlQU1UFxzADCLoMl+34AIoh2GzHh3EaMOoCClwAM4QUTFTiogsAAK9ZxAOBV0RTAAAAAElFTkSuQmCC"
  1754. };
  1755. });
  1756.  
  1757. bt.addSource("XBT", function () {
  1758. var xbt = "https://xbtmusic.org/torrents-search.php?s=i&b=d&cat=0&active=0&page=0&own=&mode=2&search_pedrovia={query}";
  1759.  
  1760. return {
  1761. url: {
  1762. all: xbt,
  1763. music: xbt,
  1764. music_flac: xbt,
  1765. mvids: [xbt + "&cat=29", xbt + "&cat=201"],
  1766. docs: xbt + "&cat=134",
  1767. abooks: xbt + "&cat=54"
  1768. },
  1769. onParse: {
  1770. cleanup: ["td.small a"],
  1771. row: "table.submain > tbody > tr",
  1772. link_prepend: "https://xbtmusic.org",
  1773. sel: [
  1774. {text: "a[href*='/torrents-details.php?id=']:eq(0)"},
  1775. {text: "> td:eq(2) > table:eq(0) > tbody > tr > td:eq(1) > span:eq(0)"},
  1776. {
  1777. text: function (context) {
  1778. return $("> td:eq(2) > table:eq(0) > tbody > tr > td:eq(0)", context).text().split('in')[0];
  1779. },
  1780. link: function (context) {
  1781. var id = $("a[href*='/torrents-details.php?id=']:eq(0)", context).attr('href').split('id=')[1].split(bt.matchFirstNonDigit)[0];
  1782. return '/download.php?id=' + id;
  1783. },
  1784. noblank: true
  1785. }
  1786. ]
  1787. },
  1788. icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAB/0lEQVQ4jZWTP4jacBTHf6Xc0g539jqVdiiloy4OAYlHklpiIFAswSSo8cCocVCiiEhdghgQhPNstboG63WyDuJSoX/QoYtDdBBKC4Wj6+nQSrkOr0vvqNwdNd/1vc97j++Xh9AlAoDt5XJpA4Cty+pXqtlsUrIs9xVFOZUkCViW/R6NRg9M07z7b99oNLJdgPP5PK8oCmQymZf1ev2Jqqr7NE1/wnEcAoHAV9M07yOEEMdxdZqmF9Vq9fAcNk3zJsuyxxRFAc/znwuFwrOzmiRJH10uF+RyuXcIISSK4ojjONB1/fn5AMMwdgmC+GW328HhcIDb7YZIJHILIYS63e4ejuOnDMP87vV6D8bj8Z3BYPAYAK6tXSCK4jGGYYBhGDAM81NV1Z2/ht5gGOaEJEnQNM2PEEKz2cwFANfXPGi32y5Zlo8kSTpqtVqPzjYAgC0cDi+cTieoqvo0nU6/4TgOisXii42SAYBtQRBOcBwHwzD4eDzeJQhi0Wg0Dv9PI4Tm8/kuSZI/PB4P9Pv9hwCw1el0LsZ4lWq1mo+iKPD5fB/WjNtUwWDwvdfrBU3TCMuwruv7JEmCLMtty3CpVAoLggCJROKLpZ8YDof2ZDL5yu/3QyqVer1are5tBE4mE7pSqVSz2ey3UCj0Vtd12tLJ0+mUKZfLe7FY7LYV7g8x5uX55Jg5HQAAAABJRU5ErkJggg=="
  1789. };
  1790. });
  1791.  
  1792. bt.addSource("FL", function () {
  1793. var filelist = "https://filelist.ro/browse.php?searchin=1&sort=0&incldead=1&search={query}";
  1794.  
  1795. return {
  1796. url: {
  1797. all: filelist,
  1798. music: filelist + "&cat=11",
  1799. music_flac: filelist + " FLAC&cat=11",
  1800. movies: filelist,
  1801. movies_bluray: filelist + "&cat=20",
  1802. movies_remux: filelist + " REMUX",
  1803. movies_1080: [filelist + " 1080p&cat=4", filelist + " 1080p&cat=19", filelist + " 1080p&cat=15"],
  1804. movies_720: [filelist + " 720p&cat=4", filelist + " 720p&cat=19", filelist + " 720p&cat=15"],
  1805. movies_dvd: [filelist + "&cat=2", filelist + "&cat=3"],
  1806. docs: filelist + " documentary&searchin=0",
  1807. ebooks: [filelist + "&cat=16", filelist + "&cat=18"],
  1808. mags: filelist + "&cat=16",
  1809. tv: [filelist + "&cat=15&sort=2", filelist + "&cat=21&sort=2", filelist + "&cat=14&sort=2"],
  1810. elearning: filelist,
  1811. apps_win: filelist + "&cat=8",
  1812. mvids: filelist + "&cat=12",
  1813. xxx: filelist + "&searchin=0&cat=7"
  1814. },
  1815. onParse: {
  1816. row: ".torrentrow",
  1817. link_prepend: "https://filelist.ro/",
  1818. sel: [
  1819. {
  1820. text: "a[href*='details.php?id=']:eq(0)",
  1821. freeleech: "meta[alt='FreeLeech']"
  1822. },
  1823. {text: "> .torrenttable:eq(8)"},
  1824. {text: "> .torrenttable:eq(6)", link: "a[href*='download.php']:eq(0)", noblank: true}
  1825. ]
  1826. },
  1827. onFilter: [bt.filter3dMovies, function(data, response){
  1828. if (response.context.category === "movies_bluray") {
  1829. return data.filter(function(){
  1830. return this.textContent.toLowerCase().indexOf('remux') === -1;
  1831. });
  1832. } else {
  1833. return data;
  1834. }
  1835. }],
  1836. icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAUUlEQVQ4jWPQaVn6nxLMoNOy9L+Orj55eBgaoOkT/V9+0VUUDBMjyQBkRRQboJZSQ7wBMMXIzifJAOXqeRiKsYnhjQVsitEDdhCngwE0gAIMAOcx0Mby0F1/AAAAAElFTkSuQmCC"
  1837. };
  1838. });
  1839.  
  1840. bt.addSource("PTP", function () {
  1841. var ptpMovies = "https://passthepopcorn.me/torrents.php?action=advanced&filter_cat[1]=1&filter_cat[2]=1&filter_cat[3]=1&order_by=relevance&grouping=1&searchstr={query}";
  1842.  
  1843. return {
  1844. url: {
  1845. all: "https://passthepopcorn.me/torrents.php?action=basic&order_by=relevance&grouping=1&searchstr={query}",
  1846. movies: ptpMovies,
  1847. // movies_hd: ptpMovies + "&resolution=anyhd",
  1848. movies_dvd: ptpMovies + "&format[]=DVD5&format[]=DVD9&grouping=0",
  1849. movies_bluray: ptpMovies + "&format[]=BD25&format[]=BD50&grouping=0",
  1850. movies_remux: ptpMovies + "&remastertitle=Remux",
  1851. movies_720: ptpMovies + "&resolution=720p",
  1852. movies_1080: ptpMovies + "&resolution=anyhd",
  1853. docs: ptpMovies + "&taglist=documentary",
  1854. mvids: "https://passthepopcorn.me/torrents.php?action=advanced&order_by=relevance&filter_cat[5]=1&searchstr={query}",
  1855. tv: "https://passthepopcorn.me/torrents.php?action=advanced&order_by=relevance&filter_cat[3]=1&searchstr={query}"
  1856. },
  1857. onPrepareQuery: [bt.extractGazelleYear, bt.extractGazelleResolution],
  1858. onParse: function (response) {
  1859. // If redirected to a single search result
  1860. if (response.finalUrl.indexOf('torrents.php?id=') !== -1) {
  1861. var html = $(bt.replaceImages(response.responseText));
  1862.  
  1863. $('.torrent-info-link span', html).remove();
  1864.  
  1865. var torrents = [];
  1866.  
  1867. $(".group_torrent_header", html).each(function () {
  1868. var row = $(this);
  1869. var cols = row.children();
  1870. var href = $("a[title='Permalink']", row).first().attr('href');
  1871.  
  1872. var title = $(".torrent-info-link", row);
  1873. var seeding = title.hasClass("torrent-info-link--user-seeding");
  1874. title = title.first().text();
  1875.  
  1876. torrents.push({
  1877. Title: '<a href="' + href + '"' + (seeding ? ' class="torrent-info-link--user-seeding"' : '') + '>' + title + '</a>',
  1878. TorrentId: href.split("torrentid=")[1],
  1879. Size: cols.eq(1).text(),
  1880. Seeders: cols.eq(3).text()
  1881. });
  1882. });
  1883.  
  1884. return [{
  1885. GroupId: response.finalUrl.split('?id=')[1].split(bt.matchFirstNonDigit)[0],
  1886. Title: html.find('h2.page__title').first().text().split(' [')[0],
  1887. Year: html.find('h2.page__title').first().text().split(' [')[1].split(']')[0],
  1888. Cover: $('meta.sidebar-cover-image', html).length > 0 ? $('meta.sidebar-cover-image', html).first().attr('src') : null,
  1889. GroupingQualities: [{
  1890. Torrents: torrents
  1891. }]
  1892. }];
  1893. }
  1894.  
  1895. if (response.responseText.indexOf('coverViewJsonData[ 0 ] =') === -1) {
  1896. return [];
  1897. }
  1898.  
  1899. var data = response.responseText.split('coverViewJsonData[ 0 ] =')[1].trim().split('var movieViewManager')[0].trim().slice(0, -1);
  1900.  
  1901. try {
  1902. return JSON.parse(data).Movies;
  1903. } catch (e) {
  1904. console.warn("PTP JSON parsing failed.", data);
  1905. return [];
  1906. }
  1907. },
  1908. onEnable: function(){
  1909. if (bt.customCSS.text().indexOf('.torrent-info-link--user-seeding') === -1) {
  1910. bt.customCSS.append(' .torrent-info-link--user-seeding {font-weight:bold;color:darkorange} ');
  1911. }
  1912. },
  1913. onRender: function (movies, table) {
  1914. var groupTable, groupTableHTML, torrent, tr;
  1915.  
  1916. for (var i = 0, ml = movies.length; i < ml; i++) {
  1917. tr = '<tr><td><h4 class="torrent-group"><a href="https://passthepopcorn.me/torrents.php?id=' + movies[i].GroupId + '" target="_blank">' + movies[i].Title + '</a> [' + movies[i].Year + ']</a></td></tr>';
  1918.  
  1919. if (movies[i].Cover) {
  1920. tr = $(tr);
  1921. $(tr[0].firstChild)
  1922. .addClass('cover')
  1923. .css('backgroundImage', 'url(' + movies[i].Cover + ')');
  1924. }
  1925.  
  1926. if (!('GroupingQualities' in movies[i])) return;
  1927.  
  1928. var groups = movies[i].GroupingQualities;
  1929. groupTable = bt.table.clone().addClass("torrent-table");
  1930.  
  1931. groupTableHTML = "";
  1932. for (var g = 0, gl = groups.length; g < gl; g++) {
  1933. if ('CategoryName' in groups[g]) {
  1934. groupTableHTML += '<tr><td colspan=3><b>' + groups[g].CategoryName + ' / ' + groups[g].QualityName + '</b></td></tr>';
  1935. }
  1936.  
  1937. for (var n = 0, nl = groups[g].Torrents.length; n < nl; n++) {
  1938. torrent = groups[g].Torrents[n];
  1939.  
  1940. var title = bt.span.clone().html(torrent.Title);
  1941. var a = title.children('a').first();
  1942. a.attr("target", "_blank");
  1943. a.attr("href", "https://passthepopcorn.me/" + a.attr("href"));
  1944.  
  1945. groupTableHTML += '<tr><td>' + title.html() + '</td><td>' + torrent.Seeders + '</td><td><a href="https://passthepopcorn.me/torrents.php?action=download&id=' + torrent.TorrentId + '">' + torrent.Size + '</a></td></tr>';
  1946. }
  1947. }
  1948. groupTable.html(groupTableHTML);
  1949.  
  1950. var torRow = bt.tr.clone().append(bt.td.clone().append(groupTable));
  1951.  
  1952. table.append(tr, torRow);
  1953. }
  1954. },
  1955. icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAXElEQVQ4jWNgYGD4TyFm+A8D5LCpYwDlXqhJ+/9/S9r//6/T/n/+m/GfgYHhf+/98v/plzr+p91a+T/t7bX/DAwM/9O2PPuf1nb6f1rGnv8T0w6OGjDMDBjheQEA+80xL75IvfsAAAAASUVORK5CYII="
  1956. };
  1957. });
  1958.  
  1959. bt.addSource("bB", function () {
  1960. var bb = "https://baconbits.org/torrents.php?action=basic&searchstr={query}";
  1961.  
  1962. return {
  1963. url: {
  1964. all: bb,
  1965. music: bb + "&filter_cat[1]=1",
  1966. music_flac: bb + "&filter_cat[1]=1",
  1967. movies: bb + "&filter_cat[9]=1",
  1968. movies_1080: bb + "&filter_cat[9]=1",
  1969. movies_720: bb + "&filter_cat[9]=1",
  1970. docs: bb + "&filter_cat[9]=1&filter_cat[10]=1",
  1971. tv: bb + "&filter_cat[10]=1",
  1972. apps_win: bb + "&filter_cat[2]=1",
  1973. mags: bb + "&filter_cat[6]=1",
  1974. games_pc: bb + "&filter_cat[11]=1",
  1975. comics: bb + "&filter_cat[7]=1",
  1976. ebooks: bb + "&filter_cat[3]=1",
  1977. abooks: bb + "&filter_cat[4]=1",
  1978. fiction: bb + "&filter_cat[3]=1",
  1979. elearning: bb + "&filter_cat[3]=1&filter_cat[4]=1&filter_cat[5]=1&filter_cat[6]=1&filter_cat[7]=1&filter_cat[13]=1&filter_cat[14]=1"
  1980. },
  1981. onParse: {
  1982. cleanup: [".tags"],
  1983. row: "#torrent_table tr.torrent",
  1984. link_prepend: "https://baconbits.org/",
  1985. sel: [
  1986. {
  1987. cleanup: ["> td:eq(1) > span:eq(0)"],
  1988. text: "> td:eq(1)",
  1989. link: "a[title='View Torrent']:eq(0)"
  1990. // freeleech: "strong:contains('Freeleech!')"
  1991. },
  1992. {text: "> td:eq(7)"},
  1993. {text: "> td:eq(4)", link: "a[href*='action=download']:eq(0)", noblank: true}
  1994. ]
  1995. },
  1996. resolution: null,
  1997. onPrepareQuery: function(context){
  1998. var year = bt.extractYear(context);
  1999.  
  2000. if (year) {
  2001. for (var i = 0, l = context.url.length; i < l; i++) {
  2002. context.url[i] += "&action=advanced&torrentname={query}&filelist=" + year;
  2003. }
  2004. }
  2005.  
  2006. context.src.resolution = bt.extractResolution(context);
  2007. },
  2008. onFilter: [bt.filter3dMovies, function (data, response) {
  2009. if (response.context.category === "music_flac") {
  2010. data = data.filter(function(){
  2011. return this.textContent.indexOf('FLAC') !== -1;
  2012. });
  2013. }
  2014.  
  2015. if (response.context.category === "movies_1080") response.context.src.resolution = "1080p";
  2016. if (response.context.category === "movies_720") response.context.src.resolution = "720p";
  2017.  
  2018. if (response.context.src.resolution) {
  2019. response.context.query += " " + response.context.src.resolution;
  2020. response.context.src.resolution = null;
  2021. return bt.requireAllWords(data, response);
  2022. } else {
  2023. return data;
  2024. }
  2025. }],
  2026. icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAkUlEQVQ4jaWSMRLEMAgDlZ/zNEr/SinuGIMCyd2kUIENKxgAyeONkAMDmPUXwABSdAcJE0zFGaIgS38oxWtVNSCTtw1YizSrEgjFbAO64gxR0Dd/AzQ51IHSewV07T50Vke4mbXtptvC5ZCmDXVbMIDuXvR0H+7+AUSg1xYQBeV8ROJ0srmbzgxT4QRSs58Bk06645TcxPnwywAAAABJRU5ErkJggg=="
  2027. };
  2028. });
  2029.  
  2030. bt.addSource("BTN", function () {
  2031. return {
  2032. url: {
  2033. all: "https://broadcasthe.net/torrents.php?searchstr=",
  2034. tv: "https://broadcasthe.net/torrents.php?searchstr=",
  2035. docs: "https://broadcasthe.net/torrents.php?searchstr="
  2036. },
  2037. onHttpRequest: function (requestData) {
  2038. var btnKey = bt.getPersistentValue("BTN_KEY", "").trim();
  2039.  
  2040. var data = {
  2041. method: "getTorrents",
  2042. params: [btnKey, {"Resolution": ["720p", "1080p", "1080i"]}, 50],
  2043. id: Date.now()
  2044. };
  2045.  
  2046. if (requestData.context.query) {
  2047. if (requestData.context.category === "docs") {
  2048. bt.extractYear(requestData.context);
  2049. bt.extractResolution(requestData.context);
  2050. data.params[1] = requestData.context.query;
  2051. } else {
  2052. bt.extractYear(requestData.context);
  2053.  
  2054. var res = bt.extractResolution(requestData.context);
  2055. if (res) {
  2056. data.params[1].Resolution = res;
  2057. }
  2058.  
  2059. data.params[1].Series = '%' + requestData.context.query.trim().replace(bt.spacesRegex, '%') + '%';
  2060. }
  2061. }
  2062.  
  2063. $.extend(requestData, {
  2064. method: "POST",
  2065. url: "http://api.btnapps.net/",
  2066. headers: {'Content-Type': 'application/json'},
  2067. data: JSON.stringify(data)
  2068. });
  2069.  
  2070. console.log("BTN request data", JSON.stringify(requestData));
  2071. },
  2072. onParse: function (response) {
  2073. console.log("BTN response data");
  2074. console.log(response.statusText, JSON.stringify(response.responseHeaders));
  2075. console.log(response.responseText);
  2076.  
  2077. try {
  2078. var data = JSON.parse(response.responseText);
  2079. } catch (e) {
  2080. bt.showFailAlert(response);
  2081. return null;
  2082. }
  2083.  
  2084. if (typeof data !== "object" || !("result" in data) || data.result === null || !("results" in data.result)) {
  2085. if ("error" in data && data.error !== null && "message" in data.error) {
  2086. bt.showFailAlert(response, data.error.message);
  2087. return null;
  2088. } else {
  2089. console.warn("Unexpected data from BTN", data, response);
  2090. return [];
  2091. }
  2092. }
  2093.  
  2094. var num = parseInt(data.result.results);
  2095.  
  2096. response.context.searchUrl = "https://broadcasthe.net/torrents.php?searchstr=" + encodeURIComponent(response.context.query);
  2097.  
  2098. if (num === 0) {
  2099. return [];
  2100. } else {
  2101. data = data.result.torrents;
  2102. data = Object.keys(data).map(function (k) {
  2103. return data[k];
  2104. });
  2105. return data;
  2106. }
  2107. },
  2108. onRender: function (torrents, table, response) {
  2109. var title, rows = "";
  2110.  
  2111. for (var i = 0, tl = torrents.length; i < tl; i++) {
  2112. title = '<a href="https://broadcasthe.net/torrents.php?id=' + torrents[i].GroupID + '&torrentid=' + torrents[i].TorrentID + '" target="_blank">' + torrents[i].ReleaseName + '.' + torrents[i].Container.toLowerCase() + '</a>';
  2113.  
  2114. if (response.context.category === "docs") {
  2115. title = '<a href="https://broadcasthe.net/series.php?id=' + torrents[i].SeriesID + '" target="_blank">' + torrents[i].Series + '</a> - ' + title;
  2116. }
  2117.  
  2118. rows += '<tr><td>' + title + '</td><td>' + torrents[i].Seeders + '</td><td><a href="' + torrents[i].DownloadURL + '">' + bt.humanizeSize(torrents[i].Size) + '</a></td></tr>';
  2119. }
  2120.  
  2121. table.html(rows);
  2122. },
  2123. config: function () {
  2124. var form = $('<div class="form-inline"><div class="form-group">Enter your API key from <a href="https://broadcasthe.net/user.php?action=edit#section5.editprofile" target="_blank" style="text-decoration:underline;">here</a>:</div></form>');
  2125. var input = $('<input type="text" class="form-control input-sm" style="width:250px">').val(bt.getPersistentValue("BTN_KEY"));
  2126. var btn = $('<button type="submit" class="btn btn-primary btn-sm">Save</button>')
  2127. .on("click", function () {
  2128. bt.setPersistentValue("BTN_KEY", input.val().trim());
  2129. alert("Saved!");
  2130. });
  2131.  
  2132. form
  2133. .append(' ', btn)
  2134. .children().first().append(' ', input);
  2135.  
  2136. return form;
  2137. },
  2138. icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACi0lEQVQ4jY1R3UuTcRQ+6d73/Z0TQh83XtSFXRt0UYyIatClUFer/8A+pi5fP1abydtgGhNsa1u5D/dOpxOmmIHSxSILES3FVTBtWlohdBF4VUSoO13MKYYfPfC7eXiec57fcwD2QHH8c4Xc9enaXppdIaIfTlDs4x/S51jS50/9n0tfKjX0fD0HACAF3xspOMMUnGHxJG0CAJD6lozQs3xsR68cmS3H7oXv1DW/bogvnpc8E0byjjN5x1k8nDDJ+txJ6s6uUvfCD0nPntnuDk6T0DNZimYY9cxPOTJbLrW9NJI7xeROsWhNmSCQKSU9s5LXzC6Dnj60tb1jugXDacZwOqcEZ2oAACTnkJGcQ0zOIRbaU1NeN3UFw+k1DKdZ6Zjybw5QfJPvKPCGhX8yC1pSBgCQ7vYZyd7LZO9l0RQ35ZV8AH2TExvaRQAAKLG0HBWesV/kGWPR/rq1MFSq7ThN9RGm+giLusiFAo9to7fRM8boGVtFNXocDt/wlqM7xehO8UHXSMNmLLO5WK7266LG3wvmdizQdH/Qgu4UY9sLxvrOswCVlRK6hlfINczC+axzv0sLbfABuYZZuIZ/Q2NnSb6De/3PSRtgbE6uQG3kyK7u2nbE5v5F0gZYNCffbl3BHr+KjsQ6ORKs2BP9hSK3QRs1KHcSHnQkGB2JnNSUuL49mk1Poi3GaIvlRGNsWlFDl0WVr0xU+cqU+mCFaIhOYmMsR7YYC1tXCkAr2r7BrMmKGhpBNcRUF2KsC+eEGloTamgN1XAuz4VYqOFXUBmknf9oNhfLVn+TqAl8QWuAaeOhNcDCGvgmVz92gaYZ9isaQNOKDDcfXVQsXlW+5W00WLyXQPs3ch5/AabcHAKs7QdQAAAAAElFTkSuQmCC"
  2139. };
  2140. });
  2141.  
  2142. bt.addSource("BMTV", function () {
  2143. var q = "https://www.bitmetv.org/browse.php?incldead=1&search={query}";
  2144.  
  2145. return {
  2146. url: {
  2147. all: q,
  2148. tv: q,
  2149. docs: q + "&cat=101"
  2150. },
  2151. onParse: {
  2152. row: "form[action*='/browse.php']:last ~ table:last > tbody > tr:gt(0)",
  2153. link_prepend: "https://www.bitmetv.org/",
  2154. sel: [
  2155. {text: "> td:eq(1) a[href*='details.php']:eq(0)"},
  2156. {text: "> td:eq(8)"},
  2157. {text: "> td:eq(6)", link: "a[href*='download.php']:eq(0)", noblank: true}
  2158. ]
  2159. },
  2160. onFilter: bt.requireAllWords,
  2161. icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACgklEQVQ4jW2TP2gjRxTGF7NccQgX4nBxmFQprzpMikO4CCKFESlCquAqiCvMVsGkOBYVZiuxpDBLikOoCIMLs1xhBhfL4MIMLsTi4lhciEGFGLY4BhVicWEEvytG3gshxceb9/H+z3tBPM749bchw5OIyVSQjDPS8wxxmSMLhbz2ULea8nOFKhTiIic9z0jGKcHph5jh+4jTDzHJOENcCO9YKOSNQs9KzMLSrBvcymEWFlkoxGVOPEoIhienxKOE9Dwjv5I+Y+Edbe1o1g3No4f94rC1xcwNslBMpoJgMhXoWUn1YKg+V1Rzg1s5mscNm6cNzdOzbLx8DlZb9J0miE4iwp3wf7H/3X77jkcxqlCt3tntYOaGIBkl9N8dsN99RbgT8monpPf2gMFhj+j345Y7/mVA9lfa6oPDHmZhCfRdia0tx4c93rwIefMiRN8omseG8ka13PFhj+wsbvXkjwi3cgTqVlM9GKIfewxehgxehpSFYrPt/ZmLfjhg8udpq8vpBFtbgudppz/1iXZDol0foHn0Q0veHbT8f218BTcaMzeIoz5pt0Pa7VAVcvsTDfJk2PL/tnErh11agvyTxCwt6qiP6HYQ3Q7mWuLWDc26ofo7bXn59vtWunWDrZ3fg+rBoI766L0Oes8HsLXF1hZ3q1pedL0sj/q4lfN7kH2coO801c99qtfewG4DuLXfRL3XoXr9DeYsRs9K9KwkSMcp4iKnnJXYpfW91RazsNilv4HN06bt2cwN5X3lK1xafwuTqSD7OPGrvIVZ+BbM0lLeV8hCkV9JynufSPyTM3wfEcRnCfEoQVzkvpKts5kb1K0m/yQRl98qlFdye7kp+bXiK0Aav3PRm9FxAAAAAElFTkSuQmCC"
  2162. };
  2163. });
  2164.  
  2165. bt.addSource("MoreThanTV", function () {
  2166. var q = "https://www.morethan.tv/ajax.php?action=browse&order_by=time&searchsubmit=1&searchstr={query}";
  2167.  
  2168. return {
  2169. url: {
  2170. all: q,
  2171. tv: q + "&filter_cat[2]=1",
  2172. docs: q + "&taglist=documentary"
  2173. },
  2174. onPrepareQuery: function(context){
  2175. var i,
  2176. len = context.url.length,
  2177. res = bt.extractResolution(context);
  2178.  
  2179. if (res) {
  2180. for (i = 0; i < len; i++) {
  2181. context.url[i] += "&encoding=" + res;
  2182. }
  2183. }
  2184.  
  2185. var year = bt.extractYear(context);
  2186.  
  2187. if (year) {
  2188. for (i = 0; i < len; i++) {
  2189. context.url[i] += "&filelist=" + year;
  2190. }
  2191. }
  2192. },
  2193. onParse: function (response) {
  2194. try {
  2195. var data = JSON.parse(response.responseText);
  2196. } catch (e) {
  2197. bt.showFailAlert(response);
  2198. return null;
  2199. }
  2200.  
  2201. if (!('status' in data) || data.status !== 'success' || !('response' in data) || !('results' in data.response)) {
  2202. bt.showFailAlert(response, "unexpected data");
  2203. return null;
  2204. }
  2205.  
  2206. response.context.searchUrl = response.finalUrl.replace("ajax.php?action=browse", "torrents.php?action=basic");
  2207.  
  2208. return data.response.results;
  2209. },
  2210. onRender: function (torrents, table) {
  2211. var title, rows = "";
  2212.  
  2213. for (var i = 0, l = torrents.length; i < l; i++) {
  2214. title = '<a href="https://www.morethan.tv/torrents.php?id=' + torrents[i].groupId + '&torrentid=' + torrents[i].torrentId + '" target="_blank">' + torrents[i].groupName + '</a>';
  2215.  
  2216. if (torrents[i].fileCount > 1) {
  2217. title += ' (' + torrents[i].fileCount + ' files)';
  2218. }
  2219.  
  2220. if (torrents[i].isFreeleech) {
  2221. title += ' <span class="label label-success">Freeleech</span>';
  2222. }
  2223.  
  2224. rows += '<tr><td>' + title + '</td><td>' + torrents[i].seeders + '</td><td><a href="https://www.morethan.tv/torrents.php?action=download&id=' + torrents[i].torrentId + '">' + bt.humanizeSize(torrents[i].size) + '</a></td></tr>';
  2225. }
  2226.  
  2227. table.html(rows);
  2228. },
  2229. icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABZ0lEQVQ4jcWTu0qDYQyGA4qCDuJisV/S/m8c3HTwCgQXL6CTizg4eAAPQ1EQHAV1ETxUsF/i2FVw0UEEN2/B2c0bcPgcfv9ixVMnX3iHF5KHhBAiIroImPSAbQs4MMHmZ8egGxZ0ywWHzlhxrs42yuUBIiKyERmLIVuLgh0Luu6c1XOYbhX2gG0TbEbRBRPcu2gywbMzJmi/VBrcJeqjLuSsDy6aPOC4m762TOAumixos5MsuHHR9D8AYzRcNHUaL0RENlqZes83PwEWTfDkoimH5dPEgJpzVnfR5JzV/7xCDKgVMBN9dNF0MlQZ/hOgKHTBy4d1Wu06xuV3gFbR0CzrTHv09/wroFmqqDEaxmg0SxUtcmTd+/UK3agDcETUXyPq6QrAeuuiKYqe0UUZ45Gxmn8ZVkyw/JWj6JKxzjnjKj+pvnqoTtMuUW8M2bwJ3BnnUfTsK5voqQccO+POWK89VKeJiN4AsErg8gM6/z4AAAAASUVORK5CYII="
  2230. };
  2231. });
  2232.  
  2233. bt.addSource("Shellife", function () {
  2234. return {
  2235. url: {
  2236. music: "http://shellife.eu/browse.php?search=",
  2237. music_flac: "http://shellife.eu/browse.php?search="
  2238. },
  2239. onParse: {
  2240. cleanup: ["div[id]", ".grey"],
  2241. row: "tr.torrent_row",
  2242. link_prepend: "http://shellife.eu/",
  2243. sel: [
  2244. {
  2245. text: "> td:eq(1) > a:lt(2)",
  2246. link: function (context) {
  2247. var id = $("a[href*='download.php']:eq(0)", context).attr("href").split("id=")[1];
  2248. return "details.php?id=" + id;
  2249. }
  2250. },
  2251. {text: "> td:eq(6)"},
  2252. {text: "> td:eq(4)", link: "a[href*='download.php']:eq(0)", noblank: true}
  2253. ]
  2254. },
  2255. onFilter: bt.requireAllWords,
  2256. icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACa0lEQVQ4jX3T30+ScRTHcf+o5u9ya866q5gXrhunde9aaTNbd66L/FUiQ6eVzhzamKDiRK1Jlg9oGCCoCPLIo/gAGvAYukH5fXfVhRM71+e8trPzOUUUKCEE+Xwet3sdk2mCgYEhNE0r1EpRoWFJcmIyTbAirbIdDPHd7cG9/gMhxP+BbDbLyPAoTpebeOKIVDpDKpUhmTzGH9gim81eDeRyOfr6jHxZlpD3FNJpjUzmBE37RSZzgqIckMvlCgNCCEymCRYWlwjuhNnwbxI7VPmZypBOp0mnNaLK/tUrRKMKwyNjyHsKscM4oXAEjzfAQUwlkTxG3lNQ1fjVgNk8iXvdgxpPsn9wyHYwxIrkwuPdQI0nicXUgsMARUII3r0fIbwrE08cEZGj+DYCLH+V0OuNtLW9QK83sLW1RT7/uzDQ0fkaf2CbiBwlFI7g9fnp6emlquom1dU19BmMLMx/xuFY5vz8z2Wgq/sNG/5NdkK7bAdDeH1+GhoeUFlxndKScpqaHrG25mbGNkckIl9Yp0gIweDgWzxeP8GdMPKeQnhXprHxIeVllRRfK6Gy4gazs3PYbHP4fP6LAIDVOsWMzU5EjnKoJlDjSdrbX1JeWkFpcRl379zD4VjGbv+E07l6+QqadsLjJy309w/xbcWFohzQ3PyUWzW30elq6XjVhX1+Eat1mkBgs3CQJEmiru4+Ol0t9fUNtD57Tq/ewPDIKBMfzZjNFiyWac7Ozi4D/xCXy0VraxsGwwDNLa306g10dHbzYWycmZlZolHlUh4uPJMQAk3TMJsnGRsbx2AwYrFOsbTk4PT0tGCY/gKeZ3zk0q3/+QAAAABJRU5ErkJggg=="
  2257. };
  2258. });
  2259.  
  2260. bt.addSource("HDB", function () {
  2261. var hdb = "https://hdbits.org/browse.php?descriptions=0&search={query}";
  2262.  
  2263. return {
  2264. url: {
  2265. all: hdb,
  2266. movies: hdb + "&c1=1",
  2267. movies_remux: hdb + "&c1=1&m5=1",
  2268. movies_bluray: hdb + "&c1=1&m1=1",
  2269. // movies_hd: hdb + "&c1=1&m4=1&m3=1&m6=1",
  2270. movies_720: hdb + "+720p&c1=1&m4=1&m3=1&m6=1",
  2271. movies_1080: hdb + "+1080p&c1=1&m4=1&m3=1&m6=1",
  2272. tv: hdb + "&c2=1",
  2273. mvids: hdb + "&c4=1",
  2274. xxx: [hdb + "&c7=1", hdb + "&descriptions=1&c7=1"],
  2275. docs: hdb + "&c3=1"
  2276. },
  2277. onParse: {
  2278. row: "#torrent-list > tbody > tr",
  2279. link_prepend: "https://hdbits.org",
  2280. sel: [
  2281. {
  2282. text: "> td:eq(2) a:eq(0)",
  2283. freeleech: "a.fl"
  2284. },
  2285. {text: "> td:eq(7)"},
  2286. {text: "> td:eq(5)", link: "a[href*='download.php']:eq(0)", noblank: true}
  2287. ]
  2288. },
  2289. onFilter: bt.filter3dMovies,
  2290. icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACHklEQVQ4jaXK30tacRjH8e+/pxd5sysFJe2mq3MCNdpFKAOz4ao1KtlKS5JOVh7H1DUNsUiLmtEWrV21iwYL8tfxR7CVvHexw2ltYzddvPg8z/N5RKr0iYcQa8Vj1oofuMs/5/8T8dwhDyGi6RJLmTJK/pBoeldXQskfspgps5gps16osF6ooGwdEE2X7hHhjQKpYgWtc014o2DQOtekiu9JFSvc3N5ycVnjstpE61zztvzR+BNT8SyJ3B7Ndpfn8SxTuma7SyK3RyK3T7PdNe5r+X2+/7gh+rrIVDyLGI+oLKe3abQ6jEdUXZJGq8Nyevt+t6ASjKicnX9l9+iM8QUV4Z9dIZLM0+v1qGttQ6/XI5LME0nmqWtt/LMrhuLBCcefz/HPriBGnkUJKxlqjRYjE1FDrdEirGT+2ZWOTtk9OmVkIooYCswxHVOp1jWGAnOGal1jOqb+1XmevqTa0HiVyDIUmEMMjk4Sml/lqtZkcHTScFVrEppfJTS/SqvTZTH5DiVd4MvFN0qVE+NPOL1B3IEZYslNnMNj9A8H6R8OEktu4g7M4A7MoOZ2UHM7KG+2ePJiCac3iNM7Rr83iLDKPmyyD5vsxyr7sEl+bJIPq+zHKul3fbfJ/l+/ks9I8WjwMQ8hLC43fTrLgJ4uD30uD3edx2AZ0PsBNxaXG2F2yJgdMia7hNkhY7brs13G7JAwGTcZk0PCbJcw/eYnDKTjHv2fDS0AAAAASUVORK5CYII="
  2291. };
  2292. });
  2293.  
  2294.  
  2295. bt.addSource("BS", function () {
  2296. var bs = "http://bitspyder.net/browse.php?incldead=1&scope=0&search={query}";
  2297.  
  2298. return {
  2299. url: {
  2300. all: bs,
  2301. elearning: bs,
  2302. docs: bs + "&c42=1",
  2303. abooks: bs + "&c40=1",
  2304. mags: bs + "&c57=1",
  2305. ebooks: bs
  2306. },
  2307. onParse: {
  2308. row: "tr.alt1,tr.alt2",
  2309. link_prepend: "http://bitspyder.net/",
  2310. sel: [
  2311. {text: "a.altlink6"},
  2312. {text: "> td:eq(2)"},
  2313. {
  2314. text: "font[color='#A52A2A']:eq(0)",
  2315. link: function(context){
  2316. var link = context[0].firstElementChild.nextElementSibling.firstElementChild;
  2317. var id = link.getAttribute("href").split("id=")[1].split("&")[0];
  2318. return "download.php/" + id + "/" + link.textContent.trim().replace(bt.spacesRegex, "%20") + ".torrent";
  2319. }
  2320. }
  2321. ]
  2322. },
  2323. onPrepareQuery: function (context) {
  2324. context.query = context.query.split(' ');
  2325. for (var i = 0, l = context.query.length; i < l; i++) {
  2326. context.query[i] = encodeURIComponent('+') + context.query[i];
  2327. }
  2328. context.query = context.query.join('%20');
  2329. },
  2330. icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAC8UlEQVQ4jY2TS2hUdxSHzzAMQxAJIS0uXLkSXLjJwkUrpbiaRRdBLkokCRY7NFgIpe2mNpSAAW0RRMEHKhIhRAouxEdpRAzBjEnzaJtJnExyX//7njv3Pffeco3ycxENPhBcHM45cL4PzoFDRJQjolylUmljjPVrmjakKMoAY6yXMcZJknRIkqR+xtigLMsjoigen5+fb3/N0evCNLUvkzRdz7LMT9P/zSRJ1TiOWavVYkEQqEEQNFzXDZvNpq7KwsH3BZXbF7ONF9jQ63hem0K2/jeSNEUcx4iiCEEQwPd9NL0A0vTd8bcE6yUqrs0/rmYbz5E+GUNy7xTif+4hThJEUYQwDOH7PlzXRdP1sDL3WFc5atsSNAd37a6t1pFlGWpXy1g+2w19ehxRGL4FO44D225iuc5DGvp835bA+XHPPkFmyLJnaNRnYCxPIgx8hGGIIAjged4r2Eaj0UBNYFj77eDmHcBR3vl57wFJ0ZGmKeIkQasVfxC2LAtrsoanZ/oHwFGewFHeGv7iK1mzkCQJWq3WB2HTNGEYBnimo3pu4CeUqUDgKK+e7j4i6Y2PgnVdh6CaWLrw/TBKVCRwlGdnD39Tl1Q4jgPP8+D7m/tHUYQoiraOaNs2LMvCqsCwcPXE7+CojVCmgnj52x+WVnmIogie38yKokBVVWiaBlVVwRiDJEngeR5z/y5h9vrJi1YvbSOUqFgb/eXXxWoNPM9DlmWoqgrDMGCaJizLgmVZMAwDmqZBEATMzC1gauz8eNBDHYQSFdcufTe4WF2BICtQdBNGw4btuHA8H64fwvUD2I4H025CUjTMLv6HmRunrnllaid0USEa/GR3ffzkeeHO5QfCxOgcP3mrKlTur4uzE0ye/UuSZ/6sy9N3qvLDmwvi/SuPlsdGRpWhz/ajREUiohy6qIBe2oYytaOHOtBHnfEx2oE+2ok+2omj9Cn6qBM91IEe6sDXtB1dVABHeXrjKXJElANH+Tfjj3f6d+dfAuBCuhI2QTSDAAAAAElFTkSuQmCC"
  2331. };
  2332. });
  2333.  
  2334. bt.addSource("BitMe", function () {
  2335. var bitme = "http://www.bitme.org/browse.php?incldead=1&search={query}";
  2336.  
  2337. return {
  2338. url: {
  2339. all: bitme,
  2340. elearning: bitme,
  2341. ebooks: bitme,
  2342. abooks: bitme + "&cat=2",
  2343. docs: bitme + "&cat=5",
  2344. mags: bitme + "&cat=6"
  2345. },
  2346. onParse: {
  2347. row: "form ~ table:eq(0) tr:not(:first-child)",
  2348. link_prepend: "http://www.bitme.org/",
  2349. sel: [
  2350. {text: "a[href*='details.php']:eq(0)"},
  2351. {text: "> td:eq(8)"},
  2352. {text: "> td:eq(6)", link: "a[href*='download.php']:eq(0)", noblank: true}
  2353. ]
  2354. },
  2355. onFilter: bt.requireAllWords,
  2356. icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABU0lEQVQ4ja2SO4oCQRCGy4YBdYwMDFQQmWgmdEJPYC74CA08hUfxDHqDnmhAMBoxMBENFMHAwAcTfhssttu4C6Jb0ND14Ku/u0pEhA+P8K5ZABFBKYVSCq01aZqilDJx4Mm3APfgaDQyd4BqtfrU9VcFmUzGUnC3crn8GsBxHKPgZ1GlUnkNcO9eLBbRWnO9XlFK4TiO9aQ/Ae+YAXy8B4VCgUajQS6XMwnf9wmCwIyuXq8TBAFhGOL7Ptls9gHodDoAjMdjRIRWqwXAer02wP1+b8nvdrsPQLvdNolarcZsNgNguVwawPF4JEkSPM/D8zxc130Aer0ep9OJKIrY7XbEcUySJJaCzWZDmqasVisWi4UN6Pf7nM9nwjAEYDgcorVmu91aCubzOa7rks/n7U8cDAbA9zaWSiVEhMPhwOVyMYW32w2AyWTCdDql2Wz+zxi/AECKPay4236DAAAAAElFTkSuQmCC"
  2357. };
  2358. });
  2359.  
  2360. bt.addSource("TGZ", function () {
  2361. var tgz = "https://thegeeks.bz/browse.php?incldead=1&nonboolean=1&titleonly=1&search={query}";
  2362.  
  2363. return {
  2364. url: {
  2365. all: tgz,
  2366. elearning: tgz,
  2367. docs: tgz + " -pdf -ebook -mp3 -m4a -aac",
  2368. ebooks: tgz + " -xvid -pdtv -hdtv -avi -mp4 -wmv -mkv -dvd",
  2369. abooks: tgz + " AND (audiobook OR mp3 OR m4a OR aac OR flac OR ogg)&nonboolean=3"
  2370. },
  2371. onParse: {
  2372. row: "tr.ttable",
  2373. link_prepend: "https://thegeeks.bz/",
  2374. sel: [
  2375. {
  2376. text: "a[href*='details.php']:eq(0)",
  2377. freeleech: "font[color='blue']:contains('FREE')"
  2378. },
  2379. {text: "> td:eq(8)"},
  2380. {text: "> td:eq(6)", link: "a[href*='download.php']:eq(0)", noblank: true}
  2381. ]
  2382. },
  2383. onPrepareQuery: function (context) {
  2384. if (context.category === "abooks") {
  2385. context.query = context.query.split(' ').join(' AND ');
  2386. }
  2387. },
  2388. icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAwUlEQVQ4jdWSvWoCURBGT1zSiJUmzfbiU6QOkt4qkFcQ3ymdWq4h2ucFRAI+hEsarTw2t7gs+3NJZ/E133xzhrlzAUyRDWICxoqbYr8RUDWyhKl3BCjAKfgc/EcwB2fgPgXQpgF4SAHk4DdYgltwGNU+UgCrSn0DfoLH1BXK4F/Bc0WXOoBgLzQ/RN5PzTtkTYBRFDr9B/AWhZZ1t+8CFJUrfIF/4C84TwEILjr+AeBLG0BwDb6CT2FaHxyD7+AuZG4TCI/1JWS7dwAAAABJRU5ErkJggg=="
  2389. };
  2390. });
  2391.  
  2392. bt.addSource("BIB", function () {
  2393. var bib = "https://bibliotik.org/torrents/?search={query}";
  2394.  
  2395. return {
  2396. url: {
  2397. all: bib,
  2398. elearning: bib,
  2399. ebooks: bib + "&cat[]=2&cat[]=5",
  2400. mags: bib + "&cat[]=6&cat[]=7",
  2401. apps_win: bib + "&cat[]=1",
  2402. abooks: bib + "&cat[]=3",
  2403. comics: bib + "&cat[]=4"
  2404. },
  2405. onParse: {
  2406. cleanup: ['time', '.taglist'],
  2407. row: "#torrents_table > tbody > tr",
  2408. sel: [
  2409. {text: "> td:has(a[href*='/torrents/']):eq(0)", link: "a[href*='/torrents/']:eq(0)"},
  2410. {text: "a[href*='peers']:eq(0)"},
  2411. {
  2412. text: function (context) {
  2413. return $("> .t_files_size_added", context).text().split(',')[1].trim();
  2414. },
  2415. link: "a[href*='download']:eq(0)",
  2416. noblank: true
  2417. }
  2418. ]
  2419. },
  2420. icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACBElEQVQ4jc3S/0sacRzHcf9JaQsysASLQXSjCUkM+mE0yV+MNO4c2qF2cp5CzptekF4fd2eepR4M2hiFI2Kt7W947qeofaX9the8fnw/fnjzCgT++6iqSqGgYhgGrVaL0cjnwcc7Oxmyioym1ajVqnQ6bZrNFt5xj0O7S7FY/D0mywqyrKAoCrValXK5jG23aTRes18/otsVpNMZWtbBj4DVttlMJEhvp1FkGcOoYpoNhBA4jovrOgwGHoVCAdvuIIS4A/b2NDY2XpBMJslms+TzeTRN40jY1Ot1TNNkNBqhqipCHOG6Ls4bh8Dx6ZiVpxKpVIpKxWC/XqfRaJDP5yiVSlQqbYQQjMdjXmWz5HI5+v0+hqHjeR6BWCzG7GyIUChENBolHo9jWRYnJx4Vo4qulxkOh2xtpdjdzeM4DrquU6tWORkMCFxc3XAoerxMJJmenmZmKsjCwgKbmwk+vP/I6XBIs9mk1bJwHZfJZILv+/i+j2maBM4vv3DbdxeX7BY1wnNzLEXnKZU20PUykiQRi8WQliXiq6tkMhl6vR7X19d3T7wPTa6+YrUFU48eEwwGkSSJSCRCJBJhfi7Ms5UVnq+tsb6+/usO7kMXVzd44zM6b/uUtApb29uEw2EiszM8WVxkeWnp76u8j9320+dvjM/OOeh0KRvGw2f9J/SfgZ/zHe4g1eDb0gaxAAAAAElFTkSuQmCC"
  2421. };
  2422. });
  2423.  
  2424. bt.addSource("AHD", function () {
  2425. var ahd = "https://awesome-hd.net/torrents.php?action=advanced&order_by=time&order_way=desc&groupname={query}";
  2426.  
  2427. return {
  2428. url: {
  2429. all: ahd,
  2430. movies: ahd,
  2431. movies_1080: ahd + "&resolution=1080p",
  2432. movies_720: ahd + "&resolution=720p",
  2433. movies_remux: ahd + "&media=Blu-ray",
  2434. tv: ahd,
  2435. docs: ahd
  2436. },
  2437. onPrepareQuery: [bt.extractGazelleYear, bt.extractGazelleResolution],
  2438. onParse: {
  2439. row: "#torrent_table tr.group, #torrent_table tr.torrent",
  2440. link_prepend: "https://awesome-hd.net/",
  2441. sel: [
  2442. { text: "a[title='View Torrent']:eq(0)" },
  2443. {
  2444. text: "> td:eq(4):contains('.'), > td:eq(5):contains('.')",
  2445. link: "a[href*='action=download']:eq(0)",
  2446. noblank: true
  2447. }
  2448. ]
  2449. },
  2450. icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADQElEQVQ4jWVTzU8iBxydW7P7LyjE00IQ2dXElfbS1thGo+tuovFiNV4k7mqtSlFXERawig6gkQ9nBhE7I6PyYQtoXNPwbeSgBw5GDiR7IWL0YuJhQzDm9dAsWe1L3u29l/zye48gHiGXy9WFw2EHy7JZt9tddLvdRZZls+Fw2JHL5eoe68vI5/NPfD7f6uLiYonjOEQiEYRCIQSDQUQiEWxubmJhYaHk8XhW8/n8kwfmQqHwlGGYGEmS4DgOqVQK29vb4Hm+zKOjI3g8HphMJlit1lihUHhaDggEAg6SJO83NjYQj8exv78Pl8uFeDyO4+NjrK2tYW9vD4lEAizLwmQy3W9tbTnKN8/NzZVomsbBwQFSqRQcDgf8fj/u7u5QKpUQDAZht9uRSCRweHgIhmEwOztbOj8/ryN2d3dtS0tL8Pl8SKfTsNvtoCgKNzc3uLy8xMXFBW5vb+F0OmG1WpFOpxEIBLC8vIydnR0bYbFYshRFIRKJwOl0giRJnJ2d4fr6GisrKzCbzbi6ukI2m4XJZAJFUYhGo2AYBkajMUsMDAwUjUYjeJ6HRqOB1+tFKpVCLBYDz/PgOA7RaBTJZBJ+vx9arfbLR6BQKIpEa2trsb+/H2azGTRNg6ZpGAwGqNVq6HQ66HQ6TE9PQ6/Xg6Io0DQNi8UChUKB5ubmItHZ2Znt6OjA8PAwvF4fRkdH0dfXh7fv3sFmd0Cr/QCaccK1vg5+axt/siwGh4bQ3t6Otra2LKFSqWwymQwtLS04OPwHPT096OnthVL5O/4OhTE4NIRp9QxUqnGMj0/gr2AI3d2/QCQSYWxszEacnJzUVlVVlSQSCShmDa/fvAFpXoLVvgrGtY6J91OYeD+F+vp6yGQy6P+YR9NPP6OioqJ0enr6X7WVSqVNIpHca2fnUVNTA7FYjO9/+BFTGh26e/swqdZiYHAYb3/9DVrDPBrk8vuRkRHH1wP6pqur6+PLBjnEYjFEIhGqq6vxskGOF7W1kH/7XZmy58/x6tXrh1X+EjI5ObkoFAo/CwQCCIXCBxQIBKisrPysVKmW/zemr5HJZJ5pNBp9Y2NjUiqVfpJKpZ+ampqSMzMzhkwm8+yx/l/wGTPXxmfuPQAAAABJRU5ErkJggg=="
  2451. };
  2452. });
  2453.  
  2454. bt.addSource("TehC", function () {
  2455. var tehc = "https://tehconnection.eu/torrents.php?action=advanced&torrentname={query}";
  2456.  
  2457. return {
  2458. url: {
  2459. all: "https://tehconnection.eu/torrents.php?action=basic&searchstr={query}",
  2460. movies: tehc,
  2461. movies_1080: tehc + "&bitrate=1080p",
  2462. movies_720: tehc + "&bitrate=720p",
  2463. movies_dvd: tehc + "&format=DVDR",
  2464. movies_bluray: tehc + "&format=AVC&media=Blu-ray",
  2465. docs: tehc + "&searchtags=Documentary"
  2466. },
  2467. onPrepareQuery: function (context) {
  2468. var i,
  2469. len = context.url.length,
  2470. year = bt.extractYear(context, true),
  2471. res = bt.extractResolution(context);
  2472.  
  2473. if (year && year.length === 4) {
  2474. for (i = 0; i < len; i++) {
  2475. context.url[i] += "&year=" + year;
  2476. }
  2477. }
  2478.  
  2479. if (res) {
  2480. for (i = 0; i < len; i++) {
  2481. context.url[i] += "&bitrate=" + res;
  2482. }
  2483. }
  2484. },
  2485. onParse: function (response) {
  2486. var result = [];
  2487. var html = $(response.responseText.replace(bt.imgTagRegex, '<meta '));
  2488. var groups = $("#browse_torrent_table", html).find(".group");
  2489.  
  2490. groups.each(function () {
  2491. var link = $("a", this).first();
  2492.  
  2493. var group = {
  2494. groupName: link.text(),
  2495. groupURL: link.attr('href'),
  2496. groupYear: link.next().text(),
  2497. torrents: []
  2498. };
  2499.  
  2500. $(this).nextUntil(".group").each(function () {
  2501. var cols = $(this).children();
  2502. var links = cols.eq(1).find("a");
  2503. group.torrents.push({
  2504. title: links.eq(2).text(),
  2505. url: links.eq(2).attr("href"),
  2506. download: links.eq(0).attr("href"),
  2507. size: cols.eq(4).text(),
  2508. seeders: cols.eq(6).text()
  2509. });
  2510. });
  2511.  
  2512. result.push(group);
  2513. });
  2514.  
  2515. return result;
  2516. },
  2517. onRender: function (movies, table) {
  2518. var movie, groupHeader, groupTable, torrents, torrentsLen, torrentTableHTML;
  2519. var host = "https://tehconnection.eu";
  2520.  
  2521. for (var i = 0, len = movies.length; i < len; i++) {
  2522. movie = movies[i];
  2523.  
  2524. if (!('torrents' in movie)) continue;
  2525.  
  2526. torrents = movie.torrents;
  2527. torrentsLen = torrents.length;
  2528.  
  2529. if (torrentsLen === 0) continue;
  2530.  
  2531. torrentTableHTML = "";
  2532. for (var n = 0; n < torrentsLen; n++) {
  2533. torrentTableHTML += '<tr><td><a href="' + host + torrents[n].url + '" target="_blank">' + torrents[n].title + '</a></td><td>' + torrents[n].seeders + '</td><td><a href="' + host + torrents[n].download + '">' + torrents[n].size + '</a></td></tr>';
  2534. }
  2535.  
  2536. groupHeader = '<h4 class="torrent-group"><a href="' + host + movie.groupURL + '" target="_blank">' + movie.groupName + '</a> [' + movie.groupYear + ']</a><h4>';
  2537. groupHeader = bt.tr.clone().append(bt.td.clone().html(groupHeader));
  2538.  
  2539. groupTable = bt.table.clone().addClass("torrent-table").html(torrentTableHTML);
  2540. groupTable = bt.tr.clone().append(bt.td.clone().append(groupTable));
  2541.  
  2542. table.append(groupHeader, groupTable);
  2543. }
  2544. },
  2545. icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABGElEQVQ4jbWRsSuFYRTGXzdJBpTtWu7wpVt3eN/f72M1GJTBwmS2moxkkjBgMSopi8FkUDJabP4MJQuiKNdy6SPfjRtPneWc8zw95zkh/AfUTF1Ql9RlYDGlNBZCqJSSsizrB1bVG7VZUk/qboxx5BMZmFMf3heBB+BY3QTW1X3guiD0CmyEELqCulYgXgBTZS5TSkk9KuyfBTUH7oH5r4RGo9FTq9V6v8loArgFxt97H+HEGIfVbeC2YPkROGgF2Tb9afWleGurmgXbK6UCwKh6p57HGCdDCN0hhEpKKQF76nPR9reo1+tDZbNqtdrXlvynyPN8QD0ETtX81wLqDrClzgBXHQm03jnbkUBKaVA9AS47OuGneANZLXB8s+ETIwAAAABJRU5ErkJggg=="
  2546. };
  2547. });
  2548.  
  2549. bt.addSource("HDT", function () {
  2550. var hdt = "https://hd-torrents.org/torrents.php?active=0&options=0&search={query}";
  2551.  
  2552. return {
  2553. url: {
  2554. all: hdt,
  2555. movies: hdt + "&category[]=1&category[]=2&category[]=5&category[]=3",
  2556. movies_1080: hdt + "&category[]=5",
  2557. movies_720: hdt + "&category[]=3",
  2558. movies_remux: hdt + "&category[]=2",
  2559. movies_bluray: hdt + "&category[]=1",
  2560. music: hdt + "&category[]=44",
  2561. music_flac: hdt + "&category[]=44",
  2562. docs: hdt + "&genre[]=Documentary",
  2563. tv: hdt + "&category[]=59&category[]=60&category[]=30&category[]=38",
  2564. mvids: hdt + "&category[]=61&category[]=62&category[]=57&category[]=45",
  2565. xxx: hdt + "&options=3&category[]=58&category[]=48&category[]=47"
  2566. },
  2567. onParse: {
  2568. row: "table.mainblockcontenttt > tbody > tr:has(a[href*='download.php'])",
  2569. link_prepend: "https://hd-torrents.org/",
  2570. sel: [
  2571. {text: "a:eq(1)"},
  2572. {text: "> td:eq(9)"},
  2573. {text: "> td:eq(7)", link: "a[href*='download.php']:eq(0)", noblank: true}
  2574. ]
  2575. },
  2576. onValidate: function (response) {
  2577. return response.responseText.indexOf("You're not authorized to view this Torrents") === -1 ? true : "login needed";
  2578. },
  2579. onFilter: bt.filter3dMovies,
  2580. icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABrklEQVQ4jbXTvWoqcRDG4dldP/6uH2RdMVUgzSoiilFWMZusrgS0UkFIkUqICqa0CNFLiKVgZeENeAPe3C/VEcSkOJycgbcbnuadEfml4R/yy0A8HieTyWDbNrZtk06nsSyLq6srLMtCKfUzkMvl6Pf7tFotOp0Ovu9zf39PtVqlUqngui5BEHBzc3MJGIZBu91G0zR0XUdE0DQNEcGyLK6vrxERdF0nCILTzglQSlEul1FK8f7+jojw8vLCfD5nt9ux2Wz4+PhARPB9n0gkcg7EYjHq9TqmabJer0kkEkynU5bLJZPJBBHh8/OTWq3G3d3dJWCaJr7vYxgGx+OR/X7P4XBgNpsxHo8REYbDId1ul1wuRzgc/h4wTZPtdkssFuP5+ZnpdMpgMEBEeHt7o1Qq4TjO90Cj0UApxWq1QkTodDqMRiMWiwWTyYTX11c0TaNYLBIKhc6BUCjE09MTmqaRSqUQEaLRKEopHMchn8+fmmk2m5ctiAiFQoHRaMTj4yNBEPDw8IDnebiui+u6eJ5Hr9fj9vb250tMJpNks1kymczZRf6JaZr/+Rf+Nl8Ccia4Vb4rGwAAAABJRU5ErkJggg=="
  2581. };
  2582. });
  2583.  
  2584. bt.addSource("HDS", function () {
  2585. var hds = "https://hdsky.me/torrents.php?incldead=0&spstate=0&inclbookmarked=0&search_area=0&search_mode=0&search={query}";
  2586.  
  2587. return {
  2588. url: {
  2589. all: hds,
  2590. movies: hds + "&cat401=1&cat410=1&cat405=1",
  2591. movies_1080: hds + "&cat401=1&cat405=1&medium7=1&medium5=1&medium11=1&standard1=1&standard2=1",
  2592. movies_720: hds + "&cat401=1&cat405=1&medium7=1&medium5=1&medium11=1&standard3=1",
  2593. movies_remux: hds + "&cat401=1&cat405=1&medium3=1",
  2594. movies_bluray: hds + "&cat401=1&cat405=1&medium1=1&medium12=1",
  2595. movies_dvd: hds + "&cat401=1&cat405=1&medium6=1",
  2596. docs: hds + "&cat404=1",
  2597. tv: hds + "&cat402=1&cat403=1",
  2598. mvids: hds + "&cat406=1",
  2599. music: hds + "&cat408=1",
  2600. music_flac: hds + "&cat408=1&audiocodec1=1&audiocodec2=1"
  2601. },
  2602. onParse: {
  2603. row: "table.torrents tr.progresstr",
  2604. link_prepend: "https://hdsky.me/",
  2605. sel: [
  2606. {
  2607. text: "> td:eq(1) a:eq(0)",
  2608. freeleech: ".pro_free"
  2609. },
  2610. {text: "> td:eq(5)"},
  2611. {text: "> td:eq(4)", link: "a[href*='download.php']:eq(0)", noblank: true}
  2612. ]
  2613. },
  2614. onFilter: bt.filter3dMovies,
  2615. icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADEElEQVQ4jYXT3U+bBRTH8aNu082XVXhKWTcYbJPS0lf68rRlA+xITEbihYkx8QXBrTOVDkrfaeimnQM13mniXOTG6IgyYHSFvoAt6xAMQ/13vPt64QxsF3qSc3k+OeckP5HH64CIHPqfPigiTz0xJwffdjQOzAeNf1Ui3VSjbu7HnBTDVjZiTspjVu5eNlD4yMjdkJmv32z9XkRe3A+Zb18yMR80sB51UYt7qCfclMZsbKZVVsNW8iEDK6NmlkNmFi6b+PKtzjkReVZE5NBFf+Pnc0ETC6EuqgkPazEX9ZSHalylnvJQidgpjBopjlnIhy0sjzpYHlcREZ2IyOFhr+6728EulkbNVJMqtaRKPe2hlvKymfGxFu2mNG6hPGHl5+Aplq84uDfhRURaRUSODPt0s3MfmlkcNdJ89AU2p85Sz6i0NLzEN0MW2rUvc7pJw08hKz8M6ylEnKzE/YjIyX8Av272TtjKUriLNkXDr9letq+eo6NZ4dsRGxMX2rk3bsFwTKEU62Y16mI1eXYPGPHrZheu2MiPmWlTNLyia+CMrgGjXsuti3Yig+2Uozb6OnWsZ9wUY26K6XP7gF7d7HzYRj5ipU3RsJPrZ+vjPjqaFW6OWIi9bqASt2NrVVhNmKkkVMqTTwB3xmwUojbaFA0PbwzwW66fjmaFW5fs9JlOEDA1YdRrKUTNlONOiinf48BixMFq3M6PoTP88cUgO5++Sj7dw8aUj6WYm6Wog/tZlbWUi1LCzUrSswcEe/WzixEHhaiVStLM7sxr7NwIsPVJH7vTAepZP7+kuqlf9bKe8bCW9lHK7D3x8BsO7Vf5uItiwsFG1sv29QEeTgfYyvWzOxOgnu2hOunkwTUf5aSd9UwPK5O9iEiLiMgzInIhH3NSSrnYuh5gZ3qA3ZkA27l+fv/sPBtTXmqTTh5c87ISN1Gb6qP3lFIXEc2/WdA2PXcgN2hsZEg9wZDawvvqcd7zHOcD/0nedR1jWNUz4tXzjltPl/bInyLSJSJP70/k849uMohI53/0aRFRHm0ufwPkeZfm3qXqFQAAAABJRU5ErkJggg=="
  2616. };
  2617. });
  2618.  
  2619. bt.addSource("BHD", function () {
  2620. // NB: Spaces should be replaced with % signs, otherwise search works for an exact phrase
  2621.  
  2622. var bhd = "https://beyondhd.me/browse.php?incldead=1&searchin=title&search={query}";
  2623.  
  2624. return {
  2625. url: {
  2626. all: bhd,
  2627. movies: bhd + "&c50=1&c77=1&c75=1&c49=1&c94=1&c61=1&c78=1&c86=1&c37=1&c54=1&c17=1",
  2628. movies_1080: bhd + "&c50=1&c77=1&c86=1&c94=1",
  2629. movies_720: bhd + "&c75=1&c78=1&c54=1",
  2630. movies_remux: bhd + "%25remux&c50=1&c77=1&c75=1&c49=1&c94=1&c61=1&c78=1&c86=1&c37=1&c54=1&c17=1",
  2631. movies_bluray: bhd + "&c37=1",
  2632. docs: bhd + "&c50=1&c83=1&c77=1&c75=1&c49=1&c94=1&c61=1&c78=1&c86=1&c37=1&c54=1&c17=1",
  2633. tv: bhd + "&c40=1&c44=1&c48=1&c89=1&c46=1&c45=1",
  2634. mvids: bhd + "&c55=1&c56=1&c42=1",
  2635. music: bhd + "&c36=1&c69=1",
  2636. music_flac: bhd + "&c36=1"
  2637. },
  2638. onParse: {
  2639. row: "table.torrenttable > tbody > tr:gt(0)",
  2640. link_prepend: "https://beyondhd.me/",
  2641. sel: [
  2642. {text: "a[href*='details.php']:eq(0)"},
  2643. {text: "> td:eq(9)"},
  2644. {text: "> td:eq(7)", link: "a[href*='download.php']:eq(0)", noblank: true}
  2645. ]
  2646. },
  2647. onPrepareQuery: function(context){
  2648. context.query = context.query.replace(bt.spacesRegex, "%25");
  2649. },
  2650. onFilter: bt.filter3dMovies,
  2651. icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAB5ElEQVQ4jYWTz2sTQRTH39mDqCdB8P/wVjJDsTeP4g+I6M7OFKGBXqqnYjKrp0JPUgv2oj2EzKSlWsjBQmcOi2KaQ0sDgrSyxdimdNEqKUnj8+LG7A/pg3eb7+c78+Z9ARI1kl+4kHNUnjjq1dj48jcubZNL+9ot2nu3p1fPJ8/HijJ1izD1mTKNlGmkbrUnpOkJz6LwLHLPBFyam5ninKOKA+HfHnWrJ88WNk4jQNRuyRZTzkkxZRrliw/dmh/0kwDhWXSluQMAANfuly8RplpZgLdm9/Qw7PzOAghpDtj0yjkgTLlZYso0Hv/qIiLi05eNNMCzyKXJA3H0EmUabxRWcP3jHta397G+vY+fdkOMqh12sLkTDjoCcmkqQBwVRI4R5H/1pXUcuw2Xpg5Z759XWymxbbRwcsZPzME2gDh6NQl4Mvc+Baj5QXoGnlmG3ANVSALemB1ERNxoHvRrftCP5pABEDCSL1+mTB8NA762f+K82sJRt3oipOnNLm5iO+zEf0Pa72LKXgQAAOKo8Uh893ENhVwbbGK0ypMzPs4ubv5zL5mH8W109POsVR7OwpD7XGYeiFOZIEwfDkG68TDZH6JkCmcksnyVssoUYWrtulg64tLucWnWXWke8dK7K8nzfwBqE0A4H4ujDAAAAABJRU5ErkJggg=="
  2652. };
  2653. });
  2654.  
  2655. bt.addSource("TorViet", function () {
  2656. var torviet = "http://torviet.com/torrents.php?incldead=0&search_area=0&search_mode=0&search={query}";
  2657.  
  2658. return {
  2659. url: {
  2660. all: torviet,
  2661. music: [torviet + "&sltCategory=5&sltSubCategory=126", torviet + "&sltCategory=5&sltSubCategory=130"],
  2662. music_flac: torviet + "&sltCategory=5&sltSubCategory=126",
  2663. // music_mp3: torviet + "&sltCategory=5&sltSubCategory=130",
  2664. movies: torviet + "&sltCategory=2",
  2665. movies_1080: torviet + "&sltCategory=2&sltSubCategory=125",
  2666. movies_720: torviet + "&sltCategory=2&sltSubCategory=124",
  2667. movies_remux: torviet + " REMUX&sltCategory=2&sltSubCategory=127",
  2668. movies_bluray: torviet + "&sltCategory=2&sltSubCategory=127",
  2669. docs: [torviet + "&sltCategory=3&sltSubCategory=0&sltGenre=62", torviet + "&sltCategory=2&sltSubCategory=0&sltGenre=32"],
  2670. tv: torviet + "&sltCategory=3&sltSubCategory=128",
  2671. elearning: torviet + "&sltCategory=6",
  2672. ebooks: torviet + "&sltCategory=6&sltSubCategory=112",
  2673. abooks: torviet + "&sltCategory=6&sltSubCategory=117",
  2674. mags: torviet + "&sltCategory=6&sltSubCategory=112",
  2675. apps_win: torviet + "&sltCategory=4&sltSubCategory=76",
  2676. mvids: torviet + "&sltCategory=5&sltSubCategory=92",
  2677. games_pc: torviet + "&sltCategory=1&sltSubCategory=7"
  2678. },
  2679. onParse: {
  2680. row: "#idtorrent table.torrents > tbody > tr:not(:first-child)",
  2681. link_prepend: "http://torviet.com",
  2682. sel: [
  2683. {
  2684. text: ".torrentname a:eq(0)",
  2685. freeleech: ".pro_free"
  2686. },
  2687. {text: "> td:eq(4)"},
  2688. {text: "> td:eq(3)", link: "a[href*='download.php']:eq(0)", noblank: true}
  2689. ]
  2690. },
  2691. onFilter: [bt.filter3dMovies],
  2692. icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADrUlEQVQ4jSXDe1DTBQDA8d//nP5B1x1pKCZwHV1xZ3/4R2eXCk5Ep1mKYR4QkIJLmURWdl6P8zSujjcRggaBD8YGIspwsKEww7En22SMjZccrzWGiMTz9+0PP3cf4VCeLuzoH49vJ1YYF5OqzaTWWjl520ZmvZ20W72k3Hg1qcZG4l8WDpSZ2FvSsyIpeKyJ++1RlHAwr1PxSXmPeLzKQvItOyeVT/nqrgt5ixu52kN6o5u0Bjepyn4OVzuJvdrL7jILHxUZxd15eosgLehaPFphIqnGRrrCgexOH/IWNzltHr7VDZLV6iWj2UOy0o20ug9JpZ3YP63sLDYRU/QEYX9+FzkKK+M+P9MzAXyBAMPTfnI0bn7RD/GTfojMlkGO1fVzqMbJvuu97Cm3sbvUREyJAeFAfheJ14xcUfexJoroh3z8qBlAP+JnZOYFw4F57rim0Q1MMeyfx+N7QeptJx8WGth+pRNhb+5D4gsNyBV2VtdEHvRPkVrv4tnMSzxTz/H6/8Plm+fphJ+llVUutT7lSI0ZaYWFmIJ/ECS/diAtNiCvc7C6JqLum0TW5GJ89iUDkwE8vgXMz+awjvqYXVgi446Dj6ts7C83E1PQjRB7WYu0+AmZNTZcE3P8bRghpc7JPcc4rvE5nGPPuXzfS6N5DMvoDKkKO9IKK/tKjcQWdCO8J7/P+xc6iP+9m2NlZqSlJo5XO0i43stnVb3sLDbxQZGJHYVGYkp6OHjVyK6Cbnbk6tl+qQMh/GQjEWc05N9zsby8iNYxzsLSMjrrMI9so5ytd1D5eIjSR4OcV9nxTs1yUWVj2886on/QIGxNU/GOvI2MChNrooh3IoD/xSJa+wSOkQC9wzN4J2dZWlmlwTiKKIrIa81EX3hA9PdqhNATCiJOt7Lr4kNWVtdYXl7G7JmmqWcM52gA52gA+8i/WAcmuKZ1IYoiOTctvCVvIVzejBAsrSX4cCOvH2miq9ONwTDMuQoDeQ0OVF1eTpUb6LSM0KwfJD63i7udHnIVZkJOtxAqa0ZYH1e1GCRREBRXT9BeJcEJzYTJ2ok4107UeR3vftdB1Dc6tmZrCc9uJyyrnc1nNITK1GyWNSGs21OpCJLUiUESBev2qwhJUbPxSw1bZRois9qI+lpLVE47b2e3seXsq5tlrWzKVIsbvrhhFdbH5kasjysxBMVc57VPbxHyuZI3Tih5M0XFlnQV4RkNRGY2EJnRwJZTKjalKwlNq2djcnX/hoTibf8Dg6DZMEdjmwAAAAAASUVORK5CYII="
  2693. };
  2694. });
  2695.  
  2696. bt.addSource("MAM", function () {
  2697. var mam = "https://www.myanonamouse.net/tor/js/loadSearch.php?tor[text]={query}&tor[srchIn]=0&tor[fullTextType]=old&tor[author]=&tor[series]=&tor[narrator]=&tor[searchType]=all&tor[searchIn]=torrents&tor[cat][]=0&tor[hash]=&tor[sortType]=default&tor[startNumber]=0";
  2698.  
  2699. return {
  2700. url: {
  2701. all: mam,
  2702. elearning: mam,
  2703. abooks: "https://www.myanonamouse.net/tor/js/loadSearch.php?tor[text]={query}&tor[srchIn]=0&tor[fullTextType]=old&tor[author]=&tor[series]=&tor[narrator]=&tor[searchType]=all&tor[searchIn]=torrents&tor[cat][]=39&tor[cat][]=49&tor[cat][]=50&tor[cat][]=83&tor[cat][]=51&tor[cat][]=97&tor[cat][]=40&tor[cat][]=41&tor[cat][]=106&tor[cat][]=42&tor[cat][]=52&tor[cat][]=98&tor[cat][]=54&tor[cat][]=55&tor[cat][]=43&tor[cat][]=99&tor[cat][]=84&tor[cat][]=44&tor[cat][]=56&tor[cat][]=137&tor[cat][]=45&tor[cat][]=57&tor[cat][]=85&tor[cat][]=87&tor[cat][]=119&tor[cat][]=88&tor[cat][]=58&tor[cat][]=59&tor[cat][]=46&tor[cat][]=47&tor[cat][]=53&tor[cat][]=89&tor[cat][]=100&tor[cat][]=108&tor[cat][]=48&tor[cat][]=111&tor[cat][]=126&tor[cat][]=0&tor[hash]=&tor[sortType]=default&tor[startNumber]=0",
  2704. ebooks: "https://www.myanonamouse.net/tor/js/loadSearch.php?tor[text]={query}&tor[srchIn]=0&tor[fullTextType]=old&tor[author]=&tor[series]=&tor[narrator]=&tor[searchType]=all&tor[searchIn]=torrents&tor[cat][]=60&tor[cat][]=71&tor[cat][]=72&tor[cat][]=90&tor[cat][]=73&tor[cat][]=101&tor[cat][]=62&tor[cat][]=63&tor[cat][]=107&tor[cat][]=64&tor[cat][]=74&tor[cat][]=102&tor[cat][]=76&tor[cat][]=77&tor[cat][]=65&tor[cat][]=103&tor[cat][]=115&tor[cat][]=91&tor[cat][]=66&tor[cat][]=78&tor[cat][]=138&tor[cat][]=67&tor[cat][]=80&tor[cat][]=92&tor[cat][]=118&tor[cat][]=94&tor[cat][]=120&tor[cat][]=95&tor[cat][]=81&tor[cat][]=82&tor[cat][]=68&tor[cat][]=69&tor[cat][]=75&tor[cat][]=96&tor[cat][]=104&tor[cat][]=109&tor[cat][]=70&tor[cat][]=112&tor[cat][]=0&tor[hash]=&tor[sortType]=default&tor[startNumber]=0",
  2705. mags: "https://www.myanonamouse.net/tor/js/loadSearch.php?tor[text]={query}&tor[srchIn]=0&tor[fullTextType]=old&tor[author]=&tor[series]=&tor[narrator]=&tor[searchType]=all&tor[searchIn]=torrents&tor[cat][]=79&tor[cat][]=0&tor[hash]=&tor[sortType]=default&tor[startNumber]=0",
  2706. fiction: "https://www.myanonamouse.net/tor/js/loadSearch.php?tor[text]={query}&tor[srchIn]=0&tor[fullTextType]=old&tor[author]=&tor[series]=&tor[narrator]=&tor[searchType]=all&tor[searchIn]=torrents&tor[cat][]=60&tor[cat][]=71&tor[cat][]=72&tor[cat][]=90&tor[cat][]=61&tor[cat][]=73&tor[cat][]=101&tor[cat][]=62&tor[cat][]=63&tor[cat][]=107&tor[cat][]=64&tor[cat][]=74&tor[cat][]=102&tor[cat][]=76&tor[cat][]=77&tor[cat][]=65&tor[cat][]=103&tor[cat][]=115&tor[cat][]=91&tor[cat][]=66&tor[cat][]=78&tor[cat][]=138&tor[cat][]=67&tor[cat][]=79&tor[cat][]=80&tor[cat][]=92&tor[cat][]=118&tor[cat][]=94&tor[cat][]=120&tor[cat][]=95&tor[cat][]=81&tor[cat][]=82&tor[cat][]=68&tor[cat][]=69&tor[cat][]=75&tor[cat][]=96&tor[cat][]=104&tor[cat][]=109&tor[cat][]=70&tor[cat][]=112&tor[cat][]=0&tor[hash]=&tor[sortType]=default&tor[startNumber]=0",
  2707. comics: "https://www.myanonamouse.net/tor/js/loadSearch.php?tor[text]={query}&tor[srchIn]=0&tor[fullTextType]=old&tor[author]=&tor[series]=&tor[narrator]=&tor[searchType]=all&tor[searchIn]=torrents&tor[cat][]=61&tor[cat][]=0&tor[hash]=&tor[sortType]=default&tor[startNumber]=0"
  2708. },
  2709. onParse: {
  2710. cleanup: ["a[href*='filelistLink']"],
  2711. row: "tr:gt(0)",
  2712. link_prepend: "https://www.myanonamouse.net",
  2713. sel: [
  2714. {text: "a.title:eq(0)"},
  2715. {text: "> td:eq(6) > p:eq(0)"},
  2716. {
  2717. text: function(context){
  2718. return $("> td:eq(4)", context).text().replace('[', '').replace(']', '').trim();
  2719. }
  2720. }
  2721. ]
  2722. },
  2723. onValidate: function (response) {
  2724. response.context.searchUrl = response.finalUrl.replace("/tor/js/loadSearch.php", "/tor/browse.php");
  2725. return true;
  2726. },
  2727. icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADWUlEQVQ4jQXBW2hbZQDA8aPrJXVr7VBonZ3Tdr2lJ4m1N18E9VEQZE70wVdfh/jmg/gggsqGq+KYax3VydqC9uLWNnR26dbck+Z2cjvJSWbZGAWFbUhnzvd9yd/fTxN7OnbhJHZpAHvPiV0dxjb6aGy2QbCVRrQNtdNCzd+FsNyIshORG6LmPYLYdKDVtp/B3mrH9rVTM/qQezoYXTxeb+XhdgckNUhr2P6j2KYLabmwI8cRNxzIUBuauOFABh2ocDP1UCfs9eNbfIPZL99i7rsPWL7yEXf93ZBx0Ci7qZdc2OEe5K0m6ulmNLXTjEo0g6VxEO1k/sd3WZg9xQP/cWo7GquXxjh37iy710Y5MHrAGkDkdOxwFyLahqbiXRyE2lm73M2V798keO11uNtLw3qB8OopAr7ficaz+EMZNq9PU93WoTqILHoQWTeaqHgQJZ2/dz38mx2Bvwag2svuxjtEEvcoV+5jmiamWaZUfcif3gX2fT00TBcq50ETphNR1sEahrKTRsnJo5vteFdnSBlVisUi+Xwe0zQxDAN/pEL86msQfxZZHEcT20cQ0WMoU0eVXGCcoDzfwfnz01y4OMPS0hKVSoVAIMDMzAzTF66yPPs2jWgrsvAqmtrVEPHDiLwbWdSh8Dxb8++zthknmUyysrJCLBbD6/USCoUIR9P8Ovct/+z00CiPoQnjGKLQjyy4kMURKPcRWXuPSOI+1Tt7lEolDMPANE0sq0z5zgO8f1ziUXSQRsGDJoseZNGFNN3InI7Ku3mcHuTWb6eJxjPc3glgGBl8vpuks1W8Kz9wb9sNBQ8qM4qmCjqy6MaOvIi92Y699TSN9CC11HNcn/+Yi7NLWJbF8uo6c78skF5xQe4kMjqMzIyjqcIoIuXE9rYh/S2o8CFUsJP9oIvFs918cuZDvvj6Mp9+9g2fn9FJLJ7gP18HKniIWqwXTRVeQSSd2FsOVKIJlXsCtduOnRrH2hjCXOvn568m2PpJp7IxwP6tl1GxbkSmAzs9giazHmR2FDvyEiJ6GJF5CpEZop4dp26MQ6gH/E0QdKBiQzSMSVRqApmaRKWm0GzDhTI81PNTiPQYIj2BMqZQxhgq4cJeb0EGWlDhJxG3j6LSU9STE9STk9QTE/wPUBjwW9wnwmsAAAAASUVORK5CYII="
  2728. };
  2729. });
  2730.  
  2731. bt.addSource("BitHQ", function () {
  2732. var bithq = "https://www.bithq.org/search.php?incldead=1&in=original&options=AND&search={query}";
  2733.  
  2734. return {
  2735. url: {
  2736. all: bithq,
  2737. movies: bithq,
  2738. movies_bluray: [bithq + " BD25", bithq + " BD50", bithq + " blu-ray"],
  2739. movies_dvd: bithq + " DVD",
  2740. docs: [bithq + "&c50=1", bithq + " documentary&in=both&c66=1"],
  2741. mvids: bithq + "&c52=1&c66=1",
  2742. apps_win: bithq + "&c54=1&c61=1&c7=1",
  2743. tv: bithq
  2744. },
  2745. onParse: {
  2746. row: "#content table.main ~ table > tbody > tr:has(a[href*='download.php'])",
  2747. link_prepend: "https://www.bithq.org/",
  2748. sel: [
  2749. {
  2750. text: "a[href*='details.php']:eq(0)",
  2751. freeleech: "meta[src*='goodies']"
  2752. },
  2753. {text: "> td:eq(6)"},
  2754. {text: "> td:eq(4)", link: "a[href*='download.php']:eq(0)", noblank: true}
  2755. ]
  2756. },
  2757. onFilter: bt.filter3dMovies,
  2758. icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAcUlEQVQ4ja2TUQ7AIAhDufrOtDvtGu5nNchobZaZNAbEF1IxImJ0C3l1fpzXiFwIVUDNQwug0vOFp3CJIasDC6A82AJ2AiDHE5CDL/oXoNqmqgBmHDOaAuyh6gDqSS2A6uAFZIButzxgH0fkjacSE3oDN8hc4OGDrZMAAAAASUVORK5CYII="
  2759. };
  2760. });
  2761.  
  2762. bt.addSource("PS", function () {
  2763. var ps = "https://polishsource.cz/browse.php?incldead=1&scene=0&pl=0&sub=&search_in=title&search={query}";
  2764.  
  2765. return {
  2766. url: {
  2767. all: ps,
  2768. movies: ps + "&c12=1&c11=1&c4=1&c43=1",
  2769. movies_1080: ps + " 1080&c11=1",
  2770. movies_720: ps + " 720p&c11=1",
  2771. movies_remux: ps + " REMUX&c43=1",
  2772. movies_bluray: ps + "&c43=1",
  2773. movies_dvd: ps + "&c4=1",
  2774. docs: ps + "&sub=Documentary",
  2775. music: ps + "&c42=1",
  2776. music_flac: ps + " FLAC&c42=1",
  2777. // music_mp3: ps + "+MP3&c42=1",
  2778. mvids: ps + " x264&c42=1",
  2779. tv: ps + "&c39=1",
  2780. elearning: ps + "&c5=1",
  2781. ebooks: ps + "&c5=1",
  2782. abooks: ps + " audiobook&search_in=both&c5=1",
  2783. mags: ps + "&c5=1",
  2784. apps_win: ps + "&c18=1",
  2785. games_pc: ps + "&c8=1",
  2786. xxx: ps + "&c13=1"
  2787. },
  2788. onParse: {
  2789. row: "#restable tr:gt(0)",
  2790. link_prepend: "https://polishsource.cz/",
  2791. sel: [
  2792. {text: "a[href*='details.php']:eq(0)"},
  2793. {text: "> td:eq(7)"},
  2794. {text: "> td:eq(4)", link: "a[href*='downloadssl.php']:eq(0)", noblank: true}
  2795. ]
  2796. },
  2797. onFilter: function(data, response){
  2798. if (response.context.category === "movies_bluray") {
  2799. return data.filter(function(){
  2800. return this.textContent.toLowerCase().indexOf('remux') === -1;
  2801. });
  2802. } else {
  2803. return data;
  2804. }
  2805. },
  2806. icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAA7klEQVQ4jc2SoQvCQBjFv//H/2H2/QHrWzEIi0OwLM0gWETbhmHpMDqLQVhcOQwXxCCXNpYGGyw+0x3oubK0B6+9+937+D4iIvJWKcaY1GPLiUZ5Nl9gQoDN8QIu5JfX2zMsJ4IXxHi9KyhxIU1AwnIAQNv1X2FneUBZNwCAsm7AhURZN8MARVfywxRt1wMA9qfb8AgK8HpXukHb9Xo8pYTl/wF58dQBLiSu9we8INZhL4h1E5YVJoALafxgORFsdwfb3RlNDICq/QvwwxS/GtxCwnL4oXkXLCv0allW6EYTu8TRACKi2XyBMSYi+gCLK3pfts+WcAAAAABJRU5ErkJggg=="
  2807. };
  2808. });
  2809.  
  2810. bt.addSource("CG", function () {
  2811. var cg = "https://cinemageddon.net/browse.php?search={query}";
  2812.  
  2813. return {
  2814. url: {
  2815. all: cg,
  2816. movies: cg,
  2817. movies_1080: cg + " 1080",
  2818. movies_720: cg + " 720p",
  2819. movies_remux: cg + " REMUX",
  2820. movies_bluray: [cg + " BD25", cg + " BD50"],
  2821. movies_dvd: cg + " DVD-R",
  2822. docs: cg + "&c15=1",
  2823. music: cg + "&c11=1",
  2824. elearning: cg + "&c19=1&c5=1",
  2825. ebooks: cg + "&c19=1"
  2826. },
  2827. onParse: {
  2828. cleanup: [".torrenttable span"],
  2829. row: ".torrenttable:last > tbody > tr",
  2830. link_prepend: "https://cinemageddon.net/",
  2831. sel: [
  2832. {text: "a[href*='details.php']:eq(0)"},
  2833. {text: "> td:eq(6)"},
  2834. {text: "> td:eq(4)", link: "a[href*='download.php']:eq(0)", noblank: true}
  2835. ]
  2836. },
  2837. icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACkklEQVQ4jX2Ty0tUcRTHz3V0dBrvXB29M5RajulcnFuTw/WnXAkryFdFiWGhQQgFwdCDCKJatAgjcRHVKsqGpOxB9F70AF0Y9QdEi6JdEFS0CqLXvXxajGWhtfhuzoEP53vO+Yr/LMvQxhXUmCbdSv1Wh+OgLAvTMFgaEyZ2CV5ursS/ncZ/lmWwZxnxeBzXdXFdl5aWFhobGzEMA7tKuLXnHwAvJ/h3mvj+NMtAt/0bopTCsix0XUclhIcH/gPwchr+3cxfEKUUyWSScDhMW70wulV4cVz4OjYvYBby42mWwR6bAk2jrq4OXdeJhIS1tnBovfDggPDl/LyAWcjbm70Y4UIqSjUGVscYXBMnWlpAbaVwcJ3w5Ijw+ZzwamQOQPCumOzbVEVVucarEcG/p/An+/jwcCf24hKc2vwkI/3C5ub5APfbqF8UYke78Hx4pnYxiP+ok6nTnRRowuIKIVAghMPhuRa+P95IVbSIHe3C9OE/elfjvBxfSyAQwDRNEokEqVRqFvBtTHh/RvBuJMgsEZxaYWSL8Ho079fLaVzYvZBIJEI6ncZxHFpbW5FPZ/PnuZ4V9nYI3cuFUDA/4sqksL9LGN2S9xwJabSlyonFYjiOg+u6yLE+YUOTEA0LwWAQwzAwTRPDMAgGgxQXCWULhMpIgOFtMfzJPoazq4hGo3kLhYWF6LpOdXU1lmVh2zYNDQ2YpkltpTCxp4ybR5v4eMnCGy/Bu1GHP72dayd6KQ0VIQ319di2TSaTQSmFUopUKoVhGHQuE96dEbzLZXg5bXah1xbiT/UzPbYNaZlZxq8Q/Xrh4uJihlYKb07OnwFvIor/uAfpaW6mQym6ZtSeTpOsqaGkSDg1+PfbztF4iJ/rnQNd64LE/gAAAABJRU5ErkJggg=="
  2838. };
  2839. });
  2840.  
  2841. bt.addSource("KG", function () {
  2842. var kg = "https://karagarga.in/browse.php?search_type=title&incldead=&search={query}";
  2843.  
  2844. return {
  2845. url: {
  2846. all: kg,
  2847. movies: kg + "&cat=1",
  2848. movies_1080: kg + "&hdrip=2",
  2849. movies_720: kg + "&hdrip=1",
  2850. movies_bluray: kg + "&hdrip=3",
  2851. movies_dvd: kg + "&dvdr=1",
  2852. docs: kg + "&genre=20",
  2853. music: kg + "&cat=2",
  2854. elearning: kg + "&cat=3",
  2855. ebooks: kg + "&genre=41",
  2856. abooks: kg + "&genre=40",
  2857. comics: kg + "&genre=42"
  2858. },
  2859. onParse: {
  2860. cleanup: ["#browse tr:has(a[href*='down.php']) span:not(:first-child)"],
  2861. row: "#browse tr:has(a[href*='down.php'])",
  2862. link_prepend: "https://karagarga.in/",
  2863. sel: [
  2864. {
  2865. text: function (context) {
  2866. var cols = context.children();
  2867. var year = cols.eq(3);
  2868. var genre = cols.eq(0).find("meta");
  2869.  
  2870. if (genre.length === 2) {
  2871. var src = genre.eq(1).attr('src');
  2872. if (~src.indexOf('hdrip720')) year.append(' [720p]');
  2873. else if (~src.indexOf('hdrip1080')) year.append(' [1080p]');
  2874. else if (~src.indexOf('dvdr')) year.append(' [DVD-R]');
  2875. else if (~src.indexOf('bluray')) year.append(' [Blu-ray]');
  2876. }
  2877.  
  2878. return cols.slice(1,4);
  2879. },
  2880. link: "a[href*='details.php']:eq(0)",
  2881. freeleech: function(context){
  2882. return context.hasClass("featuredrow");
  2883. }
  2884. },
  2885. {text: "> td:eq(12)"},
  2886. {text: "> td:eq(10)", link: "a[href*='down.php']:eq(0)", noblank: true}
  2887. ]
  2888. },
  2889. onPrepareQuery: function (context) {
  2890. var i,
  2891. len = context.url.length,
  2892. year = bt.extractYear(context, true),
  2893. res = bt.extractResolution(context);
  2894.  
  2895. if (res === "720p") {
  2896. for (i = 0; i < len; i++) {
  2897. context.url[i] += "&hdrip=1";
  2898. }
  2899. } else if (res === "1080p" || res === "1080i") {
  2900. for (i = 0; i < len; i++) {
  2901. context.url[i] += "&hdrip=2";
  2902. }
  2903. }
  2904.  
  2905. context.query = context.query.trim().split(' ');
  2906. for (i = 0, len = context.query.length; i < len; i++) {
  2907. context.query[i] = encodeURIComponent('+') + context.query[i];
  2908. }
  2909. context.query = context.query.join('%20');
  2910.  
  2911. if (year) {
  2912. context.query += "%20" + year;
  2913. }
  2914. },
  2915. // onFilter: bt.requireAllWords,
  2916. icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACoElEQVQ4jeWSXUiTcRjF/5PCi0F00Wpgr1t7dR84F5MitQVddDFlOpTUGiRR4cqREKTJmLA1FssKTZ2hNslkaxJTl9MYKyd+ZMtZutShJI3elabvmm2jRSpPNyaJRHTduX7Oj/NwDkL/h8Lh8B6dVtsgl8u7xsbGcv/J7PF4dspkMg+VSoX4+HhISEgAuVzu9ng8BX/zUkiS5CkUCheGYUCn04FCoYBAIFjHcRxEoqNrDoejdPNarVbHTU9Oik3t7VUqpdKWm5P7KTU1FXAcBwaDATQaDdKPpBORSIQWCoWY0Wh0XygU2o0QQmhubk6Sn5f3gcPhAJvDBhaLBUwmE5hMJmAYBomMROByuaDX643bcvb09FTIZLJZoVAIPB4P+Hw+sFgswDAMMAwDPAmH5ORkYLPZ6/Pz84e2AcRi8deUlBRIS0sDiUSyrFKpeo+JRKt8Ph8yMzPWCgsLvUqlstPn8x3v6rDUkCTJIwhC7JuaylGr1XEoKysrJpVKCYfDcTkYDO5CCCGn06kymUx3zWazESFE6evurnvS2alpa22ubze2ND1oaWoJBAIHEUII9dntOoIgkn4likQiNIPB0GW1WnUWi6WuvrbWVHzq5GdD7Z2nVou5dXRo6Nq3YHA/Qoiy5ZXFxUWqy+XasdG9TFlZOSqVZH8/V3zGv7CwcHgDvtfneyvp7bGVT3u9W3cw7naXB/z+jMGB55eqKsr788UnfjQ3NjwkSZL7p50ghBB6/MikL5NfcJ89XfClrOT8uyulJVPGe4aOaq1mcNjlkndotc77Ot0zb//AzfcTE0Xh5WV2LBZL3ARkCgWrt29ct0WXlui/41dWVg68evni6uuRkbJGjWa439ja9nF2tmjcbtfZqm+98c/MZNdcVLh+As9+Owd6H2u5AAAAAElFTkSuQmCC"
  2917. };
  2918. });
  2919.  
  2920. bt.addSource("TSH", function () {
  2921. var tsh = "https://torrentshack.me/torrents.php?searchstr={query}";
  2922.  
  2923. return {
  2924. url: {
  2925. all: tsh,
  2926. movies: tsh + "&filter_cat[960]=1&filter_cat[300]=1&filter_cat[320]=1&filter_cat[400]=1&filter_cat[970]=1&filter_cat[350]=1&filter_cat[982]=1&filter_cat[983]=1",
  2927. movies_1080: tsh + "+1080&filter_cat[960]=1&filter_cat[300]=1&filter_cat[982]=1",
  2928. movies_720: tsh + "+720&filter_cat[960]=1&filter_cat[300]=1&filter_cat[982]=1",
  2929. movies_bluray: tsh + "&filter_cat[970]=1",
  2930. movies_remux: tsh + "&filter_cat[320]=1",
  2931. movies_dvd: tsh + "&filter_cat[350]=1",
  2932. tv: tsh + "&filter_cat[600]=1&filter_cat[700]=1&filter_cat[981]=1&filter_cat[980]=1",
  2933. docs: tsh + "&action=advanced&description=documentary",
  2934. music: tsh + "&filter_cat[450]=1&filter_cat[480]=1&filter_cat[984]=1&filter_cat[985]=1",
  2935. music_flac: tsh + "&filter_cat[480]=1&filter_cat[985]=1",
  2936. // music_mp3: tsh + "&filter_cat[450]=1&filter_cat[984]=1",
  2937. mvids: tsh + "&filter_cat[500]=1",
  2938. apps_win: tsh + "&filter_cat[100]=1",
  2939. games_pc: tsh + "&filter_cat[200]=1",
  2940. elearning: tsh + "&filter_cat[180]=1&filter_cat[800]=1",
  2941. ebooks: tsh + "&filter_cat[180]=1"
  2942. },
  2943. onParse: {
  2944. cleanup: [".count_files"],
  2945. row: "#torrent_table tr.torrent",
  2946. link_prepend: "https://torrentshack.me/",
  2947. sel: [
  2948. {text: "a[href*='torrents.php?torrentid=']:eq(0)"},
  2949. {text: "> td:eq(6)"},
  2950. {
  2951. text: function (context) {
  2952. return $("> .size", context).text().trim().split(" ").slice(0, 2).join(" "); // buggy html at TSH
  2953. },
  2954. link: "a[href*='action=download']:eq(0)",
  2955. noblank: true
  2956. }
  2957. ]
  2958. },
  2959. onFilter: bt.filter3dMovies,
  2960. icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACRklEQVQ4jU2TS3LjOBBEqfYcRiLAmQgC0K4tfn0yqk/jFiECtMWP3DPbluUrvVmAYvQCEQCDVZVZmRntTIncF0idk5gCYXKELtcjVR2+qQypD0idI3TNVmdIVRI9CqQqiVXBzpTsTI5UJYl+XooO7PQLsSoQumRnaqTOifUzkdQ5sSqQpiLeVwhdkpiC9m2mdTOnfkKqErE0lfqwNpI6J5IqUNjqgq2uSHTFyQ20/oLtJ2w/0bqZfxZkO1OvzYRZGsQ6C3tQJa2/0PXjOt26mbO/0nYD0lQLvRqRFkjzQrQ1z0hTkagS2w+c/cDZT1h/xforZz/x0494/0HrRxKVI9KC7b58LPGASCtaN2P9eyjuJ1o/hsl+5KefeXUDZ3/F9hPCHIj3FVIfiERaBaj9QNd/rLxtP2HdiPVX7seIe7Phdgzn8U5USRTrjNP7R4DsLguFAN26C62b+Woi7s0T9+aJzybidnzidtwsKpgA5dWFqedFvvOC5vQ20HaB0u244fPHN2SakeiKWFVEsSqC7n4MkN1I14/L9qfA242c+ol7s+F3Ey3OfCbRFdHDhbaf/ii4YJcFdt2MdTPWX/k6fuN2fEKal9XeUbx42vYTbTeEn/thbXD202KqgXuz4ev4FyKt1sxEUh+QaYZ7/zfo3ge9WzfjL/9h33/Rvf3i1V35/BHxu4lCTkwWnBirArkvECpDqIw4/U5ispA6FdCJtOBvUyPSOuTBVOzU94BA6HKBU/O4r2FRJcIclhDlSFMFEy20ha75H69lPsKUP3Y4AAAAAElFTkSuQmCC"
  2961. };
  2962. });
  2963.  
  2964. bt.addSource("RarBG", function () {
  2965. var rarbg = "https://rarbg.to/torrents.php?search={query}";
  2966.  
  2967. return {
  2968. url: {
  2969. all: rarbg,
  2970. movies: rarbg + "&category=14;48;17;44;45;42;46",
  2971. movies_1080: rarbg + "&category=44",
  2972. movies_720: rarbg + "&category=45",
  2973. movies_bluray: rarbg + "&category=42",
  2974. movies_remux: rarbg + "&category=46",
  2975. tv: rarbg + "&category=41",
  2976. docs: [rarbg + " documentary&category=movies", rarbg + "&category=18;41"],
  2977. music: rarbg + "&category=23;25",
  2978. music_flac: rarbg + "&category=25",
  2979. // music_mp3: rarbg + "&category=23",
  2980. elearning: rarbg + "&category=35",
  2981. ebooks: rarbg + "&category=35",
  2982. xxx: rarbg + "&category=4",
  2983. games_pc: rarbg + "&category=27;28",
  2984. apps_win: rarbg + "&category=33"
  2985. },
  2986. onParse: {
  2987. row: ".lista2t tr.lista2",
  2988. link_prepend: "https://rarbg.to",
  2989. sel: [
  2990. {text: "td:eq(1) a:eq(0)"},
  2991. {text: "> td:eq(4)"},
  2992. {
  2993. text: "> td:eq(3)",
  2994. link: function (context) {
  2995. var link = context[0].firstElementChild.nextElementSibling.firstElementChild;
  2996. var id = link.getAttribute("href").split("/").pop();
  2997. return '/download.php?id=' + id + '&f=' + encodeURIComponent(link.textContent.trim()) + '.torrent';
  2998. },
  2999. noblank: true
  3000. }
  3001. ]
  3002. },
  3003. onValidate: function (response) {
  3004. return response.finalUrl.indexOf('/bot_check.php') === -1 ? true : "captcha";
  3005. },
  3006. onFilter: bt.requireAllWords,
  3007. icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABs0lEQVQ4jYWTP4jXMBiGK3IIde5cHG6wi1MRp04u2TNKxoNsQjaR4HAIhduy3FREDqFznBwyZxSyOBXH4CBC4RCR54a2P+9PDwPv8r0fT96PLymAB0ANvAHeA6c7OgGO194bKoAXwBf+f34Bb4Gj24DXwM+QMtJEpL0pZSPGJULKG+hsF+BjplWBTgdata8xZIBL4OndBDHT6YDQAdMnQsyEmDEuIfQCVjYyLylOdgHCBIQJuDFtcf/mDNJGhAlIG8nLJO92AdIE5C3ANM0ou9R1f0ig7gfYgHWREDM+TJg+Io2nU57Bp20bT+4BeKTxCD3SyGGRWGRd3FKd7m8hTDTCUXc9rXQINVB3PXXX0wjHNM3b7ce7gNEnysZQNgZtRwC0HSkbQ9UahB62BJ+BRzuASNloylqhzdI8zzOtsP/qK/j6GNcAgaKWFJVEGQfwB7iMaaJqFOXqucFvEAUcHQDDGCjKjqLskLoH+MHywX67wVNUi1dUAh8iwHfgVQG8BGLOMzEmQkxMUwb4usY8A4gpHfyUJoBvgCzWpmfAOXABfAQ+AM9X7/H68j6t3gUwrP7DKzy0Ezk+OKScAAAAAElFTkSuQmCC"
  3008. };
  3009. });
  3010.  
  3011. bt.addSource("TL", function () {
  3012. var tl = "https://www.torrentleech.org/torrents/browse/index/query/{query}";
  3013.  
  3014. return {
  3015. url: {
  3016. all: tl,
  3017. movies: tl + "/categories/1,8,9,10,11,12,13,14,15,29,35",
  3018. movies_1080: tl + " 1080p/categories/13,14,35",
  3019. movies_720: tl + " 720p/categories/13,14,35",
  3020. movies_bluray: tl + " (AVC OR VC-1 OR BD25 OR BD50 OR COMPLETE OR M2TS OR ISO) -x264 -re-encode -re-encoded -bdremux -remux -3D -720p/categories/13,14,35",
  3021. movies_remux: tl + " (REMUX OR BDREMUX)/categories/13,14,35",
  3022. movies_dvd: tl + "/categories/12",
  3023. docs: tl + "/categories/29",
  3024. tv: tl + "/categories/27,32,35",
  3025. mvids: tl + "/categories/16",
  3026. elearning: tl + "/categories/5",
  3027. games_pc: tl + "/categories/17",
  3028. apps_win: tl + "/categories/6,23,33",
  3029. ebooks: tl + "/categories/5"
  3030. },
  3031. onParse: {
  3032. row: "#torrenttable > tbody > tr",
  3033. link_prepend: "https://www.torrentleech.org",
  3034. sel: [
  3035. {text: "a:eq(1)"},
  3036. {text: "> td:eq(6)"},
  3037. {text: "> td:eq(4)", link: "a[href*='/download/']:eq(0)", noblank: true}
  3038. ]
  3039. },
  3040. onValidate: function (response) {
  3041. return response.responseText.indexOf('/user/account/signup') === -1 ? true : "login needed";
  3042. },
  3043. onFilter: [bt.requireAllWords, bt.filter3dMovies, function (data, response) {
  3044. if (["elearning", "ebooks"].indexOf(response.context.category) !== -1) {
  3045. return data;
  3046. } else {
  3047. return bt.requireAllWords(data, response);
  3048. }
  3049. }],
  3050. icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACfUlEQVQ4jaXST0jTcRjH8edQaWB5EG+GkhCY6aFmp2Qzm6bhRZBE0BnRoUsGm3oYLNOyCZqVKRNBMEHm9OBaEoontUMF9kcwEiwmsgIHkr9995sb/N4dRhODvPTAc/nA8+Lh4RH+s+TvwOv1UlVVhdPpTGU+nw+32017ezsWiwWHwwGAYRj7gN/vZ2BgALfbja5HycrKSgEul4vlnWFmt1082DiLiBAKhVBK7QN9fX3EE3H24ntEdYXI/nJ2u53X2528CDVxcz4DEWFxcZFwOJwEvF4vHR0dxON7xPZiRJSGiJCWlobH48FmszEesvHw2zmuPjqOiDA1NcXW1lYSqK2tRY/p6DGdqK5Y+7LG5KSXpeUl8vLyqKioYHCzEsfXk1y6m4aIMDY2RjAYTAIFBQWoaAQVjfDjZwh3j5v6+uvYHXZEhKKiIp4Gy/4NtLa2kp2dTURpvHv/lsamRkQEEaGuro78/HyeBM3/BgByc3OJKI3V1c8poK2tjZ2dHQoLC3kWvHw4YDKZUFHFrvaLrq5ORISFhQUASktLeb5ZcThQUlJCNKqIKI2XAT8igqZpANTU1DC0WX04kJOTQ0RpaJFdlt8spW7Q399PeXk5Pd/Pc2shgwu2Y4gIo6OjBwER4eOnD8z4Z/AMe3jc38er2QAiQmZmJreXT3DlXjqnLUcQEUZGRvaBRCJBQ0MDIkJLyx2qr1VTVlZG843m1CbW++mcqTzKqYtJYHx8PPlIhmGg6zrr6+tYrdbUwJ82mUyYzeYDWXFxMfPz88lXNgyDRCJBOBxmZWWFiYkJuru7cTqd9Pb24vP5mJubY3p6msHBQYaGhggEAmxsbKCU4jcmF8IcHBr/0wAAAABJRU5ErkJggg=="
  3051. };
  3052. });
  3053.  
  3054. bt.addSource("AR", function () {
  3055. var ar = "https://alpharatio.cc/torrents.php?action=basic&searchstr={query}";
  3056.  
  3057. return {
  3058. url: {
  3059. all: ar,
  3060. movies: ar + "&filter_cat[6]=1&filter_cat[7]=1&filter_cat[8]=1&filter_cat[9]=1",
  3061. movies_1080: ar + " 1080p&filter_cat[7]=1&filter_cat[9]=1",
  3062. movies_720: ar + " 720p&filter_cat[7]=1&filter_cat[9]=1",
  3063. movies_bluray: ar + " COMPLETE&filter_cat[7]=1",
  3064. movies_remux: ar + " REMUX&filter_cat[7]=1",
  3065. docs: ar + "&filter_cat[1]=1&filter_cat[2]=1&filter_cat[3]=1&filter_cat[6]=1&filter_cat[7]=1&filter_cat[24]=1",
  3066. tv: ar + "&filter_cat[2]=1&filter_cat[3]=1&filter_cat[5]=1",
  3067. mvids: ar + "&filter_cat[11]=1",
  3068. elearning: ar + "&filter_cat[21]=1&filter_cat[22]=1&filter_cat[24]=1",
  3069. ebooks: ar + "&filter_cat[21]=1",
  3070. abooks: ar + "&filter_cat[22]=1",
  3071. games_pc: ar + "&filter_cat[12]=1",
  3072. apps_win: ar + "&filter_cat[16]=1",
  3073. music: ar + "&filter_cat[23]=1",
  3074. music_flac: ar + " FLAC&filter_cat[23]=1",
  3075. xxx: ar + "&filter_cat[10]=1&filter_cat[20]=1"
  3076. },
  3077. onParse: {
  3078. row: "#torrent_table tr.torrent",
  3079. link_prepend: "https://alpharatio.cc/",
  3080. sel: [
  3081. {text: ".group_info > a:eq(0)"},
  3082. {text: "> td:eq(7)"},
  3083. {text: "> td:eq(5)", link: "a[href*='action=download']:eq(0)", noblank: true}
  3084. ]
  3085. },
  3086. onFilter: bt.filter3dMovies,
  3087. icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACO0lEQVQ4jWNgoCV4euep7PTNv1Lv3n0mR1DxqlWrmK/evq117e5d1du3Hylfv3tXraF7fS+H27H/BdWLF9y581jl2bNnXDgNuH37kbJz0+ZD3GXnvjHXPPrPkbbtP2vO1f+suVf/Mxc+/s9SduW/XNWJxztO3fDA6xKrtmMnGdq//xdVD/2vGbDvgVfK9kOMHr/+C+ql/Gds/fxfqObGuydPngjjNMC54+BBxtZP/7nsVv6fMOd4+YZtJ0IYPT795zJZ+p81/8R/xqYP/7fvO+iF0wCntoMHGFs+/Bd2nv7tyZMnMs+ePeNSDz5xl9n96X+29J3/GVs+/V+7eWcITgMc2w4eYGz99D89o30dTKxj0oFGFts9/5kanvznrb716cGDB5J4DWBo+/J/856TAfdevhRft/dMaEbP6tksuaf/M1T9+9+/+kgJ3kC0bTxwjLH18/9dRy+4bTt+1dOz68BO56bt+1mqHv1iiPj7v6Tz6EScmh/euqXEG3f5O0Pr5/87Dp9Fia6cmXsnM5T9+y/qff7d8+fPRbEaUNq6vY8h6d9/hrav/+cu35yKLHfh6m1txsoH/xnCf/+fMO9AIYrGx48fc+7Zc8SR3+PSJ4aSv/8Z2n/+r+lf1Hbv3j15qBLGM2fOGCkV77zHUPbvv1rUmTtHTpy1gBuwbvuxUNWkZXdVk/fcVSnbc1elbPdd1cwld12LZu9hYGBguH73rppOzpLrqsXb7qqW7b2rGrrzrpb/gutIFgwgAACAXCA9/NcOuQAAAABJRU5ErkJggg=="
  3088. };
  3089. });
  3090.  
  3091. bt.addSource("DS", function () {
  3092. // NB: Search in multiple categories at once doesn't work
  3093. var ds = "https://www.dvdseed.eu/browse2.php?wheresearch=1&incldead=1&search={query}";
  3094.  
  3095. return {
  3096. url: {
  3097. all: ds,
  3098. movies: ds,
  3099. movies_1080: ds + " 1080p&kopia_reencode=1",
  3100. movies_720: ds + " 720p",
  3101. movies_bluray: ds + "&pkat_bd25=1&pkat_bd50=1&kopia_clone=1&kopia_modify=1&kopia_custom=1",
  3102. movies_dvd: ds + "&pkat_dvd5=1&pkat_dvd9=1&kopia_clone=1&kopia_modify=1&kopia_custom=1",
  3103. tv: [ ds + "&c74=1", ds + "&c31=1" ],
  3104. mvids: [ ds + "&c6=1", "https://www.dvdseed.eu/browse.php?id=3&t=3&c5=1&wheresearch=1&incldead=1&search=" ],
  3105. docs: ds + "&c69=1",
  3106. abooks: ds + "&c98=1",
  3107. apps_win: ds + "&c27=1",
  3108. music: ds + "&c91=1",
  3109. music_flac: ds + "&c91=1",
  3110. xxx: ds + "&c9=1"
  3111. },
  3112. onParse: {
  3113. row: "#torrentable tr:gt(0)",
  3114. link_prepend: "https://www.dvdseed.eu/",
  3115. sel: [
  3116. {
  3117. text: "a[href*='details.php']:eq(0)",
  3118. freeleech: "meta[src*='/free.png']"
  3119. },
  3120. {text: "> td:eq(6)"},
  3121. {text: "> td:eq(5)", link: "a[href*='download.php']:eq(0)", noblank: true}
  3122. ]
  3123. },
  3124. onFilter: function (data, response) {
  3125. if (["movies","movies_1080","movies_720","movies_bluray","movies_dvd","tv"].indexOf(response.context.category) !== -1) {
  3126. var stoplist = ["dtsflac","3d1.png","audiobook","music.png","porn.png"];
  3127. var stoplistLength = stoplist.length;
  3128. return data.filter(function(){
  3129. var html = this.innerHTML;
  3130. for (var i = 0; i < stoplistLength; i++) {
  3131. if (html.indexOf(stoplist[i]) !== -1) {
  3132. return false;
  3133. }
  3134. }
  3135. return true;
  3136. });
  3137. } else {
  3138. return data;
  3139. }
  3140. },
  3141. icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADYElEQVQ4jZXTzU+TBwCA8TcZ9ON9W1r5yACHglABEfmmfCgiieKmuFnoLKW80FqIbM7FjMOyiTDcYXWJh2FxTqqFQCUM2ehaKK5I8DA34/y4sECG240hySK4ZM5Jnh2227LDDr88f8EjrD6F8J15co55/5fwnXlWn4KwvPo7/cGbvNbWSUbpftLKTaTusrBll+Wf1pNSYSF+dyti1Sni6j4hXvbyfu8odxcfIXy3sERlez+R+TLV+6vp93q56ruKz+fD5xvENzTE4OAA3d1n2FFYhq68Damun/TmC3R4phDe9HyPovYKytwjWK1Wrk9dZ3JygkDQz/R0mOXlZdb/XGf18WNcLhdxydkoTR4iLMMY3gogqBv8KF79lHijGVuDDddHZ6mtqyOr7BWKqm18fO48KysrPHv2B8FggLQd5Yi1l1FYx1BaxxAkx9coq06z5+VabkzfYGF+gQabDY3xGOq8Jsy2Fn5cXGR1bY3OD7p4MS0PsW4ApW0clc2PoJEDiMY2jh518uS3J9y/f4/qfftQJOZiKKqmp/ciS78scfvb2+SVViBVvIOm8SvU8gSqxgCCZBkmpuB1ujq7eL7+nIc/PeSzvj5cLhfXRkfxeC4jN8mUlpQhanREJBWjKLCjOtiDujGAIJr6MJTU4Ha7mZv7gXsPHvDNrVvMzs7iOuvCad7JlfYsJs5sI/RhBuNdmbQ35xJV2IDa5kdItFwgLz+L1IztZOeXkJ1vJDvfyPbcQuITNnLxxBbGTxuoMcZQvFVDYWYMW41VaM1etI4wgt4RIsbqRTp8Ca3pElEmD1GH+9Ad6iEyIYcv3k1muH0TOSkq4nQRxMTGIuWZEetH0DpnEDTOGf42i67lJhtaZ9E7w+hlP+oCO8dNBsIdScyc2kj4vUSunXwJc2UKUnEzkn0KIaFlDI0jjNYxjdYxg9Y5jd4+ib5hFHFvNxsyKylM12Mxamjdo2XkjWjGT8SiS9qGyjKCcPzcKInOL5HkIFJzCMkeQiv70daPoCpqJTkllZwkFQVJL7DboKDXIjLojCJ6cxab7EMIcz8vcdIdIK55BLHRj9joR2MdQzriIzL9AG/vjWZAVjHcpMInq3FbRGpKN1NS48TtCyEAeEN3/3PbhJ3yv6SZOjnU8TmPfl3jL7D9OQgYKA4vAAAAAElFTkSuQmCC"
  3142. };
  3143. });
  3144.  
  3145. bt.addSource("EBZ", function () {
  3146. var ebz = "http://elbitz.net/browse.php?incldead=1&typ=0&search={query}";
  3147.  
  3148. return {
  3149. url: {
  3150. all: ebz,
  3151. elearning: ebz,
  3152. docs: ebz + "&c10=1",
  3153. ebooks: ebz,
  3154. mags: ebz + "&c16=1",
  3155. abooks: ebz + "&c6=1"
  3156. },
  3157. onParse: {
  3158. row: "tr:not(:has('tr')):has(a[href*='download.php'])",
  3159. sel: [
  3160. {text: "a[href*='details.php']:eq(0)"},
  3161. {text: "> td:eq(6)"},
  3162. {text: "> td:eq(5)", link: "a[href*='download.php']:eq(0)", noblank: true}
  3163. ]
  3164. },
  3165. icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABrElEQVQ4jWNgQAO3b99mX7NyempyvO0RazOuH+bG7H+x4R07loWh62W4evWUQViw7lVcmmDYwoTj192719VQNJ85s9/G0VboAyHN5sbsfxvqkhegaH769I6sm6PEK0K2+ngpPZg1o6nmzJkzrCgGVJSGr0DXEB6qf/nQvo3et2/fZsfwKzJ48uS2DHpgRYWbnH/37i4/Xo0wsGnTolh028+c2W9z+PBWj4QYyxNhwbpXseFD+zZ6MzAwMDBMn1pXj6zZzVHi1bt37/gd7UTe4QuTixcPmzMwMDAwTJxQ2Y4s4eOl9ODBgweSFibsf3Bpjo2yOLVq1SpmBgYGBoali/oKkSWtzbh+vHx5T7ymMnYpNs1pSY4H7969KwcPg/OnDlqhK+rpKuxjYGBgvHr1tOGZM/ttYPjWrcuaGIG4atUq5kA/jVuocc7+Z9aMphq4MwmBXdtXhGJzrp+36r26moQFPV2FfT1dhX1zZrVWPnhwQxGrIZ3tuZOJScb21oKf9+xcE4DVK/3dJb3EGOLmKPHq7du3fFhdcvjwVo/YSNNzhAw5cmCbJwMDAwMAh9dGMcvzkAcAAAAASUVORK5CYII="
  3166. };
  3167. });
  3168.  
  3169. bt.addSource("Traum", function () {
  3170. var traum = "http://lib.it.cx/?find=";
  3171.  
  3172. return {
  3173. url: {
  3174. all: traum,
  3175. elearning: traum,
  3176. ebooks: traum,
  3177. fiction: traum
  3178. },
  3179. onParse: {
  3180. row: "tr:has(a[href*='epub']):not(:has('tr'))",
  3181. link_prepend: "http://lib.it.cx",
  3182. sel: [
  3183. {text: "a:eq(0)", noblank: true},
  3184. {text: "> td:last"}
  3185. ]
  3186. },
  3187. icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAM0lEQVQ4jWPo3v7gPyWYoXv7g/9y2ZvJwoPIAGwYm2KsYYAN4DIAq+JRA0YNoKkBxCZbAF6fe55MSrHNAAAAAElFTkSuQmCC"
  3188. };
  3189. });
  3190.  
  3191. bt.addSource("Genesis_Fiction", function () {
  3192. var genf = "http://gen.lib.rus.ec/foreignfiction/?s=";
  3193.  
  3194. return {
  3195. url: {
  3196. all: genf,
  3197. elearning: genf,
  3198. ebooks: genf,
  3199. fiction: genf
  3200. },
  3201. onParse: {
  3202. row: "tr:has(a[href*='foreignfiction/ads.php'])",
  3203. sel: [
  3204. {text: "> td:eq(0), > td:eq(2)"},
  3205. {text: "a[href*='/ads.php']:eq(0)", link: "a[href*='/ads.php']:eq(0)", noblank: true}
  3206. ]
  3207. },
  3208. icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABh0lEQVQ4jY2SoYvUQRiGP5bjwiGyiBhETIssDPx+M88DhxgMIodcMBhNBoNc8i8QDCKHwWAQMZjEICIGg+G4dEkOEcMhYhARk4gsIrLIWmZlXXfX+2DSzPvOM++8EQumlHIaaCJiadG5maNeVkfqCBgAW8CNnPO6enihuJRyXh2ODaYX8EvdA279I845n1K/q9tt254ALgC31d0qnDR6No3dV7/UA2/Vm+par9c7WM276ou6/yqldGAS+6j6YQ72UN1VH1eKj8A59e4Yuwu8nvfmKexBzjkDV4GXkVJaVrf3I1aHOef1iAjgnvom1Gv7FI9KKVdqVhfVIXAm1D31obqhPlW/zUHfjIho23ZV/aFuREUZjLEiIlJKy7WBm+NcgEcR0Wma5hjw6U941WAHeBARnVmlaprmSEQsqSu1C1sxWe22bVeBr+pn9X5t4cqUT6d+4buU0qFZ7esCl4AnwKC+8XnN5Xgp5Xq9pD+L8q+p37oG3FHf1wx+llLO/lc8a9Q+cHLe/m9CrdD4hthLEQAAAABJRU5ErkJggg=="
  3209. };
  3210. });
  3211.  
  3212. bt.addSource("Genesis_NonFiction", function () {
  3213. var gen = "http://gen.lib.rus.ec/search.php?open=0&view=simple&column=def&req=";
  3214.  
  3215. return {
  3216. url: {
  3217. all: gen,
  3218. elearning: gen,
  3219. ebooks: gen
  3220. },
  3221. onParse: {
  3222. prepare: function (response) {
  3223. if (response.responseText.indexOf('<table width=100% cellspacing=1') === -1) {
  3224. return "<table></table>";
  3225. }
  3226.  
  3227. var html = response.responseText.replace(bt.imgTagRegex, '<meta ').split('<table width=100% cellspacing=1')[1];
  3228. html = '<table width=100% cellspacing=1' + html;
  3229. html = html.split('</table')[0];
  3230. html += '</table>';
  3231.  
  3232. return html;
  3233. },
  3234. row: "tr:gt(0)",
  3235. link_prepend: "http://gen.lib.rus.ec/",
  3236. sel: [
  3237. {text: "a[href*='book/']:eq(0), > td:eq(8)"},
  3238. {text: "> td:eq(7)", link: "a[href*='/ads.php']:eq(0)", noblank: true}
  3239. ]
  3240. },
  3241. icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABkElEQVQ4jaWTvUtbYRSHXV5KpgydxEkcOohUkESNF6RaDIhoqYNDl4o6aNvBj6VIktdrFBFNU100BGnFKIIZxIA2JVkUvSZim8SP+JmIzvdfeDokm2Ju6PDjwBkeznkOp0TXs/xPSp5qZu4zSF+I+fUokViyeICuZ/nwNYCwOhA1DjpHVooHaIkUY4u/mFndY8i7YxwQ3o/z0blB6+cfvO3186Z7gfYvy3yaDHJ6fVEYkHnIUNU1h1BUhOLOVxVhk0hfyNgK679jiGoHJmWM8jYPrzo8mJVxfob2jDuIxJKkrm6JxE/Y2j1me/8vB4mz5wFaIoW9x0+pfZoXNhfC4kRYZD5OhFViH1h6foLhb5uIOomwSYRNRdS78sn1zE3uwis09vlz4urzU1hdiFoHok7y+v1cYUBgR6PynZfB2U0C2xqHqUuO03f8SV+TTJ8bk6jrWU5vblkLa/RPBHnZME4wemTsCiPeMObmyZwLizPnwyqJxB//xZOAYPSIspYpRIOKSVGpaPcw+n2ruF8wmn/uAT7c5N64IAAAAABJRU5ErkJggg=="
  3242. };
  3243. });
  3244.  
  3245. bt.addSource("HDClub", function () {
  3246. var hdclub = "http://hdclub.org/browse.php?incldead=1&stype=and&search={query}";
  3247.  
  3248. return {
  3249. url: {
  3250. all: hdclub,
  3251. movies: hdclub + "&c70=1&c71=1",
  3252. movies_1080: hdclub + "&cr2=1&c70=1&c71=1",
  3253. movies_720: hdclub + "&cr1=1&c70=1&c71=1",
  3254. movies_remux: hdclub + "&cr3=1&c70=1&c71=1",
  3255. movies_bluray: hdclub + "&cr4=1&c70=1&c71=1",
  3256. music: hdclub + "&c81=1",
  3257. music_flac: hdclub + "&c81=1",
  3258. tv: hdclub + "&c64=1",
  3259. mvids: hdclub + "&c68=1",
  3260. docs: hdclub + "&c78=1"
  3261. },
  3262. onParse: {
  3263. cleanup: ["a[href*='&snatched']"],
  3264. row: "#highlighted > tr",
  3265. link_prepend: "http://hdclub.org/",
  3266. sel: [
  3267. {
  3268. text: "a[href*='details.php']:eq(0)",
  3269. freeleech: "meta[src*='free']"
  3270. },
  3271. {text: "> td:eq(-3)"},
  3272. {
  3273. cleanup: ["> td:last b"],
  3274. text: "> td:last",
  3275. link: function (context) {
  3276. var link = $("a[href*='details.php']:eq(0)", context);
  3277. var id = link.attr("href").split("id=").pop().split("&")[0];
  3278. return 'download.php?id=' + id;
  3279. },
  3280. noblank: true
  3281. }
  3282. ]
  3283. },
  3284. onPrepareQuery: function (context) {
  3285. var i,
  3286. len = context.url.length,
  3287. year = bt.extractYear(context, true);
  3288.  
  3289. if (year && year.length === 4) {
  3290. for (i = 0; i < len; i++) {
  3291. context.url[i] += "&dsearch=" + year;
  3292. }
  3293. }
  3294.  
  3295. var res = bt.extractResolution(context);
  3296.  
  3297. if (res === "720p") {
  3298. for (i = 0; i < len; i++) {
  3299. context.url[i] += "&cr1=1";
  3300. }
  3301. } else if (res === "1080p" || res === "1080i") {
  3302. for (i = 0; i < len; i++) {
  3303. context.url[i] += "&cr2=1";
  3304. }
  3305. }
  3306. },
  3307. onFilter: bt.filter3dMovies,
  3308. icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABJUlEQVQ4jc2TMYrCYBCFJxEEDWkS7SWFwRNEcgMba2s9gT94A49gE0hShdT2qRMDOYCFpbESK8H222JZ2cVdFbexeNXAN2/ezIiu6/xH8j4AEbktivypG4BpmjeAZrNJu93GMAw6nQ62bWPbNo1G4woREaHb7VKWJa7rfi8wnU5JkoQwDKnrmv1+z+FwYLvdMhqNvtwIpmlyPB7p9/s/bCqlKIoCx3EYDod4nofv+6xWK87nM47jIIPBgDRNuVwurNdroigijmOCICBNU7Is+zWDuq6ZzWavAVqtFqfTiclkcn+E+XxOnueMx2OUUiilWCwWVFXFbrfDsqznQlwul2w2G/I8pygKoiii1+t9Nnq0RsMw7t7CU4ek6zqapl31pr/wqj4A0+pxDcsltyEAAAAASUVORK5CYII="
  3309. };
  3310.  
  3311. });
  3312.  
  3313. bt.addSource("BlueBird", function () {
  3314. var bird = "http://bluebird-hd.org/browse.php?incldead=1&stype=and&search={query}";
  3315.  
  3316. return {
  3317. url: {
  3318. all: bird,
  3319. movies: bird + "&c1=1&c2=1",
  3320. movies_1080: bird + "&c1=1&c2=1&cr3=1&cr5=1",
  3321. movies_720: bird + "&c1=1&c2=1&cr4=1&cr6=1",
  3322. movies_remux: bird + "&c1=1&c2=1&cr2=1",
  3323. movies_bluray: bird + "&c1=1&c2=1&cr1=1",
  3324. music: bird + "&cr7=1",
  3325. music_flac: bird + "&cr7=1",
  3326. tv: bird + "&c6=1",
  3327. mvids: bird + "&c4=1",
  3328. docs: bird + "&c3=1",
  3329. xxx: bird + "&c7=1"
  3330. },
  3331. onParse: {
  3332. cleanup: ["a[href*='&snatched']"],
  3333. row: "#highlighted > tr",
  3334. link_prepend: "http://bluebird-hd.org/",
  3335. sel: [
  3336. {text: "a[href*='details.php']:eq(0)"},
  3337. {text: "> td:eq(-3)"},
  3338. {text: "> td:last", link: "a[href*='download.php']:eq(0)", noblank: true}
  3339. ]
  3340. },
  3341. onPrepareQuery: function (context) {
  3342. var i,
  3343. len = context.url.length,
  3344. year = bt.extractYear(context, true);
  3345.  
  3346. if (year && year.length === 4) {
  3347. for (i = 0; i < len; i++) {
  3348. context.url[i] += "&dsearch=" + year;
  3349. }
  3350. }
  3351.  
  3352. var res = bt.extractResolution(context);
  3353.  
  3354. if (res === "720p") {
  3355. for (i = 0; i < len; i++) {
  3356. context.url[i] += "&cr4=1&cr6=1";
  3357. }
  3358. } else if (res === "1080p" || res === "1080i") {
  3359. for (i = 0; i < len; i++) {
  3360. context.url[i] += "&cr3=1&cr5=1";
  3361. }
  3362. }
  3363. },
  3364. onFilter: bt.filter3dMovies,
  3365. icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAC20lEQVQ4jY3IS0zTdwDA8Z+LO3gZiUumiS8ooqWlhE2lrDWxlocmUBSjpfpnUdSAAVFidOWPKxYw5VUKRmtbCxUwlgJFYbUKCOhkPoIv4pOoyWJ2miZbNEu223cHk2WLienhc/mI0OVRjM4z6D196NzBmOg9Ida5AvgHhxG6Y63kvPiT7Nn3ZD9/F6P3bHj1F2vbAojU6ib0E0/JiN4n43KMovfRjT/h29YOhLq8Ck3HEBpvmFTf4EfUngGS3f2oTn+g9gyg8Q6SFoiwqroBkbSjhG8afay0uVDIzSjkln8lVDWTYj9BeqOXNQ1e0ht9pNWfIsHaRHy1k5SSQ4jUwmKsF8ZZf8zJfEspC4vKWVhUzgKpjK+kMuqvTNE/+ytdM69w33qMPTrFns4Bkg/8gKJAQqRttnD04iT6ChmRtpa5WiNz0418ttrA5xmZeH9+yPmZl+xp97PL5aPU3Y1taIJSf4jEnE0IVbaJushP7D3RSc5BmXxrLQVyPdtsDeRUWAk+mKUlMoFYvAKhSEEkqNlwUMYxehvtFgmhysyl5sI4zePTdNx9Tt+z10R/ecvN3/+m98Es/hv3ONoTRixOYk5iCmLRcpR5Zhyjt9EX7kSk5m3FNjRJgd1J4mYJpbkYpbkYlWU38SYLS3LNxJsszDfk8uX6PBZkbUJqcmMbvsbqrUWIVduLsYbHMMgO5m00E5cvEZcv8UXeDuJMEnLfJfy3HtF69Q51w5PIAyNUha9ibu9EYSpEaL7bx66eYXTHT7GoooZllbUsq6xlaaWdpZV29g+OUT8xzfc/Xqeif4R9wSgFniCJRxwod5YhlCWHUJ/sJbmtB1X7uf9rO8cKZxcrnV0oW7tJdvWgdHWT1HIW9clevj5ch9AcOY42Ms2a8NQn3PiPD6eNTKNtOI1Ir3GS9eQPjDNvMD78LWZZz96hawsgvP0XyfT1YQiNYQiOxCY0hjEwhOPsef4BcnJ19Gval0YAAAAASUVORK5CYII="
  3366. };
  3367. });
  3368.  
  3369. bt.addSource("Rutor", function () {
  3370. var rutor = "http://main-rutor.org/search/";
  3371.  
  3372. return {
  3373. url: {
  3374. all: rutor,
  3375. movies: [rutor + "0/1/100/0/", rutor + "0/5/100/0/", rutor + "0/7/100/0/"],
  3376. movies_1080: rutor + "0/0/100/0/1080p ",
  3377. movies_720: rutor + "0/0/100/0/720p ",
  3378. movies_remux: rutor + "0/0/300/0/remux|bdremux ",
  3379. movies_bluray: rutor + "0/0/310/0/bdinfo -bdremux -remux -hdtv -bdrip ",
  3380. movies_dvd: rutor + "0/0/300/0/dvd|dvd5|dvd9|dvdr ",
  3381. music: rutor + "0/2/100/0/",
  3382. music_flac: rutor + "0/2/100/0/FLAC ",
  3383. mvids: rutor + "0/2/300/0/-mp3 -flac -ape -aac -alac ",
  3384. tv: rutor + "0/0/300/0/720p|1080p ",
  3385. docs: [rutor + "0/12/100/0/", rutor + "0/6/100/0/"],
  3386. games_pc: rutor + "0/8/100/0/",
  3387. apps_win: rutor + "0/9/100/0/",
  3388. elearning: rutor,
  3389. ebooks: rutor + "0/0/300/0/pdf|epub|fb2|djvu|chm|mobi|doc ",
  3390. fiction: rutor + "0/0/300/0/pdf|epub|fb2|djvu|chm|mobi|doc ",
  3391. abooks: rutor + "0/11/300/0/flac|mp3 ",
  3392. comics: rutor + "0/0/300/0/CBZ|CBR ",
  3393. mags: rutor + "0/0/100/0/PDF "
  3394. },
  3395. onParse: {
  3396. row: "#index > table:eq(0) > tbody > tr:gt(0)",
  3397. link_prepend: "http://main-rutor.org",
  3398. sel: [
  3399. {text: "a[href*='/torrent/']:eq(0)"},
  3400. {text: "> td:last > span:eq(0)"},
  3401. {text: "> td:eq(-2)", link: "a[href*='/download/']:eq(0)", noblank: true}
  3402. ]
  3403. },
  3404. onFilter: [bt.filter3dMovies,bt.requireAllWords],
  3405. icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAClklEQVQ4jZXSS0hUcRTH8TPXe//Xmes0apqWJQxZDBUFhhSUEbRoFUUSRBC0CFr0WLWqRWLtgloKRVowBJq06IFOr+mhmTXKWD6oHHMcNJsevmbGx9W+LVyEaEW/9TkfDoefyF+S+lrF9Iifv838MTPxo0TqSoje2cJU/Nj/IdOxrby/6KbK48Cfo9Fx3ondv/HfiD1awVjIonm/cFd0gpJGeEcmnWc20HTI4HvAxB4+vjg0k9zHjxfCgw0aDZJOdLeTb2UGoVyd8NFCYrVFBIoN4nVCIrp+PoJdyqca4Y5X8VQMBk654ItirN4kmmvwUoTBGg/RCxnUmorOCg17IH8OmZ1ZRbhS8CuNp6IRO2GBrZgd0xm65OKHOBgRjXe7FKlXbhpNHb84aD6rwcQyJPW5mHC5okYUbQ6TN8VOItezebxHMfnRYuqIyZRoxHwGY+0eWpeb1IlOuNwi1rNu7orBKoN7mk6XQ6NL0mgUk5AYhEoV9ocMEmUmQ6UuUs8tWrJ0HiqDVP2S33+YaMzjkVejRRQD+YrEfkVyu4uPotNels7IEzfJF06+XLMIaornawwSrTnzH9l12qRedAYrPNjTGUwOWcxUKnoPOhjtdgEGHSctGkSn7YDO61DJfGA44KJpbzrDb3K4u80kWGrSX69I9Cq6rpq0XXQxHc0jsNpFX2XWwi6Mfs6hr8Hi1mYnD0XntaQTEJ0GQ+O+GNwSRXO5l07/JuKhpQuBxp6dPDtncEXSeCYGraLzVoQ2EVpFCIrOZdG4cbiAie7cxdsYb/FQvcLi9ko3jwo9BAszCXpzeVKUx/21BVT7VtJ+08f4vVWLA3Z/JqmIm+T7bJKRfMYjhUxFVzMRLSLV52NywMfP70Xzln8BusiizCnLlwcAAAAASUVORK5CYII="
  3406. };
  3407. });
  3408.  
  3409. bt.addSource("AvaxHome", function () {
  3410. var q = "http://avxsearch.se/search?q={query}";
  3411.  
  3412. return {
  3413. url: {
  3414. all: q,
  3415. movies: q + "&c=54",
  3416. movies_1080: q + " 1080p&c=54",
  3417. movies_720: q + " 720p&c=54",
  3418. movies_remux: q + " remux&c=54",
  3419. movies_bluray: q + " m2ts&c=54",
  3420. movies_dvd: [q + " DVD&c=54", q + " DVD5&c=54", q + " DVD9&c=54"],
  3421. music: [q + " mp3&c=2", q + " flac&c=2", q + "&c=568"],
  3422. music_flac: [q + " flac&c=2", q + " flac&c=568"],
  3423. mvids: [q + " video&c=2", q + "&c=54"],
  3424. docs: q + " documentary",
  3425. games_pc: q + "&c=3",
  3426. apps_win: q + "&c=10",
  3427. elearning: q,
  3428. ebooks: q + "&c=5",
  3429. fiction: q + "&c=5",
  3430. abooks: q + " mp3&c=5",
  3431. comics: q + "&c=665",
  3432. mags: [q + "&c=6", q + "&c=151"]
  3433. },
  3434. onParse: {
  3435. row: ".article",
  3436. sel: [
  3437. {text: "a.title-link:eq(0)"}
  3438. ]
  3439. },
  3440. onFilter: [bt.filter3dMovies,bt.requireAllWords],
  3441. icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABRElEQVQ4jbWTsc2DMBBGPQCIElHQIFEwAKJgBmTJe4DEFImURYA1PAJM4A2c0s37K5+SEKQ0vyWL6t4933co9U8HpRTzNHIcO8exY63lOHZ+Ks7SBKUU3j/lOucE9FNxCAHvn9IZwDmHtfYSQpYmAgDw/klTVxg9EEIAEMAJkqUJTV3R1NUboO9amrrCOUcI4dKCssgxepAC75+ifRz711nIUMsip+9a5mmk71qyNBHtqA6Iwckidn/cb/RdS1nkxCcZPTBPI9ZagcThngDbumD0QFnkcuNgszRhnkYx+oyUpq7Y1oV5GmnqirLI5fsK2tZFAG+LFTt8WkRohBg9SEJvMTZ1RZYmPO43HvcbRg8S37YuYhABzrnzMsUu8zQyTyNGDxJtWeQopdjWhRDC9TpHk7hQr6kYPZzVLw6vN+7It3/gD44Pszjh7GJmAAAAAElFTkSuQmCC"
  3442. };
  3443. });
  3444.  
  3445. bt.addSource("Adamsfile", function () {
  3446. var adam = "http://adamsfile.com/search.php?s_string={query}&s_year=&albumsSearchSubmit=&s_genre=&s_mediatype=&s_type=";
  3447.  
  3448. return {
  3449. url: {
  3450. all: adam,
  3451. music: adam,
  3452. music_flac: adam
  3453. },
  3454. onParse: {
  3455. cleanup: [".alb_data", ".urating"],
  3456. row: ".albums > tbody > tr",
  3457. link_prepend: "http://adamsfile.com/",
  3458. sel: [
  3459. {text: "> td:eq(0)", link: "a[href*='details.php']:eq(0)"},
  3460. {text: "> td:eq(1)", link: "a[href^='ftp://dl.adamsfile.com/']:eq(0)"}
  3461. ]
  3462. },
  3463. onFilter: bt.requireAllWords,
  3464. icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABLklEQVQ4jbWTvYrCUBBGJ2tlsWxvQItUFkKKbRfyHCGFASGiIKRbbuNtLX2PFDb3AUKQFKl9AYtgk7CWVmcLUcTssvizA8M3DMzhm4EREVmLCHfmWkSEj/Sd7rDTUGihtdXQr5cWn5Z1ggjdYYc397WhWlt4ntXQKxdPAPz7Cn8c8gmAB1OwbZuiKDgcDiRJgjHmNkAcxxRFQbvdZrFY3Abo9/ucYrfbobU+A/I8B6Cua4IgQERYLpfUdc1+v2cymRwdXA5d1vP5HKUUWZZhjCEMQ8qyxHVdBoMBtm3/DhiNRpRlyXQ6ZbPZYIxBKUWaps0b/ASIooiqqtBas91uMcbgOA5VVbFarUiShPF4fAR4nofv+1zXYRiilCKKonOv1+sxm82I4xjHcZBH3/kbU+6yqUfzIN0AAAAASUVORK5CYII="
  3465. };
  3466. });
  3467.  
  3468. bt.addSource("SCC", function () {
  3469. var scc = "https://sceneaccess.eu/";
  3470.  
  3471. return {
  3472. url: {
  3473. all: [
  3474. scc + "browse?method=1&search=",
  3475. scc + "nonscene?method=1&search=",
  3476. scc + "spam?method=1&search=",
  3477. scc + "archive?method=1&search=",
  3478. scc + "foreign?method=1&search="
  3479. ],
  3480. movies: [
  3481. scc + "browse?method=2&c8=8&c22=22&c7=7&search=",
  3482. scc + "nonscene?method=2&c41=41&c42=42&c43=43&search=",
  3483. scc + "archive?method=2&c4=4&search=",
  3484. scc + "foreign?method=2&c31=31&c32=32&c30=30&search="
  3485. ],
  3486. movies_1080: [
  3487. scc + "browse?method=2&c22=22&search={query} 1080 264",
  3488. scc + "nonscene?method=2&c41=41&search={query} 1080 264",
  3489. scc + "archive?method=2&c4=4&search={query} 1080 264",
  3490. scc + "foreign?method=2&c32=32&search={query} 1080 264"
  3491. ],
  3492. movies_720: [
  3493. scc + "browse?method=2&c22=22&search={query} 720 264",
  3494. scc + "nonscene?method=2&c41=41&search={query} 720 264",
  3495. scc + "archive?method=2&c4=4&search={query} 720 264",
  3496. scc + "foreign?method=2&c32=32&search={query} 720 264"
  3497. ],
  3498. movies_bluray: [
  3499. scc + "browse?method=2&c22=22&search={query} COMPLETE",
  3500. scc + "archive?method=2&c4=4&search={query} COMPLETE"
  3501. ],
  3502. movies_dvd: [
  3503. scc + "browse?method=2&c8=8&search=",
  3504. scc + "foreign?method=2&c31=31&search="
  3505. ],
  3506. movies_remux: scc + "nonscene?method=2&c4=4&search={query} REMUX",
  3507. tv: [
  3508. scc + "browse?method=2&c27=27&search=",
  3509. scc + "nonscene?method=2&c44=44&search=",
  3510. scc + "archive?method=2&c26=26&search=",
  3511. scc + "foreign?method=2&c34=34&search="
  3512. ],
  3513. docs: [
  3514. scc + "browse?method=1&c8=8&c22=22&c7=7&c27=27&c17=17&c11=11&search=",
  3515. scc + "nonscene?method=1&search=",
  3516. scc + "foreign?method=1&search="
  3517. ],
  3518. games_pc: [
  3519. scc + "browse?method=2&c3=3&search=",
  3520. scc + "archive?method=2&c29=29&search="
  3521. ],
  3522. apps_win: scc + "spam?method=2&c2=2&search=",
  3523. music: scc + "spam?method=2&c40=40&c13=13&search=",
  3524. music_flac: scc + "spam?method=2&c40=40&search=",
  3525. // music_mp3: scc + "spam?method=2&c13=13&search=",
  3526. mvids: scc + "spam?method=2&c15=15&search=",
  3527. xxx: scc + "xxx?method=1&search="
  3528. },
  3529. onParse: {
  3530. cleanup: [".ttr_size a"],
  3531. row: "#torrents-table tr.tt_row",
  3532. link_prepend: "https://sceneaccess.eu/",
  3533. sel: [
  3534. {
  3535. text: "> .ttr_name a:eq(0)",
  3536. freeleech: "span:contains('Free leech.')"
  3537. },
  3538. {text: "> .ttr_seeders"},
  3539. {text: "> .ttr_size", link: "a[href*='.torrent']:eq(0)", noblank: true}
  3540. ]
  3541. },
  3542. onFilter: bt.filter3dMovies,
  3543. icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACfklEQVQ4jZXQyS/jcRzG8e//4UDSWFsS+y+EICHUkkgvloM4OAgHJ1WxJFycRELjTESNNUhHpwxVdNTUWGpiYpAOUarRQWNX7zlMKo3LmCd5HZ7P4XN4hBBC6EJD+R/63FyuDw8RQggxGBbGe40lJTGZkYFdq+XG6WS5rg4xGB7Oe0ykp3NkMKAvKMCgUuFcWmK1oQExGBWF33B8PINyOYE3P2tLC06z+bVb6utx6PUInUKB32R2Nju9vVibmxmOj2dUktBFR6NTKPii0XBzespIYiI6hQJjWRmPXi/iQ0wMgYwlJfienjgxmbA2NfGxqIjxlBS+trVxubfHkcHAeGoqtrY2AMRobCxvXe3vs9ffz6fiYpyLixhVKg6Gh9kfGuL27Ayvw4HX4fj7YDwhgUDmqioAXKurTGdmstPdjdtm42RhgaOZGexdXfjjXl9HTEkSgdbq63GtrABwc3LCkV6PpbaWzyoVa2o1662t3Lnd2Ds7mZIkxFBQEIFmCws51OlwW60AWGpqGIuIwLO1he/xEYD7iwtGZDKMSiViLDiYVyEhfNNoMJeWMhYczPH0NPaODsZlMmZzcpjLy2O+sJAfWi1Tcjmr1dWISZkMv+nISDbUajYbG7FUVODZ3OTl+Znf29tc7uxwYbNhkCQWlEpMBQUY09IQ+vBwAs1nZfG9vR3HwAB7PT14Dw54vrvj8eoKz8YGs5LET62W88VFZpOTEUa5nLfm4uKwVVaynJ/PvcuFo68Pu0aDXa3m18DA6xa3x8eI+ZgY3rKVl+M2mXi6vuZfEUIIYY6NJZBVqcSzvIzHYuHF58P38MCDy4V3dxePxcL5zAynExMIIcQfr3ecgShZoxMAAAAASUVORK5CYII="
  3544. };
  3545. });
  3546.  
  3547. bt.addSource("TPB", function () {
  3548. var q = "https://thepiratebay.org/search/{query}";
  3549.  
  3550. return {
  3551. url: {
  3552. all: q,
  3553. music: [ q + "/0/99/101", q + "/0/99/104" ],
  3554. music_flac: q + "/0/99/104",
  3555. movies: [q + "/0/99/201", q + "/0/99/202"],
  3556. movies_bluray: q + " avc/0/99/200",
  3557. movies_remux: q + " remux/0/99/200",
  3558. movies_1080: q + " 1080p/0/99/207",
  3559. movies_720: q + " 720p/0/99/207",
  3560. movies_dvd: q + "/0/99/202",
  3561. tv: [q + "/0/3/205", "/0/3/208"],
  3562. docs: q,
  3563. mvids: q + "/0/3/203",
  3564. apps_win: q + "/0/3/301",
  3565. games_pc: q + "/0/3/401",
  3566. elearning: q,
  3567. ebooks: q + "/0/99/601",
  3568. abooks: q + "/0/99/102",
  3569. fiction: q + "/0/99/601",
  3570. mags: q + "/0/3/601",
  3571. comics: q + "/0/3/602",
  3572. xxx: q + "/0/3/500"
  3573. },
  3574. onParse: {
  3575. row: "#searchResult > tbody > tr",
  3576. link_prepend: "https://thepiratebay.org",
  3577. sel: [
  3578. {text: "a[href*='/torrent/']:eq(0)"},
  3579. {text: "> td:eq(-2)"},
  3580. {
  3581. text: function(context){
  3582. var details = context.find(".detDesc").first();
  3583. if (details.length === 1 && ~details.text().indexOf(", Size ")) {
  3584. return details.text().split(", Size ")[1].split(",")[0].trim();
  3585. } else {
  3586. return $(context[0].lastElementChild.previousElementSibling.previousElementSibling);
  3587. }
  3588. },
  3589. link: "a[href^='magnet:']:eq(0)",
  3590. noblank: true
  3591. }
  3592. ]
  3593. },
  3594. onFilter: [bt.filter3dMovies, function (data, response) {
  3595. if (response.context.category === "movies_bluray") {
  3596. return data.filter(function(){
  3597. return this.textContent.toLowerCase().indexOf("remux") === -1;
  3598. });
  3599. } else {
  3600. return data;
  3601. }
  3602. }],
  3603. icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACLklEQVQ4jZWTMUiqYRSGT/04haTpEoEagYLhWgRJ+je5hmC/DtbgFoEuQmOBGIFrDbmphVKSg9AQkSC0KkI0uAjSEoS4qfjcIe5fN4t77wsvfPCd7zmc850jfNF4PP6rP0t+H56enggEAvj9fjY3N7+1qqqoqsrl5eUkoFQqISL/5GAwOAkol8t6gMFgYHp6GovFgslkQlEUFEVhamoKESEcDv8M8Hg8NJtNotEolUqF5+dnYrEYlUqFdDqNiKBp2iTg+voaEWFlZYVut4umadjtdlwuF0tLSzQaDVKpFCJCKBSaBJyfn+slzM7OTtRtNBpRFEVPMhgMfgaICHa7nZmZGUQEp9OJwWDQ75aXlz8ArVaLeDzO2dmZnmF1dZVgMMjCwgIiQjQaZX19HbPZjIjg9/sZj8eMRiPk/v4eEeHw8JBMJkM+n6darVIsFikUCuTzeXK5HFdXV5TLZW5ubuh2u5yenhKJRJCDgwOdurGxwc7ODplMhkajwXA41Jv19vZGvV4nm81ydHSExWLB5/Mht7e37O3t4fP5uLi4IJlMYrVaERGsVitra2ssLi4yPz+P1+tF0zRUVcXtduNyud6b+PLygslkwuFwoKoqoVCIWCzGyckJx8fHbG1t4Xa78Xq97O/vY7PZ2N3d5eHh4R3Q7/eZm5sjkUjQ6/W+7hcAvV6PWq3G9vY2IsLj4+PHN45GI+7u7nh9ff328Wd1Oh0CgQDtdvvPOfgffV7pXz5OoYc083dvAAAAAElFTkSuQmCC"
  3604. };
  3605. });
  3606.  
  3607. bt.addSource("RuTracker", function () {
  3608. var tru = "http://rutracker.org/forum/tracker.php?nm={query}";
  3609. var truMovies = "&f=100,101,1235,124,1543,1576,1577,1666,1670,187,1900,208,209,2090,2091,2092,2093,212,2198,2199,22,2200,2201,2220,2221,2258,2339,2343,2365,2459,312,313,376,4,484,505,521,539,572,7,709,822,905,93,930,934,941";
  3610. var truDocs = "&f=103,1114,1280,1327,1453,1467,1468,1469,1475,2076,2107,2112,2123,2159,2160,2168,2176,2177,2178,2323,2380,249,251,2538,294,314,46,500,552,56,670,671,672,752,821,851,876,97,98";
  3611. var truFiction = "&f=2039,2041,2042,2043,2044,2045,2047,2080,2193,2355,2356,2357,2474";
  3612. var truMvids = "&f=1107,1121,1122,1141,1142,1174,1189,1227,1228,1455,1775,1777,1781,1782,1783,1787,1788,1789,1790,1791,1792,1793,1794,1795,1812,1886,1887,1912,1913,1990,2088,2089,2241,2261,2262,2263,2264,2271,2304,2305,2306,2351,2352,2377,2378,2379,2383,2384,2426,2507,2508,2509,2510,2529,2530,2531,2532,2534,431,442,445,475,655,702,983,984,986,988";
  3613. var truAbooks = "&f=1036,1279,1501,1580,2152,2165,2324,2325,2326,2327,2328,2342,2387,2388,2389,2413,399,400,401,402,403,490,499,525,530,574,695,716";
  3614. var truGamesPC = "&f=1008,1098,127,128,139,2067,2115,2117,2118,2119,2142,2143,2145,2146,2147,2155,2187,2203,2204,2225,2226,2227,2228,2385,240,2415,246,2478,2479,2480,2481,2482,2483,2484,2485,2533,278,5,50,51,52,53,54,55,635,637,642,643,644,645,646,647,649,650,761,900,959,960,961,962";
  3615. var truAppsWin = "&f=1012,1013,1014,1016,1018,1019,1021,1025,1027,1028,1029,1030,1031,1032,1033,1034,1035,1038,1039,1040,1041,1042,1051,1052,1053,1054,1055,1056,1057,1058,1060,1061,1062,1063,1064,1065,1066,1067,1068,1071,1073,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1192,1193,1199,1204,1503,1507,1508,1509,1510,1511,1512,1513,1514,1515,1516,1517,1526,1536,1636,2077,2153";
  3616. var truComics = "&f=2461,2462,2463,2464,2465,2473,862";
  3617.  
  3618. return {
  3619. url: {
  3620. all: tru,
  3621. music: tru + " lossless|MP3|AAC|OGG|FLAC|APE|ALAC|WV",
  3622. music_flac: tru + " lossless|FLAC|APE|ALAC|WV",
  3623. // music_mp3: tru + "+MP3|AAC|OGG",
  3624. movies: tru + truMovies,
  3625. movies_1080: tru + " 1080p -remux -bdremux -disc" + truMovies,
  3626. movies_720: tru + " 720p -remux -bdremux -disc" + truMovies,
  3627. movies_remux: tru + " remux|bdremux" + truMovies,
  3628. movies_bluray: tru + " \"blu ray\" | bluray -DVD -DVD5 -DVD9 -rip -remux -bdremux" + truMovies,
  3629. movies_dvd: tru + " DVD|DVD5|DVD9" + truMovies,
  3630. tv: tru + " 720p|1080p",
  3631. mvids: tru + truMvids,
  3632. games_pc: tru + truGamesPC,
  3633. apps_win: tru + truAppsWin,
  3634. docs: tru + truDocs,
  3635. elearning: tru,
  3636. ebooks: tru + " PDF|EPUB|MOBI|CHM|DJVU|FB2",
  3637. abooks: tru + truAbooks,
  3638. mags: tru + " PDF",
  3639. comics: tru + truComics,
  3640. fiction: tru + truFiction
  3641. },
  3642. onEnable: function () {
  3643. $(bt.mainColumn).on('click', 'a[href^="http://dl.rutracker.org/"]', function () {
  3644. $('<form target="_blank" method="post" action="' + $(this).attr("href") + '"></form>')
  3645. .appendTo(document.body)
  3646. .submit()
  3647. .remove();
  3648. return false;
  3649. });
  3650. },
  3651. onParse: {
  3652. row: "#tor-tbl > tbody > tr:not(:has('td.pad_12'))",
  3653. link_prepend: "http://rutracker.org/forum/",
  3654. sel: [
  3655. {text: "a.tLink"},
  3656. {text: ".seedmed"},
  3657. {
  3658. text: function (context) {
  3659. var size = context.children().eq(-5)[0].firstElementChild.textContent;
  3660. return bt.humanizeSize(size);
  3661. },
  3662. link: "> td.tor-size > a",
  3663. noblank: true
  3664. }
  3665. ]
  3666. },
  3667. onFilter: bt.filter3dMovies,
  3668. icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACH0lEQVQ4jY3SQUiTcRjH8d3roG90CCIUAqG6dbDLdBEEkxJCaCJFBEmNdtohgkTC0xhBhxa8GsTrsBe6CCIFkeJhh4RZr4zXMLZ373/vH5R3L68l0xeCsW+HcGuZ6Q/+t+f5/Hl4nlDokKytreG6LofV7YvneexlaWkJx3HY2to6OmRZFruZt3wffsyfKZfLSCkPhoQQ+L5PEAR4F0dwlQiuEsHruQHA+Pg4lmX9G5BS0mg0WF5eZvX2o2azq0T4+eET0egAqqr+f4w7Zi++76OqKpvd15q/76SnUVWVhYWFdmB9fZ03m8956TzhqXWX/nwHALqus9o7zM67HACBNo9t28zNzbUDudzvgv58R9tL2Q8BmJx8TTjcx73RUQqFArquI4RoIZVKhXq9zuWVE83m7MYzABKJBMc7b3L67CRDI4skkh8xTZNsNtsChBAAPPh6hemNdHOEcLiP8xeucuzkCzrPfEbpqjD/3sMwDGZmZlqA53lsb2+j6zqzs7N82zUAiMfjDI0sonRVULpdlG4XgFgsxsrKlxZgmiaapjE1NUUmk2FiYoJarUY0OoDjOJzqcTl3qcqt+z94NR0gpcQwjBbg+z6lUgkhBKVSCV3XyeVypFIppJRErvtYdr3tGvet8u+Uy2WKxSKFQoEgCBgcHCQej5NMJhkbGzsc2IthGKTTaTRNo1gsIqXEtm2q1erRACEE+Xz+4NsPhUK/ACWu6h+j7c7tAAAAAElFTkSuQmCC"
  3669. };
  3670. });
  3671.  
  3672. bt.addSource("BTScene", function () {
  3673. var a = "http://www.btsdl.cc/advanced-search.php?term[EXACT]={query}";
  3674. var bydate = "http://www.btsdl.cc/results.php?q={query}&order=1&category=";
  3675.  
  3676. return {
  3677. url: {
  3678. all: a,
  3679. movies: a + "&advcat=1",
  3680. movies_1080: a + " 1080p&advcat=1",
  3681. movies_720: a + " 720p&advcat=1",
  3682. movies_remux: a + " REMUX&advcat=1",
  3683. movies_bluray: [ a + " bluray avc&advcat=1", a + " blu-ray avc&advcat=1", a + " BD25&advcat=1", a + " BD50&advcat=1" ],
  3684. movies_dvd: a + " DVD-R&advcat=1",
  3685. tv: bydate + "series",
  3686. docs: a + "&advcat=1",
  3687. music: a + "&advcat=3",
  3688. music_flac: a + " FLAC&advcat=3",
  3689. mvids: [a + " 720p&advcat=3", a + " 1080p&advcat=3", a + " video&advcat=3", a + " videos&advcat=3", a + " videoclips&advcat=3", a + "&advcat=1"],
  3690. games_pc: a + "&advcat=4",
  3691. apps_win: bydate + "software",
  3692. elearning: [a + "&advcat=7", a + "&advcat=9" ],
  3693. mags: bydate + "ebooks",
  3694. ebooks: a + "&advcat=9",
  3695. fiction: a + "&advcat=9",
  3696. abooks: a + "&advcat=7",
  3697. comics: a + "&advcat=9",
  3698. xxx: a + "&advcat=8"
  3699. },
  3700. onParse: {
  3701. row: "h1 ~ .tor > tbody > tr:gt(0)",
  3702. link_prepend: "http://www.btsdl.cc",
  3703. sel: [
  3704. {text: "> .tname > a:eq(0)"},
  3705. {text: "> .tseeds"},
  3706. {
  3707. text: "> .tsize",
  3708. link: function(context){
  3709. var id = context.find("a").first().attr("href").split("-tf").pop().split(".")[0];
  3710. return "/torrentdownload.php?id=" + id;
  3711. }
  3712. }
  3713. ]
  3714. },
  3715. onFilter: [bt.filter3dMovies, function (data, response) {
  3716. if (response.context.category === "movies_bluray") {
  3717. return data.filter(function () {
  3718. return this.textContent.toLowerCase().indexOf("remux") === -1;
  3719. });
  3720. } else if (response.context.category === "apps_win") {
  3721. return data.filter(function () {
  3722. return this.textContent.indexOf("Windows") !== -1;
  3723. });
  3724. } else if (response.context.category === "comics") {
  3725. return data.filter(function () {
  3726. return this.textContent.indexOf("Comics") !== -1;
  3727. });
  3728. } else if (response.context.category === "abooks") {
  3729. return data.filter(function () {
  3730. return this.textContent.indexOf("Audio Books") !== -1;
  3731. });
  3732. } else if (response.context.category === "games_pc") {
  3733. return data.filter(function () {
  3734. return this.textContent.indexOf("Pc Games") !== -1;
  3735. });
  3736. } else {
  3737. return data;
  3738. }
  3739. }],
  3740. icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAChklEQVQ4jWWSPUvzUBiG0yRtRQjaoSgKkugkguIkDV0cioM4uIij6A9w8YMOzoKurl0qRtpJsIuj6CIUpCD4QYaC1EEEoWqSc9J4vYM0vsXhhjOc534uHi4ll8uRy+WwbRvbtikUClxeXiKEQEoZRwjB4+MjhUKBfD5Pd07RNI1ukskkGxsbfHx8IKUkDMOenJ+fMzQ0xP8ziqIoKIqCruuMjo7SaDSQUtLpdHoipeTu7o7p6WlUVSWRSKAoSi/B2toavu8TRRFhGBJFUZxOp0MURRwcHJBOp0kmkz8Eqqqiqiq6rlOtVgnDMP78/f0dE3Tf1WqVdDqNpmmoqtpbcHp6ihCip6C7PQgCarUaW1tbDA4Oout6b4GmaRSLxT8EYRgSBAH39/eMj48zPDzMwMDA3wJd11laWvpTIISg2WxydnaGYRgsLi5imibdOSWbzZLNZunv78eyLFzXxfM82u02rVaLRqOB67q8v7/jOA7NZpPt7e1fgt3dXfb399nc3CSfz1Mul7m9vaVer/Pw8MDb2xtBEPRI5TgOqVTqp2B2dpaVlRWurq64vr7m+fmZz89PgiDA8zyEEPi+H7sghGB5efmX4Onpib29PWZmZpiamsJ1Xb6+vhBCEIYhQgg8z4u3t9ttcrnc7w1ubm7Y2dlhYmKCw8NDWq0WUspYpjAMe/BfXl7iIyYSCZTJyUkMw6BYLFKr1bi4uKBSqeB5XiyR7/ucnJxwfHyM4zhkMhl0Xf8xsa+vj7m5OUqlEpVKhdXVVY6OjmKhpJTU63VGRkYwDINMJhNrnEqlUObn5ymVSqyvr2PbNgsLC7y+vhIEQUxQLpexLAvLsjBNE9M0sSyLsbEx/gHNcZ7/5OeniAAAAABJRU5ErkJggg=="
  3741. };
  3742. });
  3743.  
  3744. bt.addSource("YouTube", function () {
  3745. var q = "https://m.youtube.com/results?ajax=1&tsp=1&q={query}";
  3746.  
  3747. return {
  3748. url: {
  3749. all: q,
  3750. docs: q,
  3751. music: q,
  3752. movies: q,
  3753. mvids: q,
  3754. games_pc: q
  3755. },
  3756. onHttpRequest: function (requestData) {
  3757. requestData.headers = {
  3758. 'User-Agent': 'Mozilla/5.0 (Linux; Android 5.1.1; Nexus 5 Build/LMY48B; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/43.0.2357.65 Mobile Safari/537.36'
  3759. };
  3760. },
  3761. onParse: function(response){
  3762. try {
  3763. var data = JSON.parse(response.responseText.slice(response.responseText.indexOf("{")));
  3764. } catch (e) {
  3765. bt.showFailAlert(response, "unexpected data");
  3766. return null;
  3767. }
  3768.  
  3769. if (!data || !("result" in data) || data.result !== 'ok') {
  3770. bt.showFailAlert(response, "unexpected data");
  3771. return null;
  3772. }
  3773.  
  3774. if ("content" in data && "search_results" in data.content && "contents" in data.content.search_results) {
  3775. return data.content.search_results.contents;
  3776. }
  3777.  
  3778. return [];
  3779. },
  3780. onRender: function (data, table) {
  3781. var video, rows = "", id;
  3782. console.log(data);
  3783. for (var i = 0, len = data.length; i < len; i++) {
  3784. video = data[i];
  3785.  
  3786. switch (video.item_type) {
  3787. case "compact_video":
  3788. rows += '<tr><td><a href="https://youtube.com' + video.endpoint.url + '" data-video-id="' + video.encrypted_id + '" target="_blank" class="youtube-link">' + video.title.runs[0].text + '</a></td><td>' + video.length.runs[0].text + '</td><td style="width:20%;text-align:right;">' + video.short_byline.runs[0].text + '</td></tr>';
  3789. break;
  3790. case "compact_playlist":
  3791. rows += '<tr><td><a href="https://youtube.com' + video.endpoint.url + '" data-playlist-id="' + video.playlist_id + '" target="_blank" class="youtube-link">' + video.title.runs[0].text + '</a></td><td style="white-space:nowrap;">' + (video.video_count_short.runs.length ? video.video_count_short.runs[0].text : "no") + ' videos </td><td style="width:20%;text-align:right;">[PLAYLIST]</td></tr>';
  3792. break;
  3793. case "compact_channel":
  3794. rows += '<tr><td><a href="https://youtube.com' + video.endpoint.url + '" data-user-id="' + video.endpoint.url.split("/").pop() + '" target="_blank" class="youtube-link">' + video.title.runs[0].text + '</a></td><td style="white-space:nowrap;">' + (video.video_count.runs.length ? video.video_count.runs[0].text : "no videos") + '</td><td style="width:20%;text-align:right;">[CHANNEL]</td></tr>';
  3795. break;
  3796. }
  3797. }
  3798.  
  3799. table.html(rows);
  3800. },
  3801. /*
  3802. onParse: {
  3803. row: "ol.item-section > li:has(a[href*='watch?v='])",
  3804. link_prepend: "https://www.youtube.com",
  3805. sel: [
  3806. {
  3807. text: "h3 > .yt-uix-tile-link",
  3808. class: "youtube-link",
  3809. vod: ".yt-badge-ypc"
  3810. },
  3811. {text: ".video-time"},
  3812. {text: ".yt-lockup-byline > .g-hovercard", width:"20%"}
  3813. ]
  3814. },
  3815. */
  3816. onEnable: function(){
  3817. $(bt.mainColumn).on('click', '.youtube-link', function (e) {
  3818. var id, a = $(this), td = $(this.parentNode);
  3819. var iframe = td.children("iframe");
  3820. if (iframe.length > 0) {
  3821. iframe.remove();
  3822. } else {
  3823. bt.mainColumn.find("iframe").remove();
  3824.  
  3825. var url = "https://www.youtube.com/embed/";
  3826. if (id = a.data("video-id")) {
  3827. url += id + "?autoplay=1";
  3828. } else if (id = a.data("playlist-id")) {
  3829. url += "?listType=playlist&autoplay=1&iv_load_policy=3&list=" + id;
  3830. } else if (id = a.data("user-id")) {
  3831. url += "?listType=user_uploads&autoplay=1&iv_load_policy=3&list=" + id;
  3832. } else {
  3833. return;
  3834. }
  3835.  
  3836. td.append('<iframe width="560" height="315" src="' + url + '" frameborder="0" allowfullscreen style="display:block;margin-top:10px;"></iframe>');
  3837. }
  3838.  
  3839. e.preventDefault();
  3840. e.stopPropagation();
  3841. return false;
  3842. });
  3843. },
  3844. onFilter: function(data, response){
  3845. response.context.searchUrl = "https://www.youtube.com/results?q=" + encodeURIComponent(response.context.query);
  3846.  
  3847. if (response.context.category === "mvids" || response.context.category === "docs") {
  3848. return data.filter(function (v) {
  3849. if (!~v.item_type.indexOf("compact_")) {
  3850. return false;
  3851. }
  3852.  
  3853. var title = v.title.runs[0].text.toLowerCase();
  3854.  
  3855. return !(~title.indexOf("audio") || ~title.indexOf("lyric") || ~title.indexOf("album"));
  3856. });
  3857. }
  3858.  
  3859. return data;
  3860. },
  3861. icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAArklEQVQ4jWNgGDTgia7a/Ke66v+JwU901ebDNV7VFuV5qK32nxx8Q12El+Gepup/SjDDbXWV/5Rghuuqyv+xYRjAJQ/DDFeUlf5jw8jgxYMHWNVcUVb6z3BRUek/NowMLigqfcWljuGsvOJ/bPj/////r3n6nMUlD8MMp2QV/lOCGY5Jy/+nBDPsFxXlOSwp958cvF9UlAeeIg+IyTQeEJf9TwzeLy4zeSCyG3YAAIY9jDwMQOfNAAAAAElFTkSuQmCC"
  3862. };
  3863. });
  3864.  
  3865. bt.addSource("Vimeo", function () {
  3866. var q = "https://vimeo.com/search?q={query}";
  3867.  
  3868. return {
  3869. url: {
  3870. all: q,
  3871. movies: q,
  3872. music: q + "&category=9",
  3873. docs: q + "&category=117&duration=long",
  3874. mvids: q + "&category=9"
  3875. },
  3876. onParse: {
  3877. row: "li[data-result-id]",
  3878. link_prepend: "https://vimeo.com",
  3879. sel: [
  3880. {
  3881. text: ".title",
  3882. link: "a.js-result_url",
  3883. class: "vimeo-link",
  3884. vod: ".overlay_vod"
  3885. },
  3886. {text:".clip_duration"},
  3887. {
  3888. text:".display_name",
  3889. align:"right",
  3890. width:"20%"
  3891. }
  3892. ]
  3893. },
  3894. onEnable: function () {
  3895. $(bt.mainColumn).on('click', '.vimeo-link > a', function (e) {
  3896. e.preventDefault();
  3897. e.stopPropagation();
  3898.  
  3899. var a = $(this);
  3900. var td = $(this.parentNode);
  3901. var iframe = td.children("iframe");
  3902. if (iframe.length > 0) {
  3903. iframe.remove();
  3904. } else {
  3905. bt.mainColumn.find("iframe").remove();
  3906. var href = a.attr("href");
  3907. var id = href.split("vimeo.com/")[1].split("?")[0].split("/")[0]; // just in case
  3908. td.append('<iframe src="https://player.vimeo.com/video/'+ id +'?autoplay=1&color=ffffff&title=0&byline=0&portrait=0&badge=0" width="560" height="315" frameborder="0" style="display:block;margin-top:10px;" allowfullscreen></iframe>');
  3909. }
  3910.  
  3911. return false;
  3912. });
  3913. },
  3914. icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAA/0lEQVQ4jaWTvw2CQBTGGYQQF2ACJsAFmMAJmMAJnMAJ7LQgFBQ0mlDYEGJjYSLxggLhMKIBzWd15E7+RPQlr3n5vt/7czlJXhJdsaLTyL5gSCpWdJKXRJd+MfMQaYhBc5NGTQCoToxNUgIA5oeirpt+Dlq+AAC0fMHwsiZAX6c4Fk/wwbp+xmx/EwGam9Qd+DC8DKafI6BVP4CNaXiZIDT9vBZ21RtH5LuxO5h+XteOxbP7iCP7gunuKohVJxbWm2xpP0Bfp8K4vNmOHv3PyLLtoAGtoDrxd4BFeBfMbJU2bSuAf9ZNUnaaOwFD8t/PRCR5RcaKFZHh5nMor8j4DUIXDtllgAeRAAAAAElFTkSuQmCC"
  3915. };
  3916. });
  3917.  
  3918. bt.addSource("Layer13", function () {
  3919. var q = "https://layer13.net/browse?q={query}";
  3920.  
  3921. return {
  3922. url: {
  3923. all: q,
  3924. movies: q + " @section X264|DVDR|MDVDR|BLURAY|MBLURAY|XVID|SVCD|VCD|SUBPACK",
  3925. movies_1080: q + " 1080p @section X264",
  3926. movies_720: q + " 720p @section X264",
  3927. movies_bluray: q + " @section BLURAY|MBLURAY",
  3928. movies_dvd: q + " @section DVDR|MDVDR",
  3929. music: q + " @section MP3|FLAC",
  3930. music_flac: q + " @section FLAC",
  3931. docs: q + " @section TV|X264|DVDR|MDVDR|BLURAY|MBLURAY",
  3932. tv: q + " @section TV",
  3933. mvids: q + " @section -MP3 -FLAC",
  3934. elearning: q + " @section TUTORIAL|EBOOK|BOOKWARE|APPS|TV",
  3935. mags: q + " @section EBOOK",
  3936. ebooks: q + " @section EBOOK",
  3937. abooks: q + " @section AUDIOBOOK",
  3938. fiction: q + " @section EBOOK",
  3939. comics: q + " @section EBOOK",
  3940. apps_win: q + " @section 0DAY|UTILS",
  3941. games_pc: q + " @section GAMES|DOX",
  3942. xxx: q + " @section XXX|iMGSET"
  3943. },
  3944. onParse: {
  3945. row: ".rlsname",
  3946. link_prepend: "https://layer13.net/",
  3947. sel: [
  3948. {
  3949. text: function(context){
  3950. var text = context[0].firstElementChild.textContent + context[0].firstElementChild.nextElementSibling.textContent;
  3951. var nuked = context[0].previousElementSibling.textContent;
  3952. if (~nuked.indexOf("NUKED") && !~nuked.indexOf("UnNUKED")) {
  3953. text = "<s>" + text + "</s>";
  3954. }
  3955. return text;
  3956. },
  3957. link: "> a:first-child",
  3958. width: "50%"
  3959. },
  3960. {
  3961. text: "> i",
  3962. width: "50%"
  3963. }
  3964. ]
  3965. },
  3966. icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAB4UlEQVQ4ja3T30tTUQDAcf+XHoSohwRbUGgPM4UVtDCYe2hMGDEzxGvSvZeo6UrDhczCjIljuVnsMCa2LB9iPWRMi3l2ZyFFWEE/JGL+eIhe5NtDdK+Xwgw68Hk4v75wHk5V1f8aK5+eIYtZCrOJbclilnfLM9guvyjfpVSMM52L7FipGLcihdlhMumwTWNTLeurZTbWFokMdJBJh5nK9nFvst88YwaSCZ2tgqePsbG2yJeVeQwpMKRAUbwkEzqTmTDJhE7+0aAViI10sRWbFQwpeP82T+XrAm9eP8SQwtwfvXWO2EiXFciKEEPRdhObFWod1ayvlnmcH8VxoBpDCq5HzyLuXGAo2k5WhKzAxLjK1f6Azaulab5/+8DTJ3FKC2kMKcy91O3zTIyrViAe66Qn5PvNr/dHBjrMtd6en+KxTisQ7j2FpnnQNA8zD4apP7wXTfPQ3X2SVPIyDUdq0HUPnz8+R9c96LqHmzfOWIHBawEUxW0zP5dirjDF/VwMQwp8PieKcsLGDPRd8REMuggGXeyr2cXSyxyGFNTV76GxaT+GFIyNRWhrO2pjBi5d9OL3O/H7nRhS0Nra8EeBgIuDh3abczOgqs20tNTh/Qeq2mz/D+7jDrbltvvL39z5+AF7afMCxr5a3AAAAABJRU5ErkJggg=="
  3967. };
  3968. });
  3969.  
  3970. bt.renderPage();