jenkins-bot has submitted this change and it was merged. ( 
https://gerrit.wikimedia.org/r/349622 )

Change subject: TMH: Add support for MP3 upload and playback
......................................................................


TMH: Add support for MP3 upload and playback

Adds $wgTmhEnableMp3Uploads switch, off by default. Flip this when
legal signs off.

MP3 files uploaded into the wiki can be either played back directly
or via Ogg Vorbis transcode, depending on browser support. Currently
does not include transcodes _to_ MP3.

Bug: T115170
Change-Id: I2b59f828d70a961e34b58414c24bbff0098b979f
---
M MwEmbedModules/EmbedPlayer/EmbedPlayer.config.php
M MwEmbedModules/EmbedPlayer/resources/mw.EmbedTypes.js
M MwEmbedModules/EmbedPlayer/resources/mw.processEmbedPlayers.js
M TimedMediaHandler.hooks.php
M TimedMediaHandler.php
A handlers/Mp3Handler/Mp3Handler.php
M i18n/en.json
M i18n/qqq.json
8 files changed, 92 insertions(+), 19 deletions(-)

Approvals:
  jenkins-bot: Verified
  Jforrester: Looks good to me, approved



diff --git a/MwEmbedModules/EmbedPlayer/EmbedPlayer.config.php 
b/MwEmbedModules/EmbedPlayer/EmbedPlayer.config.php
index af32b4d..59fa159 100644
--- a/MwEmbedModules/EmbedPlayer/EmbedPlayer.config.php
+++ b/MwEmbedModules/EmbedPlayer/EmbedPlayer.config.php
@@ -10,7 +10,7 @@
 
                        // The preferred media codec preference
                        // Note user selected format order
-                       'EmbedPlayer.CodecPreference' => array( 'vp9', 'webm', 
'h264', 'ogg' ),
+                       'EmbedPlayer.CodecPreference' => array( 'vp9', 'webm', 
'h264', 'ogg', 'mp3' ),
 
                        // If video tag support should be disabled 
all-together, used to test
                        // fallback decoding methods and direct file links
diff --git a/MwEmbedModules/EmbedPlayer/resources/mw.EmbedTypes.js 
b/MwEmbedModules/EmbedPlayer/resources/mw.EmbedTypes.js
index 21b2f45..b0a2aff 100644
--- a/MwEmbedModules/EmbedPlayer/resources/mw.EmbedTypes.js
+++ b/MwEmbedModules/EmbedPlayer/resources/mw.EmbedTypes.js
@@ -137,21 +137,6 @@
                return this.mediaPlayers;
        },
 
-       /**
-        * If the browsers supports a given mimetype
-        *
-        * @param {String}
-        *      mimeType Mime type for browser plug-in check
-        */
-       supportedMimeType: function( mimeType ) {
-               for ( var i =0; i < navigator.plugins.length; i++ ) {
-                       var plugin = navigator.plugins[i];
-                       if ( typeof plugin[ mimeType ] != "undefined" ){
-                               return true;
-                       }
-               }
-               return false;
-       },
        addFlashPlayer: function(){
                if( !mw.config.get( 'EmbedPlayer.DisableHTML5FlashFallback' ) ){
                        this.mediaPlayers.addPlayer( kplayer );
@@ -208,7 +193,7 @@
                                        }
 
                                        // Test for MP3:
-                                       if ( 
this.supportedMimeType('audio/mpeg') ) {
+                                       if ( dummyvid.canPlayType('audio/mpeg') 
) {
                                                        
this.mediaPlayers.addPlayer( mp3NativePlayer );
                                        }
 
diff --git a/MwEmbedModules/EmbedPlayer/resources/mw.processEmbedPlayers.js 
b/MwEmbedModules/EmbedPlayer/resources/mw.processEmbedPlayers.js
index 31308c0..e9f3553 100644
--- a/MwEmbedModules/EmbedPlayer/resources/mw.processEmbedPlayers.js
+++ b/MwEmbedModules/EmbedPlayer/resources/mw.processEmbedPlayers.js
@@ -151,6 +151,7 @@
                }
                // If we don't have a native player don't wait for metadata
                if( !mw.EmbedTypes.getMediaPlayers().isSupportedPlayer( 
'oggNative') &&
+                       !mw.EmbedTypes.getMediaPlayers().isSupportedPlayer( 
'mp3Native') &&
                        !mw.EmbedTypes.getMediaPlayers().isSupportedPlayer( 
'webmNative') &&
                        !mw.EmbedTypes.getMediaPlayers().isSupportedPlayer( 
'h264Native' ) &&
                        !mw.EmbedTypes.getMediaPlayers().isSupportedPlayer( 
'appleVdnPlayer' ) )
diff --git a/TimedMediaHandler.hooks.php b/TimedMediaHandler.hooks.php
index 78a5f1e..69010dd 100644
--- a/TimedMediaHandler.hooks.php
+++ b/TimedMediaHandler.hooks.php
@@ -207,7 +207,7 @@
        public static function register() {
                global $wgHooks, $wgJobClasses, 
$wgJobTypesExcludedFromDefaultQueue, $wgMediaHandlers,
                $wgResourceModules, $wgExcludeFromThumbnailPurge,
-               $wgFileExtensions, $wgTmhEnableMp4Uploads, 
$wgExtensionAssetsPath,
+               $wgFileExtensions, $wgTmhEnableMp3Uploads, 
$wgTmhEnableMp4Uploads, $wgExtensionAssetsPath,
                $wgMwEmbedModuleConfig, $wgEnableLocalTimedText, 
$wgTmhFileExtensions,
                $wgTmhTheoraTwoPassEncoding, $wgWikimediaJenkinsCI;
 
@@ -216,6 +216,14 @@
                        global $wgEnableTranscode, $wgFFmpegLocation;
                        $wgEnableTranscode = false;
                        $wgFFmpegLocation = '/usr/bin/ffmpeg';
+               }
+
+               // Remove mp3 if not enabled:
+               if ( $wgTmhEnableMp3Uploads === false ) {
+                       $index = array_search( 'mp3', $wgFileExtensions );
+                       if ( $index !== false ) {
+                               array_splice( $wgFileExtensions, $index, 1 );
+                       }
                }
 
                // Remove mp4 if not enabled:
@@ -258,6 +266,7 @@
                $wgMediaHandlers['audio/x-flac'] = 'FLACHandler';
                $wgMediaHandlers['audio/flac'] = 'FLACHandler';
                $wgMediaHandlers['audio/wav'] = 'WAVHandler';
+               $wgMediaHandlers['audio/mpeg'] = 'Mp3Handler';
 
                // Add transcode job class:
                $wgJobClasses['webVideoTranscode'] = 'WebVideoTranscodeJob';
diff --git a/TimedMediaHandler.php b/TimedMediaHandler.php
index 983cdb0..919c3b2 100644
--- a/TimedMediaHandler.php
+++ b/TimedMediaHandler.php
@@ -227,6 +227,9 @@
        // WebVideoTranscode::ENC_AAC,
 ];
 
