This commit is contained in:
aiden 2022-12-19 00:56:22 +08:00
parent aa5bc1b1f0
commit 172efb861b
2 changed files with 29 additions and 47 deletions

View File

@ -10,7 +10,6 @@ export const component = defineComponentMetadata({
displayName: '批量导入合集', displayName: '批量导入合集',
tags: [componentsTags.utils], tags: [componentsTags.utils],
entry: realEntry, entry: realEntry,
enabledByDefault: true,
description: { description: {
'zh-CN': '在合集页面制作一个批量导入按钮,可以新增所有合集内视频至同名收藏夹', 'zh-CN': '在合集页面制作一个批量导入按钮,可以新增所有合集内视频至同名收藏夹',
}, },

View File

@ -1,46 +1,29 @@
import progress from './progress.vue' import Progress from './Progress.vue'
import { mountVueComponent } from '@/core/utils' import { mountVueComponent, getCsrf, delay } from '@/core/utils'
import { sq } from '@/core/spin-query'
export const realEntry = async () => { export const realEntry = async () => {
// 模仿python中的time.sleep
const sleep = timeout =>
new Promise(resolve => {
setTimeout(resolve, timeout)
})
const url = new URL(window.location.href) const url = new URL(window.location.href)
// 合集id // 合集id
const sid = url.searchParams.get('sid') const sid = url.searchParams.get('sid')
// 合集作者 // 合集作者
const uid = url.pathname.split('/')[1] const uid = url.pathname.split('/')[1]
// 合集名 // 合集名
let series_name = '' let seriesName = ''
while (true) { seriesName = await sq(
series_name = document.getElementsByClassName('item cur')[0].innerHTML () => document.getElementsByClassName('item cur')[0].innerHTML,
if (series_name !== '') { t => t !== '',
break {
} else { queryInterval: 500,
await sleep(500) },
} )
}
const get_cookie = name => {
const cookies = document.cookie.split(';')
for (let i = 0; i < cookies.length; i++) {
const cookie = cookies[i].split('=')
cookie[0] = cookie[0].trim()
if (cookie[0] === name) {
return cookie[1]
}
}
return ''
}
// 当前登录用户 我 的验证信息 // 当前登录用户 我 的验证信息
const csrf = get_cookie('bili_jct') const csrf = getCsrf()
// add a button // add a button
const page_head = document.getElementsByClassName('page-head')[0] const pageHead = document.getElementsByClassName('page-head')[0]
const rel = page_head.children[1] const rel = pageHead.children[1]
const button = document.createElement('a') const button = document.createElement('a')
// 什么离谱class名play打错了可还行 // 什么离谱class名play打错了可还行
button.className = 'paly-all-btn' button.className = 'paly-all-btn'
@ -51,17 +34,17 @@ export const realEntry = async () => {
text-align: center; text-align: center;
width: 65px; width: 65px;
` `
page_head.insertBefore(button, rel) pageHead.insertBefore(button, rel)
button.onclick = async () => { button.onclick = async () => {
// 获取合集所有视频 // 获取合集所有视频
const series_videos = ( const seriesVideos = (
await fetch( await fetch(
`https://api.bilibili.com/x/series/archives?mid=${uid}&series_id=${sid}&only_normal=true&sort=desc&pn=1&ps=99999`, `https://api.bilibili.com/x/series/archives?mid=${uid}&series_id=${sid}&only_normal=true&sort=desc&pn=1&ps=99999`,
).then(r => r.json()) ).then(r => r.json())
).data.archives ).data.archives
let fav_id = 0 let favId = 0
// 创建收藏夹获取新收藏夹id // 创建收藏夹获取新收藏夹id
while (true) { while (true) {
const response = await fetch('https://api.bilibili.com/x/v3/fav/folder/add', { const response = await fetch('https://api.bilibili.com/x/v3/fav/folder/add', {
@ -70,40 +53,40 @@ export const realEntry = async () => {
headers: { headers: {
'Content-Type': 'application/x-www-form-urlencoded', 'Content-Type': 'application/x-www-form-urlencoded',
}, },
body: `title=${series_name}&csrf=${csrf}&privacy=0`, body: `title=${seriesName}&csrf=${csrf}&privacy=0`,
}).then(r => r.json()) }).then(r => r.json())
if (response.code === 0) { if (response.code === 0) {
fav_id = response.data.id favId = response.data.id
break break
} else { } else {
await sleep(2000) await delay(2000)
} }
} }
// 挂载弹出框 // 挂载弹出框
const mount_point = document.createElement('div') const mountPoint = document.createElement('div')
document.getElementsByTagName('body')[0].appendChild(mount_point) document.getElementsByTagName('body')[0].appendChild(mountPoint)
type progressSetting = Vue & { type ProgressSetting = Vue & {
isDisabled: boolean isDisabled: boolean
all: number all: number
handled: number handled: number
} }
const p: progressSetting = mountVueComponent(progress, mount_point) const p: ProgressSetting = mountVueComponent(Progress, mountPoint)
p.all = series_videos.length p.all = seriesVideos.length
for (let i = 0; i < series_videos.length; i++) { for (let i = 0; i < seriesVideos.length; i++) {
// 添加每一个视频至收藏夹 // 添加每一个视频至收藏夹
while (true) { while (true) {
// 做个延迟,防止太快而遭服务器拒绝 // 做个延迟,防止太快而遭服务器拒绝
await sleep(500) await delay(500)
const response = await fetch('https://api.bilibili.com/x/v3/fav/resource/deal', { const response = await fetch('https://api.bilibili.com/x/v3/fav/resource/deal', {
method: 'POST', method: 'POST',
credentials: 'include', credentials: 'include',
headers: { headers: {
'Content-Type': 'application/x-www-form-urlencoded', 'Content-Type': 'application/x-www-form-urlencoded',
}, },
body: `rid=${series_videos[i].aid}&add_media_ids=${fav_id}&type=2&csrf=${csrf}`, body: `rid=${seriesVideos[i].aid}&add_media_ids=${favId}&type=2&csrf=${csrf}`,
}).then(r => r.json()) }).then(r => r.json())
if (response.code === 0) { if (response.code === 0) {
@ -112,7 +95,7 @@ export const realEntry = async () => {
break break
} else { } else {
// 如果请求失败等待2s后重试 // 如果请求失败等待2s后重试
await sleep(2000) await delay(2000)
} }
} }
} }