Move fetching of the sponsorblock segments out of the store (#2684)
This commit is contained in:
		
							parent
							
								
									9888005c91
								
							
						
					
					
						commit
						0f2fe16583
					
				|  | @ -13,6 +13,7 @@ import 'videojs-contrib-quality-levels' | ||||||
| import 'videojs-http-source-selector' | import 'videojs-http-source-selector' | ||||||
| 
 | 
 | ||||||
| import { IpcChannels } from '../../../constants' | import { IpcChannels } from '../../../constants' | ||||||
|  | import { sponsorBlockSkipSegments } from '../../helpers/sponsorblock' | ||||||
| 
 | 
 | ||||||
| export default Vue.extend({ | export default Vue.extend({ | ||||||
|   name: 'FtVideoPlayer', |   name: 'FtVideoPlayer', | ||||||
|  | @ -547,32 +548,30 @@ export default Vue.extend({ | ||||||
|     }, |     }, | ||||||
| 
 | 
 | ||||||
|     initializeSponsorBlock() { |     initializeSponsorBlock() { | ||||||
|       this.sponsorBlockSkipSegments({ |       sponsorBlockSkipSegments(this.videoId, this.sponsorSkips.seekBar) | ||||||
|         videoId: this.videoId, |         .then((skipSegments) => { | ||||||
|         categories: this.sponsorSkips.seekBar |           if (skipSegments.length === 0) { | ||||||
|       }).then((skipSegments) => { |             return | ||||||
|         if (skipSegments.length === 0) { |           } | ||||||
|           return |  | ||||||
|         } |  | ||||||
| 
 | 
 | ||||||
|         this.player.ready(() => { |           this.player.ready(() => { | ||||||
|           this.player.on('timeupdate', () => { |             this.player.on('timeupdate', () => { | ||||||
|             this.skipSponsorBlocks(skipSegments) |               this.skipSponsorBlocks(skipSegments) | ||||||
|           }) |             }) | ||||||
| 
 | 
 | ||||||
|           skipSegments.forEach(({ |             skipSegments.forEach(({ | ||||||
|             category, |               category, | ||||||
|             segment: [startTime, endTime] |               segment: [startTime, endTime] | ||||||
|           }) => { |             }) => { | ||||||
|             this.addSponsorBlockMarker({ |               this.addSponsorBlockMarker({ | ||||||
|               time: startTime, |                 time: startTime, | ||||||
|               duration: endTime - startTime, |                 duration: endTime - startTime, | ||||||
|               color: 'var(--primary-color)', |                 color: 'var(--primary-color)', | ||||||
|               category: category |                 category: category | ||||||
|  |               }) | ||||||
|             }) |             }) | ||||||
|           }) |           }) | ||||||
|         }) |         }) | ||||||
|       }) |  | ||||||
|     }, |     }, | ||||||
| 
 | 
 | ||||||
|     skipSponsorBlocks(skipSegments) { |     skipSponsorBlocks(skipSegments) { | ||||||
|  | @ -1927,7 +1926,6 @@ export default Vue.extend({ | ||||||
|       'calculateColorLuminance', |       'calculateColorLuminance', | ||||||
|       'updateDefaultCaptionSettings', |       'updateDefaultCaptionSettings', | ||||||
|       'showToast', |       'showToast', | ||||||
|       'sponsorBlockSkipSegments', |  | ||||||
|       'parseScreenshotCustomFileName', |       'parseScreenshotCustomFileName', | ||||||
|       'updateScreenshotFolderPath', |       'updateScreenshotFolderPath', | ||||||
|       'getPicturesPath', |       'getPicturesPath', | ||||||
|  |  | ||||||
|  | @ -0,0 +1,32 @@ | ||||||
|  | import store from '../store/index' | ||||||
|  | 
 | ||||||
|  | export async function sponsorBlockSkipSegments(videoId, categories) { | ||||||
|  |   const videoIdBuffer = new TextEncoder().encode(videoId) | ||||||
|  | 
 | ||||||
|  |   const hashBuffer = await crypto.subtle.digest('SHA-256', videoIdBuffer) | ||||||
|  |   const hashArray = Array.from(new Uint8Array(hashBuffer)) | ||||||
|  | 
 | ||||||
|  |   const videoIdHashPrefix = hashArray | ||||||
|  |     .map(byte => byte.toString(16).padStart(2, '0')) | ||||||
|  |     .slice(0, 4) | ||||||
|  |     .join('') | ||||||
|  | 
 | ||||||
|  |   const requestUrl = `${store.getters.getSponsorBlockUrl}/api/skipSegments/${videoIdHashPrefix}?categories=${JSON.stringify(categories)}` | ||||||
|  | 
 | ||||||
|  |   try { | ||||||
|  |     const response = await fetch(requestUrl) | ||||||
|  | 
 | ||||||
|  |     // 404 means that there are no segments registered for the video
 | ||||||
|  |     if (response.status === 404) { | ||||||
|  |       return [] | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     const json = await response.json() | ||||||
|  |     return json | ||||||
|  |       .filter((result) => result.videoID === videoId) | ||||||
|  |       .flatMap((result) => result.segments) | ||||||
|  |   } catch (error) { | ||||||
|  |     console.error('failed to fetch SponsorBlock segments', requestUrl, error) | ||||||
|  |     throw error | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | @ -1,55 +0,0 @@ | ||||||
| const state = {} |  | ||||||
| const getters = {} |  | ||||||
| 
 |  | ||||||
| const actions = { |  | ||||||
|   sponsorBlockSkipSegments ({ rootState }, { videoId, categories }) { |  | ||||||
|     return new Promise((resolve, reject) => { |  | ||||||
|       const videoIdBuffer = new TextEncoder().encode(videoId) |  | ||||||
| 
 |  | ||||||
|       crypto.subtle.digest('SHA-256', videoIdBuffer).then((hashBuffer) => { |  | ||||||
|         const hashArray = Array.from(new Uint8Array(hashBuffer)) |  | ||||||
| 
 |  | ||||||
|         const videoIdHashPrefix = hashArray |  | ||||||
|           .map(byte => byte.toString(16).padStart(2, '0')) |  | ||||||
|           .slice(0, 4) |  | ||||||
|           .join('') |  | ||||||
| 
 |  | ||||||
|         const requestUrl = `${rootState.settings.sponsorBlockUrl}/api/skipSegments/${videoIdHashPrefix}?categories=${JSON.stringify(categories)}` |  | ||||||
| 
 |  | ||||||
|         fetch(requestUrl) |  | ||||||
|           .then((response) => { |  | ||||||
|             // 404 means that there are no segments registered for the video
 |  | ||||||
|             if (response.status === 404) { |  | ||||||
|               resolve([]) |  | ||||||
|               return |  | ||||||
|             } |  | ||||||
| 
 |  | ||||||
|             response.json() |  | ||||||
|               .then((json) => { |  | ||||||
|                 const segments = json |  | ||||||
|                   .filter((result) => result.videoID === videoId) |  | ||||||
|                   .flatMap((result) => result.segments) |  | ||||||
|                 resolve(segments) |  | ||||||
|               }) |  | ||||||
|               .catch((error) => { |  | ||||||
|                 console.error('failed to fetch SponsorBlock segments', requestUrl, error) |  | ||||||
|                 reject(error) |  | ||||||
|               }) |  | ||||||
|           }) |  | ||||||
|           .catch((error) => { |  | ||||||
|             console.error('failed to fetch SponsorBlock segments', requestUrl, error) |  | ||||||
|             reject(error) |  | ||||||
|           }) |  | ||||||
|       }) |  | ||||||
|     }) |  | ||||||
|   } |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| const mutations = {} |  | ||||||
| 
 |  | ||||||
| export default { |  | ||||||
|   state, |  | ||||||
|   getters, |  | ||||||
|   actions, |  | ||||||
|   mutations |  | ||||||
| } |  | ||||||
		Loading…
	
		Reference in New Issue