JavDB Trailer

在 JavDB 页面上显示预告片信息

Versão de: 19/01/2025. Veja: a última versão.

  1. // ==UserScript==
  2. // @name JavDB Trailer
  3. // @namespace http://tampermonkey.net/
  4. // @version 2025-01-03
  5. // @description 在 JavDB 页面上显示预告片信息
  6. // @author haoyinhaoyin
  7. // @match https://javdb.com/v/*
  8. // @icon https://www.google.com/s2/favicons?sz=64&domain=javdb.com
  9. // @grant GM_xmlhttpRequest
  10. // @connect javtrailers.com
  11. // @license MIT
  12. // ==/UserScript==
  13.  
  14. (function () {
  15. 'use strict';
  16.  
  17. // 在 JavDB 页面上获取包含视频 ID 的元素
  18. const spanElement = document.querySelector('.panel-block.first-block .value a');
  19. if (spanElement != null) {
  20. // 获取视频 ID
  21. const rawJavId = spanElement.parentElement.textContent.trim();
  22. const formattedJavId = standardizeJavId(rawJavId);
  23. fetchPreview(formattedJavId);
  24. } else {
  25. console.log("JavDB 页面中未找到视频 ID。");
  26. }
  27.  
  28. // 标准化视频 ID 格式(移除破折号并补零)
  29. function standardizeJavId(javId) {
  30. const parts = javId.split('-');
  31. if (parts.length === 2 && /^[A-Za-z]+$/.test(parts[0]) && /^[0-9]+$/.test(parts[1])) {
  32. const prefix = parts[0].toUpperCase();
  33. const number = parts[1].padStart(5, '0');
  34. return `${prefix}${number}`;
  35. }
  36. return javId.replace(/-/g, '').toUpperCase();
  37. }
  38.  
  39. // 通过 API 获取预告片信息并插入页面
  40. function fetchPreview(javId) {
  41. const url = `https://search.javtrailers.com/indexes/videos/search?q=${javId}&page=1&sort=releaseDate:desc&hitsPerPage=1`;
  42.  
  43. doGet(url).then(data => {
  44. try {
  45. const result = JSON.parse(data);
  46. if (result.hits && result.hits.length > 0) {
  47. const hit = result.hits[0];
  48. const contentId = hit['contentId'];
  49. const matchedId = hit['id'] || hit['title'];
  50.  
  51. // 宽松匹配:检查返回的 ID 是否包含标准化后的 javId
  52. if (matchedId && matchedId.toLowerCase().includes(javId.toLowerCase())) {
  53. insertTrailerLink(javId, contentId);
  54. } else {
  55. insertNoTrailerMessage(javId);
  56. }
  57. } else {
  58. insertNoTrailerMessage(javId);
  59. }
  60. } catch (error) {
  61. console.error("解析 API 响应失败:", error);
  62. insertNoTrailerMessage(javId);
  63. }
  64. });
  65. }
  66.  
  67. // 在页面中插入预告片链接
  68. function insertTrailerLink(javId, contentId) {
  69. const trailerUrl = `https://javtrailers.com/video/${contentId}`;
  70. const existingDiv = document.querySelector('.panel-block.first-block');
  71.  
  72. if (existingDiv) {
  73. const trailerHTML = `
  74. <div class="panel-block">
  75. <strong>预览:</strong>
  76. &nbsp;<span class="value"><a href="${trailerUrl}" target="_blank">${javId}</a></span>
  77. </div>
  78. `;
  79. existingDiv.insertAdjacentHTML('afterend', trailerHTML);
  80. } else {
  81. console.warn("页面中未找到插入位置。");
  82. }
  83. }
  84.  
  85. // 如果没有预告片,插入提示信息
  86. function insertNoTrailerMessage(javId) {
  87. const existingDiv = document.querySelector('.panel-block.first-block');
  88.  
  89. if (existingDiv) {
  90. const noTrailerHTML = `
  91. <div class="panel-block">
  92. <strong>预览:</strong>
  93. &nbsp;<span class="value">未找到与 <strong>${javId}</strong> 对应的预告片。</span>
  94. </div>
  95. `;
  96. existingDiv.insertAdjacentHTML('afterend', noTrailerHTML);
  97. } else {
  98. console.warn("页面中未找到插入位置。");
  99. }
  100. }
  101.  
  102. // 封装 GET 请求
  103. async function doGet(url) {
  104. return new Promise(resolve => {
  105. GM.xmlHttpRequest({
  106. method: "GET",
  107. headers: { "authorization": "Bearer 6b4bd3e560e994a5b009023e1d21f51e95dbb86ca3f47cb03f34f8a2cb9a93f2" },
  108. url,
  109. onload: response => resolve(response.responseText),
  110. });
  111. });
  112. }
  113. })();