// ==UserScript==
// @name douban-info-for-pt
// @namespace https://github.com/techmovie/DouBan-Info-for-PT
// @version 1.1.0
// @description 在PT站电影详情页展示部分中文信息
// @author birdplane
// @require https://cdn.staticfile.org/jquery/1.7.1/jquery.min.js
// @match https://passthepopcorn.me/torrents.php?id=*
// @match https://beyond-hd.me/torrents/*
// @match https://blutopia.xyz/torrents/*
// @match https://asiancinema.me/torrents/*
// @match https://hdbits.org/details.php?id=*
// @match https://uhdbits.org/torrents.php?id=*
// @match https://filelist.io/details.php?id=*
// @match https://hd-torrents.org/details.php?id=*
// @match https://karagarga.in/details.php?id=*
// @match https://privatehd.to/torrent/*
// @grant GM_addStyle
// @grant GM_xmlhttpRequest
// @grant GM_openInTab
// @license MIT
// ==/UserScript==
(() => {
var __assign = Object.assign;
// src/config.json
var PT_SITE = {
"asiancinema.me": {
url: "https://asiancinema.me",
host: "asiancinema.me",
siteName: "ACM",
poster: "img.movie-poster",
imdb: '.badge-user a[href*="imdb.com/title"]:nth-child(1)',
insertDomSelector: "#main-content .box:first .movie-wrapper .movie-row .movie-heading-box h1",
doubanContainerDom: '<div class="douban-dom"></div>'
},
"beyond-hd.me": {
url: "https://beyond-hd.me",
host: "beyond-hd.me",
siteName: "BHD",
imdb: '.badge-meta a[href*="imdb.com/title"]:nth-child(1)',
insertDomSelector: ".movie-wrapper .movie-heading",
doubanContainerDom: '<div class="douban-dom"></div>'
},
"blutopia.xyz": {
url: "https://blutopia.xyz",
host: "blutopia.xyz",
siteName: "BLU",
poster: "img.movie-poster",
imdb: '.badge-user a[href*="imdb.com/title"]:nth-child(1)',
insertDomSelector: "#main-content .box:first .movie-wrapper .movie-row .movie-heading-box h1",
doubanContainerDom: '<div class="douban-dom"></div>'
},
"filelist.io": {
url: "https://filelist.io",
host: "filelist.io",
siteName: "FL",
imdb: '.cblock-innercontent div a[href*="imdb.com/title"]:first',
poster: 'img[width="300px"][src*="image.tmdb.org"]',
insertDomSelector: ".cblock-innercontent hr.separator:first",
doubanContainerDom: '<div class="douban-dom" style="width: 100%;padding-top:20px;"></div>'
},
"hd-torrents.org": {
url: "https://hd-torrents.org",
host: "hd-torrents.org",
siteName: "HDT",
poster: "#IMDBDetailsInfoHideShowTR .imdbnew a img",
imdb: '.imdbnew2 a[href*="imdb.com/title"]:first',
insertDomSelector: "td.detailsleft:contains(IMDb)",
doubanContainerDom: '<tr><td align="left" class="detailsleft">\u8C46\u74E3</td><td valign="top" align="left" class="detailshash douban-dom"></td></tr>'
},
"hdbits.org": {
url: "https://hdbits.org",
host: "hdbits.org",
siteName: "HDB",
imdb: {
movie: ".contentlayout h1 a",
tv: "#details .showlinks li:nth-child(2) a"
},
insertDomSelector: "#details>tbody>tr:nth-child(2)",
doubanContainerDom: '<tr><td><div id="l7829483" class="label collapsable" onclick="showHideEl(7829483);(7829483)"><span class="plusminus">- </span>\u8C46\u74E3\u4FE1\u606F</div><div id="c7829483" class="hideablecontent" ><div class="contentlayout douban-dom"></div></td></tr>'
},
"karagarga.in": {
url: "https://karagarga.in",
host: "karagarga.in",
siteName: "KG",
imdb: 'td a[href*="imdb.com/title"]:first',
insertDomSelector: ".outer h1~table:first",
doubanContainerDom: '<div class="douban-dom kg" style="width:770px;padding-top:20px;"></div>'
},
"passthepopcorn.me": {
url: "https://passthepopcorn.me",
host: "passthepopcorn.me",
siteName: "PTP",
siteType: "gazelle",
imdb: "#imdb-title-link"
},
"privatehd.to": {
url: "https://privatehd.to",
host: "privatehd.to'",
siteName: "PHD",
imdb: '.movie-details .badge-extra a[href*="imdb.com/title"]:first',
poster: ".movie-poster img",
insertDomSelector: ".movie-title",
doubanContainerDom: '<div class="douban-dom" style="justify-content: flex-start;"></div>'
},
"uhdbits.org": {
url: "https://uhdbits.org",
host: "uhdbits.org",
siteName: "UHD",
imdb: ".tooltip.imdb_icon",
poster: ".poster_box .imgbox img",
insertDomSelector: "div.head:contains(IMDB)",
doubanContainerDom: '<div class="box"><div class="head"><a href="#">\u2191</a> <strong>\u8C46\u74E3</strong></div><div class="body douban-dom"></div></div>'
}
};
// src/const.js
var _a, _b;
var CURRENT_SITE_INFO = (_b = (_a = PT_SITE) == null ? void 0 : _a[location.host]) != null ? _b : "";
var _a2;
var CURRENT_SITE_NAME = (_a2 = CURRENT_SITE_INFO == null ? void 0 : CURRENT_SITE_INFO.siteName) != null ? _a2 : "";
var DOUBAN_API_URL = "https://omit.mkrobot.org/movie/infos";
var DOUBAN_SEARCH_API = "https://movie.douban.com/j/subject_suggest";
// src/common.js
var isChinese = (title) => {
return /[\u4e00-\u9fa5]+/.test(title);
};
var addToPtpPage = (data) => {
console.log(data);
if (isChinese(data.chineseTitle)) {
$(".page__title").prepend(`<a target='_blank' href="${data.link}">[${data.chineseTitle}] </a>`);
}
if (data.summary) {
const synopsisDom = $("#synopsis-and-trailer").clone().attr("id", "");
synopsisDom.find("#toggletrailer").empty();
synopsisDom.find(".panel__heading__title").text("\u4E2D\u6587\u7B80\u4ECB");
synopsisDom.find("#synopsis").text(data.summary).attr("id", "");
$("#synopsis-and-trailer").after(synopsisDom);
}
$("#movieinfo").before(`
<div class="panel">
<div class="panel__heading"><span class="panel__heading__title">\u7535\u5F71\u4FE1\u606F</span></div>
<div class="panel__body">
<div><strong>\u5BFC\u6F14:</strong> ${data.director}</div>
<div><strong>\u7C7B\u578B:</strong> ${data.genre}</div>
<div><strong>\u5236\u7247\u56FD\u5BB6/\u5730\u533A:</strong> ${data.region}</div>
<div><strong>\u8BED\u8A00:</strong> ${data.language}</div>
<div><strong>\u65F6\u957F:</strong> ${data.runtime}</div>
<div><strong>\u53C8\u540D:</strong> ${data.aka}</div
</div>`);
if (data.average) {
$("#movie-ratings-table tr").prepend(`<td colspan="1" style="width: 152px;">
<center>
<a target="_blank" class="rating" href="${data.link}" rel="noreferrer">
<div style="font-size: 0;min-width: 105px;">
<span class="icon-pt1">\u8C46</span>
<span class="icon-pt2">\u8C46\u74E3\u8BC4\u5206</span>
</div>
</a>
</center>
</td>
<td style="width: 153px;">
<span class="rating">${data.average}</span>
<span class="mid">/</span>
<span class="outof"> 10</span>
<br>(${data.votes} votes)</td>`);
}
};
var getImdbId = () => {
let imdbLink = "";
const imdbConfig = CURRENT_SITE_INFO.imdb;
if (typeof imdbConfig === "object") {
try {
Object.keys(imdbConfig).forEach((key) => {
if ($(`${imdbConfig[key]}`)[0]) {
imdbLink = $(imdbConfig[key]).attr("href");
throw new Error("end loop");
}
});
} catch (error) {
if (error.message !== "end loop") {
console.log(error);
}
}
} else {
imdbLink = $(imdbConfig).attr("href");
}
console.log(imdbLink);
return /tt\d+/.exec(imdbLink)[0];
};
var getDoubanId = (imdbId) => {
return new Promise((resolve, reject) => {
GM_xmlhttpRequest({
method: "GET",
url: `${DOUBAN_SEARCH_API}?q=${imdbId}`,
onload(res) {
try {
const data = JSON.parse(res.responseText);
if (data.length > 0) {
resolve(data[0]);
}
} catch (error) {
console.log(error);
}
}
});
});
};
var getTvSeasonData = (data) => {
const {titleDom} = CURRENT_SITE_INFO;
const torrentTitle = $(titleDom).text();
return new Promise((resolve, reject) => {
var _a3, _b2;
const {episode = "", title} = data;
if (episode) {
const seasonNumber = (_b2 = (_a3 = torrentTitle.match(/S(?!eason)?0?(\d+)\.?(EP?\d+)?/i)) == null ? void 0 : _a3[1]) != null ? _b2 : 1;
if (parseInt(seasonNumber) === 1) {
resolve(data);
} else {
const query = title.replace(/第.+?季/, `\u7B2C${seasonNumber}\u5B63`);
getDoubanId(query).then((data2) => {
resolve(data2);
});
}
}
});
};
var getDoubanInfo = (doubanId) => {
return new Promise((resolve, reject) => {
try {
if (doubanId) {
GM_xmlhttpRequest({
method: "GET",
url: `${DOUBAN_API_URL}/${doubanId}`,
onload(res) {
var _a3;
const data = JSON.parse(res.responseText);
if (data && ((_a3 = data.data) == null ? void 0 : _a3.id)) {
resolve(formatDoubanInfo(data.data));
} else {
console.log("\u8C46\u74E3\u6570\u636E\u83B7\u53D6\u5931\u8D25");
}
}
});
} else {
reject(new Error("\u8C46\u74E3\u94FE\u63A5\u83B7\u53D6\u5931\u8D25"));
}
} catch (error) {
console.log(error);
reject(new Error(error.message));
}
});
};
var formatDoubanInfo = (data) => {
let {title, votes, average, originalTitle} = data;
if (originalTitle !== title) {
title = title.replace(originalTitle, "").trim();
}
votes = votes || "0";
average = average || "0.0";
return __assign(__assign({}, data), {
chineseTitle: title,
votes,
average
});
};
var createDoubanDom = (doubanId) => {
const iframe = document.createElement("iframe");
iframe.id = "doubanIframe";
iframe.width = "770";
iframe.height = "345";
iframe.frameborder = "0";
iframe.scrolling = "no";
const div = document.createElement("div");
let {doubanContainerDom, insertDomSelector, siteName, poster} = CURRENT_SITE_INFO;
if (siteName === "HDT") {
insertDomSelector = $(insertDomSelector).parent();
}
$(insertDomSelector).before(doubanContainerDom);
const doubanLink = `https://movie.douban.com/subject/${doubanId}`;
GM_xmlhttpRequest({
url: `${doubanLink}/output_card`,
method: "GET",
onload(res) {
const htmlData = res.responseText.replace(/wrapper/g, "douban-wrapper").replace(/<script.+?script>/g, "");
let headDom = htmlData.match(/<head>((.|\n)+)<\/head>/)[1];
headDom = headDom.replace(/<link.+?>/g, "");
const bodyDom = htmlData.match(/<body>((.|\n)+)<\/body>/)[1];
div.insertAdjacentHTML("beforeend", headDom);
div.insertAdjacentHTML("beforeend", bodyDom);
$(".douban-dom").append(div).attr("douban-link", doubanLink);
if ($(poster).attr("src")) {
let posterStyle = $(".picture-douban-wrapper").attr("style");
posterStyle = posterStyle.replace(/\(.+\)/, `(${$(poster).attr("src")})`);
$(".picture-douban-wrapper").attr("style", posterStyle);
}
$(".douban-dom").click(() => {
GM_openInTab(doubanLink);
});
}
});
iframe.onload = () => {
};
};
// src/style.js
var style_default = GM_addStyle(`
.contentlayout.douban-info {
display: flex;
justify-content: space-around;
}
.contentlayout.douban-info .detail{
flex:1;
}
.detail .title{
font-size: 26px;
font-weight: 600;
margin-bottom: 20px;
}
.detail .title a{
text-decoration: none;
}
.movie-detail{
display: flex;
justify-content: space-between;
}
.movie-detail .synopsis {
width: 60%;
}
.movie-detail .movieinfo {
margin-right: 20px;
max-width: 30%;
}
.icon-pt1{
font-size: 14px;
display: inline-block;
text-align: center;
border: 1px solid #41be57;
background-color: #41be57;
color: white;
border-top-left-radius: 4px;
border-bottom-left-radius: 4px;
width: 24px;
height: 24px;
line-height: 24px;
}
.icon-pt2{
display: inline-block;
text-align: center;
border: 1px solid #41be57;
color: #3ba94d;
background: #ffffff;
border-top-right-radius: 4px;
border-bottom-right-radius: 4px;
width: 69px;
height: 24px;
line-height: 24px;
font-size: 14px;
}
.douban-dom {
display: flex;
cursor: pointer;
}
.douban-dom {
text-align: left;
}
#douban-wrapper *{
box-sizing: content-box;
}
#douban-wrapper .clearfix:after {
content: ".";
display: block;
height: 0;
clear: both;
visibility: hidden
}
#douban-wrapper .clearfix {
zoom: 1;
display: inline-block;
_height: 1px;
}
#douban-wrapper .clearfix {
height: 1%
}
#douban-wrapper .clearfix {
display: block
}
#douban-wrapper .rating_per{
color: #111;
}
#douban-wrapper .grid{
overflow: initial;
}
`);
// src/index.js
(async () => {
if (CURRENT_SITE_INFO) {
const imdbId = getImdbId();
const movieData = await getDoubanId(imdbId);
let {id, episode = ""} = movieData;
if (episode) {
const tvData = await getTvSeasonData(movieData);
id = tvData.id;
}
if (CURRENT_SITE_NAME === "PTP") {
getDoubanInfo(id).then((doubanData) => {
addToPtpPage(doubanData);
});
} else {
createDoubanDom(id);
}
}
})();
})();