summaryrefslogtreecommitdiff
path: root/extensions/TimedMediaHandler/handlers/ID3Handler/ID3Handler.php
diff options
context:
space:
mode:
Diffstat (limited to 'extensions/TimedMediaHandler/handlers/ID3Handler/ID3Handler.php')
-rw-r--r--extensions/TimedMediaHandler/handlers/ID3Handler/ID3Handler.php107
1 files changed, 107 insertions, 0 deletions
diff --git a/extensions/TimedMediaHandler/handlers/ID3Handler/ID3Handler.php b/extensions/TimedMediaHandler/handlers/ID3Handler/ID3Handler.php
new file mode 100644
index 00000000..1e3ae4fb
--- /dev/null
+++ b/extensions/TimedMediaHandler/handlers/ID3Handler/ID3Handler.php
@@ -0,0 +1,107 @@
+<?php
+/**
+ * getID3 Metadata handler
+ */
+class ID3Handler extends TimedMediaHandler {
+ // XXX match GETID3_VERSION ( too bad version is not a getter )
+ const METADATA_VERSION = 2;
+
+ /**
+ * @param $path string
+ * @return array
+ */
+ protected function getID3( $path ) {
+ // Create new id3 object:
+ $getID3 = new getID3();
+
+ // Don't grab stuff we don't use:
+ $getID3->option_tag_id3v1 = false; // Read and process ID3v1 tags
+ $getID3->option_tag_id3v2 = false; // Read and process ID3v2 tags
+ $getID3->option_tag_lyrics3 = false; // Read and process Lyrics3 tags
+ $getID3->option_tag_apetag = false; // Read and process APE tags
+ $getID3->option_tags_process = false; // Copy tags to root key 'tags' and encode to $this->encoding
+ $getID3->option_tags_html = false; // Copy tags to root key 'tags_html' properly translated from various encodings to HTML entities
+
+ // Analyze file to get metadata structure:
+ $id3 = $getID3->analyze( $path );
+
+ // remove file paths
+ unset( $id3['filename'] );
+ unset( $id3['filepath'] );
+ unset( $id3['filenamepath']);
+
+ // Update the version
+ $id3['version'] = self::METADATA_VERSION;
+
+ return $id3;
+ }
+
+ /**
+ * @param $file File
+ * @param $path string
+ * @return string
+ */
+ function getMetadata( $file, $path ) {
+ $id3 = $this->getID3( $path );
+ return serialize( $id3 );
+ }
+
+ /**
+ * @param $metadata
+ * @return bool|mixed
+ */
+ function unpackMetadata( $metadata ) {
+ wfSuppressWarnings();
+ $unser = unserialize( $metadata );
+ wfRestoreWarnings();
+ if ( isset( $unser['version'] ) && $unser['version'] == self::METADATA_VERSION ) {
+ return $unser;
+ } else {
+ return false;
+ }
+ }
+
+ /**
+ * @param $file File
+ * @return mixed
+ */
+ function getBitrate( $file ){
+ $metadata = $this->unpackMetadata( $file->getMetadata() );
+ if ( !$metadata || isset( $metadata['error'] ) || !isset( $metadata['bitrate'] ) ) {
+ return 0;
+ } else {
+ return $metadata['bitrate'];
+ }
+ }
+
+ /**
+ * @param $file File
+ * @return int
+ */
+ function getLength( $file ) {
+ $metadata = $this->unpackMetadata( $file->getMetadata() );
+ if ( !$metadata || isset( $metadata['error'] ) || !isset( $metadata['playtime_seconds'] ) ) {
+ return 0;
+ } else {
+ return $metadata['playtime_seconds'];
+ }
+ }
+
+ /**
+ * @param $file File
+ * @return bool|int
+ */
+ function getFramerate( $file ){
+ $metadata = $this->unpackMetadata( $file->getMetadata() );
+ if ( !$metadata || isset( $metadata['error'] ) ) {
+ return 0;
+ } else {
+ // return the frame rate of the first found video stream:
+ if( isset( $metadata['video'] )
+ && isset( $metadata['video']['frame_rate'] ) ) {
+ return $metadata['video']['frame_rate'];
+ }
+ return false;
+ }
+ }
+}