Fix bugs in batch download entry

This commit is contained in:
the1812 2019-05-04 22:43:06 +08:00
parent d6011f7f42
commit 01fc575706
6 changed files with 87 additions and 19 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
(()=>{return(t,c)=>{class a{static test(){return document.URL.includes("/www.bilibili.com/bangumi")}async collectData(){return`{x:"test"}`}}const e=[a];class n{async collectData(){const t=new(e.find(t=>t.test()));return await t.collectData()}}return{export:{BatchExtractor:n}}}})();
(()=>{return(t,e)=>{class s{static test(){return document.URL.includes("/www.bilibili.com/bangumi")}async collectData(t){const e=document.querySelector("meta[property='og:url']");if(e===null){Toast.error("获取番剧数据失败: 无法找到 Season ID","批量下载");return""}const s=e.getAttribute("content").match(/play\/ss(\d+)/)[1];if(s===undefined){Toast.error("获取番剧数据失败: 无法解析 Season ID","批量下载");return""}const i=await Ajax.getJson(`https://api.bilibili.com/pgc/web/season/section?season_id=${s}`);if(i.code!==0){Toast.error(`获取番剧数据失败: 无法获取番剧集数列表, message=${i.message}`,"批量下载");return""}const r=i.result.main_section.episodes.map(t=>{return{aid:t.aid,cid:t.cid,number:t.title,title:t.long_title}});const n=[];for(const e of r){const s=`https://api.bilibili.com/pgc/player/web/playurl?avid=${e.aid}&cid=${e.cid}&qn=${t}&otype=json`;const i=await Ajax.getJsonWithCredentials(s);const r=i.data||i.result||i;if(r.quality!==t){Toast.error("获取下载链接失败, 请确认当前账号有下载权限后重试.","批量下载");return""}const a=r.durl.map(t=>{return{length:t.length,size:t.size,url:t.url}});n.push({fragments:a,title:`${e.number} - ${e.title}`,totalSize:a.map(t=>t.size).reduce((t,e)=>t+e)})}return JSON.stringify(n)}}const i=[s];class r{async collectData(t,e){const s=new(i.find(t=>t.test()));const r=await s.collectData(t.quality);e.dismiss();return r}}return{export:{BatchExtractor:r}}}})();

File diff suppressed because one or more lines are too long

View File

@ -4,18 +4,67 @@ class BangumiBatch
{
return document.URL.includes("/www.bilibili.com/bangumi");
}
async collectData()
async collectData(quality)
{
return `{x:"test"}`;
const metaUrl = document.querySelector("meta[property='og:url']");
if (metaUrl === null)
{
Toast.error("获取番剧数据失败: 无法找到 Season ID", "批量下载");
return "";
}
const seasonId = metaUrl.getAttribute("content").match(/play\/ss(\d+)/)[1];
if (seasonId === undefined)
{
Toast.error("获取番剧数据失败: 无法解析 Season ID", "批量下载");
return "";
}
const json = await Ajax.getJson(`https://api.bilibili.com/pgc/web/season/section?season_id=${seasonId}`);
if (json.code !== 0)
{
Toast.error(`获取番剧数据失败: 无法获取番剧集数列表, message=${json.message}`, "批量下载");
return "";
}
const pages = json.result.main_section.episodes.map(it =>
{
return { aid: it.aid, cid: it.cid, number: it.title, title: it.long_title };
});
const result = [];
for (const page of pages)
{
const url = `https://api.bilibili.com/pgc/player/web/playurl?avid=${page.aid}&cid=${page.cid}&qn=${quality}&otype=json`;
const json = await Ajax.getJsonWithCredentials(url);
const data = json.data || json.result || json;
if (data.quality !== quality)
{
Toast.error("获取下载链接失败, 请确认当前账号有下载权限后重试.", "批量下载");
return "";
}
const fragments = data.durl.map(it =>
{
return {
length: it.length,
size: it.size,
url: it.url,
};
});
result.push({
fragments,
title: `${page.number} - ${page.title}`,
totalSize: fragments.map(it => it.size).reduce((acc, it) => acc + it),
});
}
return JSON.stringify(result);
}
}
const extractors = [BangumiBatch];
export class BatchExtractor
{
async collectData()
async collectData(format, toast)
{
const extractor = new (extractors.find(it => it.test()));
return await extractor.collectData();
const result = await extractor.collectData(format.quality);
toast.dismiss();
return result;
}
}
export default {

View File

@ -5,6 +5,7 @@ const pageData = {
aid: undefined,
cid: undefined,
};
let selectedFormat = null;
class Video
{
constructor()
@ -375,14 +376,33 @@ async function checkBatch()
document.getElementById("download-video").classList.add("batch");
document.getElementById("video-action-batch-data").addEventListener("click", async () =>
{
const data = await extractor.collectData();
if (!selectedFormat)
{
return;
}
pageData.entity.resetMenuClass();
const toast = Toast.info("获取链接中...", "批量下载");
const data = await extractor.collectData(selectedFormat, toast);
if (!data)
{
return;
}
GM_setClipboard(data, { type: "text/json" });
Toast.success("已复制批量数据到剪贴板.", "复制批量数据", 3000);
pageData.entity.resetMenuClass();
});
document.getElementById("video-action-batch-download-data").addEventListener("click", async () =>
{
const data = await extractor.collectData();
if (!selectedFormat)
{
return;
}
pageData.entity.resetMenuClass();
const toast = Toast.info("获取链接中...", "批量下载");
const data = await extractor.collectData(selectedFormat, toast);
if (!data)
{
return;
}
const a = document.createElement("a");
const blob = new Blob([data], { type: "text/json" });
@ -394,7 +414,6 @@ async function checkBatch()
a.remove();
URL.revokeObjectURL(url);
pageData.entity.resetMenuClass();
});
}
}
@ -417,7 +436,7 @@ async function loadPageData()
async function loadWidget()
{
let formats = await VideoFormat.availableFormats;
let [selectedFormat] = formats;
selectedFormat = formats[0];
const loadQualities = async () =>
{
await loadPageData();