1
1
import config from './config' ;
2
2
3
- import { video } from './element' ;
3
+ import { video , canvas } from './element' ;
4
4
import { insetLyricsBtn } from './btn' ;
5
5
import { sharedData } from './share-data' ;
6
6
7
+ let loginResolve : ( value ?: unknown ) => void ;
8
+ export const loggedPromise = new Promise ( res => ( loginResolve = res ) ) ;
9
+
7
10
const weakMap = new WeakMap < Element , MutationObserver > ( ) ;
8
11
9
- config . then ( ( { ALBUM_COVER_SELECTOR , TRACK_INFO_SELECTOR } ) => {
12
+ config . then ( ( { ALBUM_COVER_SELECTOR , TRACK_INFO_SELECTOR , LOGGED_MARK_SELECTOR } ) => {
10
13
let infoElement : Element | null = null ;
11
14
12
15
const checkElement = ( ) => {
16
+ if ( document . querySelector ( LOGGED_MARK_SELECTOR ) ) loginResolve ( ) ;
13
17
// https://github.com/mantou132/Spotify-Lyrics/issues/30
14
18
insetLyricsBtn ( ) ;
15
19
const prevInfoElement = infoElement ;
@@ -20,28 +24,26 @@ config.then(({ ALBUM_COVER_SELECTOR, TRACK_INFO_SELECTOR }) => {
20
24
if ( ! weakMap . has ( infoElement ) ) {
21
25
const cover = document . querySelector ( ALBUM_COVER_SELECTOR ) as HTMLImageElement ;
22
26
// https://developer.mozilla.org/en-US/docs/Web/HTML/CORS_enabled_image
27
+ // YouTube video has no cors
23
28
cover . crossOrigin = 'anonymous' ;
24
- const coverCanvas = document . createElement ( 'canvas' ) ;
25
- coverCanvas . width = video . width ;
26
- coverCanvas . height = video . height ;
27
- const ctx = coverCanvas . getContext ( '2d' ) ;
29
+ const ctx = canvas . getContext ( '2d' ) ;
28
30
if ( ! ctx ) return ;
29
- const stream = coverCanvas . captureStream ( ) ;
30
- video . srcObject = stream ;
31
31
// May load multiple times in a short time
32
32
// Need to remember the last cover image
33
33
let largeImage : HTMLImageElement ;
34
34
cover . addEventListener ( 'load' , ( ) => {
35
- const draw = ( ) => {
35
+ const drawSmallCover = ( ) => {
36
36
ctx . imageSmoothingEnabled = false ;
37
37
const blur = 10 ;
38
38
ctx . filter = `blur(${ blur } px)` ;
39
39
ctx . drawImage ( cover , - blur * 2 , - blur * 2 , video . width + 4 * blur , video . height + 4 * blur ) ;
40
40
} ;
41
41
// https://github.com/mantou132/Spotify-Lyrics/issues/26#issuecomment-638019333
42
42
const reg = / 0 0 0 0 4 8 5 1 (? = \w { 24 } $ ) / ;
43
- if ( ! reg . test ( cover . src ) ) {
44
- draw ( ) ;
43
+ if ( cover . naturalWidth >= 480 ) {
44
+ ctx . drawImage ( cover , 0 , 0 , video . width , video . height ) ;
45
+ } else if ( ! reg . test ( cover . src ) ) {
46
+ drawSmallCover ( ) ;
45
47
} else {
46
48
const largeUrl = cover . src . replace ( reg , '0000b273' ) ;
47
49
largeImage = new Image ( ) ;
@@ -51,10 +53,13 @@ config.then(({ ALBUM_COVER_SELECTOR, TRACK_INFO_SELECTOR }) => {
51
53
ctx . filter = `blur(0px)` ;
52
54
ctx . drawImage ( largeImage , 0 , 0 , video . width , video . height ) ;
53
55
} ) ;
54
- largeImage . addEventListener ( 'error' , draw ) ;
56
+ largeImage . addEventListener ( 'error' , drawSmallCover ) ;
55
57
largeImage . src = largeUrl ;
56
58
}
57
59
} ) ;
60
+ cover . addEventListener ( 'error' , ( ) => {
61
+ ctx . fillRect ( 0 , 0 , video . width , video . height ) ;
62
+ } ) ;
58
63
const infoEleObserver = new MutationObserver ( ( ) => {
59
64
sharedData . updateTrack ( ) ;
60
65
} ) ;
0 commit comments