+// If mp3 source assets can be ingested:
+$wgTmhEnableMp3Uploads = false;
+
 // If mp4 source assets can be ingested:
 $wgTmhEnableMp4Uploads = false;
 
@@ -240,7 +243,7 @@
 // List of extensions handled by Timed Media Handler since its referenced in a 
few places.
 // you should not modify this variable
 
-$wgTmhFileExtensions = [ 'ogg', 'ogv', 'oga', 'flac', 'opus', 'wav', 'webm', 
'mp4' ];
+$wgTmhFileExtensions = [ 'ogg', 'ogv', 'oga', 'flac', 'opus', 'wav', 'webm', 
'mp4', 'mp3' ];
 
 $wgFileExtensions = array_merge( $wgFileExtensions, $wgTmhFileExtensions );
 
@@ -296,6 +299,8 @@
 $wgAutoloadClasses['FLACHandler'] = 
"$timedMediaDir/handlers/FLACHandler/FLACHandler.php";
 // WAV Handler
 $wgAutoloadClasses['WAVHandler'] = 
"$timedMediaDir/handlers/WAVHandler/WAVHandler.php";
+// Mp3 Handler
+$wgAutoloadClasses['Mp3Handler'] = 
"$timedMediaDir/handlers/Mp3Handler/Mp3Handler.php";
 
 // Text handler
 $wgAutoloadClasses['TextHandler'] = 
"$timedMediaDir/handlers/TextHandler/TextHandler.php";
diff --git a/handlers/Mp3Handler/Mp3Handler.php 
b/handlers/Mp3Handler/Mp3Handler.php
new file mode 100644
index 0000000..f36c8c7
--- /dev/null
+++ b/handlers/Mp3Handler/Mp3Handler.php
@@ -0,0 +1,69 @@
+<?php
+/**
+ * Mp3 handler
+ */
+class Mp3Handler extends ID3Handler {
+
+       /**
+        * @param $image
+        * @return string
+        */
+       function getMetadataType( $image ) {
+               return 'mp3';
+       }
+       /**
+        * @param $file File
+        */
+       function getWebType( $file ) {
+               return 'audio/mpeg';
+       }
+       /**
+        * @param $file File
+        * @return array|bool
+        */
+       function getStreamTypes( $file ) {
+               $streamTypes = [];
+               $metadata = self::unpackMetadata( $file->getMetadata() );
+               if ( !$metadata || isset( $metadata['error'] ) ) {
+                       return false;
+               }
+               if ( isset( $metadata['audio'] ) && 
$metadata['audio']['dataformat'] == 'mp3' ) {
+                       $streamTypes[] =  'MP3';
+               }
+               return $streamTypes;
+       }
+
+       /**
+        * @param $file File
+        * @return String
+        */
+       function getShortDesc( $file ) {
+               $streamTypes = $this->getStreamTypes( $file );
+               if ( !$streamTypes ) {
+                       return parent::getShortDesc( $file );
+               }
+               return wfMessage( 'timedmedia-mp3-short-audio'
+               )->timeperiodParams(
+                       $this->getLength( $file )
+               )->text();
+       }
+
+       /**
+        * @param $file File
+        * @return String
+        */
+       function getLongDesc( $file ) {
+               $streamTypes = $this->getStreamTypes( $file );
+               if ( !$streamTypes ) {
+                       return parent::getLongDesc( $file );
+               }
+               return wfMessage(
+                       'timedmedia-mp3-long-audio'
+                       )->timeperiodParams(
+                               $this->getLength( $file )
+                       )->bitrateParams(
+                               $this->getBitRate( $file )
+                       )->text();
+       }
+
+}
diff --git a/i18n/en.json b/i18n/en.json
index 9b198c9..2b9b6a9 100644
--- a/i18n/en.json
+++ b/i18n/en.json
@@ -20,6 +20,8 @@
        "timedmedia-wav-short-audio": "WAV audio file, $1",
        "timedmedia-wav-long-audio": "WAV audio file, length $1, $2 overall",
        "timedmedia-wav-pcm-required": "You can only upload PCM (Pulse Code 
