소스 검색

Adding Open Magnet Links Tampermonkey script

jenn 2 년 전
부모
커밋
392ff4aa51
1개의 변경된 파일154개의 추가작업 그리고 0개의 파일을 삭제
  1. 154 0
      JS/Open Magnets in Transmission.user.js

+ 154 - 0
JS/Open Magnets in Transmission.user.js

@@ -0,0 +1,154 @@
+// ==UserScript==
+// @name        Open Magnets in Transmission
+// @namespace   ca.tarka.home
+// @description Open magnet links from ThePirateBay in the Transmission web client
+// @include     https://thepiratebay.org/*
+// @include     https://www.thepiratebay.org/*
+// @include     https://thepiratebay.se/*
+// @include     https://www.thepiratebay.se/*
+// @include     https://1337x.to/*
+// @include     https://tpb.party/*
+// @include     https://thepiratebay.net/*
+// @include     https://downloadtorrentfile.com/*
+// @include     https://rarbg2020.org/*
+// @include     https://torrentz2eu.org/*
+// @include     http://storm:9091/*
+// @include     storm.tarka:9091/*
+// @include     https://bittorrent/*
+// @include     https://bittorrent.tarka/*
+// @connect     storm.tarka
+// @connect     storm.tarka:9091
+// @connect     bittorrent
+// @connect     bittorrent.tarka
+// @version     1.1
+// @grant       GM_xmlhttpRequest
+// @grant       GM_setValue
+// @grant       GM_getValue
+// ==/UserScript==
+
+const options = {
+  host: 'bittorrent',
+  altHosts: ['bt', 'bittorrent.tarka', 'bt.tarka', 'storm:9091', 'storm.tarka:9091', 'bittorrent'],
+  auth: 'YnQ6bm9QYXNzd29yZDEyMw==',
+  destination: '/var/lib/transmission-daemon/downloads/unsorted'
+};
+const csrfTokenkey = 'csrfToken';
+
+(function() {
+  let host = document.location.host;
+  if( host == options.host || options.altHosts.includes(host) ) {
+    getCsrfToken();
+    //setConfig();
+  } else if( self == top ) {
+    setTimeout( setupLinks, 300 );
+  }
+})();
+
+function getCsrfToken() {
+  console.log( 'Attempting to get CSRF token' );
+  if( !unsafeWindow.transmission ) {
+    console.log( 'Transmission doesn\'t exist on window. Trying again.' );
+    return setTimeout( getCsrfToken, 100 );
+  }
+  let token = unsafeWindow.transmission.remote._token;
+  console.log( 'Storing CSRF token:', token );
+  GM_setValue( csrfTokenkey, token );
+}
+
+function setConfig() {
+  console.log( 'Attempting to set seeding config' );
+  const data = {
+    method: "session-set",
+	arguments: {
+		"seedRatioLimited": true,
+		"seedRatioLimit": 0.001,
+		"idle-seeding-limit-enabled": true,
+		"idle-seeding-limit": 1,
+		"speed-limit-up-enabled": true,
+		"speed-limit-up": 5
+	}
+  };
+
+  postData( data, () => console.log( 'Updated configs' ), false );
+}
+
+var searches = 0;
+function setupLinks() {
+  console.log( 'setting up links' );
+  let links = Array.from( document.querySelectorAll( 'a[href^="magnet:"]' ) );
+  if( ++searches >= 10 ) {
+    console.error( 'Too many searches. Aborting.' );
+    return;
+  }
+
+  if( !links.length ) {
+    console.log( 'No links found on page. Trying again in a moment.', links );
+    return setTimeout( setupLinks, 50 );
+  } else {
+    console.log( 'Got links', links );
+    links.forEach( x => x.addEventListener( 'click', clickLink ) );
+  }
+}
+
+function clickLink( event ) {
+  console.log( 'Clicking link', event );
+  let magnet = this.href;
+  startTorrent( magnet );
+
+  // Stop the link from being clicked
+  event.preventDefault();
+}
+
+function startTorrent( magnet ) {
+  let data = {
+    method: 'torrent-add',
+    arguments: {
+      paused: false,
+      'download-dir': options.destination,
+      filename: magnet
+    }
+  };
+  postData(
+    data,
+    () => alert( 'Successfully added torrent' ),
+    true
+  );
+}
+
+function postData( data, success, showError ) {
+  GM_xmlhttpRequest( {
+    method: 'POST',
+    url: `https://${options.host}/transmission/rpc`,
+    data: JSON.stringify( data ),
+    headers: {
+      'Authorization': `Basic ${options.auth}`,
+      'X-Transmission-Session-Id': GM_getValue( csrfTokenkey )
+    },
+    onload: response => {
+      if( response.status != 200 ) {
+        return onError( response );
+      }
+      success();
+    },
+    onerror: response => {
+      console.error( response );
+      if( showError ) {
+        alert( 'An error occurred adding the torrent' );
+      }
+    }
+  } );
+
+  function onError( response ) {
+    console.error( response );
+    if( !showError ) {
+      return;
+    }
+    if( response.statusText == 'Conflist' ) {
+        alert('Received "Conflict" error.\n\nHas this torrent already been added?');
+    } else if( response.status == 409 ) {
+      alert( 'CSRF token is out of date.\n\nPlease open the Transmission UI in another tab, then try again' );
+    } else {
+      alert( 'Unknown error occurred adding the event. More details available in the browser console.' );
+    }
+  }
+}