Greasy Fork is available in English.

[TS] Youtube Filter

Filter out users and channels from search with GUI. Include Auto-Paging and ScreenShot Links.

Από την 27/01/2017. Δείτε την τελευταία έκδοση.

  1. // ==UserScript==
  2. // @name [TS] Youtube Filter
  3. // @namespace TimidScript
  4. // @version 1.1.43
  5. // @description Filter out users and channels from search with GUI. Include Auto-Paging and ScreenShot Links.
  6. // @author TimidScript
  7. // @homepageURL https://github.com/TimidScript
  8. // @copyright © 2013+ TimidScript, Some Rights Reserved.
  9. // @license https://github.com/TimidScript/UserScripts/blob/master/license.txt
  10. // @include *//www.youtube.*
  11. // @exclude *//www.youtube.*/embed/*
  12. // @require https://greasyfork.org/scripts/19967/code/TSL - GM_update.js
  13. // @require https://greasyfork.org/scripts/19968/code/TSLibrary - Generic.js
  14. // @homeURL https://greasyfork.org/en/scripts/4687
  15. // @grant GM_xmlhttpRequest
  16. // @grant GM_info
  17. // @grant GM_getMetadata
  18. // @grant GM_getValue
  19. // @grant GM_setValue
  20. // @grant GM_deleteValue
  21. // @grant GM_registerMenuCommand
  22. // @icon data:image/png;base64,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
  23. // ==/UserScript==
  24.  
  25. /* License + Copyright Notice
  26. ********************************************************************************************
  27. License can be found at: https://github.com/TimidScript/UserScripts/blob/master/license.txt
  28. Below is a copy of the license the may not be up-to-date.
  29.  
  30. Copyright © TimidScript, Some Rights Reserved.
  31.  
  32. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the
  33. following conditions are met:
  34.  
  35. 1) GPL-3 License is met that does not conflict with the rest of the license (http://www.gnu.org/licenses/gpl-3.0.en.html)
  36. 2) This notice must be included
  37. 3) Due credits and link to original author's homepage (included in this notice).
  38. 4) Notify the original author of redistribution
  39. 5) Clear clarification of the License and Notice to the end user
  40. 6) Do not upload on OpenUserJS.org or any other site that infringes on this license
  41.  
  42. TimidScript's Homepages: GitHub: https://github.com/TimidScript
  43. GreasyFork: https://greasyfork.org/users/1455
  44. */
  45. /* Information
  46. ********************************************************************************************
  47. Known Issues:
  48. - Support for paged front page is not implemented as it seems to cause infinite loop
  49. ----------------------------------------------
  50. Version History
  51. ----------------------------------------------
  52. 1.1.43 (2017-01-27)
  53. - Bugfix: Support other URLs
  54. 1.1.42 (2016-06-19)
  55. - Fix auto-paging
  56. 1.1.41 (2016-05-27)
  57. - Altered license
  58. 1.1.40 (2016-05-25)
  59. - Moving to GreasyFork and preparing to remove OUJS files
  60. 1.1.39 (2016-04-10)
  61. - updateURL added
  62. 1.1.38 (2016-04-03)
  63. - Changed license to GPL-3
  64. - A delay on load more videos added
  65. 1.1.37 (2015-11-20)
  66. - Load more videos permanent fix
  67. 1.1.36 (2015-10-05)
  68. - Larger delay on Load More Videos on video page
  69. 1.1.35 (2015-10-05)
  70. - Replaced base64 bmp icon with png version
  71. 1.1.34 (2015-09-12)
  72. - Make filter compatible with "Youtube Center"
  73. - Bug Fix: Corrections to changes made in Youtube video page syntax
  74. 1.1.33 (2015-08-18)
  75. - Bug Fix: Corrections to changes made in Youtube page syntax
  76. - Added fullscreen link
  77. - Removal of tags occurs on mouseover and mouseout
  78. 1.1.32 (2015-06-20)
  79. - Remove link tag on mouse down
  80. 1.1.31 (2015-06-19)
  81. - Added tag "?timidscript_youtube" to screenshot links.
  82. 1.1.30 (2015-04-25)
  83. - Bug Fix: Make it compatible with "Youtube Center" as it changes some of the classes script queries.
  84. 1.1.29 (2015-04-06)
  85. - Bug Fix: Removed monitor of search result
  86. - Bug Fix: Search results checks item count before parsing.
  87. 1.1.28 (2015-04-04)
  88. - Bug Fix: Now able to pickup changes in main page and by extension search result page.
  89. 1.1.27 (2015-01-18)
  90. - Bug fixes to changes in youtube layout (front page and user channel)
  91. - Bug fix filter button added to the side of video panel
  92. - Added script setting to change the icon size. Search for "VYCS" to get to the Section
  93. - Changed the scroll functionality
  94. - Generic Library added
  95. - Show all video setting is now stored
  96. 1.0.26 (2015-01-04)
  97. - Bug fix to front page due to changes in youtube
  98. 1.0.25 (2014-12-11)
  99. - Delay to handle delayed video recommendations
  100. 1.0.24 (2014-08-29)
  101. - Added GM_update
  102. 1.0.23 (2014-08-19)
  103. - Cleaned up header for OUJS
  104. 1.0.22 (2014-07-16)
  105. - @exclude iframe embed videos
  106. 1.0.21 (2014-07-15)
  107. - Added image link to channel videos
  108. - Added necessary @grant header
  109. - Altered the CSS
  110. - Remove MutationObserver from most page types
  111. 1.0.20 (2014-07-03)
  112. - Bug Fix: Fixed issues caused by change in youtube layout
  113. - Added option to turn off auto-paging
  114. - Removed img.youtube include
  115. 1.0.19 (2014-06-14)
  116. - Scrollable FilterWindow
  117. - Use port 8080 for require on userscripts.org
  118. 1.0.18 (2014-06-07)
  119. - Bug fix on pager when spelling correction is applied
  120. 1.0.17 (2014-05-31)
  121. - Updated so main page includes "Recommended" in the filter
  122. 1.0.16 (2014-05-30)
  123. - Modified CSS and link text
  124. 1.0.15 (2014-05-25)
  125. - Moved options button beside upload button if it exists.
  126. 1.0.14 (2014-05-21)
  127. - Bug Fix: Not checking for maxresdefault.jpg.
  128. 1.0.13 (2014-05-20)
  129. - Video screenshot link now points to "hqdefault.jpg" by default.
  130. Checks if "maxresdefault.jpg" and re-links if necessary
  131. 1.0.12 (2014-05-17)
  132. - Added link to max res screenshot
  133. 1.0.11 (2014-05-09)
  134. - Made options button invisible unless you hover over top, right corner.
  135. 1.0.10 (2014-03-28)
  136. - Updated broken script due to changes in youtube
  137. 1.0.9 (2014-01-16)
  138. - Bug not getting page type when type changes.
  139. 1.0.8 (2014-01-01)
  140. - Option button alternates filter window display
  141. 1.0.7b (2013-12-21)
  142. - Removed redundant code
  143. - Highlights blocked users and options buttonQ
  144. - Button now is an Icon
  145. - Bug fixes due to changes in Youtube
  146. - Captures changes in URL
  147. 1.0.6
  148. - Added block button on all thumbnails
  149. - Information stored now only contains the name of the user-channel and nothing else
  150. 1.0.5
  151. - Main X button now also removes filter
  152. 1.0.4
  153. - Colours added
  154. 1.0.3 (2013-10-16)
  155. - Extended the filter to work on main page
  156. 1.0.2 (2013-08-25)
  157. - Bug Fix: Filter observer added
  158. 1.0.1 (2013-08-24)
  159. - Initial Release
  160. ********************************************************************************************/
  161.  
  162.  
  163. /************** [VYCS] Variable you can set **************/
  164. //CSS Style for video page. It uses smaller text and icon for the block button and image link
  165. //GM_setValue("PageType2",".blockBox .blockBTN32 {width: 24px; height: 24px;} .blockBox a {font-size: 10px;}"
  166. // + "body #watch7-sidebar-contents {padding: 15px 0px 15px 5px !important;}"
  167. // + "#watch7-sidebar-contents .video-list-item.related-list-item {padding-right: 24px;}");
  168.  
  169. //CSS Style that limites the size of the search list width, if increased by "Youtube Center"
  170. //GM_setValue("PageType1",".ytcenter-site-search .yt-card.clearfix{width: 700px !important;}");
  171. /**************************************************/
  172.  
  173. ////if (window.self !== window.top) return;
  174. console.info("Youtube Filter");
  175. var intervalID;
  176. var AutoPaging = GM_getValue("AutoPaging", true);
  177. //0 Main Page; 1 Search Result; 2 Video Page; 3 Channel Video Page
  178. var PageTYPE = null; //Video Page
  179. var FilteredUsers = new Array();
  180.  
  181. //*****************
  182. ///
  183. function IsMouseEventInClientArea(event, element)
  184. {
  185. var rect = element.getBoundingClientRect();
  186. var minX = rect.left + element.clientLeft;
  187.  
  188. var x = event.clientX;
  189. if (x < minX || x >= minX + element.clientWidth) return false;
  190. var minY = rect.top + element.clientTop;
  191. var y = event.clientY;
  192. if (y < minY || y >= minY + element.clientHeight) return false;
  193. return true;
  194. }
  195.  
  196. function GetPageType()
  197. {
  198. PageTYPE = null;
  199. if (document.URL.match(/\.youtube\.[^\/]+\/?$/i)) PageTYPE = 0; //Main Page
  200. else if (document.URL.match(/youtube\.[^\/]+\/result/gi)) PageTYPE = 1; //Search Result
  201. else if (document.URL.match(/youtube\.[^\/]+\/watch/gi)) PageTYPE = 2; //Video Page
  202. else if (document.URL.match(/youtube\.[^\/]+\/(user|channel\/)?.+\/videos/gi)) PageTYPE = 3; //User Channel
  203. }
  204.  
  205. function GetUserData(link)
  206. {
  207. var user = new Object();
  208. user.name = link.textContent;
  209. user.url = link.href.replace(/.+youtube\.[a-z]+/, "");
  210.  
  211. return user;
  212. }
  213.  
  214. function IsFilteredUser(user)
  215. {
  216. var userFilters = GetFilters();
  217. for (var i = 0; i < userFilters.length; i++)
  218. {
  219. if (userFilters[i] == user) return true;
  220. }
  221.  
  222. return false;
  223. }
  224.  
  225. function BlockUser(e)
  226. {
  227. e.stopImmediatePropagation();
  228. e.preventDefault();
  229. var user = this.title;
  230.  
  231. if (!IsFilteredUser(user))
  232. {
  233. var filters = GetFilters();
  234. filters.push(user);
  235. GM_setValue("Filters", JSON.stringify(filters));
  236. }
  237.  
  238. HideUnwantedUsers();
  239. if (document.getElementById("FilterWindow")) CreateFilterWindow();
  240. return false;
  241. }
  242.  
  243.  
  244. function CreateScreenshotLink(videoID)
  245. {
  246. var ss = document.createElement("a");
  247. ss.textContent = "[SH]";
  248. ss.href = "https://img.youtube.com/vi/" + videoID + "/hqdefault.jpg?timidscript_youtube";
  249.  
  250. GM_xmlhttpRequest(
  251. {
  252. url: "https://img.youtube.com/vi/" + videoID + "/maxresdefault.jpg",
  253. method: "HEAD",
  254. onload: function (response)
  255. {
  256. if (response.status == 200)
  257. {
  258. //var contentLength = parseInt(response.responseHeaders.replace(/(Content-Length: (\d+)|.*\r?)/gi, "$2"));
  259. ss.href = "https://img.youtube.com/vi/" + videoID + "/maxresdefault.jpg?timidscript_youtube";
  260. ss.textContent = "[SM]";
  261. }
  262. }
  263. });
  264.  
  265. ss.addEventListener("mouseover", RemoveLinkTag, true);
  266. ss.addEventListener("mouseout", AddLinkTag, false);
  267.  
  268. return ss;
  269. }
  270.  
  271. function AddLinkTag(e)
  272. {
  273. var link = e.target;
  274. link.href += link.postfix;
  275. //if (link.postfix)
  276. // setTimeout(function () { link.href += link.postfix; }, 250);
  277. }
  278. function RemoveLinkTag(e)
  279. {
  280. var s, m = this.href.match(/\?timidscript_[_a-z0-9]+/i);
  281. if (m)
  282. {
  283. this.postfix = m[0];
  284. this.href = this.href.replace(/\?timidscript_[_a-z0-9]+/i, "");
  285. }
  286. }
  287.  
  288. function AddBlockButton(li)
  289. {
  290. var btn = document.createElement("span");
  291. btn.className = "blockBTN32";
  292.  
  293. //if (PageTYPE == 1) btn.title = li.getElementsByClassName("g-hovercard")[0].textContent;
  294. //else btn.title = li.getElementsByClassName("g-hovercard")[1].textContent;
  295. btn.title = li.getElementsByClassName("g-hovercard")[0].textContent;
  296. var span = document.createElement("span");
  297.  
  298. if (PageTYPE == 2)
  299. {
  300. span.setAttribute("style", "position:absolute; right:0px;");
  301. li.insertBefore(span, li.firstElementChild);
  302. }
  303. else
  304. {
  305. span.setAttribute("style", "float:right;");
  306. li.firstElementChild.insertBefore(span, li.firstElementChild.firstElementChild);
  307. }
  308.  
  309. btn.onclick = BlockUser;
  310. span.appendChild(btn);
  311. span.className = "blockBox";
  312.  
  313. var href = li.getElementsByTagName("a")[0].href;
  314. if (href.indexOf("/watch?v=") > 0)
  315. {
  316. var ss = CreateScreenshotLink(href.replace(/.+watch\?v=(([a-z0-9]|_|-)+).*/gi, "$1"));
  317. ss.setAttribute("style", "display:block;text-align:center;");
  318. span.appendChild(ss);
  319. }
  320. }
  321.  
  322. function NextPageURL()
  323. {
  324. var nextpage = document.querySelector(".branded-page-box > [disabled=true]");
  325.  
  326. if (nextpage) nextpage = nextpage.nextElementSibling;
  327. if (!nextpage) return null;
  328.  
  329. return nextpage.href;
  330. }
  331.  
  332.  
  333. function ScrollCheck()
  334. {
  335. var pager = document.querySelector(".branded-page-box");
  336. var loc = pager.offsetTop + pager.offsetHeight - document.documentElement.offsetHeight;
  337.  
  338. if (loc < document.documentElement.scrollTop)
  339. {
  340. clearInterval(intervalID);
  341. var url = NextPageURL();
  342.  
  343. var xhr = new XMLHttpRequest();
  344. xhr.open("GET", url, true);
  345. xhr.responseType = "document";
  346. xhr.onload = function (e)
  347. {
  348. var pager = document.querySelector(".branded-page-box");
  349. var doc = xhr.response;
  350. var pagerNew = doc.querySelector(".branded-page-box");
  351. pager.outerHTML = pagerNew.outerHTML;
  352.  
  353. var result = document.getElementsByClassName("item-section")[0];
  354. var resultNew = doc.getElementsByClassName("item-section")[0];
  355.  
  356. //Removes spell correction from result
  357. if (resultNew.getElementsByClassName("spell-correction")[0])
  358. {
  359. resultNew.removeChild(resultNew.getElementsByClassName("spell-correction")[0].parentElement);
  360. }
  361. var lis = resultNew.children;
  362.  
  363.  
  364. while (lis.length > 0)
  365. {
  366. var li = lis[0];
  367. result.appendChild(li);
  368. var imgs = li.getElementsByTagName("img");
  369.  
  370. for (var i = 0; i < imgs.length; i++)
  371. {
  372. var src = imgs[i].getAttribute("data-thumb");
  373. if (src) imgs[i].src = src;
  374. }
  375.  
  376. AddBlockButton(li);
  377. }
  378.  
  379. HideUnwantedUsers();
  380. setTimeout(EnablePager, 1500);
  381. };
  382. xhr.send();
  383. }
  384. }
  385.  
  386. function EnablePager()
  387. {
  388. if (AutoPaging && NextPageURL()) intervalID = setInterval(ScrollCheck, 500);
  389. else clearInterval(intervalID);
  390. }
  391.  
  392. function HideUnwantedUsers()
  393. {
  394. FilteredUsers = new Array();
  395.  
  396. if (PageTYPE == 0) //Main Page
  397. {
  398. //var items = document.getElementsByClassName("channels-content-item");
  399. var items = document.getElementsByClassName("yt-lockup-video");
  400.  
  401. for (var i = 0; i < items.length; i++)
  402. {
  403. var thumbdata = items[i],
  404. user = thumbdata.querySelector(".yt-uix-sessionlink.spf-link.g-hovercard, .yt-uix-sessionlink.g-hovercard").textContent,
  405. filtered = IsFilteredUser(user),
  406. notice = thumbdata.parentNode.querySelector(".banNotice");
  407.  
  408. if (filtered && !notice)
  409. {
  410. FilteredUsers.push(user);
  411. TSL.addClass(thumbdata, "blockedVideoBG");
  412.  
  413. notice = document.createElement("div");
  414. notice.className = "banNotice";
  415. notice.style.left = thumbdata.offsetLeft + "px";
  416.  
  417. notice.style.height = thumbdata.clientHeight + "px";
  418. notice.style.width = thumbdata.clientWidth + "px";
  419. notice.setAttribute("name", "YTF");
  420.  
  421. var txt = document.createElement("span");
  422. txt.textContent = user;
  423. txt.style.height = thumbdata.clientHeight + "px";
  424. txt.style.width = thumbdata.clientWidth + "px";
  425. notice.appendChild(txt);
  426. thumbdata.parentNode.insertBefore(notice, thumbdata);
  427. }
  428. else if (!filtered && notice)
  429. {
  430. TSL.removeClass(thumbdata, "blockedVideoBG");
  431. TSL.removeNode(notice);
  432. }
  433. }
  434. }
  435. else //Search Result & Video Page
  436. {
  437. var results, user;
  438. if (PageTYPE == 1) results = document.getElementsByClassName("item-section")[0].children;
  439. else results = document.getElementsByClassName("video-list-item");
  440. console.log(results.length);
  441. for (var i = 0; i < results.length; i++)
  442. {
  443. try
  444. {
  445. var vid = results[i];
  446. if (vid.getElementsByClassName("g-hovercard").length == 0) continue;
  447. var user = vid.getElementsByClassName("g-hovercard")[0].textContent;
  448. //if (PageTYPE == 1) user = vid.getElementsByClassName("g-hovercard")[0].textContent;
  449. //else user = vid.getElementsByClassName("g-hovercard")[1].textContent;
  450.  
  451. var filtered = IsFilteredUser(user);
  452. if (filtered)
  453. {
  454. FilteredUsers.push(user);
  455. TSL.addClass(vid, "blockedVideo");
  456. }
  457. else
  458. {
  459. TSL.removeClass(vid, "blockedVideo");
  460. }
  461. }
  462. catch (e) { console.warn(e); }
  463. }
  464. }
  465.  
  466. if (FilteredUsers.length > 0) TSL.addStyle("OptSelect", "#OptionsButton, #OptionsButton2{background-color: #FBE8E5;} #OptionsButton:hover{background-color: #FBD5CF}");
  467. else TSL.removeNode("OptSelect");
  468. }
  469.  
  470. function GetFilters()
  471. {
  472. var filters = GM_getValue("Filters", null);
  473. if (!filters) return new Array();
  474.  
  475. return JSON.parse(filters);
  476. }
  477.  
  478.  
  479. function ShowAllVideos()
  480. {
  481. if (Boolean(GM_getValue("ShowAllVideos", false)))
  482. {
  483. TSL.removeNode("BlockVideos");
  484. TSL.addStyle("ShowAllVideos", ".banNotice {display: none;}");
  485. }
  486. else
  487. {
  488. TSL.addStyle("BlockVideos", ".blockedVideo {display:none;}");
  489. TSL.removeNode("ShowAllVideos");
  490. }
  491. }
  492.  
  493. function CreateFilterWindow()
  494. {
  495. var fwin = document.getElementById("FilterWindow");
  496. if (fwin) TSL.removeNode(fwin);
  497.  
  498. var userFilters = GetFilters();
  499.  
  500. fwin = document.createElement("span");
  501. var tbHolder = document.createElement("div");
  502. tbHolder.setAttribute("style", "overflow-x:hidden; overflow-y:auto; max-height: 500px;");
  503. var table = document.createElement("table");
  504. table.style.maxHeight
  505. tbHolder.appendChild(table);
  506. fwin.appendChild(tbHolder);
  507.  
  508.  
  509. for (var i = 0; i < userFilters.length; i++)
  510. {
  511. var user = userFilters[i];
  512. var btn = document.createElement("a");
  513. btn.className = "unblockBTN";
  514. btn.title = user;
  515.  
  516. btn.onclick = function (e)
  517. {
  518. e.stopImmediatePropagation();
  519. var user = this.title;
  520. var filters = GetFilters();
  521.  
  522. for (var i = 0; i < filters.length; i++)
  523. {
  524. if (filters[i] == user)
  525. {
  526. filters.splice(i, 1);
  527. GM_setValue("Filters", JSON.stringify(filters));
  528. break;
  529. }
  530. }
  531.  
  532. TSL.removeNode(this.parentElement.parentElement);
  533. HideUnwantedUsers();
  534. };
  535.  
  536. var r = table.insertRow(-1);
  537. var td = document.createElement("td");
  538. r.appendChild(td);
  539. td.appendChild(btn);
  540.  
  541. var a = document.createElement("a");
  542. a.href = "results?search_query=" + user + "&sm=3";
  543.  
  544. var d = document.createElement("div");
  545. d.textContent = user;
  546.  
  547. for (var j = 0; j < FilteredUsers.length; j++)
  548. {
  549. if (user == FilteredUsers[j])
  550. {
  551. r.style.backgroundColor = "#FBE8E5";
  552. //d.style.color = "red";
  553. break;
  554. }
  555. }
  556.  
  557. td = document.createElement("td");
  558. a.appendChild(d);
  559. td.appendChild(a);
  560. r.appendChild(td);
  561. }
  562.  
  563.  
  564. var d = document.createElement("div");
  565. d.style.textAlign = "center";
  566. var b = document.createElement("input");
  567.  
  568. if (PageTYPE == 1)
  569. {
  570. b.type = "button";
  571. b.value = "Auto-Page";
  572. b.style.backgroundColor = (AutoPaging) ? "lime" : "gray";
  573. b.onclick = function ()
  574. {
  575. AutoPaging = !AutoPaging;
  576. this.style.backgroundColor = (AutoPaging) ? "lime" : "gray";
  577. EnablePager();
  578.  
  579. GM_setValue("AutoPaging", AutoPaging);
  580. };
  581. d.appendChild(b);
  582. }
  583.  
  584. b = document.createElement("input");
  585. b.type = "button";
  586. b.value = "Show All";
  587. b.style.backgroundColor = Boolean(GM_getValue("ShowAllVideos", false)) ? "lime" : "gray";
  588. b.onclick = function ()
  589. {
  590. var show = !Boolean(GM_getValue("ShowAllVideos", false));
  591. this.style.backgroundColor = show ? "lime" : "gray";
  592. GM_setValue("ShowAllVideos", show);
  593. ShowAllVideos(show);
  594. };
  595. d.appendChild(b);
  596.  
  597. b = document.createElement("input");
  598. b.type = "button";
  599. b.value = "Close";
  600. b.onclick = function () { TSL.removeNode("FilterWindow"); };
  601.  
  602. d.appendChild(b);
  603. fwin.appendChild(d);
  604.  
  605.  
  606.  
  607. fwin.id = "FilterWindow";
  608. document.body.appendChild(fwin);
  609. return fwin;
  610. }
  611.  
  612.  
  613. var SearchCount = 0;
  614. function AdjustSearchResult()
  615. {
  616. var results;
  617. if (PageTYPE == 1) results = document.getElementsByClassName("item-section")[0].children;
  618. else results = document.getElementsByClassName("video-list-item");
  619.  
  620. if (SearchCount == results.length) return;
  621. SearchCount = results.length;
  622.  
  623. for (var i = 0; i < results.length; i++)
  624. {
  625. if (results[i].getElementsByClassName("blockBTN32").length == 0)
  626. {
  627. try
  628. {
  629. AddBlockButton(results[i]);
  630. }
  631. catch (e) { };
  632. }
  633. }
  634.  
  635. HideUnwantedUsers();
  636. if (PageTYPE == 1) EnablePager();
  637. }
  638.  
  639. function AddOptions()
  640. {
  641. if (document.getElementById("OptionsButton")) return;
  642. var masthead = document.getElementById("yt-masthead-signin");
  643.  
  644. if (masthead)
  645. {
  646. var options = document.createElement("button");
  647. options.id = "OptionsButton";
  648. options.className = "yt-uix-button yt-uix-button-default";
  649. //options.textContent = "Options";
  650. options.onclick = function ()
  651. {
  652. var fwin = document.getElementById("FilterWindow");
  653. if (fwin) TSL.removeNode(fwin);
  654. else CreateFilterWindow();
  655. };
  656. masthead.insertBefore(options, masthead.firstElementChild);
  657.  
  658. //var el = document.createElement("button");
  659. //el.id = "ViewAllButton";
  660. //el.className = "yt-uix-button yt-uix-button-default";
  661. //masthead.insertBefore(el, options);
  662. }
  663. else
  664. {
  665. var placer = document.createElement("div");
  666. placer.id = "FloatArea";
  667. document.body.appendChild(placer);
  668.  
  669.  
  670. var options = document.createElement("div");
  671. options.id = "OptionsButton";
  672. //options.textContent = "Options";
  673. options.onclick = function ()
  674. {
  675. var fwin = document.getElementById("FilterWindow");
  676. if (fwin) TSL.removeNode(fwin);
  677. else CreateFilterWindow();
  678. };
  679.  
  680. document.onmousemove = function (e)
  681. {
  682. options.style.display = (IsMouseEventInClientArea(e, placer)) ? null : "none";
  683. }
  684.  
  685. document.body.appendChild(options);
  686. }
  687. }
  688.  
  689. //Mutation Observer
  690. var MO =
  691. {
  692. monitorBody: function ()
  693. {
  694. var mo = window.MutationObserver || window.MozMutationObserver || window.WebKitMutationObserver;
  695. if (mo)
  696. {
  697. MO.Observer = new mo(
  698. function ()
  699. {
  700. setTimeout(MainFunc, 500);
  701. });
  702.  
  703. MO.Observer.observe(document.body, { characterData: true, attributes: true, childList: true, subtree: true });
  704. }
  705. },
  706.  
  707. disconnect: function ()
  708. {
  709. if (MO.Observer) MO.Observer.disconnect();
  710. MO.Observer = null;
  711. }
  712. };
  713.  
  714. var MainItemPageCount = 0;
  715. function MainFunc()
  716. {
  717. GetPageType();
  718. switch (PageTYPE)
  719. {
  720. case 0: //Main Page
  721. console.info("YTF: Main Page");
  722. MO.disconnect();
  723. AddOptions();
  724.  
  725. var items = document.getElementsByClassName("yt-lockup");
  726. if (MainItemPageCount != items.length)
  727. {
  728. MainItemPageCount = items.length;
  729. for (var i = 0; i < items.length; i++)
  730. {
  731. var thumbdata = items[i];
  732. if (thumbdata.parsed) continue;
  733. thumbdata.parsed = true;
  734.  
  735. var user = thumbdata.querySelector(".yt-uix-sessionlink.g-hovercard").textContent;
  736. var filters = GetFilters();
  737.  
  738. var block = document.createElement("span");
  739. block.className = "blockLINKS";
  740.  
  741. var blockBtn = document.createElement("a");
  742. blockBtn.className = "blockBTN16";
  743. blockBtn.title = user;
  744. blockBtn.onclick = BlockUser;
  745. block.appendChild(blockBtn);
  746.  
  747. var link = thumbdata.getElementsByTagName("a")[0];
  748. link.appendChild(block);
  749. link.className += " aaTT";
  750.  
  751. var ss = CreateScreenshotLink(link.href.replace(/.+watch\?v=(([a-z0-9]|_|-)+).*/gi, "$1"));
  752. block.appendChild(ss);
  753. }
  754.  
  755. HideUnwantedUsers();
  756. }
  757. //setTimeout(MO.monitorBody, 1000);
  758. MO.monitorBody();
  759. break;
  760. case 1: //Search Result
  761. console.info("YTF: Search Result");
  762. //MO.disconnect();
  763. AddOptions();
  764. AdjustSearchResult();
  765. //MO.monitorBody();
  766. break;
  767. case 2: // Video Page
  768. //TSL.addStyle("YT_RELATED",".related-list-item .content-link {width:170px; background-color:red;}");
  769. console.info("YTF: Video Page");
  770. AddOptions();
  771. AdjustSearchResult();
  772.  
  773. //Adds sceenshot
  774. var player = document.getElementById("watch7-headline");
  775. if (!player.getAttribute("screenshot"))
  776. {
  777. player.setAttribute("screenshot", "added");
  778. var ss = CreateScreenshotLink(document.URL.replace(/.+watch\?v=(([a-z0-9]|_|-)+).*/gi, "$1"));
  779. player.insertBefore(ss, player.firstElementChild);
  780. var fs = document.createElement("a");
  781. fs.textContent = "[FT]";
  782. fs.href = "https://www.youtube.com/v/" + document.location.search.match(/v=([-_\w]+)/)[1];
  783. fs.style.marginLeft = "10px";
  784. player.insertBefore(fs, ss.nextElementSibling);
  785. }
  786.  
  787. setTimeout(LoadMoreVideos, 5000);
  788. break;
  789. case 3: //User Channel
  790. console.info("YTF: User Channel");
  791. MO.disconnect();
  792. var vthumbs = document.getElementsByClassName("ux-thumb-wrap");
  793.  
  794. for (var i = 0, thumb; i < vthumbs.length, thumb = vthumbs[i]; i++)
  795. {
  796. if (!thumb.className.match("aaTT"))
  797. {
  798. thumb.className += " aaTT";
  799.  
  800. var block = document.createElement("span");
  801. block.className = "blockLINKS";
  802. block.style.visibility = "visible";
  803. block.style.top = "10px";
  804. thumb.appendChild(block);
  805.  
  806. var ss = CreateScreenshotLink(thumb.querySelector("a").href.replace(/.+watch\?v=(([a-z0-9]|_|-)+).*/gi, "$1"));
  807. ss.style.backgroundColor = "yellow";
  808. ss.style.border = "1px solid black";
  809. block.appendChild(ss);
  810. }
  811. }
  812.  
  813. MO.monitorBody();
  814. break;
  815. }
  816.  
  817. //Loads more side videos and filters them
  818. function LoadMoreVideos()
  819. {
  820. var wmv = document.getElementById("watch-more-related-button");
  821. AdjustSearchResult();
  822.  
  823. if (!wmv || wmv.style.display == "none") return;
  824.  
  825. document.getElementById("watch-more-related-button").click();
  826. setTimeout(LoadMoreVideos, 2500);
  827. }
  828. }
  829.  
  830. var URL = document.URL;
  831. (function ()
  832. {
  833. GetPageType();
  834. if (PageTYPE == null) return;
  835. //Replace old saved syntax
  836. CURRENTVERSION = 1;
  837. if (GM_getValue("Version", 0) != CURRENTVERSION)
  838. {
  839. var filters = GM_getValue("Filters", null);
  840.  
  841. if (filters)
  842. {
  843. filters = filters.split("|");
  844. for (var i = 0; i < filters.length; i++)
  845. {
  846. filters[i] = filters[i];
  847. }
  848.  
  849. GM_setValue("Filters", JSON.stringify(filters));
  850. }
  851.  
  852. GM_setValue("Version", CURRENTVERSION);
  853. }
  854.  
  855. TSL.addStyle(null, "#OptionsButton {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAADPUlEQVR42u3XX0xSURwH8N/lzwUVxED+mpW5HtQ0ptJspBPkKmVzTtfafKunntqa9d67bD219dZLPrVmc22mglhSul2FnEtfMjf/C4oCCpfLvw7XbGXxT5q98HuBO845389+nMs9YPCfC0t3oF6vl6DBpWwMk0Si0TMxDMtD17z4ZzGAIBaLBdhs9m4kEtkBFmvFYrHsnBig1WpxHo4TGIYRMplMU1Z2sVqpVAilUhkUigpBKBQCzsWBw+Ew48PhMNAhGnw+H3g9XnC6nLC5seH7trQ053I6yVgsNoKQZqvVSqcEXGtoIK6o1S86OjpK6uvrQSyWZNVit3sHpslpGBwcXJ2d/Xx3cmrKnBTQ3dX15WV/fyWO41kFHy+apqGnp2d+YGCgKingenv3fOmliorbTbWg0WhApSrJKnh9fQ1IkoRXY3ZYWVxYsA29rkwKaGzvtpKdz5r53g0Qr87AudAmVIsAzhfxQCaXg0gkOtwD+LE9QB/uAY/HA1tbW7C8G4S5bYBlUIC7uA5oXAJ1kw+GJ4bfGJMCDHq9/KBQZXHcNFVRBXJmi0MUgBUKAH/fBVzKC5zgPrDCNLAiYWZOFDgQZeEQ5gogxBUBxZeiaz4zLz4/b38VaqcekXzK1WoZG9tLCogXuuVkAaHSjBDVVIHi50JHmN9eU7xnwif/Hp4Q8AMhpYRKi93YhxDKEwHyfCj8U+LwpADm62hulvoLVWZ7m6mGEigzAjDhH3tJ3O9stY6P7yXKSPlLiPZEsb9APupo61MHBCVpAZhwW+rwtADx0ul0ElogN9sJ0yEiWdu9KHyidwaFG1KFpw1gOmEwSAJ8yYjdYKoNCM8mbvt7JpxA4bvprJs2IF4ter2YypeOOFr66vyC0j/bHg8/SD88Y8ARIpAvs5DG5+oQLmIAXMoDmtH7jgJq2zBqNrszWS9jQLwIg8E4d/Xx0OaFVgagWBqGsvEnN9CD5l2ma50IgLrQuKB5+GG9/BYDUH19CxUzT5vQvT6RA+QAOUAOkAOcFkC7Vt5uW6y5ByG86PQB6GzA5vF4LYFg6M5u8eVOdBoWy9Zspwf4tQiC4EbCYR3GYpHoD2na54B/Bsi2vgPc5hg/VHiJIwAAAABJRU5ErkJggg==); background-size:24px 24px; background-repeat:no-repeat; background-position:center;}");
  856. TSL.addStyle(null, "#ViewAllButton {background-image: url(data:image/png;base64,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); background-size:24px 24px; background-repeat:no-repeat; background-position:center;}");
  857. //TSL.addStyle(null, "#OptionsButton {background-image: url(); background-size:24px 24px; background-repeat:no-repeat; background-position:center;}");
  858.  
  859. if (document.getElementById("yt-masthead-signin"))
  860. {
  861. TSL.addStyle("YTF_FW", "#FilterWindow{position: fixed;z-index: 9999999999999; right: 50px;top: 50px;background-color: #E9EAEA;border: 1px solid black;}#FilterWindow div{color: gray;text-decoration-style: none;padding: 3px 5px;}#FilterWindow tr:hover{text-decoration-style: none;background-color: lightgray;color: black;}");
  862. TSL.addStyle(null, "#ViewAllButton, #OptionsButton {margin-right: 10px; height: 28px; width: 32px; background-size:15px 15px; background-repeat:no-repeat; background-position:center;}");
  863. }
  864. else
  865. {
  866. TSL.addStyle("YTF_FW", "#FilterWindow{position: fixed;z-index: 9999999999999; right: 10px;top: 95px;background-color: #E9EAEA;border: 1px solid black;}#FilterWindow div{color: gray;text-decoration-style: none;padding: 3px 5px;}#FilterWindow tr:hover{text-decoration-style: none;background-color: lightgray;color: black;}");
  867. TSL.addStyle(null, "#OptionsButton{height: 32px; width: 32px; margin: 0; padding: 0; position: fixed;color: #777979; right: 10px;top: 60px;border-radius: 3px;background-color: lightgray;border: 1px solid darkgray;cursor: pointer; z-index:99999999999999999;}#OptionsButton:hover{background-color: darkgray;color: black;}");
  868. }
  869. TSL.addStyle(null, ".blockBTN32, .blockBTN16, .unblockBTN{background-repeat:no-repeat; cursor:pointer; background-image: url(data:image/png;base64,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);background-size: contain;z-index: 100;}");
  870. TSL.addStyle("YTF_BT", ".unblockBTN{display: inline-block;width: 16px;height: 16px; padding-right: 3px;} .blockBTN32{display: block;width: 32px;height: 32px;}a.aaTT:hover .blockLINKS{visibility: visible;} .blockBTN16 {display:block; background-color: black;border: 1px solid red;height: 24px;width: 24px;}");
  871. TSL.addStyle("YTF_BL", ".blockLINKS{position: absolute;top: 2px;visibility: hidden; z-index: 100; right: 2px;} .blockLINKS a:nth-child(2){line-height:normal; background-color:yellow; border: 1px solid blue; display:block;text-align:center;}");
  872. TSL.addStyle("YTF_NB", ".banNotice {position:absolute; z-index: 1000; font-size:medium;} .banNotice > span { display:table-cell; background-color:yellow; text-align: center; vertical-align: middle; }");
  873. TSL.addStyle("YTF_PC", "#FloatArea{position: fixed; right: 0px; top:10px; border: none; visibility:hidden; height: 200px; width:140px;}");
  874. TSL.addStyle("YTF_BX", ".blockBox {text-align:center;}");
  875.  
  876.  
  877. ShowAllVideos();
  878. TSL.addStyle("BlockVideoBG", ".blockedVideo, .blockedVideoBG {background-color:#FBE8E5;}");
  879.  
  880.  
  881. if (PageTYPE == 2)
  882. {
  883. if (GM_getValue("PageType2", false))
  884. TSL.addStyle("", GM_getValue("PageType2"));
  885. else TSL.addStyle("", "body #watch7-sidebar-contents {padding: 15px 0px 15px 5px !important;}"
  886. + "#watch7-sidebar-contents .video-list-item.related-list-item {padding-right: 35px;}");
  887. }
  888. else if (PageTYPE == 1 && GM_getValue("PageType1", false))
  889. {
  890. TSL.addStyle("", GM_getValue("PageType1"));
  891. }
  892.  
  893. MainFunc();
  894. })();
  895.  
  896. /*
  897. 1-3, Default is same as HQdefault but thumbnail size
  898. http://img.youtube.com/vi/<insert-youtube-video-id-here>/<1-3>.jpg
  899. http://img.youtube.com/vi/<insert-youtube-video-id-here>/default.jpg
  900.  
  901. 0 & HQ default are the same
  902. http://img.youtube.com/vi/<insert-youtube-video-id-here>/0.jpg
  903. http://img.youtube.com/vi/<insert-youtube-video-id-here>/hqdefault.jpg
  904.  
  905. http://img.youtube.com/vi/<insert-youtube-video-id-here>/maxresdefault.jpg
  906. https://developers.google.com/youtube/2.0/developers_guide_php?csw=1
  907. */