Hive - YouTube to Hive / Local Download

Inserts a download button on YouTube video pages and sends to hive -Major fixes

当前为 2015-06-23 提交的版本,查看 最新版本

  1. /** YouTube link resolving Originally written by angelsl
  2. With contributions from Manish Burman http://mburman.com
  3. With contributions from LouCypher https://github.com/LouCypher
  4.  
  5. YTGrab is distributed under the GNU LGPL v3 or later and comes with no warranty.
  6. Full preamble at https://github.com/angelsl/misc-Scripts/blob/master/Greasemonkey/LICENSE.md#ytgrab
  7.  
  8. //===========DS===========//
  9. This is a DefSoul MOD for use with hive. All non hive related code is credited to angelsl and contributers above. (My code will have //===========DS===========// above it)
  10. angelsl's scripts can be found here > https://github.com/angelsl/misc-Scripts
  11. //===========DS===========\\
  12.  
  13. // ==UserScript==
  14. // @name Hive - YouTube to Hive / Local Download
  15. // @namespace https://openuserjs.org/users/DefSoul/scripts
  16. // @description Inserts a download button on YouTube video pages and sends to hive -Major fixes
  17. // @version 1.9 > added ability to send whole playlists to hive
  18. // @run-at document-end
  19. // @include http*://www.youtube.com/*
  20. // @include http*://api.hive.im/api/*
  21. // @include https://touch.hive.im/account/*
  22. // @exclude http*://*.google.com/*
  23. // @exclude http*://*.facebook.com/*
  24. // @exclude http*://facebook.com/*
  25. // @exclude about:blank
  26. // @exclude http*://*.stripe.com/*
  27. // @require https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js
  28. // @require https://gist.githubusercontent.com/angelsl/347fa95f00bb11c8eef3/raw/fd02ec05e3079cdd52cf5892a7ba27b67b6b6131/waitForKeyElements.js
  29. // @resource toastrCss http://cdnjs.cloudflare.com/ajax/libs/toastr.js/latest/css/toastr.min.css
  30. // @require http://cdnjs.cloudflare.com/ajax/libs/toastr.js/latest/js/toastr.min.js
  31. // @require http://yt-lnk.org/yt-lnk.js
  32. // @grant GM_xmlhttpRequest
  33. // @grant GM_getValue
  34. // @grant GM_setValue
  35. // @grant GM_log
  36. // @grant GM_getResourceText
  37. // @grant GM_addStyle
  38. // @grant unsafeWindow
  39. // ==/UserScript==
  40. */
  41. //===========DS===========//
  42. var nameB = "YouTube to Hive / Local Download: Test ";
  43. GM_log(nameB + location.href);
  44.  
  45. var folderName = "# YouTube #"; // CASE SENSITIVE
  46. var uploadFolderId;
  47. var auth;
  48. auth = GM_getValue("auth");
  49. var link;
  50. GM_setValue("ready", "false");
  51. //GM_deleteValue("auth");
  52.  
  53. var ru;
  54. var uploadToHive;
  55. var uploadPng = "data:image/png;base64,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";
  56. var downloadPng = "data:image/png;base64,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";
  57. function log(str){console.log('%c ' + str, 'background: #000000; color: #FFFFFF');} // CUSTOM LOG
  58.  
  59. var newCSS = GM_getResourceText ("toastrCss");
  60. GM_addStyle(newCSS);
  61.  
  62. toastr.options = {
  63. "closeButton": false,
  64. "debug": false,
  65. "newestOnTop": false,
  66. "progressBar": false,
  67. "positionClass": "toast-bottom-right",
  68. "preventDuplicates": true,
  69. "onclick": null,
  70. "showDuration": "300",
  71. "hideDuration": "1000",
  72. "timeOut": "12000",
  73. "extendedTimeOut": "1000",
  74. "showEasing": "swing",
  75. "hideEasing": "linear",
  76. "showMethod": "fadeIn",
  77. "hideMethod": "fadeOut"
  78. };
  79.  
  80.  
  81. $(document).on("click", "#hiveSwitch", function(){
  82. if ($("#hiveSwitch").attr("src") === uploadPng){
  83. uploadToHive = false;
  84. $("#hiveSwitch").attr("src", downloadPng);
  85. $("#hiveSwitch").attr("title", "Local download activated.");
  86. document.getElementById('btnDownload').innerHTML = 'Download';
  87. $("#hiveSwitch").css("right", "9px");
  88. if ($("#watch-action-panels").css("display") == "none")
  89. document.getElementById("btnDownload").click();
  90. }
  91. else{
  92. uploadToHive = true;
  93. $("#hiveSwitch").attr("src", uploadPng);
  94. $("#hiveSwitch").attr("title", "Upload to Hive activated.");
  95. document.getElementById('btnDownload').innerHTML = ' Upload ';
  96. $("#hiveSwitch").css("right", "0px");
  97. if ($("#watch-action-panels").css("display") == "none")
  98. document.getElementById("btnDownload").click();
  99. }
  100. });
  101. //===========DS===========\\
  102.  
  103. if (typeof unsafeWindow === 'undefined' || typeof unsafeWindow.ytplayer === 'undefined') {
  104. var p = document.createElement('p');
  105. p.setAttribute('onclick', 'return window;');
  106. unsafeWindow = p.onclick();
  107. }
  108.  
  109. function main(decipher) {
  110. var dashmpd = unsafeWindow.ytplayer.config.args.dashmpd, mpbsrgx = /\/s\/([\w\.]+)/, mpbs;
  111. if (typeof dashmpd !== 'undefined') {
  112. mpbs = mpbsrgx.exec(dashmpd); if(mpbs) dashmpd = dashmpd.replace(mpbsrgx, "/signature/"+decipher(mpbs[1]));
  113. GM_xmlhttpRequest({method: "GET", url: dashmpd, onload: function (t) { main2(t.responseText, decipher); }});
  114. } else main2(false, decipher);
  115. }
  116.  
  117. function main2(dashmpd, decipher) {
  118. "use strict";
  119. var
  120. uriencToMap = function (s) {
  121. var n = {}, a = s.split("&"), idy, c;
  122. for (idy = 0; idy < a.length; idy++) {
  123. c = a[idy].split("=");
  124. n[c[0]] = decodeURIComponent(c[1]);
  125. }
  126. return n;
  127. },
  128. uwyca = unsafeWindow.ytplayer.config.args,
  129. title = uwyca.title.replace(/[\/\\\:\*\?\"<\>\|]/g, ""),
  130. fmtrgx = /^[\-\w+]+\/(?:x-)?([\-\w+]+)/,
  131. fmt_map = {}, idx, idz, n, a, qual, fmt, fmt_list, map, uefmss, dashlist, ul, q, div,
  132. type, itag, maporder, fpsa, fpsb, fpsw = false;
  133.  
  134. fmt_list = uwyca.fmt_list.split(",");
  135. for (idx = 0; idx < fmt_list.length; idx++) {
  136. a = fmt_list[idx].split("/");
  137. fmt_map[a[0]] = a[1].split("x")[1] + "p";
  138. }
  139.  
  140. map = {};
  141. uefmss = uwyca.url_encoded_fmt_stream_map.split(",");
  142. for (idx = 0; idx < uefmss.length; idx++) {
  143. n = uriencToMap(uefmss[idx]);
  144. qual = fmt_map[n.itag];
  145.  
  146. if (!(qual in map)) { map[qual] = []; }
  147. fmt = fmtrgx.exec(n.type);
  148. map[qual].push($("<a>" + (fmt ? fmt[1] : "MISSINGNO.").toUpperCase() + "</a>").attr("href", n.url + ((n.url.indexOf("signature=") !== -1) ? "" : ("&signature=" + (n.sig || decipher(n.s)))) + "&title=" + title).attr("title", "Format ID: " + n.itag + " | Quality: " + n.quality + " | Mime: " + n.type));
  149. }
  150.  
  151. dashlist = uwyca.adaptive_fmts;
  152. if (typeof dashlist !== 'undefined') {
  153. dashlist = dashlist.split(",");
  154. for (idx = 0; idx < dashlist.length; idx++) {
  155. n = uriencToMap(dashlist[idx]);
  156. qual = n.type.indexOf("audio/") === 0 ? "Audio" : (("size" in n) ? (n.size.split('x')[1] + 'p' + n.fps) : (n.itag in fmt_map) ? (fmt_map[n.itag]) : ("Unknown"));
  157.  
  158. if (!(qual in map)) { map[qual] = []; }
  159. fmt = fmtrgx.exec(n.type);
  160. if (parseInt(n.fps) == 1) fpsw = 1;
  161. map[qual].push($("<a>DASH" + (fmt ? fmt[1] : "MISSINGNO.").toUpperCase() + "</a>").attr("href", n.url + ((n.url.indexOf("signature=") !== -1) ? "" : ("&signature=" + (n.sig || decipher(n.s)))) + "&title=" + title).attr("title", "Format ID: " + n.itag + " | Bitrate: " + n.bitrate + " | Mime: " + n.type + " | Res: " + n.size + " | FPS: " + n.fps));
  162. }
  163. }
  164. if (dashmpd !== false) {
  165. dashmpd = $($.parseXML(dashmpd));
  166. dashmpd.find("AdaptationSet").each(function() {
  167. q = $(this); type = q.attr("mimeType");
  168. q.children("Representation").each(function() {
  169. n = $(this); itag = n.attr("id");
  170. qual = type.indexOf("audio/") === 0 ? "Audio" : (n.attr("height") + 'p' + n.attr("frameRate"));
  171. if (!(qual in map)) { map[qual] = []; }
  172. fmt = fmtrgx.exec(type);
  173. if (parseInt(n.attr("frameRate")) == 1) fpsw = 1;
  174. map[qual].push($("<a>MPD" + (fmt ? fmt[1] : "MISSINGNO.").toUpperCase() + "</a>").attr("href", n.children("BaseURL").text() + "&title=" + title).attr("title", "Format ID: " + itag + " | Bitrate: " + n.attr("bandwidth") + " | Mime: " + type + (type.indexOf("audio/") === 0 ? " | Sample Rate: " + n.attr("audioSamplingRate") : " | Res: " + n.attr("width") + 'x' + n.attr("height") + " | FPS: " + n.attr("frameRate"))));
  175. });
  176. });
  177. }
  178.  
  179. maporder = Object.keys(map);
  180. maporder.sort(function(a,b) {
  181. if((a == "Audio" && b == "Unknown") || (b == "Audio" && a != "Unknown")) return -1;
  182. if ((b == "Audio" && a == "Unknown") || (a == "Audio" && b != "Unknown")) return 1;
  183. fpsa = a.split('p')[1] || 0; fpsb = b.split('p')[1] || 0; if (fpsa != fpsb) return parseInt(fpsb)-parseInt(fpsa);
  184. return parseInt(b)-parseInt(a); });
  185. ul = $("<ul class=\"watch-extras-section\" />");
  186. for (n = 0; n < maporder.length; ++n) {
  187. q = maporder[n];
  188. if (map[q].length < 1) { continue; }
  189. div = $("<div class=\"content\" />").append(map[q][0]);
  190. for (idz = 1; idz < map[q].length; idz++) {
  191. div.append(" ").append(map[q][idz]);
  192. }
  193. ul.append($("<li><h4 class=\"title\" style=\"font-weight: bold; color: #333333;\">" + q + "</h4></li>").append(div));
  194. }
  195.  
  196. $("#action-panel-share").after($("<div id=\"action-panel-sldownload\" class=\"action-panel-content hid\" data-panel-loaded=\"true\" />").append(ul));
  197. $("#watch8-secondary-actions").find("> div").eq(1).after($('<button class="yt-uix-button yt-uix-button-size-default yt-uix-button-opacity action-panel-trigger yt-uix-button-opacity yt-uix-tooltip" style="text-align: center;" type="button" onclick=";return false;" title="" id="btnDownload" data-trigger-for="action-panel-sldownload" data-button-toggle="true"><span class="yt-uix-button-content">Upload</span></button>')).size();
  198. //===========DS===========//
  199. //$("#hiveSwitch").css("display", "block");
  200. $("#watch8-secondary-actions").find("> div").eq(1).after($('<img title="Upload to Hive activated." src="' + uploadPng + '" type="button" onclick=";return false;" title="" id="hiveSwitch" style="right: 0px; bottom: 41px; z-index: 9999999; cursor: pointer; position: absolute; display: block; height: 50px; width: 50px; padding-left: 5px;" data-button-toggle="true"><span class=""></span></button>')).size();
  201. //===========DS===========\\
  202. if (fpsw) ul.after($("<p style='color: green;'>At this time Hive only accepts Mp4 & Flv video files, the other formats are for local downloading.</p>"));
  203. }
  204.  
  205. function run() {
  206. if (typeof unsafeWindow.ytplayer !== 'undefined')
  207. { GM_xmlhttpRequest({method: "GET", url: unsafeWindow.ytplayer.config.assets.js.replace(/^\/\//, "https://"), onload: function (t) { main((function (u) {
  208. "use strict"; var sres = /function ([a-zA-Z$0-9]+)\(a\)\{a=a\.split\(""\);([a-zA-Z0-9]*)\.?.*?return a\.join\(""\)\};/g.exec(u);
  209. if (!sres) { return function (v) { return v; }; }
  210. return eval("(function(s){" + (sres[2] !== "" ? (new RegExp("var " + sres[2] + "={.+?}};", "g").exec(u)[0]) : "") + sres[0] + "return " + sres[1] + "(s);})");
  211. }(t.responseText))); }}); }
  212. }
  213.  
  214. //DS//
  215. function run2(val) {
  216. log("run2 running");
  217. GM_xmlhttpRequest({
  218. method: "GET",
  219. url: val,
  220. onload: function(t){
  221.  
  222. json = JSON.parse(t.responseText);
  223. //for(var key in json) {
  224. // var value = json[key];
  225. // log(value);
  226. //}
  227. }});
  228. }
  229. //DS\\
  230.  
  231. waitForKeyElements("#watch8-secondary-actions", run);
  232.  
  233. //===========DS===========/
  234.  
  235. function createFolder(uploadFolderName){
  236. GM_xmlhttpRequest({ //CROSS DOMAIN POST REQUEST
  237. "method": "get",
  238. "url": "https://api.hive.im/api/hive/get/",
  239. "headers": {
  240. 'Content-Type': 'application/x-www-form-urlencoded;',
  241. 'Authorization': auth,
  242. 'Client-Type': 'Browser',
  243. 'Client-Version': '0.1',
  244. 'Referer': 'https://touch.hive.im/myfiles/videos',
  245. 'Origin': 'https://touch.hive.im/'
  246. },
  247. "onload": function(data){
  248. var r = data.responseText;
  249. var json = JSON.parse(r);
  250. for (var i = 0; i < json.data.length; i++){
  251. var id;
  252. if (json.data[i].title === "Videos"){ // FINDS INITIAL VIDEOS FOLDER ID
  253. //log("we got a video ova here", "green");
  254. parentId = json.data[i].parentId;
  255. id = json.data[i].id;
  256. GM_xmlhttpRequest({ //CROSS DOMAIN POST REQUEST
  257. "method": "post",
  258. "url": "https://api.hive.im/api/hive/get-children/",
  259. "data": "&parentId=" + id + "&limit=1000",
  260. "headers": {
  261. 'Content-Type': 'application/x-www-form-urlencoded;',
  262. 'Authorization': auth,
  263. 'Client-Type': 'Browser',
  264. 'Client-Version': '0.1',
  265. 'Referer': 'https://touch.hive.im/',
  266. 'Origin': 'https://touch.hive.im/'
  267. },
  268. "onload": function(data){
  269. var r = data.responseText;
  270. var json = JSON.parse(r);
  271. var hasFolderIndex;
  272. Object.keys(json.data).forEach(function(key) {
  273. //log(json.data[key].title, "blue");
  274. hasFolderIndex += json.data[key].title;
  275. if (json.data[key].title === uploadFolderName){
  276. uploadFolderId = json.data[key].id;
  277. log("<" + uploadFolderName + "> Already exists. " + uploadFolderId, "green");
  278. //return json.data[key].id;
  279. }
  280. });
  281. if (hasFolderIndex.indexOf(uploadFolderName) == -1){ // SEARCHES VIDEOS FOLDER TO SEE IF uploadFolderName EXISTS
  282. log("does not contain: " + uploadFolderName, "red");
  283. GM_xmlhttpRequest({ //CROSS DOMAIN POST REQUEST
  284. "method": "post",
  285. "url": "https://api.hive.im/api/hive/create/",
  286. "data": "filename=" + uploadFolderName + "&parent=" + id + "&locked=false",
  287. "headers": {
  288. 'Content-Type': 'application/x-www-form-urlencoded;',
  289. 'Authorization': auth,
  290. 'Client-Type': 'Browser',
  291. 'Client-Version': '0.1',
  292. 'Referer': 'https://touch.hive.im/',
  293. 'Origin': 'https://touch.hive.im/'
  294. },
  295. "onload": function(data){
  296. var r = data.responseText;
  297. var json = JSON.parse(r);
  298. uploadFolderId = json.data.id;
  299.  
  300. log("Create folder <" + uploadFolderName + "> " + json.data.id);
  301. return json.data.id;
  302. }
  303. });
  304. }
  305. else{
  306. //log("does contain: " + uploadFolderName, "green");
  307. }
  308. }
  309. });
  310. //log(parentId + "\n" + currentId);
  311. }
  312. //log(item, "blue");
  313. }
  314. //log(r, "blue");
  315. }
  316. });
  317. }
  318.  
  319. function cdReq(href, nameT, folderId){
  320. log("cdReq start: " + href);
  321. GM_xmlhttpRequest({ //CROSS DOMAIN POST REQUEST
  322. "method": "post",
  323. "url": "https://api.hive.im/api/transfer/add/",
  324. "data": "remoteUrl=" + window.btoa(href) + "&parentId=" + folderId,
  325. //"data": "remoteUrl=" + window.btoa(href),
  326. "headers": {
  327. 'Content-Type': 'application/x-www-form-urlencoded;',
  328. 'Authorization': GM_getValue("auth"),
  329. 'Client-Type': 'Browser',
  330. 'Client-Version': '0.1',
  331. 'Referer': 'https://touch.hive.im/',
  332. 'Origin': 'https://touch.hive.im/'
  333. },
  334. "onload": function(data){
  335. var r = data.responseText;
  336. var json = JSON.parse(r);
  337. if (json.status === "success"){
  338. toastr.success(nameT, "Status: " + json.data.status);
  339. log("========= " + nameT + " success =========", "green");
  340. log("Job ID: " + json.data.jobId, "blue");
  341. log("Data Status: " + json.data.status, "blue");
  342. log("Folder Id: " + folderId, "blue");
  343. log("", "red");
  344. }
  345. else{
  346. if (json.message === "quotaExceeded"){
  347. toastr.warning(nameT, "Quota Exceeded");
  348. }
  349. else if (json.message === "securityViolation"){
  350. toastr.error(nameT, "Security Violation");
  351. }
  352.  
  353. log("========= " + nameT + " error =========", "green");
  354. log("Message: " + json.message, "blue");
  355. log("", "red");
  356. }
  357. //log("cdReq >" + data.responseText);
  358. //transferItemsList(); // GO GET ITEMS IN CURRENT TRANSFER LIST
  359. }
  360. });
  361. }
  362.  
  363. $(document).on("click", "#PlaylistToHive", function(e){ // MAIN CLICK EVENT
  364. e.preventDefault();
  365. toastr.warning("Extracting links.", "Please don't navigate from page!");
  366. var tiles = document.getElementsByClassName("yt-uix-tile");
  367. var titlesClass = document.getElementsByClassName("pl-video-title-link");
  368. var titles = [];
  369. var vids = []; // CONTAINS ALL COMPLETE URLS OF ALL ITEMS IN PLAYLIST
  370. var mp4s = [];
  371. for (var i = 0; i < tiles.length; i++){
  372. var r = $(titlesClass[i]).html();
  373. r = r.replace(/(\r\n|\n|\r)/gm,"");
  374. r = r.trim();
  375. r = r.replace(/[`~!@#$%^&*()_|+\=÷¿?;:'",.<>\{\}\[\]\\\/]/gi, '%20');
  376. r = r.replace(/ /g, "%20");
  377. //r = "&title=" + r;
  378. //log(r);
  379. titles.push(r); // CREATES ARRAY OF VIDEO TITLES
  380. vids.push("https://www.youtube.com/watch?v=" + $(tiles[i]).attr("data-video-id")); // CREATES ARRAY OF VIDEO URLS
  381. }
  382.  
  383. var jjj = 0;
  384. for (var jI = 0; jI < vids.length; jI++){
  385. var toastTitle;
  386.  
  387. extract(vids[jI]).done(function (result) {
  388. for (var j = 0; j < result.formats.length; j++){
  389. if (result.formats[j].ext === "mp4" && typeof result.formats[j].format_note == "undefined"){
  390. toastTitle = titles[jjj];
  391. toastTitle = toastTitle.replace(/%20/g, " ");
  392. mp4s = [];
  393. mp4s.push(result.formats[j].url + "&title=" + titles[jjj]);
  394. }
  395. }
  396.  
  397. //log("MP4S 1: >>" + mp4s[0], "blue"); // HIGHEST QUALITY MP4
  398. cdReq(mp4s[0], toastTitle, uploadFolderId);
  399. jjj++;
  400. setTimeout(function(){
  401. if (jjj === jI){
  402. toastr.info("Finished!");
  403. }
  404. }, 5000);
  405. });
  406. }
  407.  
  408. });
  409.  
  410. if (window.top === window.self) {
  411. //=========MAIN WINDOW=========//
  412. if (document.location.href.indexOf("touch.hive.im") !== -1){
  413. return;
  414. }
  415. createFolder(folderName);
  416. if ($(".playlist-actions").length){
  417. $(".playlist-actions").append('<button id="PlaylistToHive" class="yt-uix-button yt-uix-button-size-default yt-uix-button-default yt-uix-button-has-icon no-icon-markup yt-uix-playlistlike yt-uix-tooltip" type="button" onclick=";return false;" aria-label="To Hive" title="To Hive" data-like-tooltip="Save to Playlists" data-unlike-tooltip="Remove" data-like-label="Save" data-unlike-label="Saved" data-tooltip-text="To Hive" aria-labelledby="yt-uix-tooltip95-arialabel" data-tooltip-hide-timer="235"><span class="yt-uix-button-content">To Hive</span></button>');
  418. }
  419. if (!$("#iframeHive").length || typeof auth == "undefined"){
  420. var iframe = document.createElement('iframe');
  421. iframe.id = "iframeHive";
  422. iframe.src = "https://touch.hive.im/account/?1";
  423. iframe.style = "height: 0px; width: 0px; display: none; overflow:hidden";
  424. document.body.appendChild(iframe);
  425. $("#iframeHive").attr("style", "height: 0px; width: 0px; display: none; overflow:hidden");
  426. //$("#iframeHive").attr("style", "height: 600px; width: 600px; display: block; overflow:hidden");
  427. log("iframe created! " + nameB);
  428. }
  429. var onceB = 0;
  430. setInterval(function(){
  431. //log("AA: " + auth);
  432. if (onceB === 0 && typeof auth !== "undefined"){
  433. GM_setValue("ready", "true")
  434. GM_setValue("auth", auth);
  435. $("#iframeHive").remove();
  436. //log("TRUE: " + auth);
  437. }
  438. if (onceB === 0 && GM_getValue("ready") == "true"){
  439. onceB = 1;
  440. auth = GM_getValue("auth");
  441. log("A: " + auth);
  442. $("#iframeHive").remove();
  443. //init();
  444. }
  445. }, 250);
  446. $(document).on("click", "a", function(evt){ // MAIN CLICK EVENT
  447. if ($(this).attr('href').indexOf('googlevideo') !== -1){
  448. if (uploadToHive === false)
  449. return;
  450.  
  451. log($("#hiveSwitch").attr("src"));
  452. evt.preventDefault();
  453. ru = $(this).attr('href');
  454. //log("pre: " + ru);
  455. ru = ru.replace(/ /g, "%20");
  456. //log("post: " + ru);
  457. var vidTitle = $("#eow-title").attr("title");
  458. cdReq(ru, vidTitle, uploadFolderId);
  459. }
  460. });
  461. }
  462. else
  463. {
  464. //=========IFRAME WINDOW=========//
  465. try{
  466. auth = unsafeWindow.account.token;
  467. }
  468. catch(err){}
  469. var once = 0;
  470. setInterval(function(){ // EVENT FOR WHEN PAGE IS LOADED // RUNS ONCE
  471. if (once === 0 && $("#username").text().indexOf("My Account") !== -1){
  472. once = 1;
  473. log("ready");
  474. auth = unsafeWindow.account.token;
  475. GM_setValue("auth", unsafeWindow.account.token);
  476. GM_setValue("ready", "true");
  477. }
  478. else if (once === 1 && auth == "undefined"){
  479. GM_setValue("ready", "false");
  480. try{
  481. auth = unsafeWindow.account.token;
  482. }
  483. catch(err){}
  484. }
  485. }, 200);
  486. }
  487. //===========DS===========\\
  488.  
  489.