Greasy Fork

Greasy Fork is available in English.

豆瓣电影磁力链

豆瓣电影(https://movie.douban.com/)中进入电影的详细页时,在电影海报下方自动添加与当前电影匹配的磁力链。

当前为 2018-06-19 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         豆瓣电影磁力链
// @namespace    http://tampermonkey.net/
// @version      3.18.0619.07
// @description  豆瓣电影(https://movie.douban.com/)中进入电影的详细页时,在电影海报下方自动添加与当前电影匹配的磁力链。
// @author       Alfonso
// @match        https://movie.douban.com/subject/*
// @match        http://movie.mtime.com/*
// @connect      www.wcs123.com
// @connect      www.btanf.com
// @connect      xiguacili.net
// @run-at       document-idle
// @grant        GM.xmlHttpRequest
// @grant        GM.setClipboard
// @grant        GM.setValue
// @grant        GM.getValue
// @require      https://cdn.jsdelivr.net/npm/vue/dist/vue.min.js
// ==/UserScript==

(function() {
    'use strict';
    var main={
        mtime:{
            re:/mtime/,
            key:function(){return document.querySelector(".db_head > div  > h1 ").innerText;},
            insertNode:function (){return document.querySelector("p.line_dot");}
        },
        douban:{
            re:/douban/,
            key:function(){return document.querySelector("div#content h1 span").innerText.split(" ")[0];},
            insertNode:function(){return document.querySelector("#interest_sect_level");}
        }
    }

    //     let key = document.querySelector("div#content h1 span").innerText.split(" ")[0];
    //     let insertNode = document.querySelector("#interest_sect_level");
    var key="";
    var insertNode = "";

    var main_keys = Object.keys(main);
    for (var i = 0; i < main_keys.length; i++) {
        var currentMovieSite = main[main_keys[i]];
        if (currentMovieSite.re && currentMovieSite.re.test(location.href)) {
            key =currentMovieSite.key();
            insertNode =currentMovieSite.insertNode();
        }
    }

    let mainNode = document.createElement("div");
    mainNode.setAttribute("id","mainmovie");
    mainNode.innerHTML="<movies></movies>";
    insertNode.parentNode.insertBefore(mainNode,insertNode);
    console.log(insertNode);

    // 将搜索结果转为HTML
    function parseText(text) {
        let doc = null;
        try {
            doc = document.implementation.createHTMLDocument("");
            doc.documentElement.innerHTML = text;
            return doc;
        }
        catch (e) {
            //  alert("parse error");
        }
    }

    Vue.component('movies',{
        data: function () {
            return {
                movies: [],
                error:null,
                currentSelect:"xiguacili",
                couponSelected: '',
                magnetSite:
                {
                    xiguacili: {
                        search: (key) => {
                            return `http://xiguacili.net/xigua/${key}.html`;
                        },
                        lists: "div.row:nth-child(7) div.ffbox",
                        title: (item) => {
                            return item.querySelector("div.title h3>a").innerText;
                        },
                        url: (item) => {
                            return item.querySelector("div.title h3>a").href;
                        },
                        magnet: (item) => {
                            return item.querySelector("span>a").href;
                        },
                        hot: (item) => {
                            return item.querySelector("div.categorybar span:nth-child(5) > b").innerText;
                        },
                        size: (item) => {
                            return item.querySelector("div.categorybar span:nth-child(3) > b").innerText;
                        }
                    },
                    btanf: {
                        search: (key) => {
                            return `http://www.btanf.com/search/${key}-first-asc-1`;
                        },
                        lists: "div.search-item",
                        title: (item) => {
                            return item.querySelector("div.item-title>a").innerText;
                        },
                        url: (item) => {
                            return "http://www.btanf.com" + item.querySelector("div.item-title>a").href;
                        },
                        magnet: (item) => {
                            return item.querySelector("div:nth-child(3) > a:nth-child(5)").href;
                        },
                        hot: (item) => {
                            return item.querySelector(" div:nth-child(3) > span:nth-child(2) > b").innerText;
                        },
                        size: (item) => {
                            return item.querySelector("div:nth-child(3) > span:nth-child(4) > b").innerText;
                        }
                    },
                    wcs123: {
                        search: (key) => {
                            return `http://www.wcs123.com/s/${key}-hot-desc-1`;
                        },
                        lists: "td.x-item",
                        title: (item) => {
                            return item.querySelector("h3>a").innerText;
                        },
                        url: (item) => {
                            return "http://www.wcs123.com" + item.querySelector("h3>a").href;
                        },
                        magnet: (item) => {
                            return item.querySelector("span>a").href;
                        },
                        hot: (item) => {
                            return item.querySelector("span:nth-child(5)>b").innerText;
                        },
                        size: (item) => {
                            return item.querySelector("span:nth-child(6)>b").innerText;
                        }
                    },
                },

            }
        },
        template:
        '<table style="width: 100%; padding: 0; margin-bottom: 3px;">' +
        '<thead>' +
        '<tr>' +
        '<th style="border:1px dashed #dddddd; text-align:center; width:40px; color:#007722; font-size:14px; padding:5px;">操作</th>' +
        '<th style="border:1px dashed #dddddd; text-align:center; width:45px; color:#007722; font-size:14px; padding:5px;">热度</th>' +
        '<th style="border:1px dashed #dddddd; text-align:center; width:65px; color:#007722; font-size:14px; padding:5px;">大小</th>' +
        '<th style="border:1px dashed #dddddd; text-align:center; color:#007722; font-size:14px; padding:5px;">' +
        '磁力搜索网站:<select v-model="couponSelected" @change="selectMagnetSite"><option v-for="(item, key,value) in magnetSite" v-bind:value="key">&nbsp;{{key}}&nbsp; </option></select></th>' +
        '</tr>' +
        '</thead>' +
        '<tbody>' +
        '<tr v-if="!movies.length && !error"><td colspan="4" style="font-size:14px;text-align:center;padding:8px;"><span>Loading......</span></td></tr>' +
        '<tr v-if="error"><td colspan="4" style="color:darkred;font-size:14px;text-align:center;padding:8px;"><span>{{error}}</span></td></tr>' +
        '<tr v-for="item in movies" v-else>' +
        '<td style="border:1px dashed #dddddd; text-align:center; padding:5px;"><a :href="item.magnet" @click.prevent="copyMagnet" title="单击此处复制磁力链到剪贴板">复制</a></td>' +
        '<td style="border:1px dashed #dddddd; padding:5px;">{{item.hot}}</td>' +
        '<td style="border:1px dashed #dddddd; padding:5px;"><a :href="item.url" target="_blank" title="打开搜索结果页">{{item.size}}</a></td>' +
        '<td style="border:1px dashed #dddddd; padding:5px;"><a :href="item.magnet" target="_blank">{{item.title}}</a></td>' +
        '</tr></tbody></table>',
        mounted:function(){
            GM.getValue("currentMagnetSite", "xiguacili").then((response)=>{
                this.currentSelect=response;
                this.getMovies(key);
            });
        },
        created:function(){
            // 读取当前磁力网站名
            GM.getValue("currentMagnetSite", "xiguacili").then((response)=>{
                this.currentSelect=response;
                // 设置下拉框的默认项
                this.couponSelected =response;
            })
        },
        methods:{
            selectMagnetSite:function(){
                // console.log(this.couponSelected);
                this.currentSelect=this.couponSelected;
                GM.setValue("currentMagnetSite", this.couponSelected);
                this.error =null;
                this.movies =[];
                this.getMovies(key);
            },
            copyMagnet:function(event){
                console.log("跳转 >>> ");
                event.preventDefault(); //阻止跳转
                event.target.innerHTML = '<span style="color:#3c763d">成功</span>';
                GM.setClipboard(event.target.href);
                setTimeout(()=>{
                    event.target.innerHTML = "复制";
                }, 3000);
            },
            getMovies:function(keyword){
                // console.log("get movies start!");
                let currentMagnet=this.magnetSite[this.currentSelect];
                console.log("currentMagnet >>> ",this.currentSelect," >>> ",currentMagnet);
                var self = this;
                GM.xmlHttpRequest({
                    method: "GET",
                    url: currentMagnet.search(key),
                    onload: function(response) {
                        // console.log(response.responseText);
                        let magHtml = parseText(response.responseText);
                        let mags = magHtml.querySelectorAll(currentMagnet.lists);
                        console.log("数量:",mags.length);
                        // console.log(mags);
                        if(mags){
                            self.error =null;
                            mags.forEach(function (item, index) {
                                let title = currentMagnet.title(item);
                                console.log("Title -> "+title);
                                if(title.indexOf(key) != -1){
                                    self.movies.push({
                                        "title": title,
                                        "url": currentMagnet.url(item),
                                        "magnet": currentMagnet.magnet(item),
                                        "hot": currentMagnet.hot(item),
                                        "size": currentMagnet.size(item),
                                    });
                                }
                            });
                            // console.log("self.movies >>> .",self.movies);
                        }
                        if(!self.movies.length){
                            self.error ="当前电影无有效磁力资源,换个磁力搜索网站试试!";
                        }
                    },
                    onerror:function(ex){
                        console.log(`獲取磁力鏈資源異常:${ex}`);
                        self.error ="提供磁力资源的网站异常,请稍后再重试!";
                    }
                });
            }
        }
    });

    var app = new Vue({
        el: '#mainmovie',
    });

    // Your code here...
})();