Fix quality bugs

This commit is contained in:
the1812 2020-03-21 23:15:00 +08:00
parent 5ff60bd1bc
commit 5d79a7cf39
12 changed files with 37 additions and 32 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -12,7 +12,7 @@
"auto-draw.min.js": "AE72CF2623DF2D15AD4AF82D125FFAF7EF5B1E6B36D9E9AC646AC98AA6AA8698", "auto-draw.min.js": "AE72CF2623DF2D15AD4AF82D125FFAF7EF5B1E6B36D9E9AC646AC98AA6AA8698",
"auto-play.min.js": "DC9938AC15DADDC9D88DCA0C9BE64BE142C37D32CB85E42E23DAB2A7378531E5", "auto-play.min.js": "DC9938AC15DADDC9D88DCA0C9BE64BE142C37D32CB85E42E23DAB2A7378531E5",
"bangumi-timeline.vue.min.js": "753B8C96AFB3E6AC4C9507576D12B6CBB207BC1CC3FE5885C419E99C65BCD547", "bangumi-timeline.vue.min.js": "753B8C96AFB3E6AC4C9507576D12B6CBB207BC1CC3FE5885C419E99C65BCD547",
"batch-download.min.js": "44F0F3C9CFC0DD3B841A0CA24F506918E8F8AB44ABEED43D03464B3BC88CCD40", "batch-download.min.js": "A93E6C2030A9C80D8B9187A47D6B19A74BCF93F34C614C96F76F725D5DE0FB0C",
"biliplus-redirect.min.js": "9882D14DAC5C103212A101A5168883C41B4B3B2737FD5F222DC343D0304FF8AF", "biliplus-redirect.min.js": "9882D14DAC5C103212A101A5168883C41B4B3B2737FD5F222DC343D0304FF8AF",
"blackboard.min.js": "8BB9CCDE72302AE7DE39D66F9231EFB82BA27DDA799BA4AAAC06F6DE802661BF", "blackboard.min.js": "8BB9CCDE72302AE7DE39D66F9231EFB82BA27DDA799BA4AAAC06F6DE802661BF",
"blackboard.vue.min.js": "84A30D5A6F322A3C083FC1100E9FF51233ECD08AFBD89A6449AD2388ACCC8522", "blackboard.vue.min.js": "84A30D5A6F322A3C083FC1100E9FF51233ECD08AFBD89A6449AD2388ACCC8522",
@ -71,7 +71,7 @@
"download-subtitle.min.js": "4B99A00FEEA40C6D577AC8BD8DFFD34D91B75E150C7848B965D58B0096DF762C", "download-subtitle.min.js": "4B99A00FEEA40C6D577AC8BD8DFFD34D91B75E150C7848B965D58B0096DF762C",
"download-video.min.css": "8B68CCDADACC3D84BC1AC661C3E46CD3EBEB657CC89F244B05D756B0ECF4069C", "download-video.min.css": "8B68CCDADACC3D84BC1AC661C3E46CD3EBEB657CC89F244B05D756B0ECF4069C",
"download-video.min.html": "D5542056B00352B37B9BAF05D823832B477FD10E8F6C179A02A4B1ADBB6F0761", "download-video.min.html": "D5542056B00352B37B9BAF05D823832B477FD10E8F6C179A02A4B1ADBB6F0761",
"download-video.min.js": "A4356AF7EF2EE2298377673D134656D9D989E268002128B0D2B8B2AB47BE44B7", "download-video.min.js": "17E76FB8966626D13C0AF0547C91AA94539697BFB52EF0A290C65C7BC730B250",
"download-video-package.min.js": "B10FF11DE7DFBACEC38F195B8E836511E527215B5E177CB1D223D14F30EB1435", "download-video-package.min.js": "B10FF11DE7DFBACEC38F195B8E836511E527215B5E177CB1D223D14F30EB1435",
"dpi-img.vue.min.js": "11DF7577B754D8C01E8331E4FDAC9494E72523099845A0D6B0D897849CD841D6", "dpi-img.vue.min.js": "11DF7577B754D8C01E8331E4FDAC9494E72523099845A0D6B0D897849CD841D6",
"expand-danmaku.min.js": "B21658C40085AEA8DC49652AE62EB8610BB2EBEAF7A9C9AF69EF3B11E08EEC8D", "expand-danmaku.min.js": "B21658C40085AEA8DC49652AE62EB8610BB2EBEAF7A9C9AF69EF3B11E08EEC8D",
@ -212,7 +212,7 @@
"v-dropdown.vue.min.js": "DE6DF6A2081FEE6AB802A355FEC5FF87B7FDE054BC01AB145379DB6634A83133", "v-dropdown.vue.min.js": "DE6DF6A2081FEE6AB802A355FEC5FF87B7FDE054BC01AB145379DB6634A83133",
"video-card.vue.min.js": "C335B564D4D625D4AE26D15A4031898479EEE81A84AB43A7D4D8D144C32B5D6F", "video-card.vue.min.js": "C335B564D4D625D4AE26D15A4031898479EEE81A84AB43A7D4D8D144C32B5D6F",
"video-card-info.min.js": "13B755C0EE0CA018AE65251E168BAF3395FEA2EB4FAD6949AADD752F61B8819B", "video-card-info.min.js": "13B755C0EE0CA018AE65251E168BAF3395FEA2EB4FAD6949AADD752F61B8819B",
"video-dash.min.js": "010621860893DE3E324090F01CCDE542B6AE7F2115F44D76A634C9D541980BBA", "video-dash.min.js": "8F657BDA87B5DE18F8978B02B311F491F9D23302DB0E38C5A62CA1BCB5F56726",
"video-downloader-fragment.min.js": "13B755C0EE0CA018AE65251E168BAF3395FEA2EB4FAD6949AADD752F61B8819B", "video-downloader-fragment.min.js": "13B755C0EE0CA018AE65251E168BAF3395FEA2EB4FAD6949AADD752F61B8819B",
"video-info.min.js": "EDF4176D830A516FBE476576B1944E09997309A543233DDF298FF23213B08CFC", "video-info.min.js": "EDF4176D830A516FBE476576B1944E09997309A543233DDF298FF23213B08CFC",
"video-list.vue.min.js": "9B0FB6AC3D3CD8D0250CBBC787D5BE823C46216CD71B9E8DCAC75AFE1BE5A9EA", "video-list.vue.min.js": "9B0FB6AC3D3CD8D0250CBBC787D5BE823C46216CD71B9E8DCAC75AFE1BE5A9EA",

