JAVBUS预告片

javbus自动显示预告片

// ==UserScript==
// @name         JAVBUS预告片
// @namespace    http://tampermonkey.net/
// @version      0.3
// @description  javbus自动显示预告片
// @author       jibi
// @include      *://www.*bus*/*
// @include     *://*javbus.com/*
// @exclude      /https?:\/\/www\.(\w{3})?bus(\w{3})?\.\w{3}\/$/
// @exclude      https://www.*bus*/forum/*
// @grant        GM_xmlhttpRequest
// @icon         https://www.google.com/s2/favicons?domain=www.buscdn.xyz/
// v0.2          优化视频的展现方式
// v0.2.1        fix a bug
// v0.2.1        fix a bug
// v0.3          更新了非科学版本
// ==/UserScript==

(function () {
	'use strict';
	let log = console.log;
	let url = location.href;
	let main_re = /https?:\/\/www\.(\w{3})?bus(\w{3})?\.\w{3}\/$/
	if(main_re.test(url)){
		log('这是主页');
		return '';
	}
	let avid = url.split('/').pop();
	let big_img =  document.querySelector('a.bigImage img');
	function request(url, referrerStr, timeoutInt) {
		return new Promise((resolve, reject) => {
			console.log(`发起网址请求:${url}`);
			GM_xmlhttpRequest({
				url,
				method: 'GET',
				headers: {
					"Cache-Control": "no-cache",
					referrer: referrerStr,
					'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36'
				},
				timeout: timeoutInt > 0 ? timeoutInt : 20000,
				onload: response => { //console.log(url + " reqTime:" + (new Date() - time1));
					response.loadstuts = true;
					resolve(response);
				},
				onabort: response => {
					console.log(url + " abort");
					response.loadstuts = false;
					resolve(response);
				},
				onerror: response => {
					console.log(url + " error");
					console.log(response);
					response.loadstuts = false;
					resolve(response);
				},
				ontimeout: response => {
					console.log(`${url} ${timeoutInt}ms timeout`);
					response.loadstuts = false;
					response.finalUrl = url;
					resolve(response);
				},
			});
		});
	}


	function parsetext(text) {
		try {
			//let doc = (new DOMParser).parseFromString("需要将其解析为Document的字符串", "text/html");
			let doc = document.implementation.createHTMLDocument('');
			doc.documentElement.innerHTML = text;
			return doc;
		}catch (e) {
			alert('parse error');
		}
	}
	 
	function set_style(){
		 // 创建style标签,#mask:befero伪元素
		const styleElement = document.createElement('style');
		styleElement.innerText = `
			#mask:before {
				content: "x";
				font-size: 50px;
				color: white;
				opacity: 0.7;
				right: 10px;
				top: -15px;
				position: absolute;
				cursor: pointer;
			}
			
			div.sample-box div.photo-frame:after {
				background: url(https://javdb32.com/packs/media/images/btn-play-b414746c.svg) 50% no-repeat;
				background-color: rgba(0,0,0,.2);
				background-size: 40px 40px;
				bottom: 0;
				content: "";
				display: block;
				left: 0;
				position: absolute;
				right: 0;
				top: 0;
				height: calc(100% - 6px);
			}
			`;
		document.head.append(styleElement);
		
	} 
	
	set_style();
	
	
	function add_video(video_url) {
        const sampleWaterFall = document.getElementById('sample-waterfall');
        let divElement = document.createElement('div');
        if (sampleWaterFall) {
            divElement.className = 'sample-box';
            divElement.style.cursor = 'pointer';
			divElement.style.setProperty('position', 'relative');
			let photo_frame = document.createElement('div');
			photo_frame.className = 'photo-frame';
			divElement.appendChild(photo_frame);
			if(big_img!=null){
				let temp = big_img.cloneNode(false);
				photo_frame.appendChild(temp);
			}
            sampleWaterFall.prepend(divElement);
        }else {
            const clearfix = document.getElementsByClassName('clearfix')[0];
            let div_box  = document.createElement('div');
			div_box.id = 'sample-waterfall';
			div_box.innerHTML = `
                <div class="sample-box" style="cursor: pointer;">
				<div class="photo-frame"></div>                
                </div>
            `;
			divElement = div_box.querySelector('div.sample-box')

			if(big_img!=null){
				let temp = big_img.cloneNode(false);
				let box = div_box.querySelector('div.sample-box div.photo-frame');
				box.style.setProperty('position', 'relative');
				box.appendChild(temp);
			}
			let img_tit = document.createElement('h4');
			img_tit.innerText = '樣品圖像';
            clearfix.before(img_tit, div_box);
        }
        divElement.addEventListener('click', () => {
            const bodyElement = document.body;
            let maskDivElement = document.getElementById('mask');
            if (!maskDivElement) {
                maskDivElement = document.createElement('div');
                maskDivElement.id = 'mask';
                maskDivElement.innerHTML = `
                    <video id="preview-video" playsinline controls preload="none" autoplay="autoplay" style="display:block;position:relative;transform: translateY(-50%);margin: 0 auto;top:50%;width: 73%; height: 80%;" >
                        <source src="${video_url}" type="video/mp4" />
                    </video>
                `;
                maskDivElement.setAttribute('style', 'position:fixed;height:100%;width:100%;background-color:rgba(0,0,0,0.8);top:0px;z-index:999;display:block;');
                // 点击 X 关闭
                maskDivElement.addEventListener('click', () => {
                    maskDivElement.style.display = 'none';
                    document.querySelector('video').pause();
                    bodyElement.style.overflow = 'auto';
                }); 
				bodyElement.append(maskDivElement);   
				document.getElementById('preview-video').addEventListener('click',(e)=>{
					e.stopPropagation();
				});
            }else {
                maskDivElement.style.display = 'block';
                document.querySelector('video').play();
                bodyElement.style.overflow = 'hidden';		
            }
        });
	}

	let first_url = `http://dmm.xrmoo.com/sindex.php?searchstr=${avid}`;
	let r18_url = `https://www.r18.com/common/search/searchword=${avid}/`;
	let promise = request(first_url);
	promise.then((res) => {
		let doc = parsetext(res.responseText);
		let a = doc.querySelector('a[class="link viewVideo"]');
		let video_url;
		if(a!=null){
			video_url = a.getAttribute('data-link');
			video_url=video_url.replace('_sm_','_dmb_')
			add_video(video_url);
			throw new Error('add video done');
		}
		return request(r18_url);
	})
	.then((res) => {
		let doc = parsetext(res.responseText);
		let a = doc.getElementsByClassName('js-view-sample')[0];
		let video_url;
		if (a !== undefined) {
			video_url = a.getAttribute('data-video-high');
			log('video_url -> ', video_url);
			add_video(video_url);
			throw new Error('add video done');
		} else {
			let p = request(`https://www.mgstage.com/product/product_detail/${avid}/`);
			return p;
		}
	}).then((res) => {
		let doc = parsetext(res.responseText);
		let ele = doc.querySelector('div.detail_photo p.sample_movie_btn a');
		if (ele != null) {
			let href = ele.getAttribute('href');
			let pid = href.split('/').pop();
			log('pid -> ', pid);
			href = `https://www.mgstage.com/sampleplayer/sampleRespons.php?pid=${pid}`;
			let p = request(href);
			return p;
		} else {
			let href = `https://www.dmm.co.jp/mono/dvd/-/search/=/searchstr=${avid}/`;
			let p = request(href);
			return p;
		}
	}).then((res) => {
		let final_url = res.finalUrl;
		let re = /www\.(.*?)\.co/
		let site = re.exec(final_url)[1];
		switch (site) {
			case 'mgstage':
				let re = /https.*?ism/
				let json_obj = JSON.parse(res.responseText);
				let video_url = json_obj['url'];
				video_url = re.exec(video_url)[0].replace('ism', 'mp4');
				add_video(video_url);
				throw new Error('add video done');
				break;
			case 'dmm':
				let doc = parsetext(res.responseText);
				let ele = doc.querySelector('ul#list li p.tmb a');
				if (ele != null) {
					let href = ele.getAttribute('href');
					let re = /cid=.*?(\/)/
					let cid = re.exec(href)[0];
					cid = cid.replace('/', '');
					href = `https://www.dmm.co.jp/service/digitalapi/-/html5_player/=/${cid}/mtype=AhRVShI_/service=mono/floor=dvd/mode=/`;
					let p = request(href)
					return p;
				} else {
					throw new Error('target av not found,fuck!')
				}
			default:
				throw new Error('target av not found,fuck!')
		}

	}).then((res) => {
		let text = res.responseText;
		let re = /src":"(.*?.mp4)/g;
		re.test(text);
		let url = RegExp.$1;
		url = url.replace(/\\/, '');
		url = url.replace(/\\/, '');
		let video_url = 'https:' + url;
		add_video(video_url);
	}).catch(msg => {
		log('Msg: ', msg)
	})

})();