您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Lightweight avfun video dumper
- // ==UserScript==
- // @name localav
- // @namespace https://github.com/doomred
- // @description Lightweight avfun video dumper
- // @version 0.22
- // @encoding utf-8
- // @license GPLv3
- // @copyleft dye `Eric' jarhoo
- // @author dye `Eric' jarhoo
- // @homepageURL htpp://saltyremix.com
- // @icon https://raw.github.com/doomred/localav/master/localav_icon.png
- // @include http://*.acfun.*/v/ac*
- // @run-at document-end
- // @grant GM_getValue
- // @grant GM_setValue
- // @grant GM_xmlhttpRequest
- // @grant GM_openInTab
- // @grant GM_registerMenuCommand
- // ==/UserScript==
- /***********
- * Many thanks for the followings, without you the mates,
- * `localav' would not make sense.
- * zjworks for debuging & testing
- * 持续飞翔的胖子 & acfun_tv & 冷色猫咪 for suggestion alternative solution
- *
- \*********************************************************/
- function forceupdate() {
- 'use strict';
- GM_openInTab('https://raw.github.com/doomred/localav/master/localav.user.js');
- return 0;
- }
- var lvDebug, lvLeft, lvBt, lvEasterEgg;
- lvDebug = 0; // debug usage, value: 0/1/2
- lvLeft = GM_getValue('gm_lv_left', '1em');
- lvBt = GM_getValue('gm_lv_bt', '1em');
- lvEasterEgg = 0;
- GM_registerMenuCommand('localav| Force Update!', forceupdate, 'a');
- var lvDiv, lvCloseDiv, lvContDiv;
- /* init lv-box */
- lvDiv = document.createElement('div');
- lvDiv.style.border = '2px solid';
- lvDiv.style.left = lvLeft;
- lvDiv.style.bottom = lvBt;
- lvDiv.style.display = 'none'; //init
- lvDiv.style.lineHeight = '1em'; //fix inherit
- lvDiv.style.zIndex = '9999';
- lvDiv.style.position = 'fixed';
- lvDiv.style.textAlign = 'right';
- lvDiv.style.backgroundColor = '#ffe'; //may use BG-image
- lvDiv.id = 'lv-box';
- lvDiv.setAttribute('draggable', 'true');
- window.document.body.appendChild(lvDiv);
- lvCloseDiv = document.createElement('span');
- lvCloseDiv.id = 'lv-topbar';
- lvCloseDiv.innerHTML = '[X]';
- lvCloseDiv.style.cursor = 'pointer';
- lvCloseDiv.style.fontSize = '16pt';
- lvCloseDiv.style.color = 'white';
- lvCloseDiv.style.background = '#810400';
- lvCloseDiv.onclick = function() {
- lvDiv.style.display = 'none';
- };
- lvDiv.appendChild(lvCloseDiv);
- lvContDiv = document.createElement('div');
- lvContDiv.id = 'lv-contbox';
- lvDiv.appendChild(lvContDiv);
- var lvTarget, anchorBtn, i, lvName;
- anchorBtn = document.getElementsByTagName('a');
- lvTarget = [];
- window.lvName = [];
- for(i = anchorBtn.length; i--;) {
- if(anchorBtn[i].getAttribute('title')) {
- if(anchorBtn[i].getAttribute('title').search('Part') !== -1) { // dirty hack, may fail
- lvTarget.push(anchorBtn[i].getAttribute('data-vid'));
- window.lvName.push(anchorBtn[i].innerHTML);
- }
- }
- }
- for(i = lvTarget.length; i--;) {
- playerDLURL = "https://ssl.acfun.tv//aliyun/index.php?&type=mobileclient&vid=" + lvTarget[i];
- // key core of localav, another API: jiexi.avfun.info/index.php?vid=xxx
- if(lvDebug) {window.alert(playerDLURL);}
- function dynaparts(obj, id) {
- var key, lvContBox, lvContSize, lvContName, temp, i, lvContURL, contDiv, lvContQuality, lvContType, lvTowerBuilder;
- contDiv = window.top.document.getElementById('lv-contbox');
- lvContName = document.createElement('div');
- lvContName.style.margin = '1em 0 0 0';
- lvContName.style.textAlign = 'center';
- lvContName.innerHTML = window.lvName[id];
- contDiv.appendChild(lvContName);
- for(key in obj) {
- if(obj.hasOwnProperty(key)) {
- lvContBox = document.createElement('div');
- lvContBox.classList.add('lv-content');
- lvContBox.style.margin = '0 1.5em 0 1.5em';
- lvContBox.style.cursor = 'pointer';
- lvContBox.style.cssFloat = 'left';
- lvContQuality = obj[key].quality;
- lvContType = obj[key].files[0].type;
- temp = 0;
- lvContURL = '';
- for(i = 0; i < obj[key].files.length; i++) {
- lvContURL += obj[key].files[i].url;
- lvContURL += '^'; // split urls
- temp += obj[key].files[i].bytes; // add up bytes
- }
- lvContBox.setAttribute('data-lv', lvContURL);
- if(lvDebug) {window.alert(lvContURL);}
- temp = temp / 1024 / 1024 * 100; // leave two float point
- lvContSize = parseInt(temp, 10) / 100 + 'MB';
- if(lvContURL.search('.hlv?') !== -1) { // sina hlv fix
- lvContType = 'hlv';
- }
- if(!parseInt(lvContSize, 10)) {lvContSize = '大小仍是个迷';}
- lvContBox.innerHTML = lvContQuality + ' [' + lvContType + ']<br />' + lvContSize;
- lvContBox.addEventListener('click', function (e) { // download with purejs, midified via SO
- var iframe, eventSender, cSrc, arraySrc, i;
- if (!e && window.event) {e = window.event;}
- eventSender = (window.event) ? e.srcElement : e.target;
- cSrc = eventSender.getAttribute('data-lv');
- if(lvDebug > 1) {window.alert(lvContURL);}
- arraySrc = cSrc.split('^');
- if(cSrc.search('.hlv?') !== -1) { // sina hlv fix
- for(i = 0; i < arraySrc.length - 1; i++) { //dirty hack, trim tailling one
- if(lvDebug > 1) {alert(arraySrc[i]);}
- GM_openInTab(arraySrc[i]);
- }
- temp = null;
- } else {
- for(i = 0; i < arraySrc.length - 1; i++) {
- iframe = document.createElement('iframe');
- iframe.style.display = 'none';
- iframe.style.position = 'absoulte';
- iframe.style.top = '0px';
- iframe.style.left = '0px';
- iframe.src = arraySrc[i];
- document.body.appendChild(iframe);
- }
- }
- }, false);
- if(lvContURL.search('&id=tudou') !== -1 || 0) { // add broken parsed urls here, blame API
- lvContBox.style.backgroundColor = 'grey';
- lvContBox.innerHTML += "<br />可能失效";
- }
- contDiv.appendChild(lvContBox);
- lvContBox.id = 'lv_' + id;
- /* fix sina duplicate generated API*/
- if(lvContURL.search('v.iask.com') !== -1) {
- break;
- }
- }
- }
- lvTowerBuilder = document.createElement('hr');
- lvTowerBuilder.style.clear = 'both';
- contDiv.appendChild(lvTowerBuilder);
- }
- GM_xmlhttpRequest({
- method: "GET",
- url: playerDLURL,
- headers: {
- "Accept": "application/json"
- },
- onload: function(response) {
- var foo = JSON.parse(response.responseText)
- var bar = response.finalUrl.search('mobileclient&vid=');
- var index = lvTarget.indexOf(response.finalUrl.substr(bar + 17));
- dynaparts(foo.result, index);
- }
- });
- }
- if(lvTarget.length > 4 ) { //side style trigger
- var lvSidemode;
- window.lvSidemode = 1;
- }
- function feedbugback() { //make a dirty joke here
- lvCloseDiv.style.height = '100px';
- lvFB = document.createElement('div');
- lvFB.innerHTML = '[feedback]';
- lvFB.style.height = '50px';
- lvFB.style.width = '300%';
- lvFB.style.borderRadius = '100px';
- lvFB.style.backgroundColor = 'brown';
- lvFB.style.cursor = 'pointer';
- lvFB.style.textAlign = 'right';
- lvFB.style.width = '100%';
- lvFB.style.textDecoration = 'underline';
- lvFB.onclick = function() {
- window.open('https://github.com/doomred/localav/issues', 'FEED_ME_BUG');
- };
- lvDiv.appendChild(lvFB);
- }
- /* HTML5 drag & drop element
- * Modified via http://jsfiddle.net/robertc/kKuqH/
- * More info https://stackoverflow.com/questions/6230834/html5-drag-and-drop-anywhere-on-the-screen */
- function drag_start(event) {
- var style = window.getComputedStyle(event.target, null);
- event.dataTransfer.setData("text/plain",
- parseInt(style.getPropertyValue("left"),10) + ',' + parseInt(event.clientX) + ',' +
- parseInt(style.getPropertyValue("bottom"),10) + ',' + parseInt(event.clientY));
- }
- function drag_over(event) {
- event.preventDefault();
- return false;
- }
- function drop(event) {
- var offset = event.dataTransfer.getData("text/plain").split(',');
- var dg = document.getElementById('lv-box');
- var dgRel = document.getElementById('lv-topbar');
- dg.style.left = (event.clientX + parseInt(offset[0],10) - parseInt(offset[1],10)) + 'px';
- dg.style.bottom = (-event.clientY + parseInt(offset[2],10) + parseInt(offset[3],10)) + 'px';
- if(window.lvSidemode) {
- dgRel.style.left = (event.clientX + parseInt(offset[0],10) - parseInt(offset[1],10)) + 'px';
- dgRel.style.top = (event.clientY + parseInt(dgRel.style.top,10) - parseInt(offset[3],10)) + 'px';
- } else {
- GM_setValue('gm_lv_left', dg.style.left);
- GM_setValue('gm_lv_bt', dg.style.bottom);
- }
- event.preventDefault();
- return false;
- }
- if(document.getElementById('lv_' + (lvTarget.length - 1))) {
- }
- function checkload() {
- // 'use strict';
- if(document.getElementById('lv_' + (lvTarget.length - 1))) { //sidebar mode on, rewrite lvCloseDiv style
- document.getElementById('lv-box').style.display = 'block';
- document.getElementById('lv-box').addEventListener('dragstart',drag_start,false);
- document.body.addEventListener('dragover',drag_over,false);
- document.body.addEventListener('drop',drop,false);
- if(window.lvSidemode) {
- lvCloseDiv = window.top.document.getElementById('lv-topbar');
- lvDiv = window.top.document.getElementById('lv-box');
- lvDiv.style.position = 'fixed';
- lvDiv.style.left = lvDiv.style.bottom = 0;
- lvDiv.style.height = '100%';
- lvDiv.style.overflowY = 'scroll';
- lvCloseDiv.style.position = 'fixed';
- lvCloseDiv.style.left = lvCloseDiv.style.top = 0;
- }
- if(lvEasterEgg) {feedbugback()}
- } else {
- window.setTimeout(checkload, 500); //api load
- }
- }
- window.setTimeout(checkload, 500);