FV Flowplayer Video Player - Version 7.2.2.727

Version Description

  • 2018/09/28 =

  • Amazon S3 - fixing issues caused by Flash version of signed URL

  • Amazon S3 - fixing handling of blank spaces for S3 bucket browser

  • Amazon S3 - fixing handling of blank spaces for URL signature

Download this release

Release Info

Developer FolioVision
Plugin Icon 128x128 FV Flowplayer Video Player
Version 7.2.2.727
Comparing to
See all releases

Code changes from version 7.2.1.727 to 7.2.2.727

css/flowplayer.css CHANGED
@@ -797,7 +797,7 @@
797
  }
798
  .flowplayer .fp-speed-menu.fp-active.wont-fit {
799
  overflow-y: scroll;
800
- height: 86%;
801
  }
802
  .flowplayer .fp-speed-menu::-webkit-scrollbar {
803
  width: 8px;
@@ -1602,6 +1602,7 @@ article .entry-content .fvfp_admin_error p { line-height: 18px }
1602
 
1603
  }
1604
  @media (max-width: 39.9375em){
 
1605
  .flowplayer .fp-captions{line-height:14px !important}
1606
  .flowplayer .fp-captions p{font-size:14px !important;line-height:20px !important}
1607
  .flowplayer .fp-help p{font-size:9px;}
@@ -1615,7 +1616,7 @@ article .entry-content .fvfp_admin_error p { line-height: 18px }
1615
  @media only screen and (max-width: 29.9375em) {
1616
  .flowplayer .fp-captions{bottom:4px;line-height:12px !important}
1617
  .flowplayer .fp-captions p{font-size:11px !important;line-height:18px !important;-webkit-text-shadow:0 0 2px #666;-moz-text-shadow:0 0 2px #666;text-shadow:0 0 2px #666}
1618
- .flowplayer .fv_player_popup {width:99%;font-size:14px;top:0;}
1619
  .flowplayer.is-fv-narrow .fv_player_popup{font-size:.8em}
1620
  .flowplayer.is-audio .fp-time em {font-size:12px}
1621
  .fp-playlist-external a h4 {font-size:10px}
797
  }
798
  .flowplayer .fp-speed-menu.fp-active.wont-fit {
799
  overflow-y: scroll;
800
+ height: 83%;
801
  }
802
  .flowplayer .fp-speed-menu::-webkit-scrollbar {
803
  width: 8px;
1602
 
1603
  }
1604
  @media (max-width: 39.9375em){
1605
+ .flowplayer .fv_player_popup { padding: 12px 0 0 }
1606
  .flowplayer .fp-captions{line-height:14px !important}
1607
  .flowplayer .fp-captions p{font-size:14px !important;line-height:20px !important}
1608
  .flowplayer .fp-help p{font-size:9px;}
1616
  @media only screen and (max-width: 29.9375em) {
1617
  .flowplayer .fp-captions{bottom:4px;line-height:12px !important}
1618
  .flowplayer .fp-captions p{font-size:11px !important;line-height:18px !important;-webkit-text-shadow:0 0 2px #666;-moz-text-shadow:0 0 2px #666;text-shadow:0 0 2px #666}
1619
+ .flowplayer .fv_player_popup {width:99%;font-size:12px;top:0;}
1620
  .flowplayer.is-fv-narrow .fv_player_popup{font-size:.8em}
1621
  .flowplayer.is-audio .fp-time em {font-size:12px}
1622
  .fp-playlist-external a h4 {font-size:10px}
flowplayer.php CHANGED
@@ -3,7 +3,7 @@
3
  Plugin Name: FV Player
4
  Plugin URI: http://foliovision.com/wordpress/plugins/fv-wordpress-flowplayer
5
  Description: Formerly FV WordPress Flowplayer. Supports MP4, HLS, MPEG-DASH, WebM and OGV. Advanced features such as overlay ads or popups. Uses Flowplayer 7.2.7.
6
- Version: 7.2.1.727
7
  Author URI: http://foliovision.com/
8
  License: GPL-3.0
9
  License URI: http://www.gnu.org/licenses/gpl-3.0.txt
@@ -26,7 +26,7 @@ License URI: http://www.gnu.org/licenses/gpl-3.0.txt
26
  along with this program. If not, see <http://www.gnu.org/licenses/>.
27
  */
28
 
29
- $fv_wp_flowplayer_ver = '7.2.1.727';
30
  $fv_wp_flowplayer_core_ver = '7.2.7.1';
31
 
32
  include_once( dirname( __FILE__ ) . '/includes/extra-functions.php' );
3
  Plugin Name: FV Player
4
  Plugin URI: http://foliovision.com/wordpress/plugins/fv-wordpress-flowplayer
5
  Description: Formerly FV WordPress Flowplayer. Supports MP4, HLS, MPEG-DASH, WebM and OGV. Advanced features such as overlay ads or popups. Uses Flowplayer 7.2.7.
6
+ Version: 7.2.2.727
7
  Author URI: http://foliovision.com/
8
  License: GPL-3.0
9
  License URI: http://www.gnu.org/licenses/gpl-3.0.txt
26
  along with this program. If not, see <http://www.gnu.org/licenses/>.
27
  */
28
 
29
+ $fv_wp_flowplayer_ver = '7.2.2.727';
30
  $fv_wp_flowplayer_core_ver = '7.2.7.1';
31
 
32
  include_once( dirname( __FILE__ ) . '/includes/extra-functions.php' );
models/flowplayer-frontend.php CHANGED
@@ -282,10 +282,12 @@ class flowplayer_frontend extends flowplayer
282
  $this->ret['html'] .= ">\n";
283
 
284
  if (!empty($mobile)) {
285
- $this->ret['html'] .= $this->get_video_src($mobile, array( 'id' => 'wpfp_'.$this->hash.'_mobile' ) );
 
286
  } else {
287
- foreach( apply_filters( 'fv_player_media', array($media, $src1, $src2), $this ) AS $media_item ) {
288
- $this->ret['html'] .= $this->get_video_src($media_item);
 
289
  }
290
  }
291
 
@@ -535,95 +537,6 @@ class flowplayer_frontend extends flowplayer
535
  $this->ret['html'] .= "\t".'<div class="fp-ratio" style="padding-top: '.str_replace(',','.',$this->fRatio * 100).'%"></div>'."\n";
536
  $this->ret['html'] .= "\t".'<div class="fp-ui"><div class="fp-play fp-visible"><a class="fp-icon fp-playbtn"></a></div></div>'."\n";
537
  }
538
-
539
- if( count($aPlaylistItems) == 0 ) { // todo: this stops subtitles, mobile video, preload etc.
540
- $this->ret['html'] .= "\t".'<video class="fp-engine" preload="none"';
541
- if (isset($splash_img) && !empty($splash_img)) {
542
- $this->ret['html'] .= ' poster="'.flowplayer::get_encoded_url($splash_img).'"';
543
- }
544
-
545
- $this->ret['html'] .= ">\n";
546
-
547
- if( isset($rtmp) && !empty($rtmp) ) {
548
-
549
- foreach( apply_filters( 'fv_player_media_rtmp', array($rtmp),$this ) AS $rtmp_item ) {
550
- $rtmp_item = apply_filters( 'fv_flowplayer_video_src', $rtmp_item, $this );
551
-
552
- if( preg_match( '~([a-zA-Z0-9]+)?:~', $rtmp ) ) {
553
- $aTMP = preg_split( '~([a-zA-Z0-9]+)?:~', $rtmp, -1, PREG_SPLIT_DELIM_CAPTURE );
554
-
555
- if( isset($aTMP[1]) && isset($aTMP[2]) ) {
556
- $rtmp_file = $aTMP[2];
557
- $extension = $this->get_mime_type($rtmp_file, $aTMP[1], true);
558
- } else {
559
- $rtmp_file = $aTMP[1];
560
- $extension = $this->get_mime_type($rtmp_file, false, true);
561
- }
562
- } else {
563
- $rtmp_url = parse_url($rtmp_item);
564
- $rtmp_file = $rtmp_url['path'] . ( ( !empty($rtmp_url['query']) ) ? '?'. str_replace( '&amp;', '&', $rtmp_url['query'] ) : '' );
565
- $extension = $this->get_mime_type($rtmp_url['path'], false, true);
566
- }
567
-
568
- if( $extension ) {
569
- $extension .= ':';
570
- } else {
571
- //$extension = 'mp4:'; // https://github.com/flowplayer/flowplayer/search?q=rtmp&type=Issues&utf8=%E2%9C%93
572
- }
573
-
574
- $this->ret['html'] .= "\t"."\t".'<source src="'.$extension.trim($rtmp_file, " \t\n\r\0\x0B/").'" type="video/flash" />'."\n";
575
- }
576
- }
577
-
578
- foreach( apply_filters( 'fv_player_media', array($media, $src1, $src2), $this ) AS $media_item ) {
579
- $this->ret['html'] .= $this->get_video_src($media_item, array( 'rtmp' => $rtmp ) );
580
- }
581
- if (!empty($mobile)) {
582
- $this->ret['script']['fv_flowplayer_mobile_switch'][$this->hash] = true;
583
- $this->ret['html'] .= $this->get_video_src($mobile, array( 'id' => 'wpfp_'.$this->hash.'_mobile', 'rtmp' => $rtmp ) );
584
- }
585
-
586
- if (isset($aSubtitles) && !empty($aSubtitles)) {
587
- $aLangs = self::get_languages();
588
- $countSubtitles = 0;
589
- foreach( $aSubtitles AS $key => $subtitles ) {
590
- if( $key == 'subtitles' ) {
591
- $aLang = explode('-', get_bloginfo('language'));
592
- $sExtra = !empty($aLang[0]) ? 'srclang="'.$aLang[0].'" ' : '';
593
- $sCode = $aLang[0];
594
-
595
- $sCaption = '';
596
- if( !empty($sCode) && $sCode == 'en' ) {
597
- $sCaption = 'English';
598
-
599
- } elseif( !empty($sCode) ) {
600
- $translations = get_site_transient( 'available_translations' );
601
- $sLangCode = str_replace( '-', '_', get_bloginfo('language') );
602
- if( $translations && isset($translations[$sLangCode]) && !empty($translations[$sLangCode]['native_name']) ) {
603
- $sCaption = $translations[$sLangCode]['native_name'];
604
- }
605
-
606
- }
607
-
608
- if( $sCaption ) {
609
- $sExtra .= 'label="'.$sCaption.'" ';
610
- }
611
-
612
- } else {
613
- $sExtra = 'srclang="'.$key.'" label="'.$aLangs[strtoupper($key)].'" ';
614
- }
615
-
616
- if( $countSubtitles == 0 && $this->_get_option('subtitleOn') ) {
617
- $sExtra .= 'default ';
618
- }
619
-
620
- $countSubtitles++;
621
- $this->ret['html'] .= "\t"."\t".'<track '.$sExtra.'src="'.esc_attr($subtitles).'" />'."\n";
622
- }
623
- }
624
-
625
- $this->ret['html'] .= "\t".'</video>';//."\n";
626
- }
627
 
628
  $this->ret['html'] .= $this->get_buttons();
629
 
@@ -1051,13 +964,13 @@ class flowplayer_frontend extends flowplayer
1051
  $aTest_media = array();
1052
  foreach( array( $media, $src1, $src2, $rtmp ) AS $media_item ) {
1053
  if( $media_item ) {
1054
- $aTest_media[] = $this->get_video_src( $media_item, array( 'flash' => false, 'url_only' => true, 'dynamic' => true ) );
1055
  //break;
1056
  }
1057
  }
1058
 
1059
  if( !empty($this->aCurArgs['mobile']) ) {
1060
- $aTest_media[] = $this->get_video_src($this->aCurArgs['mobile'], array( 'flash' => false, 'url_only' => true, 'dynamic' => true ) );
1061
  }
1062
 
1063
  if( isset($aTest_media) && count($aTest_media) > 0 ) {
282
  $this->ret['html'] .= ">\n";
283
 
284
  if (!empty($mobile)) {
285
+ $src = $this->get_video_src($mobile);
286
+ $this->ret['html'] .= '<source src="'.esc_attr($src).'" type="'.$this->get_mime_type($src).'" />';
287
  } else {
288
+ foreach( apply_filters( 'fv_player_media', array($media, $src1, $src2), $this ) AS $media_item ) {
289
+ $src = $this->get_video_src($media_item);
290
+ $this->ret['html'] .= '<source src="'.esc_attr($src).'" type="'.$this->get_mime_type($src).'" />';
291
  }
292
  }
293
 
537
  $this->ret['html'] .= "\t".'<div class="fp-ratio" style="padding-top: '.str_replace(',','.',$this->fRatio * 100).'%"></div>'."\n";
538
  $this->ret['html'] .= "\t".'<div class="fp-ui"><div class="fp-play fp-visible"><a class="fp-icon fp-playbtn"></a></div></div>'."\n";
539
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
540
 
541
  $this->ret['html'] .= $this->get_buttons();
542
 
964
  $aTest_media = array();
965
  foreach( array( $media, $src1, $src2, $rtmp ) AS $media_item ) {
966
  if( $media_item ) {
967
+ $aTest_media[] = $this->get_video_src( $media_item, array( 'dynamic' => true ) );
968
  //break;
969
  }
970
  }
971
 
972
  if( !empty($this->aCurArgs['mobile']) ) {
973
+ $aTest_media[] = $this->get_video_src($this->aCurArgs['mobile'], array( 'dynamic' => true ) );
974
  }
975
 
976
  if( isset($aTest_media) && count($aTest_media) > 0 ) {
models/flowplayer.php CHANGED
@@ -121,7 +121,7 @@ class flowplayer extends FV_Wordpress_Flowplayer_Plugin_Private {
121
  //add_filter( 'fv_flowplayer_caption', array( $this, 'get_duration_playlist' ), 10, 3 );
122
  add_filter( 'fv_flowplayer_inner_html', array( $this, 'get_duration_video' ), 10, 2 );
123
 
124
- add_filter( 'fv_flowplayer_video_src', array( $this, 'get_amazon_secure'), 10, 2 );
125
 
126
  add_filter( 'fv_flowplayer_splash', array( $this, 'get_amazon_secure') );
127
  add_filter( 'fv_flowplayer_playlist_splash', array( $this, 'get_amazon_secure') );
@@ -803,7 +803,6 @@ class flowplayer extends FV_Wordpress_Flowplayer_Plugin_Private {
803
  }
804
 
805
  $aItem = array();
806
- $flash_media = array();
807
 
808
  if( $rtmp && stripos($rtmp,'rtmp://') === false ) {
809
  $rtmp = 'rtmp:'.$rtmp;
@@ -818,48 +817,25 @@ class flowplayer extends FV_Wordpress_Flowplayer_Plugin_Private {
818
  $media_item_tmp = $media_item;
819
  }
820
 
821
- $media_url = $this->get_video_src( $media_item_tmp, array( 'url_only' => true, 'suppress_filters' => $suppress_filters ) );
822
 
823
  // add domain for relative video URLs if it's not RTMP
824
  if( stripos($media_item,'rtmp://') === false && $key != 3 ) {
825
  $media_url = $this->get_video_url($media_url);
826
  }
827
 
828
- if( is_array($media_url) ) {
829
- $actual_media_url = $media_url['media'];
830
- if( $this->get_mime_type($actual_media_url) == 'video/mp4' ) {
831
- $flash_media[] = $media_url['flash'];
832
- }
833
- } else {
834
- $actual_media_url = $media_url;
835
- }
836
  if( stripos( $media_item, 'rtmp:' ) === 0 ) {
837
- if( !preg_match( '~^[a-z0-9]+:~', $actual_media_url ) ) { // no RTMP extension provided
838
- $ext = $this->get_mime_type($actual_media_url,false,true) ? $this->get_mime_type($actual_media_url,false,true).':' : false;
839
- $aItem[] = array( 'src' => $ext.str_replace( '+', ' ', $actual_media_url ), 'type' => 'video/flash' );
840
  } else {
841
- $aItem[] = array( 'src' => str_replace( '+', ' ', $actual_media_url ), 'type' => 'video/flash' );
842
  }
843
  } else {
844
- $aItem[] = array( 'src' => $actual_media_url, 'type' => $this->get_mime_type($actual_media_url) );
845
  }
846
  }
847
 
848
- if( count($flash_media) ) {
849
- $bHaveFlash = false;
850
- foreach( $aItem AS $key => $aItemFile ) { // how to avoid duplicates?
851
- if( in_array( 'flash', array_keys($aItemFile) ) ) {
852
- $bHaveFlash = true;
853
- }
854
- }
855
-
856
- if( !$bHaveFlash ) {
857
- foreach( $flash_media AS $flash_media_items ) {
858
- $aItem[] = array( 'flash' => $flash_media_items );
859
- }
860
- }
861
- }
862
-
863
  $sItemCaption = ( isset($aCaption) ) ? array_shift($aCaption) : false;
864
  $sItemCaption = apply_filters( 'fv_flowplayer_caption', $sItemCaption, $aItem, $aArgs );
865
 
@@ -868,7 +844,7 @@ class flowplayer extends FV_Wordpress_Flowplayer_Plugin_Private {
868
  list( $rtmp_server, $rtmp ) = $this->get_rtmp_server($rtmp);
869
 
870
  if( !empty($aArgs['mobile']) ) {
871
- $mobile = $this->get_video_url($aArgs['mobile']);
872
  $aItem[] = array( 'src' => $mobile, 'type' => $this->get_mime_type($mobile), 'mobile' => true );
873
  }
874
 
@@ -906,7 +882,6 @@ class flowplayer extends FV_Wordpress_Flowplayer_Plugin_Private {
906
 
907
  $aItem = array();
908
  $sSplashImage = false;
909
- $flash_media = array();
910
 
911
  foreach( apply_filters( 'fv_player_media', $aPlaylist_item, $this ) AS $aPlaylist_item_i ) {
912
  if( preg_match('~\.(png|gif|jpg|jpe|jpeg)($|\?)~',$aPlaylist_item_i) ) {
@@ -914,44 +889,22 @@ class flowplayer extends FV_Wordpress_Flowplayer_Plugin_Private {
914
  continue;
915
  }
916
 
917
- $media_url = $this->get_video_src( preg_replace( '~^rtmp:~', '', $aPlaylist_item_i ), array( 'url_only' => true, 'suppress_filters' => $suppress_filters ) );
918
- if( is_array($media_url) ) {
919
- $actual_media_url = $media_url['media'];
920
- if( $this->get_mime_type($actual_media_url) == 'video/mp4' ) {
921
- $flash_media[] = $media_url['flash'];
922
- }
923
- } else {
924
- $actual_media_url = $media_url;
925
- }
926
  if( stripos( $aPlaylist_item_i, 'rtmp:' ) === 0 ) {
927
- if( !preg_match( '~^[a-z0-9]+:~', $actual_media_url ) ) { // no RTMP extension provided
928
- $ext = $this->get_mime_type($actual_media_url,false,true) ? $this->get_mime_type($actual_media_url,false,true).':' : false;
929
- $aItem[] = array( 'src' => $ext.str_replace( '+', ' ', $actual_media_url ), 'type' => 'video/flash' );
930
  } else {
931
- $aItem[] = array( 'src' => str_replace( '+', ' ', $actual_media_url ), 'type' => 'video/flash' );
932
  }
933
  } else {
934
- $aItem[] = array( 'src' => $actual_media_url, 'type' => $this->get_mime_type($aPlaylist_item_i) );
935
  }
936
 
937
  }
938
 
939
  $sSplashImage = apply_filters( 'fv_flowplayer_playlist_splash', $sSplashImage, $this, $aPlaylist_item );
940
-
941
- if( count($flash_media) ) {
942
- $bHaveFlash = false;
943
- foreach( $aItem AS $key => $aItemFile ) {
944
- if( in_array( 'flash', array_keys($aItemFile) ) ) {
945
- $bHaveFlash = true;
946
- }
947
- }
948
-
949
- if( !$bHaveFlash ) {
950
- foreach( $flash_media AS $flash_media_items ) {
951
- $aItem[] = array( 'flash' => $flash_media_items );
952
- }
953
- }
954
- }
955
 
956
  $aPlayer = array( 'sources' => $aItem );
957
  if( $rtmp_server ) $aPlayer['rtmp'] = array( 'url' => $rtmp_server );
@@ -1295,9 +1248,6 @@ class flowplayer extends FV_Wordpress_Flowplayer_Plugin_Private {
1295
 
1296
  if( stripos($media,'X-Amz-Expires') !== false || stripos($media,'AWSAccessKeyId') !== false ) return $media;
1297
 
1298
- $aArgs = func_get_args();
1299
- $aArgs = isset($aArgs[1]) ? $aArgs[1] : array();
1300
-
1301
  global $fv_fp;
1302
 
1303
  $amazon_key = -1;
@@ -1336,7 +1286,7 @@ class flowplayer extends FV_Wordpress_Flowplayer_Plugin_Private {
1336
  $iAWSVersion = $fv_fp->_get_option( array( 'amazon_region', $amazon_key ) ) ? 4 : 2;
1337
 
1338
  if( $iAWSVersion == 4 ) {
1339
- $url_components['path'] = str_replace('+', ' ', $url_components['path']);
1340
  }
1341
 
1342
  $url_components['path'] = rawurlencode($url_components['path']);
@@ -1345,8 +1295,6 @@ class flowplayer extends FV_Wordpress_Flowplayer_Plugin_Private {
1345
  $url_components['path'] = str_replace('%2523', '%23', $url_components['path']);
1346
  $url_components['path'] = str_replace('%252B', '%2B', $url_components['path']);
1347
  $url_components['path'] = str_replace('%2527', '%27', $url_components['path']);
1348
-
1349
- $sGlue = ( !empty($aArgs['url_only']) && $aArgs['url_only'] ) ? '&' : '&amp;';
1350
 
1351
  if( $iAWSVersion == 4 ) {
1352
  $sXAMZDate = gmdate('Ymd\THis\Z');
@@ -1378,11 +1326,11 @@ class flowplayer extends FV_Wordpress_Flowplayer_Plugin_Private {
1378
 
1379
  // 4. http://docs.aws.amazon.com/general/latest/gr/sigv4-add-signature-to-request.html
1380
  $resource .= "?X-Amz-Algorithm=AWS4-HMAC-SHA256";
1381
- $resource .= $sGlue."X-Amz-Credential=$sXAMZCredential";
1382
- $resource .= $sGlue."X-Amz-Date=$sXAMZDate";
1383
- $resource .= $sGlue."X-Amz-Expires=$time";
1384
- $resource .= $sGlue."X-Amz-SignedHeaders=$sSignedHeaders";
1385
- $resource .= $sGlue."X-Amz-Signature=".$sSignature;
1386
 
1387
  $this->ret['script']['fv_flowplayer_amazon_s3'][$this->hash] = $time;
1388
 
@@ -1405,7 +1353,7 @@ class flowplayer extends FV_Wordpress_Flowplayer_Plugin_Private {
1405
  $signature = urlencode($signature);
1406
  } while( stripos($signature,'%2B') !== false );
1407
 
1408
- $resource .= '?AWSAccessKeyId='.$fv_fp->_get_option( array('amazon_key', $amazon_key) ).$sGlue.'Expires='.$expires.$sGlue.'Signature='.$signature;
1409
 
1410
  }
1411
 
@@ -1787,52 +1735,16 @@ class flowplayer extends FV_Wordpress_Flowplayer_Plugin_Private {
1787
 
1788
  function get_video_src($media, $aArgs = array() ) {
1789
  $aArgs = wp_parse_args( $aArgs, array(
1790
- 'dynamic' => false,
1791
- 'flash' => true,
1792
- 'id' => false,
1793
- 'rtmp' => false,
1794
  'suppress_filters' => false,
1795
- 'url_only' => false
1796
  )
1797
  );
1798
 
1799
  if( $media ) {
1800
- $mime_type = $this->get_mime_type($media);
1801
- $sID = ($aArgs['id']) ? 'id="'.$aArgs['id'].'" ' : '';
1802
-
1803
  if( !$aArgs['suppress_filters'] ) {
1804
  $media = apply_filters( 'fv_flowplayer_video_src', $media, $aArgs );
1805
  }
1806
-
1807
- $media = trim($media);
1808
-
1809
- // fix for signed Amazon URLs, we actually need it for Flash only, so it gets into an extra source tag
1810
- $source_flash_encoded = false;
1811
- if( $this->is_secure_amazon_s3($media) /*&& stripos($media,'.webm') === false && stripos($media,'.ogv') === false */) {
1812
- $media_fixed = str_replace('%2B', '%25252B',$media);
1813
- $media_fixed = str_replace('%23', '%252523',$media_fixed );
1814
- $media_fixed = str_replace('+', '%2B',$media_fixed );
1815
- // only if there was a change and we don't have an RTMP for Flash
1816
- if( $media_fixed != $media && empty($aArgs['rtmp']) ) {
1817
- $source_flash_encoded = $media_fixed;
1818
- }
1819
- }
1820
-
1821
- if( $aArgs['url_only'] ) {
1822
- if( $aArgs['flash'] && $source_flash_encoded ) {
1823
- return array( 'media' => $media, 'flash' => $source_flash_encoded );
1824
- } else {
1825
- return strip_tags($media);
1826
- }
1827
- } else {
1828
-
1829
- $sReturn = '<source '.$sID.'src="'.esc_attr($media).'" type="'.$mime_type.'" />'."\n";
1830
-
1831
- if( $source_flash_encoded && strcmp($mime_type,'video/mp4') == 0 ) {
1832
- $sReturn .= '<source '.$sID.'src="'.esc_attr($source_flash_encoded).'" type="video/flash" />'."\n";
1833
- }
1834
- return $sReturn;
1835
- }
1836
  }
1837
  return null;
1838
  }
@@ -2142,10 +2054,7 @@ function fv_wp_flowplayer_save_post( $post_id ) {
2142
  }
2143
 
2144
  if( isset($post->ID) && !get_post_meta( $post->ID, flowplayer::get_video_key($video), true ) ) {
2145
- $video_secured = $fv_fp->get_video_src( $video, array( 'dynamic' => true, 'url_only' => true, 'flash' => false ) );
2146
- if( !is_array($video_secured) ) {
2147
- $video_secured = array( 'media' => $video_secured );
2148
- }
2149
  if( isset($video_secured['media']) && $FV_Player_Checker->check_mimetype( array($video_secured['media']), array( 'meta_action' => 'check_time', 'meta_original' => $video ) ) ) {
2150
  $iDone++;
2151
  if( isset($_GET['fv_flowplayer_checker'] ) ) {
121
  //add_filter( 'fv_flowplayer_caption', array( $this, 'get_duration_playlist' ), 10, 3 );
122
  add_filter( 'fv_flowplayer_inner_html', array( $this, 'get_duration_video' ), 10, 2 );
123
 
124
+ add_filter( 'fv_flowplayer_video_src', array( $this, 'get_amazon_secure') );
125
 
126
  add_filter( 'fv_flowplayer_splash', array( $this, 'get_amazon_secure') );
127
  add_filter( 'fv_flowplayer_playlist_splash', array( $this, 'get_amazon_secure') );
803
  }
804
 
805
  $aItem = array();
 
806
 
807
  if( $rtmp && stripos($rtmp,'rtmp://') === false ) {
808
  $rtmp = 'rtmp:'.$rtmp;
817
  $media_item_tmp = $media_item;
818
  }
819
 
820
+ $media_url = $this->get_video_src( $media_item_tmp, array( 'suppress_filters' => $suppress_filters ) );
821
 
822
  // add domain for relative video URLs if it's not RTMP
823
  if( stripos($media_item,'rtmp://') === false && $key != 3 ) {
824
  $media_url = $this->get_video_url($media_url);
825
  }
826
 
 
 
 
 
 
 
 
 
827
  if( stripos( $media_item, 'rtmp:' ) === 0 ) {
828
+ if( !preg_match( '~^[a-z0-9]+:~', $media_url ) ) { // no RTMP extension provided
829
+ $ext = $this->get_mime_type($media_url,false,true) ? $this->get_mime_type($media_url,false,true).':' : false;
830
+ $aItem[] = array( 'src' => $ext.str_replace( '+', ' ', $media_url ), 'type' => 'video/flash' );
831
  } else {
832
+ $aItem[] = array( 'src' => str_replace( '+', ' ', $media_url ), 'type' => 'video/flash' );
833
  }
834
  } else {
835
+ $aItem[] = array( 'src' => $media_url, 'type' => $this->get_mime_type($media_url) );
836
  }
837
  }
838
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
839
  $sItemCaption = ( isset($aCaption) ) ? array_shift($aCaption) : false;
840
  $sItemCaption = apply_filters( 'fv_flowplayer_caption', $sItemCaption, $aItem, $aArgs );
841
 
844
  list( $rtmp_server, $rtmp ) = $this->get_rtmp_server($rtmp);
845
 
846
  if( !empty($aArgs['mobile']) ) {
847
+ $mobile = $this->get_video_src( $this->get_video_url($aArgs['mobile']) );
848
  $aItem[] = array( 'src' => $mobile, 'type' => $this->get_mime_type($mobile), 'mobile' => true );
849
  }
850
 
882
 
883
  $aItem = array();
884
  $sSplashImage = false;
 
885
 
886
  foreach( apply_filters( 'fv_player_media', $aPlaylist_item, $this ) AS $aPlaylist_item_i ) {
887
  if( preg_match('~\.(png|gif|jpg|jpe|jpeg)($|\?)~',$aPlaylist_item_i) ) {
889
  continue;
890
  }
891
 
892
+ $media_url = $this->get_video_src( preg_replace( '~^rtmp:~', '', $aPlaylist_item_i ), array( 'suppress_filters' => $suppress_filters ) );
893
+
 
 
 
 
 
 
 
894
  if( stripos( $aPlaylist_item_i, 'rtmp:' ) === 0 ) {
895
+ if( !preg_match( '~^[a-z0-9]+:~', $media_url ) ) { // no RTMP extension provided
896
+ $ext = $this->get_mime_type($media_url,false,true) ? $this->get_mime_type($media_url,false,true).':' : false;
897
+ $aItem[] = array( 'src' => $ext.str_replace( '+', ' ', $media_url ), 'type' => 'video/flash' );
898
  } else {
899
+ $aItem[] = array( 'src' => str_replace( '+', ' ', $media_url ), 'type' => 'video/flash' );
900
  }
901
  } else {
902
+ $aItem[] = array( 'src' => $media_url, 'type' => $this->get_mime_type($media_url) );
903
  }
904
 
905
  }
906
 
907
  $sSplashImage = apply_filters( 'fv_flowplayer_playlist_splash', $sSplashImage, $this, $aPlaylist_item );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
908
 
909
  $aPlayer = array( 'sources' => $aItem );
910
  if( $rtmp_server ) $aPlayer['rtmp'] = array( 'url' => $rtmp_server );
1248
 
1249
  if( stripos($media,'X-Amz-Expires') !== false || stripos($media,'AWSAccessKeyId') !== false ) return $media;
1250
 
 
 
 
1251
  global $fv_fp;
1252
 
1253
  $amazon_key = -1;
1286
  $iAWSVersion = $fv_fp->_get_option( array( 'amazon_region', $amazon_key ) ) ? 4 : 2;
1287
 
1288
  if( $iAWSVersion == 4 ) {
1289
+ $url_components['path'] = str_replace( array('%20','+'), ' ', $url_components['path']);
1290
  }
1291
 
1292
  $url_components['path'] = rawurlencode($url_components['path']);
1295
  $url_components['path'] = str_replace('%2523', '%23', $url_components['path']);
1296
  $url_components['path'] = str_replace('%252B', '%2B', $url_components['path']);
1297
  $url_components['path'] = str_replace('%2527', '%27', $url_components['path']);
 
 
1298
 
1299
  if( $iAWSVersion == 4 ) {
1300
  $sXAMZDate = gmdate('Ymd\THis\Z');
1326
 
1327
  // 4. http://docs.aws.amazon.com/general/latest/gr/sigv4-add-signature-to-request.html
1328
  $resource .= "?X-Amz-Algorithm=AWS4-HMAC-SHA256";
1329
+ $resource .= "&X-Amz-Credential=$sXAMZCredential";
1330
+ $resource .= "&X-Amz-Date=$sXAMZDate";
1331
+ $resource .= "&X-Amz-Expires=$time";
1332
+ $resource .= "&X-Amz-SignedHeaders=$sSignedHeaders";
1333
+ $resource .= "&X-Amz-Signature=".$sSignature;
1334
 
1335
  $this->ret['script']['fv_flowplayer_amazon_s3'][$this->hash] = $time;
1336
 
1353
  $signature = urlencode($signature);
1354
  } while( stripos($signature,'%2B') !== false );
1355
 
1356
+ $resource .= '?AWSAccessKeyId='.$fv_fp->_get_option( array('amazon_key', $amazon_key) ).'&Expires='.$expires.'&Signature='.$signature;
1357
 
1358
  }
1359
 
1735
 
1736
  function get_video_src($media, $aArgs = array() ) {
1737
  $aArgs = wp_parse_args( $aArgs, array(
1738
+ 'dynamic' => false, // apply URL signature for CDNs which normally use Ajax
 
 
 
1739
  'suppress_filters' => false,
 
1740
  )
1741
  );
1742
 
1743
  if( $media ) {
 
 
 
1744
  if( !$aArgs['suppress_filters'] ) {
1745
  $media = apply_filters( 'fv_flowplayer_video_src', $media, $aArgs );
1746
  }
1747
+ return strip_tags(trim($media));
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1748
  }
1749
  return null;
1750
  }
2054
  }
2055
 
2056
  if( isset($post->ID) && !get_post_meta( $post->ID, flowplayer::get_video_key($video), true ) ) {
2057
+ $video_secured = array( 'media' => $fv_fp->get_video_src( $video, array( 'dynamic' => true ) ) );
 
 
 
2058
  if( isset($video_secured['media']) && $FV_Player_Checker->check_mimetype( array($video_secured['media']), array( 'meta_action' => 'check_time', 'meta_original' => $video ) ) ) {
2059
  $iDone++;
2060
  if( isset($_GET['fv_flowplayer_checker'] ) ) {
models/media-browser-s3.php CHANGED
@@ -97,13 +97,13 @@ class FV_Player_Media_Browser_S3 extends FV_Player_Media_Browser {
97
 
98
  try {
99
 
100
- $s3Client = Aws\CloudFront\CloudFrontClient::factory( array(
101
  'credentials' => $credentials,
102
  'region' => 'us-east-1',
103
  'version' => 'latest'
104
  ) );
105
 
106
- $cloudfronts = $s3Client->listDistributions();
107
  foreach( $cloudfronts['DistributionList']['Items'] AS $item ) {
108
  if( !$item['Enabled'] ) continue;
109
 
@@ -157,7 +157,8 @@ class FV_Player_Media_Browser_S3 extends FV_Player_Media_Browser {
157
  if ( $object['Size'] != '0' ) {
158
 
159
  $link = (string) $s3Client->getObjectUrl( $bucket, $name );
160
-
 
161
  // replace link with CloudFront URL, if we have one
162
  if( !empty($domains[$array_id]) ) {
163
  // replace S3 URLs with buckets in the S3 subdomain
97
 
98
  try {
99
 
100
+ $cfClient = Aws\CloudFront\CloudFrontClient::factory( array(
101
  'credentials' => $credentials,
102
  'region' => 'us-east-1',
103
  'version' => 'latest'
104
  ) );
105
 
106
+ $cloudfronts = $cfClient->listDistributions();
107
  foreach( $cloudfronts['DistributionList']['Items'] AS $item ) {
108
  if( !$item['Enabled'] ) continue;
109
 
157
  if ( $object['Size'] != '0' ) {
158
 
159
  $link = (string) $s3Client->getObjectUrl( $bucket, $name );
160
+ $link = str_replace( '%20', '+', $link );
161
+
162
  // replace link with CloudFront URL, if we have one
163
  if( !empty($domains[$array_id]) ) {
164
  // replace S3 URLs with buckets in the S3 subdomain
readme.txt CHANGED
@@ -349,15 +349,21 @@ Thank you for being part of the HMTL 5 mobile video revolution!
349
 
350
  == Screenshots ==
351
 
352
- 1. Post containing modified flowplayer playing a video.
353
- 2. Adding three players with different arguments into a post.
354
- 3. Add new video dialog window in editing mode.
355
- 4. Configuration menu for administrators.
356
- 5. Video checker. This shows up for admins only. Click on Admin: Video Ok or Admin: Video Issues in top left corner of the video when you are logged in as admin to get it.
357
 
358
  == Changelog ==
359
 
360
- = 7.2.0.727 - 2018/09/20 =
 
 
 
 
 
 
361
 
362
  * Security - adding nonce for the Shortcode Editor preview
363
 
349
 
350
  == Screenshots ==
351
 
352
+ 1. FV Player different skin options
353
+ 2. FV Player shortcode in post content
354
+ 3. It's easy to use our shortcode editor to add videos
355
+ 4. Plugin settings screen
356
+ 5. Video checker helps you find issues with your video encoding
357
 
358
  == Changelog ==
359
 
360
+ = 7.2.2.727 - 2018/09/28 =
361
+
362
+ * Amazon S3 - fixing issues caused by Flash version of signed URL
363
+ * Amazon S3 - fixing handling of blank spaces for S3 bucket browser
364
+ * Amazon S3 - fixing handling of blank spaces for URL signature
365
+
366
+ = 7.2.1.727 - 2018/09/20 =
367
 
368
  * Security - adding nonce for the Shortcode Editor preview
369