Brion VIBBER has submitted this change and it was merged.

Change subject: Launch videos in VLC app on iOS if installed
......................................................................


Launch videos in VLC app on iOS if installed

iOS does not support ogg/webm. Direct people to install iOS app
instead, and direct them to view videos in that instead.

This is meant as a somewhat short term solution. After the
kaltura player update (whenever that happens), it may make sense
to replace this sort of thing with ogv.js, or perhaps keep this
vlc triggering code. Either way, in the near term this is a
relative simple fix that would help us reach 11.4% of our user base.

One minor issue: If you don't have the VLC app installed, you will
get a safari cannot open the page dialog box when we try to open
with vlc. I couldn't find anyway around it. I don't think its a big
deal, since in that case we cannot play the video anyways, so an
error is not out of place.

Bug: 61095
Change-Id: I6c3b5d8aadbd69577df3fe513f780f69708450d5
---
M MwEmbedModules/EmbedPlayer/EmbedPlayer.php
M MwEmbedModules/EmbedPlayer/i18n/en.json
M MwEmbedModules/EmbedPlayer/i18n/qqq.json
A MwEmbedModules/EmbedPlayer/resources/mw.EmbedPlayerVLCApp.js
M MwEmbedModules/EmbedPlayer/resources/mw.EmbedTypes.js
M MwEmbedModules/EmbedPlayer/resources/mw.MediaPlayers.js
M MwEmbedModules/EmbedPlayer/resources/skins/mw.PlayerControlBuilder.js
7 files changed, 147 insertions(+), 7 deletions(-)

Approvals:
  Brion VIBBER: Looks good to me, approved



diff --git a/MwEmbedModules/EmbedPlayer/EmbedPlayer.php 
b/MwEmbedModules/EmbedPlayer/EmbedPlayer.php
index 66f6c32..c60d41c 100644
--- a/MwEmbedModules/EmbedPlayer/EmbedPlayer.php
+++ b/MwEmbedModules/EmbedPlayer/EmbedPlayer.php
@@ -64,6 +64,10 @@
                        "mw.EmbedPlayerGeneric" => array( 'scripts'=> 
"resources/mw.EmbedPlayerGeneric.js" ),
                        "mw.EmbedPlayerJava" => array( 'scripts'=> 
"resources/mw.EmbedPlayerJava.js"),
                        "mw.EmbedPlayerNative"  => array( 'scripts'=> 
"resources/mw.EmbedPlayerNative.js" ),
+                       "mw.EmbedPlayerVLCApp"  => array(
+                               'scripts'=> "resources/mw.EmbedPlayerVLCApp.js",
+                               'dependencies' => array( 'mediawiki.Uri' )
+                       ),
                        "mw.EmbedPlayerImageOverlay" => array( 'scripts'=> 
"resources/mw.EmbedPlayerImageOverlay.js" ),
 
                        "mw.EmbedPlayerVlc" => array( 'scripts'=> 
"resources/mw.EmbedPlayerVlc.js" ),
diff --git a/MwEmbedModules/EmbedPlayer/i18n/en.json 
b/MwEmbedModules/EmbedPlayer/i18n/en.json
index 3534011..d3221a2 100644
--- a/MwEmbedModules/EmbedPlayer/i18n/en.json
+++ b/MwEmbedModules/EmbedPlayer/i18n/en.json
@@ -49,6 +49,7 @@
     "mwe-embedplayer-ogg-player-h264Native": "HTML5 H.264 player",
     "mwe-embedplayer-ogg-player-webmNative": "HTML5 WebM player",
     "mwe-embedplayer-ogg-player-oggPlugin": "Generic Ogg plugin",
+    "mwe-embedplayer-ogg-player-vlcAppPlayer": "VLC for iOS app",
     "mwe-embedplayer-ogg-player-quicktime-mozilla": "QuickTime plugin",
     "mwe-embedplayer-ogg-player-quicktime-activex": "QuickTime ActiveX",
     "mwe-embedplayer-ogg-player-cortado": "Java Cortado",
@@ -77,5 +78,11 @@
     "mwe-embedplayer-video-3gp": "3GP video",
     "mwe-embedplayer-video-mpeg": "MPEG video",
     "mwe-embedplayer-video-msvideo": "AVI video",
