@@ -4,74 +4,63 @@ import {VideoExtractor} from "./videoExtractor";
4
4
import { ObjectUtils } from "../objectUtils" ;
5
5
import { UrlUtils } from "../urlUtils" ;
6
6
7
- export class YoutubeVideoExtractor implements VideoExtractor {
7
+ export class YoutubeVideoExtractor extends VideoExtractor {
8
8
private youTubeWatchVideoBaseUrl = "https://www.youtube.com/watch" ;
9
9
private youTubeVideoIdQueryKey = "v" ;
10
10
private dataOriginalSrcAttribute = "data-original-src" ;
11
11
12
- /**
13
- * Return the ID of the video in the YouTube URL as an array
14
- */
15
- public getVideoIds ( youTubeUrl : string , pageContent : string ) : string [ ] {
16
- if ( ObjectUtils . isNullOrUndefined ( youTubeUrl ) ) {
17
- return ;
12
+ public createEmbeddedVideosFromHtml ( html : string ) : HTMLIFrameElement [ ] {
13
+ if ( ! html ) {
14
+ return [ ] ;
18
15
}
19
16
20
- let youTubeId : string ;
21
- if ( UrlUtils . getPathname ( youTubeUrl ) . indexOf ( "/watch" ) === 0 ) {
22
- youTubeId = UrlUtils . getQueryValue ( youTubeUrl , this . youTubeVideoIdQueryKey ) ;
23
- if ( ObjectUtils . isNullOrUndefined ( youTubeId ) ) {
24
- return ;
25
- }
26
- }
17
+ let divContainer = document . createElement ( "div" ) as HTMLDivElement ;
18
+ divContainer . innerHTML = html ;
19
+ let allIframes = divContainer . getElementsByTagName ( "iframe" ) as HTMLCollectionOf < HTMLIFrameElement > ;
27
20
28
- if ( UrlUtils . getPathname ( youTubeUrl ) . indexOf ( "/embed" ) === 0 ) {
29
- let youTubeIdMatch = youTubeUrl . match ( / y o u t u b e \. c o m \/ e m b e d \/ ( \S + ) / ) ;
30
- if ( ObjectUtils . isNullOrUndefined ( youTubeIdMatch ) || ObjectUtils . isNullOrUndefined ( youTubeIdMatch [ 1 ] ) ) {
31
- return ;
21
+ let videoEmbeds : HTMLIFrameElement [ ] = [ ] ;
22
+ for ( let i = 0 ; i < allIframes . length ; i ++ ) {
23
+ if ( this . isYoutubeUrl ( allIframes [ i ] . src ) ) {
24
+ let videoEmbed = this . createEmbeddedVideoFromUrl ( allIframes [ i ] . src ) ;
25
+ if ( videoEmbed ) {
26
+ videoEmbeds . push ( videoEmbed ) ;
27
+ }
32
28
}
33
- youTubeId = youTubeIdMatch [ 1 ] ;
34
- }
35
-
36
- if ( ObjectUtils . isNullOrUndefined ( youTubeId ) ) {
37
- return ;
38
29
}
30
+ return videoEmbeds ;
31
+ }
39
32
40
- // Ensure we remove query parameters
41
- return [ youTubeId . split ( "?" ) [ 0 ] ] ;
33
+ private isYoutubeUrl ( url : string ) : boolean {
34
+ return / [ ^ \w ] y o u t u b e \. c o m \/ w a t c h ( \? v = ( \w + ) | . * \& v = ( \w + ) ) / . test ( url ) || / [ ^ \w ] y o u t u b e \. c o m \/ e m b e d \/ ( \w + ) / . test ( url ) ;
42
35
}
43
36
44
- /**
45
- * Return valid iframe src attribute value for the supported YouTube domain
46
- */
47
- public getVideoSrcValues ( pageUrl : string , pageContent : string ) : string [ ] {
48
- if ( ObjectUtils . isNullOrUndefined ( pageUrl ) ) {
49
- return ;
37
+ public createEmbeddedVideoFromUrl ( url : string ) : HTMLIFrameElement {
38
+ if ( ! url ) {
39
+ return undefined ;
40
+ }
41
+
42
+ if ( UrlUtils . getPathname ( url ) . indexOf ( "/watch" ) === 0 ) {
43
+ return this . createEmbeddedVideoFromId ( UrlUtils . getQueryValue ( url , this . youTubeVideoIdQueryKey ) ) ;
50
44
}
51
45
52
- let youTubeVideoId = this . getVideoIds ( pageUrl , pageContent ) ;
53
- if ( ObjectUtils . isNullOrUndefined ( youTubeVideoId ) ) {
54
- return ;
46
+ if ( UrlUtils . getPathname ( url ) . indexOf ( "/embed" ) === 0 ) {
47
+ let youTubeIdMatch = url . match ( / y o u t u b e \. c o m \/ e m b e d \/ ( \S + ) / ) ;
48
+ return this . createEmbeddedVideoFromId ( youTubeIdMatch [ 1 ] ) ;
55
49
}
56
50
57
- return [ "https://www.youtube.com/embed/" + youTubeVideoId ] ;
51
+ return undefined ;
58
52
}
59
53
60
- /**
61
- * Create iframe in correct format for YouTube video embed in OneNote.
62
- * Supports a single video.
63
- */
64
- public createEmbeddedVideos ( pageUrl : string , pageContent : string ) : HTMLIFrameElement [ ] {
65
- let iframe = DomUtils . createEmbedVideoIframe ( ) ;
66
- let srcValue = this . getVideoSrcValues ( pageUrl , pageContent ) ;
67
- let videoId = this . getVideoIds ( pageUrl , pageContent ) [ 0 ] ;
68
- if ( ObjectUtils . isNullOrUndefined ( srcValue ) || ObjectUtils . isNullOrUndefined ( videoId ) ) {
69
- // fast fail: we expect all page urls passed into this function in prod to contain a video id
70
- throw new Error ( "YouTube page url does not contain video id" ) ;
54
+ public createEmbeddedVideoFromId ( id : string ) : HTMLIFrameElement {
55
+ if ( ! id ) {
56
+ return undefined ;
71
57
}
72
- iframe . src = srcValue [ 0 ] ;
73
- iframe . setAttribute ( this . dataOriginalSrcAttribute , UrlUtils . addUrlQueryValue ( this . youTubeWatchVideoBaseUrl , this . youTubeVideoIdQueryKey , videoId ) ) ;
74
58
75
- return [ iframe ] ;
59
+ let videoEmbed = DomUtils . createEmbedVideoIframe ( ) ;
60
+ let src = "https://www.youtube.com/embed/" + id ;
61
+ videoEmbed . src = src ;
62
+ let dataOriginalSrc = UrlUtils . addUrlQueryValue ( this . youTubeWatchVideoBaseUrl , this . youTubeVideoIdQueryKey , id ) ;
63
+ videoEmbed . setAttribute ( this . dataOriginalSrcAttribute , dataOriginalSrc ) ;
64
+ return videoEmbed ;
76
65
}
77
66
}
0 commit comments