la mise en art album d'un mp3 avec php
Question
Je cherche le meilleur ou tout autre moyen de mettre l'Art Album de mp3s en PHP.
Suggestions?
La solution
art album est une trame de données identifiées comme « image ci-joint » en raison spécification ID3v2 et getid3 () est maintenant une seule façon d'écrire toutes les trames de données possibles en ID3v2 avec PHP pur.
Regardez cette source: http://getid3.sourceforge.net/source/write.id3v2.phps
Rechercher ce texte dans la source:
// 4.14 APIC Attached picture
il y a un morceau de code responsable de l'écriture de l'album art.
Une autre façon, qui semble ne pas être aussi lent que PHP pur, est d'utiliser une application externe, qui sera lancé par le script PHP. Si votre service conçu pour fonctionner sous une charge élevée, outil binaire compilé sera une meilleure solution.
Autres conseils
Une meilleure (plus rapide) façon de le faire serait par une application externe et la fonction exec () de PHP pour le plaisir d'une commande. Je recommande eyed3 .
Je ne sais pas c'est toujours un problème, mais:
le getid3 étonnamment complet () ( http://getid3.org ) projet résoudra tous vos problèmes. Consultez ce post forum plus d'informations.
Installer getid3 en utilisant composer require james-heinrich/getid3
compositeur
Utilisez ensuite ce code pour mettre à jour vos tags ID3
// Initialize getID3 engine
$getID3 = new getID3;
// Initialize getID3 tag-writing module
$tagwriter = new getid3_writetags;
$tagwriter->filename = 'path/to/file.mp3';
$tagwriter->tagformats = array('id3v2.4');
$tagwriter->overwrite_tags = true;
$tagwriter->remove_other_tags = true;
$tagwriter->tag_encoding = 'UTF-8';
$pictureFile = file_get_contents("path/to/image.jpg");
$TagData = array(
'title' => array('My Title'),
'artist' => array('My Artist'),
'album' => array('This Album'),
'comment' => array('My comment'),
'year' => array(2018),
'attached_picture' => array(
array (
'data'=> $pictureFile,
'picturetypeid'=> 3,
'mime'=> 'image/jpeg',
'description' => 'My Picture'
)
)
);
$tagwriter->tag_data = $TagData;
// write tags
if ($tagwriter->WriteTags()){
return true;
}else{
throw new \Exception(implode(' : ', $tagwriter->errors));
}
Vous pouvez regarder dans le projet getid3 () . Je ne peux pas promettre qu'il peut gérer les images, mais il ne prétend être capable d'écrire les tags ID3 pour les fichiers MP3, donc je pense que ce sera votre meilleur pari.
Plutôt que de partager le code de mise à jour de l'art de l'album, je vais un poster ici toute ma classe wrapper MP3 de getid3 de sorte que vous pouvez utiliser comme vous le souhaitez
Utilisation
$mp3 = new Whisppa\Music\MP3($mp3_filepath);
//Get data
$mp3->title
$mp3->artist
$mp3->album
$mp3->genre
//set properties
$mp3->year = '2014';
//change album art
$mp3->set_art(file_get_contents($pathtoimage), 'image/jpeg', 'New Caption');//sets front album art
//save new details
$mp3->save();
Classe
<?php
namespace Whisppa\Music;
class MP3
{
protected static $_id3;
protected $file;
protected $id3;
protected $data = null;
protected $info = ['duration'];
protected $tags = ['title', 'artist', 'album', 'year', 'genre', 'comment', 'track', 'attached_picture', 'image'];
protected $readonly_tags = ['attached_picture', 'comment', 'image'];
//'popularimeter' => ['email'=> 'music@whisppa.com', 'rating'=> 1, 'data'=> 0],//rating: 5 = 255, 4 = 196, 3 = 128, 2 = 64,1 = 1 | data: counter
public function __construct($file)
{
$this->file = $file;
$this->id3 = self::id3();
}
public function update_filepath($file)
{
$this->file = $file;
}
public function save()
{
$tagwriter = new \GetId3\Write\Tags;
$tagwriter->filename = $this->file;
$tagwriter->tag_encoding = 'UTF-8';
$tagwriter->tagformats = ['id3v2.3', 'id3v1'];
$tagwriter->overwrite_tags = true;
$tagwriter->remove_other_tags = true;
$tagwriter->tag_data = $this->data;
// write tags
if ($tagwriter->WriteTags())
return true;
else
throw new \Exception(implode(' : ', $tagwriter->errors));
}
public static function id3()
{
if(!self::$_id3)
self::$_id3 = new \GetId3\GetId3Core;
return self::$_id3;
}
public function set_art($data, $mime = 'image/jpeg', $caption = 'Whisppa Music')
{
$this->data['attached_picture'] = [];
$this->data['attached_picture'][0]['data'] = $data;
$this->data['attached_picture'][0]['picturetypeid'] = 0x03; // 'Cover (front)'
$this->data['attached_picture'][0]['description'] = $caption;
$this->data['attached_picture'][0]['mime'] = $mime;
return $this;
}
public function __get($key)
{
if(!in_array($key, $this->tags) && !in_array($key, $this->info) && !isset($this->info[$key]))
throw new \Exception("Unknown property '$key' for class '" . __class__ . "'");
if($this->data === null)
$this->analyze();
if($key == 'image')
return isset($this->data['attached_picture']) ? ['data' => $this->data['attached_picture'][0]['data'], 'mime' => $this->data['attached_picture'][0]['mime']] : null;
else if(isset($this->info[$key]))
return $this->info[$key];
else
return isset($this->data[$key]) ? $this->data[$key][0] : null;
}
public function __set($key, $value)
{
if(!in_array($key, $this->tags))
throw new \Exception("Unknown property '$key' for class '" . __class__ . "'");
if(in_array($key, $this->readonly_tags))
throw new \Exception("Tying to set readonly property '$key' for class '" . __class__ . "'");
if($this->data === null)
$this->analyze();
$this->data[$key] = [$value];
}
protected function analyze()
{
$data = $this->id3->analyze($this->file);
$this->info = [
'duration' => isset($data['playtime_seconds']) ? ceil($data['playtime_seconds']) : 0,
];
$this->data = isset($data['tags']) ? array_intersect_key($data['tags']['id3v2'], array_flip($this->tags)) : [];
$this->data['comment'] = ['http://whisppa.com'];
if(isset($data['id3v2']['APIC']))
$this->data['attached_picture'] = [$data['id3v2']['APIC'][0]];
}
}
Remarque
Il n'y a pas de code de gestion des erreurs encore. À l'heure actuelle, je suis juste compte sur des exceptions lorsque je tente d'exécuter des opérations. Ne hésitez pas à modifier et utiliser comme forme. Nécessite PHP getid3
Voici le code de base pour ajouter une image et des données ID3 utilisant getid3. (Emballage @frostymarvelous' inclut le code équivalent, mais je pense qu'il est utile de montrer les bases.)
<?php
// Initialize getID3 engine
$getID3 = new getID3;
// Initialize getID3 tag-writing module
$tagwriter = new getid3_writetags;
$tagwriter->filename = 'audiofile.mp3';
$tagwriter->tagformats = array('id3v2.3');
$tagwriter->overwrite_tags = true;
$tagwriter->remove_other_tags = true;
$tagwriter->tag_encoding = $TextEncoding;
$pictureFile=file_get_contents("image.jpg");
$TagData = array(
'title' => 'My Title',
'artist' => 'My Artist',
'attached_picture' => array(
array (
'data'=> $pictureFile,
'picturetypeid'=> 3,
'mime'=> 'image/jpeg',
'description' => 'My Picture'
)
)
);
?>
Cette fonction intégrée de PHP,
<?php
$tag = id3_get_tag( "path/to/example.mp3" );
print_r($tag);
?>
Je ne pense pas qu'il soit vraiment possible avec PHP. Je veux dire, je suppose que tout est possible, mais il ne peut pas être une solution PHP native. De PHP Docs , je pense que les seuls éléments qui peut être mis à jour sont:
- Titre
- Les artistes
- Album
- Année
- Genre
- Commentaire
- Piste
homme Désolé. Peut-être que Perl, Python, Ruby ou pourrait avoir une solution.
Je ne sais pas si vous êtes familier avec Perl (je n'aime pas personnellement, mais il est bon à des choses comme ça ...). Voici un script qui semble pouvoir tirer et modifier l'art de l'album dans un fichier MP3: http: //www.plunder.com/-download-66279.htm