-    "mwe-embedplayer-missing-source": "No source video was found"
-}
\ No newline at end of file
+    "mwe-embedplayer-missing-source": "No source video was found",
+    "mwe-embedplayer-vlcapp-intro": "In order to view videos from this site on 
an iPhone or iPad, you need the free $1.",
+    "mwe-embedplayer-vlcapp-vlcapplinktext": "VLC app",
+    "mwe-embedplayer-vlcapp-downloadapp": "Download the VLC app from the App 
Store",
+    "mwe-embedplayer-vlcapp-openvideo": "Open this video in the VLC app",
+    "mwe-embedplayer-vlcapp-downloadvideo": "Download this video",
+    "mwe-embedplayer-vlcapp-vlcapppopup": "To play videos on this site, you 
need the free VLC app. Install now?"
+}
diff --git a/MwEmbedModules/EmbedPlayer/i18n/qqq.json 
b/MwEmbedModules/EmbedPlayer/i18n/qqq.json
index cf3c762..df06a9b 100644
--- a/MwEmbedModules/EmbedPlayer/i18n/qqq.json
+++ b/MwEmbedModules/EmbedPlayer/i18n/qqq.json
@@ -22,6 +22,7 @@
        "mwe-embedplayer-close_btn": "{{Identical|Close}}",
        "mwe-embedplayer-ogg-player-mp3Native": "name of mp3 player in 
configuration screen",
        "mwe-embedplayer-ogg-player-aacNative": "name of AAC player in 
configuration screen",
+       "mwe-embedplayer-ogg-player-VLCApp": "Name for launching video in 
external VLC app, in the media player configuration screen. Only shown on 
iPhones/iPads"
        "mwe-embedplayer-ogg-player-cortado": "{{optional}}",
        "mwe-embedplayer-ogg-player-selected": "{{Identical|Selected}}",
        "mwe-embedplayer-for_best_experience": "Shown when user's browser 
doesn't support playing videos. Parameters:\n* $1 - An empty <a> tag. 
Don't use this parameter.",
@@ -29,5 +30,11 @@
        "mwe-embedplayer-do_not_warn_again": "Standard message for 
disabling\nfuture identical warnings messages",
        "mwe-embedplayer-playerSelect": "{{Identical|Player}}",
        "mwe-embedplayer-embed_site_or_blog": "title for iframe embed code in 
share dialog",
-       "mwe-embedplayer-embed_wiki": "title for wiki embed code in share 
dialog"
+       "mwe-embedplayer-embed_wiki": "title for wiki embed code in share 
dialog",
+       "mwe-embedplayer-vlcapp-intro": "Shown where a video would be on the 
page, on iPhones/iPads. Parameter $1 is a link to the App store page for the 
vlc app, with the text contianed in the mwe-embedplayer-vlcapp-vlcapplinktext 
message. This message is followed by a bulleted list of links consisting of the 
messages: mwe-embedplayer-vlcapp-downloadapp, mwe-embedplayer-vlcapp-openvideo, 
mwe-embedplayer-vlcapp-openvideo. See also the related 
mwe-embedplayer-vlcapp-vlcapppopup message.",
+       "mwe-embedplayer-vlcapp-vlcapplinktext": "Text of the $1 parameter of 
mwe-embedplayer-vlcapp-intro. Will be linked to 
https://itunes.apple.com/us/app/vlc-for-ios/id650377962?mt=8 (the download page 
for the vlc app).",
+       "mwe-embedplayer-vlcapp-downloadapp": "First bullet point after the 
mwe-embedplayer-vlcapp-intro. Links to the download page for installing the vlc 
app ( https://itunes.apple.com/us/app/vlc-for-ios/id650377962?mt=8 ).",
+       "mwe-embedplayer-vlcapp-openvideo": "Second bullet point after the 
mwe-embedplayer-vlcapp-intro. Link will open the video in the VLC app, if the 
app is installed",
+       "mwe-embedplayer-vlcapp-downloadvideo": "Third bullet point after the 
mwe-embedplayer-vlcapp-intro. Linked directly to the video file",
+       "mwe-embedplayer-vlcapp-vlcapppopup": "Popup dialog box shown to user 
if they do not have the VLC app installed when trying to play a video on 
iPhone/iPad. Box will be presented with this message and two buttons (OK and 
cancel. Actual text of buttons may vary.) If user presses ok, they are 
redirected to https://itunes.apple.com/us/app/vlc-for-ios/id650377962?mt=8.";
 }
