【Mod】PHDownloader

Pornhub 视频一键下载 | pornhub.com 【Mod包括:1.Pc和安卓都可以,2.调整布局,减少面积】

As of 2024-03-31. See the latest version.

// ==UserScript==
// @name         【Mod】PHDownloader
// @namespace    http://tampermonkey.net/
// @version      0.0.2【2024.03.31】
// @description  Pornhub 视频一键下载 | pornhub.com 【Mod包括:1.Pc和安卓都可以,2.调整布局,减少面积】
// @author       Hmhm mod by heckles
// @match        *://*.pornhub.com/view_video.php?viewkey=*
// @match        *://*.pornhubpremium.com/view_video.php?viewkey=*
// @icon         https://ci.phncdn.com/www-static/favicon.ico
// @grant        unsafeWindow
// @require      https://cdn.bootcss.com/jquery/1.12.4/jquery.min.js
// @license MIT
// ==/UserScript==

/**
 * 一个异步函数,用于检索并显示远程视频地址的下载列表。
 * 该函数会遍历`unsafeWindow`对象,寻找以`flashvars_`开头的属性,
 * 然后从这些属性中提取视频信息,并通过AJAX请求获取视频下载列表,
 * 最后将下载列表插入到页面指定的位置。
 *
 * @returns {void} 该函数没有返回值。
 */


(async function () {
  'use strict';
  let videoWrapTarget;//let可以先不赋值,用在这里
  let signDomTarget;//let可以先不赋值,用在这里
  let fontstyle;
  if (document.querySelector('.video-wrapper')) {
    videoWrapTarget = document.querySelector('.video-wrapper');
    signDomTarget = document.querySelector('.video-wrapper .title-container');
    fontstyle= "font-size:120%;  font-wieght:400;";
  }
  else {
    console.log("安卓");
    videoWrapTarget = document.querySelector('#videoShow');
    signDomTarget = document.querySelector('#videoShow .categoryTags');
    fontstyle= "font-size:100%;  font-wieght:400;";
  }


  // 获取视频容器元素和标题容器元素
  const videoWrap = videoWrapTarget
  const signDom = signDomTarget
  const style = fontstyle
  let remoteAddress

  // 遍历unsafeWindow对象,寻找可能的视频源信息
  for (let key in unsafeWindow) {
    // 查找以'flashvars_'开头的属性,提取视频地址
    if (key.startsWith('flashvars_')) {
      console.log(unsafeWindow[key])
      let flashvars = unsafeWindow[key]
      let mediaDefinitions = flashvars.mediaDefinitions
      // 从mediaDefinitions中寻找远程视频地址
      mediaDefinitions.some(item => {
        if (item.remote) {
          remoteAddress = item.videoUrl
        }
      })
    }
  }

  // 使用获取到的远程地址通过AJAX请求下载列表
  const list = await $.ajax(remoteAddress).then(data => {
    return data
  })

  // 创建一个DOM元素,用于装载下载列表
  const dom = document.createElement("div");
  dom.style = "display:inline-flex;"//调成一行
  let str = '<div style=' + style + '>DOWNLOAD LIST</div><ul class="Download_List" style="display:inline-flex;">';
  // 构建下载列表的HTML字符串
  list.forEach(item => {
    const { videoUrl, quality } = item
    console.log(item)
    str += `<li style= 'padding-inline:12px;${style}'><a href="${videoUrl}" target="_blank">${quality}P</a></li>`
  })
  str += '</ul>';
  dom.innerHTML = str

  // 创建文档片段,并将下载列表DOM插入其中
  const fragment = document.createDocumentFragment();
  fragment.appendChild(dom)
  // 将下载列表插入到页面指定位置
  videoWrap.insertBefore(fragment, signDom)
})();