mirror of
https://codeberg.org/streams/streams.git
synced 2024-09-19 21:55:15 +00:00
New library for extracting mp3 album art. The old one was hopelessly broken and unsupported. Requires composer install or update.
This commit is contained in:
parent
bed9fb86b8
commit
0163fd23c9
15 changed files with 56 additions and 506 deletions
|
@ -2,11 +2,7 @@
|
||||||
|
|
||||||
namespace Code\Thumbs;
|
namespace Code\Thumbs;
|
||||||
|
|
||||||
require_once('library/php-id3/PhpId3/Id3TagsReader.php');
|
use wapmorgan\Mp3Info\Mp3Info;
|
||||||
require_once('library/php-id3/PhpId3/BinaryFileReader.php');
|
|
||||||
require_once('library/php-id3/PhpId3/Id3Tags.php');
|
|
||||||
|
|
||||||
use PhpId3\Id3TagsReader;
|
|
||||||
|
|
||||||
class Mp3audio
|
class Mp3audio
|
||||||
{
|
{
|
||||||
|
@ -19,19 +15,12 @@ class Mp3audio
|
||||||
public function Thumb($attach, $preview_style, $height = 300, $width = 300)
|
public function Thumb($attach, $preview_style, $height = 300, $width = 300)
|
||||||
{
|
{
|
||||||
|
|
||||||
$fh = @fopen(dbunescbin($attach['content']), 'rb');
|
$audio = new Mp3Info($attach['content'], true);
|
||||||
if ($fh === false) {
|
if (! $audio->hasCover) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
$id3 = new Id3TagsReader($fh);
|
|
||||||
$id3->readAllTags();
|
|
||||||
|
|
||||||
$image = $id3->getImage();
|
$photo = $audio->getCover();
|
||||||
if (is_array($image)) {
|
|
||||||
$photo = $image[1];
|
|
||||||
}
|
|
||||||
|
|
||||||
fclose($fh);
|
|
||||||
|
|
||||||
if ($photo) {
|
if ($photo) {
|
||||||
$image = imagecreatefromstring($photo);
|
$image = imagecreatefromstring($photo);
|
||||||
|
|
|
@ -39,7 +39,8 @@
|
||||||
"ext-json": "*",
|
"ext-json": "*",
|
||||||
"symfony/yaml": "^5.4",
|
"symfony/yaml": "^5.4",
|
||||||
"symfony/uid": "^5.4",
|
"symfony/uid": "^5.4",
|
||||||
"symfony/mailer": "^5.4"
|
"symfony/mailer": "^5.4",
|
||||||
|
"wapmorgan/mp3info": "^0.0.8"
|
||||||
},
|
},
|
||||||
"require-dev" : {
|
"require-dev" : {
|
||||||
"phpunit/phpunit" : "@stable",
|
"phpunit/phpunit" : "@stable",
|
||||||
|
|
51
composer.lock
generated
51
composer.lock
generated
|
@ -4,7 +4,7 @@
|
||||||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
||||||
"This file is @generated automatically"
|
"This file is @generated automatically"
|
||||||
],
|
],
|
||||||
"content-hash": "a27d00681fe935f0f31de7359c0d24b4",
|
"content-hash": "47010e9f19209fb51bf8324c91a3da4b",
|
||||||
"packages": [
|
"packages": [
|
||||||
{
|
{
|
||||||
"name": "blueimp/jquery-file-upload",
|
"name": "blueimp/jquery-file-upload",
|
||||||
|
@ -3465,6 +3465,55 @@
|
||||||
"source": "https://github.com/voku/stop-words/tree/master"
|
"source": "https://github.com/voku/stop-words/tree/master"
|
||||||
},
|
},
|
||||||
"time": "2018-11-23T01:37:27+00:00"
|
"time": "2018-11-23T01:37:27+00:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "wapmorgan/mp3info",
|
||||||
|
"version": "0.0.8",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/wapmorgan/Mp3Info.git",
|
||||||
|
"reference": "13d1c142a75ca5bf63dd29d706c9a93d8436dbcb"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/wapmorgan/Mp3Info/zipball/13d1c142a75ca5bf63dd29d706c9a93d8436dbcb",
|
||||||
|
"reference": "13d1c142a75ca5bf63dd29d706c9a93d8436dbcb",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"ext-mbstring": "*",
|
||||||
|
"php": ">=5.4.0"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"wapmorgan/terminal-info": "dev-master"
|
||||||
|
},
|
||||||
|
"bin": [
|
||||||
|
"bin/mp3scan"
|
||||||
|
],
|
||||||
|
"type": "library",
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"wapmorgan\\Mp3Info\\": "src/"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"LGPL-3.0"
|
||||||
|
],
|
||||||
|
"description": "The fastest php library to extract mp3 tags & meta information.",
|
||||||
|
"keywords": [
|
||||||
|
"audio",
|
||||||
|
"id3",
|
||||||
|
"id3v1",
|
||||||
|
"id3v2",
|
||||||
|
"mp3",
|
||||||
|
"mpeg"
|
||||||
|
],
|
||||||
|
"support": {
|
||||||
|
"issues": "https://github.com/wapmorgan/Mp3Info/issues",
|
||||||
|
"source": "https://github.com/wapmorgan/Mp3Info/tree/0.0.8"
|
||||||
|
},
|
||||||
|
"time": "2022-06-15T23:39:26+00:00"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"packages-dev": [
|
"packages-dev": [
|
||||||
|
|
2
library/php-id3/.gitignore
vendored
2
library/php-id3/.gitignore
vendored
|
@ -1,2 +0,0 @@
|
||||||
/vendor/
|
|
||||||
/nbproject/private/
|
|
|
@ -1,20 +0,0 @@
|
||||||
The MIT License (MIT)
|
|
||||||
|
|
||||||
Copyright (c) 2013 Shubham Jain
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
||||||
this software and associated documentation files (the "Software"), to deal in
|
|
||||||
the Software without restriction, including without limitation the rights to
|
|
||||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
|
||||||
the Software, and to permit persons to whom the Software is furnished to do so,
|
|
||||||
subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
|
||||||
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
|
||||||
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
|
||||||
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
||||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
|
@ -1,134 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
namespace PhpId3;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A simple class to read variable byte length binary data.
|
|
||||||
* This is basically is a better replacement for unpack() function
|
|
||||||
* which creates a very large associative array.
|
|
||||||
*
|
|
||||||
* @author Shubham Jain <shubham.jain.1@gmail.com>
|
|
||||||
* @example https://github.com/shubhamjain/PHP-ID3
|
|
||||||
* @license MIT License
|
|
||||||
*/
|
|
||||||
class BinaryFileReader
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* size of block depends upon the variable defined in the next array element.
|
|
||||||
*/
|
|
||||||
const SIZE_OF = 1;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Block is read until NULL is encountered.
|
|
||||||
*/
|
|
||||||
const NULL_TERMINATED = 2;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Block is read until EOF is encountered.
|
|
||||||
*/
|
|
||||||
const EOF_TERMINATED = 3;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Block size is fixed.
|
|
||||||
*/
|
|
||||||
const FIXED = 4;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Datatypes to transform the read block
|
|
||||||
*/
|
|
||||||
const INT = 5;
|
|
||||||
|
|
||||||
const FLOAT = 6;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* file handle to read data
|
|
||||||
*/
|
|
||||||
private $fp;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Associative array of Varaibles and their info ( TYPE, SIZE, DATA_TYPE)
|
|
||||||
* In special cases it can be an array to handle different types of block data lengths
|
|
||||||
*/
|
|
||||||
private $map;
|
|
||||||
|
|
||||||
public function __construct($fp, array $map)
|
|
||||||
{
|
|
||||||
$this->fp = $fp;
|
|
||||||
$this->setMap($map);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function setMap($map)
|
|
||||||
{
|
|
||||||
$this->map = $map;
|
|
||||||
|
|
||||||
foreach ($this->map as $key => $size) {
|
|
||||||
//Create property from keys of $map
|
|
||||||
$this->$key = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public function read()
|
|
||||||
{
|
|
||||||
if (feof($this->fp)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach ($this->map as $key => $info) {
|
|
||||||
|
|
||||||
$this->fillTag($info, $key);
|
|
||||||
|
|
||||||
if (isset($info[2])) {
|
|
||||||
$this->convertBinToNumeric($info[2], $key);
|
|
||||||
}
|
|
||||||
$this->$key = ltrim($this->$key, "\0x");
|
|
||||||
}
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
private function nullTeminated($key)
|
|
||||||
{
|
|
||||||
while ((int) bin2hex(($ch = fgetc($this->fp))) !== 0) {
|
|
||||||
$this->$key .= $ch;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private function eofTerminated($key)
|
|
||||||
{
|
|
||||||
while (!feof($this->fp)) {
|
|
||||||
$this->$key .= fgetc($this->fp);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private function fillTag($tag, $key)
|
|
||||||
{
|
|
||||||
switch ($tag[0]) {
|
|
||||||
case self::NULL_TERMINATED:
|
|
||||||
$this->nullTeminated($key);
|
|
||||||
break;
|
|
||||||
case self::EOF_TERMINATED:
|
|
||||||
$this->eofTerminated($key);
|
|
||||||
break;
|
|
||||||
case self::SIZE_OF:
|
|
||||||
//If the variable is not an integer return false
|
|
||||||
if (!( $tag[1] = $this->$tag[1] )) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
//Read as string
|
|
||||||
$this->$key = fread($this->fp, $tag[1]);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private function convertBinToNumeric($value, $key)
|
|
||||||
{
|
|
||||||
switch ($value) {
|
|
||||||
case self::INT:
|
|
||||||
$this->$key = intval(bin2hex($this->$key), 16);
|
|
||||||
break;
|
|
||||||
case self::FLOAT:
|
|
||||||
$this->$key = floatval(bin2hex($this->$key), 16);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,86 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
namespace PhpId3;
|
|
||||||
|
|
||||||
class Id3Tags
|
|
||||||
{
|
|
||||||
public static function getId3Tags()
|
|
||||||
{
|
|
||||||
return array(
|
|
||||||
"AENC" => "Audio encryption",
|
|
||||||
"APIC" => "Attached picture",
|
|
||||||
"COMM" => "Comments",
|
|
||||||
"COMR" => "Commercial frame",
|
|
||||||
"ENCR" => "Encryption method registration",
|
|
||||||
"EQUA" => "Equalization",
|
|
||||||
"ETCO" => "Event timing codes",
|
|
||||||
"GEOB" => "General encapsulated object",
|
|
||||||
"GRID" => "Group identification registration",
|
|
||||||
"IPLS" => "Involved people list",
|
|
||||||
"LINK" => "Linked information",
|
|
||||||
"MCDI" => "Music CD identifier",
|
|
||||||
"MLLT" => "MPEG location lookup table",
|
|
||||||
"OWNE" => "Ownership frame",
|
|
||||||
"PRIV" => "Private frame",
|
|
||||||
"PCNT" => "Play counter",
|
|
||||||
"POPM" => "Popularimeter",
|
|
||||||
"POSS" => "Position synchronisation frame",
|
|
||||||
"RBUF" => "Recommended buffer size",
|
|
||||||
"RVAD" => "Relative volume adjustment",
|
|
||||||
"RVRB" => "Reverb",
|
|
||||||
"SYLT" => "Synchronized lyric/text",
|
|
||||||
"SYTC" => "Synchronized tempo codes",
|
|
||||||
"TALB" => "Album/Movie/Show title",
|
|
||||||
"TBPM" => "BPM (beats per minute)",
|
|
||||||
"TCOM" => "Composer",
|
|
||||||
"TCON" => "Content type",
|
|
||||||
"TCOP" => "Copyright message",
|
|
||||||
"TDAT" => "Date",
|
|
||||||
"TDLY" => "Playlist delay",
|
|
||||||
"TENC" => "Encoded by",
|
|
||||||
"TEXT" => "Lyricist/Text writer",
|
|
||||||
"TFLT" => "File type",
|
|
||||||
"TIME" => "Time",
|
|
||||||
"TIT1" => "Content group description",
|
|
||||||
"TIT2" => "Title/songname/content description",
|
|
||||||
"TIT3" => "Subtitle/Description refinement",
|
|
||||||
"TKEY" => "Initial key",
|
|
||||||
"TLAN" => "Language(s)",
|
|
||||||
"TLEN" => "Length",
|
|
||||||
"TMED" => "Media type",
|
|
||||||
"TOAL" => "Original album/movie/show title",
|
|
||||||
"TOFN" => "Original filename",
|
|
||||||
"TOLY" => "Original lyricist(s)/text writer(s)",
|
|
||||||
"TOPE" => "Original artist(s)/performer(s)",
|
|
||||||
"TORY" => "Original release year",
|
|
||||||
"TOWN" => "File owner/licensee",
|
|
||||||
"TPE1" => "Lead performer(s)/Soloist(s)",
|
|
||||||
"TPE2" => "Band/orchestra/accompaniment",
|
|
||||||
"TPE3" => "Conductor/performer refinement",
|
|
||||||
"TPE4" => "Interpreted, remixed, or otherwise modified by",
|
|
||||||
"TPOS" => "Part of a set",
|
|
||||||
"TPUB" => "Publisher",
|
|
||||||
"TRCK" => "Track number/Position in set",
|
|
||||||
"TRDA" => "Recording dates",
|
|
||||||
"TRSN" => "Internet radio station name",
|
|
||||||
"TRSO" => "Internet radio station owner",
|
|
||||||
"TSIZ" => "Size",
|
|
||||||
"TSRC" => "ISRC (international standard recording code)",
|
|
||||||
"TSSE" => "Software/Hardware and settings used for encoding",
|
|
||||||
"TYER" => "Year",
|
|
||||||
"TXXX" => "User defined text information frame",
|
|
||||||
"UFID" => "Unique file identifier",
|
|
||||||
"USER" => "Terms of use",
|
|
||||||
"USLT" => "Unsychronized lyric/text transcription",
|
|
||||||
"WCOM" => "Commercial information",
|
|
||||||
"WCOP" => "Copyright/Legal information",
|
|
||||||
"WOAF" => "Official audio file webpage",
|
|
||||||
"WOAR" => "Official artist/performer webpage",
|
|
||||||
"WOAS" => "Official audio source webpage",
|
|
||||||
"WORS" => "Official internet radio station homepage",
|
|
||||||
"WPAY" => "Payment",
|
|
||||||
"WPUB" => "Publishers official webpage",
|
|
||||||
"WXXX" => "User defined URL link frame",
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,107 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
namespace PhpId3;
|
|
||||||
|
|
||||||
use Exception;
|
|
||||||
use PhpId3\Id3Tags;
|
|
||||||
use PhpId3\BinaryFileReader;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Read ID3Tags and thumbnails.
|
|
||||||
*
|
|
||||||
* @author Shubham Jain <shubham.jain.1@gmail.com>
|
|
||||||
* @license MIT License
|
|
||||||
*/
|
|
||||||
class Id3TagsReader
|
|
||||||
{
|
|
||||||
|
|
||||||
private $fileReader;
|
|
||||||
private $id3Array;
|
|
||||||
private $validMp3 = TRUE;
|
|
||||||
|
|
||||||
public function __construct($fileHandle)
|
|
||||||
{
|
|
||||||
$this->fileReader = new BinaryFileReader($fileHandle, array(
|
|
||||||
"id3" => array(BinaryFileReader::FIXED, 3),
|
|
||||||
"version" => array(BinaryFileReader::FIXED, 2),
|
|
||||||
"flag" => array(BinaryFileReader::FIXED, 1),
|
|
||||||
"sizeTag" => array(BinaryFileReader::FIXED, 4, BinaryFileReader::INT),
|
|
||||||
));
|
|
||||||
|
|
||||||
$data = $this->fileReader->read();
|
|
||||||
|
|
||||||
if( $data->id3 !== "ID3")
|
|
||||||
{
|
|
||||||
throw new Exception("The MP3 file contains no valid ID3 Tags.");
|
|
||||||
$this->validMp3 = FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public function readAllTags()
|
|
||||||
{
|
|
||||||
assert( $this->validMp3 === TRUE);
|
|
||||||
|
|
||||||
$bytesPos = 10; //From headers
|
|
||||||
|
|
||||||
$this->fileReader->setMap(array(
|
|
||||||
"frameId" => array(BinaryFileReader::FIXED, 4),
|
|
||||||
"size" => array(BinaryFileReader::FIXED, 4, BinaryFileReader::INT),
|
|
||||||
"flag" => array(BinaryFileReader::FIXED, 2),
|
|
||||||
"body" => array(BinaryFileReader::SIZE_OF, "size"),
|
|
||||||
));
|
|
||||||
|
|
||||||
$id3Tags = Id3Tags::getId3Tags();
|
|
||||||
|
|
||||||
while (($file_data = $this->fileReader->read())) {
|
|
||||||
|
|
||||||
if (!in_array($file_data->frameId, array_keys($id3Tags))) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
$body = $file_data->body;
|
|
||||||
|
|
||||||
// If frame is a text frame then we have to consider
|
|
||||||
// encoding as shown in spec section 4.2
|
|
||||||
if( $file_data->frameId[0] === "T" )
|
|
||||||
{
|
|
||||||
// First character determines the encoding, 1 = ISO-8859-1, 0 = UTF - 16
|
|
||||||
if( intval(bin2hex($body[0]), 16) === 1)
|
|
||||||
$body = mb_convert_encoding(substr($body, 1), 'UTF-8', 'UTF-16'); // Convert UTF-16 to UTF-8 to compatible with current browsers
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->id3Array[$file_data->frameId] = array(
|
|
||||||
"fullTagName" => $id3Tags[$file_data->frameId],
|
|
||||||
"position" => $bytesPos,
|
|
||||||
"size" => $file_data->size,
|
|
||||||
"body" => $body,
|
|
||||||
);
|
|
||||||
|
|
||||||
$bytesPos += 4 + 4 + 2 + $file_data->size;
|
|
||||||
}
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getId3Array()
|
|
||||||
{
|
|
||||||
return $this->id3Array;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getImage()
|
|
||||||
{
|
|
||||||
$fp = fopen('data://text/plain;base64,' . base64_encode($this->id3Array["APIC"]["body"]), 'rb'); //Create an artificial stream from Image data
|
|
||||||
|
|
||||||
$fileReader = new BinaryFileReader($fp, array(
|
|
||||||
"textEncoding" => array(BinaryFileReader::FIXED, 1),
|
|
||||||
"mimeType" => array(BinaryFileReader::NULL_TERMINATED),
|
|
||||||
"fileName" => array(BinaryFileReader::NULL_TERMINATED),
|
|
||||||
"contentDesc" => array(BinaryFileReader::NULL_TERMINATED),
|
|
||||||
"binaryData" => array(BinaryFileReader::EOF_TERMINATED)
|
|
||||||
)
|
|
||||||
);
|
|
||||||
|
|
||||||
$imageData = $fileReader->read();
|
|
||||||
|
|
||||||
return array($imageData->mimeType, $imageData->binaryData);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,55 +0,0 @@
|
||||||
#PHP-ID3
|
|
||||||
|
|
||||||
PHP-ID3 makes use of native PHP to read [ID3 Tags](http://en.wikipedia.org/wiki/ID3) and thumbnail from a MP3 file. There have been many revisions to ID3 Tags specification; this program makes use of v3.2 of the [spec](http://id3.org/id3v2.3.0).
|
|
||||||
|
|
||||||
To read binary data more effectively, I have created a sclass, [BinaryFileReader](https://gist.github.com/shubhamjain/5964350), which reads data in named chunks.
|
|
||||||
|
|
||||||
##How to Install
|
|
||||||
|
|
||||||
Into your composer.json
|
|
||||||
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"require" : {
|
|
||||||
"shubhamjain/php-id3": "dev-master"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
##How to Use
|
|
||||||
|
|
||||||
You will first need to include the autoload.php generated by composer and then you can use the classes in PhpId3 namespace.
|
|
||||||
|
|
||||||
```php
|
|
||||||
<?php
|
|
||||||
|
|
||||||
require 'vendor/autoload.php';
|
|
||||||
|
|
||||||
//...
|
|
||||||
use PhpId3\Id3TagsReader;
|
|
||||||
|
|
||||||
//...
|
|
||||||
$id3 = new Id3TagsReader(fopen("Exodus - 06 - Piranha.mp3", "rb"));
|
|
||||||
|
|
||||||
$id3->readAllTags(); //Calling this is necesarry before others
|
|
||||||
|
|
||||||
foreach($id3->getId3Array() as $key => $value) {
|
|
||||||
if( $key !== "APIC" ) { //Skip Image data
|
|
||||||
echo $value["FullTagName"] . ": " . $value["Body"] . "<br />";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
list($mimeType, $image) = $id3->getImage();
|
|
||||||
|
|
||||||
file_put_contents("thumb.jpeg", $image ); //Note the image type depends upon MimeType
|
|
||||||
|
|
||||||
//...
|
|
||||||
```
|
|
||||||
|
|
||||||
##LICENSE
|
|
||||||
|
|
||||||
See ``LICENSE`` for more informations
|
|
||||||
|
|
||||||
##Feedback
|
|
||||||
|
|
||||||
If you used this project or liked it or have any doubt about the source, send your valuable thoughts at <shubham.jain.1@gmail.com>.
|
|
|
@ -1,43 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
namespace PhpId3\Tests;
|
|
||||||
|
|
||||||
use PhpId3\Id3TagsReader;
|
|
||||||
use PHPUnit_Framework_TestCase;
|
|
||||||
|
|
||||||
class GenerateCvCommandTest extends PHPUnit_Framework_TestCase
|
|
||||||
{
|
|
||||||
private $id3;
|
|
||||||
|
|
||||||
private $mp3File = "/TestFiles/Exodus - 06 - Piranha.mp3";
|
|
||||||
|
|
||||||
private $albumCover = "/TestFiles/thumb.jpeg";
|
|
||||||
|
|
||||||
protected function setUp()
|
|
||||||
{
|
|
||||||
$this->id3 = new Id3TagsReader(fopen(__DIR__ . $this->mp3File, "rb"));
|
|
||||||
$this->id3->readAllTags();
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testGetImage()
|
|
||||||
{
|
|
||||||
$image = $this->id3->getImage();
|
|
||||||
|
|
||||||
$this->assertEquals("mage/jpg", $image[0]);
|
|
||||||
$this->assertEquals(file_get_contents(__DIR__ . $this->albumCover), $image[1]);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testGetId3TagsArray()
|
|
||||||
{
|
|
||||||
$id3Tags = $this->id3->getId3Array();
|
|
||||||
|
|
||||||
$this->assertEquals($id3Tags["TIT2"]["body"], 'Piranha');
|
|
||||||
$this->assertEquals($id3Tags["TRCK"]["body"], '6');
|
|
||||||
$this->assertEquals($id3Tags["TCON"]["body"], 'Heavy Metal');
|
|
||||||
$this->assertEquals($id3Tags["TALB"]["body"], 'Bonded by Blood');
|
|
||||||
$this->assertEquals($id3Tags["TYER"]["body"], '1985');
|
|
||||||
$this->assertEquals($id3Tags["TPE1"]["body"], 'Exodus');
|
|
||||||
$this->assertEquals($id3Tags["TLEN"]["body"], '228963');
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
Binary file not shown.
Binary file not shown.
Before Width: | Height: | Size: 15 KiB |
|
@ -1,7 +0,0 @@
|
||||||
<?php
|
|
||||||
$file = __DIR__ . '/../vendor/autoload.php';
|
|
||||||
if (!file_exists($file)) {
|
|
||||||
throw new RuntimeException('Install dependencies to run test suite.');
|
|
||||||
}
|
|
||||||
|
|
||||||
require_once $file;
|
|
|
@ -1,17 +0,0 @@
|
||||||
{
|
|
||||||
"name": "shubhamjain/php-id3",
|
|
||||||
"description": "A MP3 ID3 tags reader in native PHP",
|
|
||||||
"license": "MIT",
|
|
||||||
"authors": [
|
|
||||||
{
|
|
||||||
"name": "Shubham Jain",
|
|
||||||
"email": "shubham.jain.1@gmail.com"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"autoload": {
|
|
||||||
"psr-0": { "PhpId3" : "" }
|
|
||||||
},
|
|
||||||
"require": {
|
|
||||||
"php": ">=5.3.3"
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,18 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<phpunit bootstrap="./Tests/bootstrap.php" colors="true">
|
|
||||||
<testsuites>
|
|
||||||
<testsuite name="PhpId3 test suite">
|
|
||||||
<directory suffix="Test.php">./Tests</directory>
|
|
||||||
</testsuite>
|
|
||||||
</testsuites>
|
|
||||||
<filter>
|
|
||||||
<whitelist>
|
|
||||||
<directory>./</directory>
|
|
||||||
<exclude>
|
|
||||||
<directory>./Resources</directory>
|
|
||||||
<directory>./Tests</directory>
|
|
||||||
<directory>./vendor</directory>
|
|
||||||
</exclude>
|
|
||||||
</whitelist>
|
|
||||||
</filter>
|
|
||||||
</phpunit>
|
|
Loading…
Reference in a new issue