diff --git a/MwEmbedModules/EmbedPlayer/resources/mw.EmbedPlayerVLCApp.js 
b/MwEmbedModules/EmbedPlayer/resources/mw.EmbedPlayerVLCApp.js
new file mode 100644
index 0000000..cddbb31
--- /dev/null
+++ b/MwEmbedModules/EmbedPlayer/resources/mw.EmbedPlayerVLCApp.js
@@ -0,0 +1,101 @@
+/**
+ * Play the video using the vlc app on iOS
+ */
+
+( function( mw, $ ) { "use strict";
+
+mw.EmbedPlayerVLCApp = {
+       // List of supported features (or lack thereof)
+        supports: {
+               'playHead':false,
+               'pause':false,
+               'stop':true,
+               'fullscreen':false,
+               'timeDisplay':false,
+               'volumeControl':false
+       },
+
+       // Instance name:
+       instanceOf:'VLCApp',
+
+       /*
+       * Embed this "fake" player
+       *
+       * @return {String}
+       *       embed code to link to VLC app
+       */
+       embedPlayerHTML: function() {
+               var fileUrl = this.getSrc( this.seekTimeSec ),
+                       vlcUrl = 'vlc://' + (new mw.Uri( fileUrl )).toString(),
+                       appStoreUrl = 
'//itunes.apple.com/us/app/vlc-for-ios/id650377962',
+                       appInstalled = false,
+                       promptInstallTimeout,
+                       $link,
+                       startTime;
+
+               // Replace video with download in vlc link.
+               // the <span> ends up being not used as we get the html via 
.html()
+               $link = $( '<span></span>' ).append( $( '<a></a>' ).attr( 
'href', appStoreUrl ).append(
+                       mw.html.escape( mw.msg( 
'mwe-embedplayer-vlcapp-vlcapplinktext' ) )
+               ) );
+               $( this ).html( $( '<div class="vlcapp-player"></div>' )
+                       .width( this.getWidth() )
+                       .height( this.getHeight() )
+                       .append(
+                               // mw.msg doesn't have rawParams() equivalent. 
Lame.
+                               mw.html.escape(
+                                       mw.msg( 'mwe-embedplayer-vlcapp-intro' )
+                               ).replace( /\$1/g, $link.html() )
+                       ).append( $( '<ul></ul>' )
+                               .append( $( '<li></li>' ).append( $( '<a></a>' 
).attr( 'href', appStoreUrl )
+                                       .text( mw.msg( 
'mwe-embedplayer-vlcapp-downloadapp' ) ) )
+                               ).append( $( '<li></li>' ).append( $( '<a></a>' 
).attr( 'href', vlcUrl )
+                                       .text( mw.msg( 
'mwe-embedplayer-vlcapp-openvideo' ) ) )
+                               ).append( $( '<li></li>' ).append( $( '<a></a>' 
).attr( 'href', fileUrl )
+                                       .text( mw.msg( 
'mwe-embedplayer-vlcapp-downloadvideo' ) ) )
+                               )
+                       )
+               );
+
+               // Try to auto-open in vlc.
+               // Based on 
http://stackoverflow.com/questions/627916/check-if-url-scheme-is-supported-in-javascript
+
+               $( window ).one( 'pagehide', function() {
+                       appInstalled = true;
+                       if ( promptInstallTimeout ) {
+                               window.clearTimeout( promptInstallTimeout );
+                       }
+               } );
+               startTime = (new Date).getTime();
+               try {
+                       window.location = vlcUrl;
+               } catch( e ) {
+                       // Just to be safe, ignore any exceptions
+                       // However, it appears iOS doesn't throw any. Other 
browsers do.
+               }
+               promptInstallTimeout = window.setTimeout( function() {
+                       var install;
+                       if ( appInstalled ) {
+                               return;
+                       }
+                       if ( document.hidden || document.webkitHidden ) {
+                               // browser still running, but in background.
+                               // probably means an App was opened up.
+                               return;
+                       }
+                       if ( (new Date).getTime() - 15000 > startTime ) {
+                               // We switched to VLC more than fifteen seconds 
ago.
+                               // Probably we succesfully switched and the 
other detection
+                               // methods failed.
+                               return;
+                       }
+                       install = confirm( mw.msg( 
'mwe-embedplayer-vlcapp-vlcapppopup' ) );
+                       if ( install ) {
+                               window.location = appStoreUrl;
+                       }
+               // Note about timeout: iPad air needs longer than an iPhone
+               }, 1000 );
+       }
+};
+
+} )( window.mediaWiki, window.jQuery );
diff --git a/MwEmbedModules/EmbedPlayer/resources/mw.EmbedTypes.js 
b/MwEmbedModules/EmbedPlayer/resources/mw.EmbedTypes.js
index aa5ff47..3749f80 100644
--- a/MwEmbedModules/EmbedPlayer/resources/mw.EmbedTypes.js
+++ b/MwEmbedModules/EmbedPlayer/resources/mw.EmbedTypes.js
@@ -76,6 +76,19 @@
 //var vlcMimeList = ['video/ogg', 'audio/ogg', 'audio/mpeg', 
'application/ogg', 'video/x-flv', 'video/mp4', 'video/h264', 'video/x-msvideo', 
'video/mpeg', 'video/3gp'];
 //var vlcPlayer = new mw.MediaPlayer( 'vlc-player', vlcMimeList, 'Vlc' );
 