Modulation) WAV.",
+       "timedmedia-mp3-short-audio": "MP3 audio file, $1",
+       "timedmedia-mp3-long-audio": "MP3 audio file, length $1, $2 overall",
        "timedmedia-mp4-short-video": "MP4 $1 video file, $2",
        "timedmedia-mp4-long-video": "MP4 audio/video file, $1, length $2, $4 × 
$5 pixels, $3 overall",
        "timedmedia-more": "More…",
diff --git a/i18n/qqq.json b/i18n/qqq.json
index d308749..fbe4c68 100644
--- a/i18n/qqq.json
+++ b/i18n/qqq.json
@@ -38,6 +38,8 @@
        "timedmedia-wav-short-audio": "File details for WAV audio files, short 
version.\nParameters:\n* $1 - duration of the audio (localized) - e.g. 
1m34s\nSee also:\n* {{msg-mw|Timedmedia-wav-long-audio}}",
        "timedmedia-wav-long-audio": "File details for WAV files, long 
version.\nShown after the filename in the image description 
page.\n\nParameters:\n* $1 - duration of the audio (localized) - e.g. 1m34s\n* 
$2 - bit-rate (localized) - e.g. 97kbps\nSee also:\n* 
{{msg-mw|Timedmedia-wav-short-audio}}",
        "timedmedia-wav-pcm-required": "Message shown at upload if user tries 
to upload a WAV file using a codec that is not PCM",
+       "timedmedia-mp3-short-audio": "File details for MP3 audio files, short 
version.\nParameters:\n* $1 - duration of the audio (localized) - e.g. 
1m34s\n\nPrimarily used on [[Special:Search]] results pages, i.e.\n 
https://commons.wikimedia.org/w/index.php?title=Special%3ASearch&profile=advanced&search=What%27s+a+love+dart&fulltext=Search&ns6=1&profile=advanced\n\nSee
 also:\n* {{msg-mw|Timedmedia-mp3-long-audio}}\n* 
{{msg-mw|Timedmedia-ogg-short-audio}}",
+       "timedmedia-mp3-long-audio": "File details for MP3 files, long 
version.\n\nShown after the filename in the image description 
page.\n\nParameters:\n* $1 - duration (localized) - e.g. 1m34s\n* $2 - bit-rate 
(localized) - e.g. 97kbps\nSee also:\n* {{msg-mw|Timedmedia-mp3-short-audio}}",
        "timedmedia-mp4-short-video": "File details for MP4 video files, short 
version.\nParameters:\n* $1 - stream type names (slash separated) - e.g. 
AAC/h.264\n* $2 - duration of the video (localized) - e.g. 1m34s\nSee also:\n* 
{{msg-mw|Timedmedia-mp4-long-video}}",
        "timedmedia-mp4-long-video": "File details for MP4 multiplexed 
audio/video files, long version.\n\nShown after the filename in the image 
description page.\n\nParameters:\n* $1 - stream type names (slash separated) - 
e.g. AAC/h.264\n* $2 - duration (localized) - e.g. 1m34s\n* $3 - bit-rate 
(localized) - e.g. 97kbps\n* $4 - width of the video (in pixels)\n* $5 - height 
of the video (in pixels)\nSee also:\n* {{msg-mw|Timedmedia-mp4-short-video}}",
        "timedmedia-more": "Unused at this time.\n{{Identical|More...}}",

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

Gerrit-MessageType: merged
Gerrit-Change-Id: I2b59f828d70a961e34b58414c24bbff0098b979f
Gerrit-PatchSet: 3
Gerrit-Project: mediawiki/extensions/TimedMediaHandler
Gerrit-Branch: master
Gerrit-Owner: TheDJ <hartman.w...@gmail.com>
Gerrit-Reviewer: Brion VIBBER <br...@wikimedia.org>
Gerrit-Reviewer: Jforrester <jforres...@wikimedia.org>
Gerrit-Reviewer: Legoktm <lego...@member.fsf.org>
Gerrit-Reviewer: Paladox <thomasmulhall...@yahoo.com>
Gerrit-Reviewer: Reedy <re...@wikimedia.org>
Gerrit-Reviewer: TheDJ <hartman.w...@gmail.com>
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