Question

Je cherche le meilleur ou tout autre moyen de mettre l'Art Album de mp3s en PHP.

Suggestions?

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top