+var vlcAppPlayer = new mw.MediaPlayer( 'vlcAppPlayer', [
+       'video/ogg',
+       'video/ogg; codecs="theora"',
+       'video/ogg; codecs="theora, vorbis"',
+       'audio/ogg',
+       'audio/ogg; codecs="vorbis"',
+       'audio/ogg; codecs="opus"',
+       'application/ogg',
+       'video/webm',
+       'video/webm; codecs="vp8"',
+       'video/webm; codecs="vp8, vorbis"',
+], 'VLCApp' );
+
 // Generic plugin
 //var oggPluginPlayer = new mw.MediaPlayer( 'oggPlugin', ['video/ogg', 
'application/ogg'], 'Generic' );
 
@@ -298,6 +311,9 @@
                        }
                }
 
+               if ( mw.isIOS() ) {
+                       this.mediaPlayers.addPlayer( vlcAppPlayer );
+               }
                // Allow extensions to detect and add their own "players"
                
mw.log("EmbedPlayer::trigger:embedPlayerUpdateMediaPlayersEvent");
                $( mw ).trigger( 'embedPlayerUpdateMediaPlayersEvent' , 
this.mediaPlayers );
diff --git a/MwEmbedModules/EmbedPlayer/resources/mw.MediaPlayers.js 
b/MwEmbedModules/EmbedPlayer/resources/mw.MediaPlayers.js
index 7d515e9..19e7fde 100644
--- a/MwEmbedModules/EmbedPlayer/resources/mw.MediaPlayers.js
+++ b/MwEmbedModules/EmbedPlayer/resources/mw.MediaPlayers.js
@@ -33,10 +33,10 @@
 
                this.defaultPlayers['application/vnd.apple.mpegurl'] = 
['Native'];
 
-               this.defaultPlayers['video/ogg'] = ['Native', 'Vlc', 'Java', 
'Generic'];
-               this.defaultPlayers['video/webm'] = ['Native', 'Vlc'];
-               this.defaultPlayers['application/ogg'] = ['Native', 'Vlc', 
'Java', 'Generic'];
-               this.defaultPlayers['audio/ogg'] = ['Native', 'Vlc', 'Java' ];
+               this.defaultPlayers['video/ogg'] = ['Native', 'Vlc', 'Java', 
'Generic', 'VLCApp'];
+               this.defaultPlayers['video/webm'] = ['Native', 'Vlc', 'VLCApp'];
+               this.defaultPlayers['application/ogg'] = ['Native', 'Vlc', 
'Java', 'Generic', 'VLCApp'];
+               this.defaultPlayers['audio/ogg'] = ['Native', 'Vlc', 'Java', 
'VLCApp'];
                this.defaultPlayers['audio/mpeg']= ['Native', 'Kplayer'];
                this.defaultPlayers['audio/mp3']= ['Native', 'Kplayer'];
                this.defaultPlayers['audio/mp4']= ['Native'];
diff --git 
a/MwEmbedModules/EmbedPlayer/resources/skins/mw.PlayerControlBuilder.js 
b/MwEmbedModules/EmbedPlayer/resources/skins/mw.PlayerControlBuilder.js
index bea9458..98602da 100644
--- a/MwEmbedModules/EmbedPlayer/resources/skins/mw.PlayerControlBuilder.js
+++ b/MwEmbedModules/EmbedPlayer/resources/skins/mw.PlayerControlBuilder.js
@@ -1354,6 +1354,11 @@
                        return false;
                }
 
+               // Not a lot of good options for an iPhone
+               if( this.embedPlayer.instanceOf == 'VLCApp' ){
+                       return false;
+               }
+
                // Chrome's webM support is oky though:
                if( /chrome/.test(navigator.userAgent.toLowerCase() ) &&
                        mw.EmbedTypes.getMediaPlayers().getMIMETypePlayers( 
'video/webm' ).length ){

-- 
To view, visit https://gerrit.wikimedia.org/r/144349
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: I6c3b5d8aadbd69577df3fe513f780f69708450d5
Gerrit-PatchSet: 3
Gerrit-Project: mediawiki/extensions/TimedMediaHandler
Gerrit-Branch: master
Gerrit-Owner: Brian Wolff <bawolff...@gmail.com>
Gerrit-Reviewer: Brian Wolff <bawolff...@gmail.com>
Gerrit-Reviewer: Brion VIBBER <br...@wikimedia.org>
Gerrit-Reviewer: Gilles <gdu...@wikimedia.org>
Gerrit-Reviewer: Siebrand <siebr...@kitano.nl>
Gerrit-Reviewer: jenkins-bot <>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to