@@ -18,28 +18,42 @@ This file is part of pywb, https://github.com/ikreymer/pywb
18
18
*/
19
19
20
20
// VidRw 1.0 -- video rewriting
21
+ //
22
+ //
23
+
24
+ var _pywbvid = "default" ;
25
+
26
+ var _pywb_yt_err = undefined ;
27
+
28
+ if ( window . location . hash ) {
29
+ var m = window . location . hash . match ( / _ p y w b v i d = ( [ \w ] + ) / ) ;
30
+ if ( m ) {
31
+ _pywbvid = m [ 1 ] ;
32
+ }
33
+
34
+ if ( _pywbvid == "html" || _pywbvid == "flash" ) {
35
+ var YT_W_E_RX = / ^ ( h t t p s ? : \/ \/ .* y o u t u b e .c o m ) \/ ( w a t c h | e m b e d ) .* $ / ;
36
+
37
+ if ( wbinfo . url . match ( YT_W_E_RX ) ) {
38
+ // special case: prevent yt player from being inited
39
+ Object . defineProperty ( window , 'yt' , { writeable : false } ) ;
40
+ Object . defineProperty ( window , 'ytplayer' , { writeable : false } ) ;
41
+ }
42
+ }
43
+ }
44
+
21
45
22
46
__wbvidrw = ( function ( ) {
23
47
24
48
var found_embeds = false ;
25
49
26
- var vid_type = "default" ;
27
-
28
50
var FLASH_PLAYER = wbinfo . static_prefix + "/flowplayer/flowplayer-3.2.18.swf" ;
29
51
30
52
function check_videos ( ) {
31
53
if ( found_embeds ) {
32
54
return ;
33
55
}
34
56
35
- // extract_typ
36
- if ( window . location . hash ) {
37
- var m = window . location . hash . match ( / _ p y w b v i d = ( [ \w ] + ) / ) ;
38
- if ( m ) {
39
- vid_type = m [ 1 ] ;
40
- }
41
- }
42
-
43
57
function handle_all_embeds ( ) {
44
58
var embeds = document . getElementsByTagName ( "embed" ) ;
45
59
@@ -61,10 +75,9 @@ __wbvidrw = (function() {
61
75
62
76
found_embeds = true ;
63
77
64
- handle_yt_videos ( vid_type ) ;
65
-
66
- //window.setInterval(handle_all_embeds, 1000);
78
+ handle_yt_videos ( _pywbvid ) ;
67
79
80
+ //window.setInterval(handle_all_embeds, 2000);
68
81
//_wb_wombat.add_tag_handler("embed", handle_all_embeds);
69
82
//_wb_wombat.add_tag_handler("object", handle_all_objects);
70
83
}
@@ -100,8 +113,8 @@ __wbvidrw = (function() {
100
113
return false ;
101
114
}
102
115
103
- for ( var j = 0 ; j < objects [ i ] . children . length ; j ++ ) {
104
- var child = objects [ i ] . children [ j ] ;
116
+ for ( var j = 0 ; j < elem . children . length ; j ++ ) {
117
+ var child = elem . children [ j ] ;
105
118
106
119
if ( child . tagName == "EMBED" ) {
107
120
return false ;
@@ -125,7 +138,7 @@ __wbvidrw = (function() {
125
138
126
139
elem . _vidrw = true ;
127
140
128
- check_replacement ( elem , src ) ;
141
+ check_replacement ( elem , obj_url ) ;
129
142
return true ;
130
143
}
131
144
@@ -136,41 +149,85 @@ __wbvidrw = (function() {
136
149
var YT_V_RX = / ^ ( h t t p s ? : \/ \/ .* y o u t u b e .c o m ) \/ v \/ ( [ ^ & ? ] + ) ( .* ) $ / ;
137
150
var VIMEO_RX = / ^ h t t p s ? : \/ \/ .* v i m e o .* c l i p _ i d = ( [ ^ & ] + ) / ;
138
151
139
-
140
- function handle_yt_videos ( vid_type )
152
+ function remove_yt ( )
141
153
{
142
- function do_yt_video_replace ( )
143
- {
144
- console . log ( "REPLACING YT: " + wbinfo . url ) ;
145
- ytvideo [ 0 ] . autoplay = false ;
146
- ytvideo [ 0 ] . preload = "none" ;
154
+ // yt special case
155
+ if ( window . yt && window . yt . player && window . yt . player . getPlayerByElement ) {
156
+ //yt.player.Application.create("player-api", ytplayer.config).dispose();
147
157
148
- var elem = ytvideo [ 0 ] ;
149
- // get ancestor 'div'
150
- if ( elem . parentElement ) {
151
- elem = elem . parentElement ;
158
+ var elem = window . yt . player . getPlayerByElement ( "player-api" ) ;
159
+
160
+ if ( ! elem ) {
161
+ elem = window . yt . player . getPlayerByElement ( "player" ) ;
152
162
}
153
- if ( elem . parentElement ) {
154
- elem = elem . parentElement ;
163
+
164
+ if ( elem ) {
165
+ elem . destroy ( ) ;
155
166
}
156
- console . log ( elem ) ;
157
167
158
- // Experimental
168
+ delete window . yt ;
169
+ if ( window . ytplayer ) {
170
+ delete window . ytplayer ;
171
+ }
172
+ }
173
+ // end yt special case
174
+ }
159
175
160
- check_replacement ( elem , wbinfo . url ) ;
176
+ function handle_yt_videos ( _pywbvid )
177
+ {
178
+ function do_yt_video_replace ( elem )
179
+ {
180
+ remove_yt ( ) ;
181
+
182
+ while ( elem . hasChildNodes ( ) ) {
183
+ elem . removeChild ( elem . lastChild ) ;
184
+ }
185
+
186
+ //add placeholder child to remove
187
+ var placeholder = document . createElement ( "div" ) ;
188
+ elem . appendChild ( placeholder ) ;
189
+ check_replacement ( placeholder , wbinfo . url ) ;
161
190
}
162
191
163
192
// special case: yt
164
193
if ( wbinfo . url . match ( YT_W_E_RX ) ) {
165
- var ytvideo = document . getElementsByTagName ( "video" ) ;
194
+ //var ytvideo = document.getElementsByTagName("video");
195
+ var player_div = document . getElementById ( "player-api" ) ;
196
+ if ( ! player_div ) {
197
+ player_div = document . getElementById ( "player" ) ;
198
+ }
199
+
200
+ //if (ytvideo.length == 1 && ytvideo[0].getAttribute("data-youtube-id") != "") {
201
+ if ( player_div ) {
202
+ if ( _pywbvid == "html" || _pywbvid == "flash" ) {
203
+ do_yt_video_replace ( player_div ) ;
204
+ } else if ( ! wbinfo . is_live ) {
205
+ var player = window . yt . player . getPlayerByElement ( player_div ) ;
206
+
207
+ if ( player ) {
208
+ _pywb_yt_err = function ( ) {
209
+ do_yt_video_replace ( player_div ) ;
210
+ }
211
+
212
+ player . addEventListener ( "onError" , "_pywb_yt_err" ) ;
213
+ }
166
214
167
- if ( ytvideo . length == 1 && ytvideo [ 0 ] . getAttribute ( "data-youtube-id" ) != "" ) {
168
- if ( vid_type == "html" ) {
169
- do_yt_video_replace ( ) ;
170
- } else {
171
215
setTimeout ( function ( ) {
172
- if ( ! ytvideo || ! ytvideo . length || ytvideo [ 0 ] . readyState == 0 ) {
173
- do_yt_video_replace ( ) ;
216
+ if ( ! window . yt || ! window . yt . player ) {
217
+ do_yt_video_replace ( player_div ) ;
218
+ return ;
219
+ }
220
+
221
+ var state = - 1 ;
222
+
223
+ if ( player && player . getPlayerState ) {
224
+ state = player . getPlayerState ( ) ;
225
+ }
226
+
227
+ // if no player or player is still buffering (is this ok), then replace
228
+ if ( state < 0 || state == 3 ) {
229
+ do_yt_video_replace ( player_div ) ;
230
+ return ;
174
231
}
175
232
} , 4000 ) ;
176
233
}
@@ -197,7 +254,7 @@ __wbvidrw = (function() {
197
254
198
255
src = src . replace ( VIMEO_RX , "http://player.vimeo.com/video/$1" ) ;
199
256
200
- if ( vid_type == "orig" ) {
257
+ if ( _pywbvid == "orig" ) {
201
258
var repl_src = src . replace ( YT_V_RX , "$1/embed/$2?$3&controls=0" ) ;
202
259
if ( repl_src != src ) {
203
260
do_replace_iframe ( elem , repl_src ) ;
@@ -275,12 +332,6 @@ __wbvidrw = (function() {
275
332
} else {
276
333
elem . parentNode . replaceChild ( replacement , elem ) ;
277
334
}
278
-
279
- if ( window . yt ) {
280
- yt . player . Application . create ( "player-api" , ytplayer . config ) . dispose ( ) ;
281
- delete window . yt ;
282
- delete window . ytplayer ;
283
- }
284
335
}
285
336
286
337
@@ -315,7 +366,7 @@ __wbvidrw = (function() {
315
366
if ( type == "audio" ) {
316
367
htmlelem = document . createElement ( "audio" ) ;
317
368
}
318
- if ( vid_type != "flash" ) {
369
+ if ( _pywbvid != "flash" ) {
319
370
replacement = init_html_player ( htmlelem , type , width , height , info , thumb_url ) ;
320
371
}
321
372
}
@@ -402,7 +453,6 @@ __wbvidrw = (function() {
402
453
return ;
403
454
}
404
455
405
- //console.log("html5 " + type +" error");
406
456
var replacement = document . createElement ( "div" ) ;
407
457
408
458
var vidId = "_wb_vid" + Date . now ( ) ;
0 commit comments