Binary file not shown.

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
(()=>{return(t,e)=>{const a=t=>{return{url:t.downloadUrl,backupUrls:t.backupUrls,length:t.duration,size:Math.trunc(t.bandWidth*t.duration/8)}};const r=e=>{console.log(e.videoDashes);const r=(()=>{const a=e=>e.videoCodec===t.downloadVideoDashCodec;if(e.videoDashes.some(a)){return e.videoDashes.filter(a).sort(ascendingSort(t=>t.bandWidth))[0]}else{return e.videoDashes.sort(ascendingSort(t=>t.bandWidth))[0]}})();const o=e.audioDashes.sort(descendingSort(t=>t.bandWidth))[0];return[a(r),a(o)]};const o=async(t,a)=>{const r=await Ajax.getJsonWithCredentials(t);const o=r.data||r.result||r;if(r.code!==0||!o.dash){throw new Error("DASH api failed")}const d=o.accept_quality;if(!d.includes(a)){throw new Error("没有找到请求的清晰度")}if(o.quality!==a){const{throwQualityError:t}=await e.importAsync("quality-errors");t(a)}const s=o.accept_description;const c=s[d.indexOf(a)];const n=o.dash.duration;const i=o.dash.video.filter(t=>t.id===a).map(t=>{const e=(()=>{switch(t.codecid){case 12:return"HEVC/H.265";default:case 7:return"AVC/H.264"}})();const r={quality:a,qualityText:c,width:t.width,height:t.height,codecs:t.codecs,codecId:t.codecid,bandWidth:t.bandwidth,frameRate:t.frameRate,backupUrls:(t.backupUrl||t.backup_url||[]).forEach(t=>t.replace("http:","https:")),downloadUrl:(t.baseUrl||t.base_url||"").replace("http:","https:"),duration:n,videoCodec:e};return r});const h=o.dash.audio.map(t=>{return{bandWidth:t.bandwidth,codecs:t.codecs,codecId:t.codecid,backupUrls:(t.backupUrl||t.backup_url||[]).forEach(t=>t.replace("http:","https:")),downloadUrl:(t.baseUrl||t.base_url||"").replace("http:","https:"),duration:n}});return{videoDashes:i,audioDashes:h}};return{export:{getDashInfo:o,dashToFragments:r}}}})(); (()=>{return(t,e)=>{const a=t=>{return{url:t.downloadUrl,backupUrls:t.backupUrls,length:t.duration,size:Math.trunc(t.bandWidth*t.duration/8)}};const r=e=>{console.log(e.videoDashes);const r=(()=>{const a=e=>e.videoCodec===t.downloadVideoDashCodec;if(e.videoDashes.some(a)){return e.videoDashes.filter(a).sort(ascendingSort(t=>t.bandWidth))[0]}else{return e.videoDashes.sort(ascendingSort(t=>t.bandWidth))[0]}})();const o=e.audioDashes.sort(descendingSort(t=>t.bandWidth))[0];return[a(r),a(o)]};const o=async(t,a,r=false)=>{const o=await Ajax.getJsonWithCredentials(t);const d=o.data||o.result||o;if(o.code!==0||!d.dash){throw new Error("DASH api failed")}const s=d.accept_quality;if(!s.includes(a)&&!r){throw new Error("没有找到请求的清晰度")}if(d.quality!==a&&!r){const{throwQualityError:t}=await e.importAsync("quality-errors");t(a)}const c=d.accept_description;const n=c[s.indexOf(a)];const i=d.dash.duration;const h=d.dash.video.filter(t=>t.id===(r?d.quality:a)).map(t=>{const e=(()=>{switch(t.codecid){case 12:return"HEVC/H.265";default:case 7:return"AVC/H.264"}})();const r={quality:a,qualityText:n,width:t.width,height:t.height,codecs:t.codecs,codecId:t.codecid,bandWidth:t.bandwidth,frameRate:t.frameRate,backupUrls:(t.backupUrl||t.backup_url||[]).forEach(t=>t.replace("http:","https:")),downloadUrl:(t.baseUrl||t.base_url||"").replace("http:","https:"),duration:i,videoCodec:e};return r});const l=d.dash.audio.map(t=>{return{bandWidth:t.bandwidth,codecs:t.codecs,codecId:t.codecid,backupUrls:(t.backupUrl||t.backup_url||[]).forEach(t=>t.replace("http:","https:")),downloadUrl:(t.baseUrl||t.base_url||"").replace("http:","https:"),duration:i}});return{videoDashes:h,audioDashes:l}};return{export:{getDashInfo:o,dashToFragments:r}}}})();

View File

@ -163,7 +163,7 @@ class VideoEpisodeBatch extends Batch {
}) })
} else { } else {
const { getDashInfo, dashToFragments } = await import('./video-dash') const { getDashInfo, dashToFragments } = await import('./video-dash')
const info = await getDashInfo(url, typeof quality === 'string' ? parseInt(quality) : quality) const info = await getDashInfo(url, typeof quality === 'string' ? parseInt(quality) : quality, true)
fragments = dashToFragments(info) fragments = dashToFragments(info)
} }
result.push({ result.push({

View File

@ -784,13 +784,18 @@ async function loadPanel() {
throw error throw error
} }
}, },
getManualFormat() {
let format: VideoFormat | undefined
format = allFormats.find(f => f.displayName === this.manualQualityModel.value)
if (!format) {
console.error(`No format found. model value = ${this.manualQualityModel.value}`)
return null
}
return format
},
getFormat() { getFormat() {
let format: VideoFormat | undefined let format: VideoFormat | undefined
if (this.selectedTab.name === 'manual') { format = formats.find(f => f.displayName === this.qualityModel.value)
format = allFormats.find(f => f.displayName === this.manualQualityModel.value)
} else {
format = formats.find(f => f.displayName === this.qualityModel.value)
}
if (!format) { if (!format) {
console.error(`No format found. model value = ${this.qualityModel.value}`) console.error(`No format found. model value = ${this.qualityModel.value}`)
return null return null
@ -1003,7 +1008,7 @@ async function loadPanel() {
switch (type) { switch (type) {
default: default:
case 'aria2': { case 'aria2': {
const result = await batch.collectAria2(this.getFormat().quality, false) as string const result = await batch.collectAria2(this.getManualFormat().quality, false) as string
await DownloadVideoPackage.single( await DownloadVideoPackage.single(
'manual-exports.txt', 'manual-exports.txt',
new Blob([result], { type: 'text/plain' }), new Blob([result], { type: 'text/plain' }),
@ -1012,7 +1017,7 @@ async function loadPanel() {
break break
} }
case 'aria2RPC': { case 'aria2RPC': {
await batch.collectAria2(this.getFormat().quality, true) await batch.collectAria2(this.getManualFormat().quality, true)
Toast.success(`成功发送了批量请求.`, 'aria2 RPC', 3000) Toast.success(`成功发送了批量请求.`, 'aria2 RPC', 3000)
break break
} }

View File

@ -41,17 +41,17 @@ export const dashToFragments = (dashes: { videoDashes: VideoDash[], audioDashes:
const audio = dashes.audioDashes.sort(descendingSort(d => d.bandWidth))[0] const audio = dashes.audioDashes.sort(descendingSort(d => d.bandWidth))[0]
return [dashToFragment(video), dashToFragment(audio)] return [dashToFragment(video), dashToFragment(audio)]
} }
export const getDashInfo = async (api: string, quality: number) => { export const getDashInfo = async (api: string, quality: number, allowLowerQuality = false) => {
const json = await Ajax.getJsonWithCredentials(api) const json = await Ajax.getJsonWithCredentials(api)
const data = json.data || json.result || json const data = json.data || json.result || json
if (json.code !== 0 || !data.dash) { if (json.code !== 0 || !data.dash) {
throw new Error('DASH api failed') throw new Error('DASH api failed')
} }
const qualities = data.accept_quality as number[] const qualities = data.accept_quality as number[]
if (!qualities.includes(quality)) { if (!qualities.includes(quality) && !allowLowerQuality) {
throw new Error('没有找到请求的清晰度') throw new Error('没有找到请求的清晰度')
} }
if (data.quality !== quality) { if (data.quality !== quality && !allowLowerQuality) {
const { throwQualityError } = await import('./quality-errors') const { throwQualityError } = await import('./quality-errors')
throwQualityError(quality) throwQualityError(quality)
} }
@ -59,7 +59,7 @@ export const getDashInfo = async (api: string, quality: number) => {
const qualityText = qualityTexts[qualities.indexOf(quality)] const qualityText = qualityTexts[qualities.indexOf(quality)]
const duration = data.dash.duration const duration = data.dash.duration
const videoDashes: VideoDash[] = data.dash.video const videoDashes: VideoDash[] = data.dash.video
.filter((d: any) => d.id === quality) .filter((d: any) => d.id === (allowLowerQuality ? data.quality : quality))
.map((d: any) => { .map((d: any) => {
const videoCodec: DashCodec = (() => { const videoCodec: DashCodec = (() => {
switch (d.codecid) { switch (d.codecid) {