setting album art of a mp3 with php

前端 未结 9 1802
花落未央
花落未央 2021-01-04 16:04

I am looking for the best or any way to set the Album Art of mp3s using PHP.

Suggestions?

相关标签:
9条回答
  • 2021-01-04 16:32

    Not sure this is still an issue but:

    the amazingly complete getid3() (http://getid3.org) project will solve all your problems. Check out this forum post for more info.

    0 讨论(0)
  • 2021-01-04 16:33

    You can look into the getID3() project. I can't promise that it can handle images but it does claim to be able to write ID3 tags for MP3s so I think it will be your best bet.

    0 讨论(0)
  • 2021-01-04 16:34

    I don't think it's really possible with PHP. I mean, I suppose anything is possible but it may not be a native PHP solution. From the PHP Docs, I think the only items that can be updated are:

    • Title
    • Artists
    • Album
    • Year
    • Genre
    • Comment
    • Track

    Sorry man. Maybe Perl, Python, or Ruby might have some solution.

    I'm not sure if you are familiar with Perl (I personally don't like it, but, it's good at things like this...). Here's a script that seems to be able to pull in and edit album art in an MP3: http://www.plunder.com/-download-66279.htm

    0 讨论(0)
  • 2021-01-04 16:35

    Album art is a data frame identified as “Attached picture” due ID3v2 specification, and getID3() now is only one way to write all possible data frames in ID3v2 with pure PHP.

    Look at this source: http://getid3.sourceforge.net/source/write.id3v2.phps

    Search for this text in the source:

    // 4.14  APIC Attached picture
    

    there's a piece of code responsible for writing album art.

    Another way, that seems to be not as slow as pure PHP, is to use some external application, that will be launched by PHP script. If your service designed to work under a high load, binary compiled tool will be a better solution.

    0 讨论(0)
  • 2021-01-04 16:36

    Rather than just share the code for album art update, I an going to post my entire MP3 wrapper class of getID3 here so you can use as you wish

    Usage

    $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();
    

    Class

    <?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]];
        }
    
    
    }
    

    Note

    There isn't any error handling code yet. Currently, I am just relying on exceptions when I try to run any operations. Feel free to modify and use as fit. Requires PHP GETID3

    0 讨论(0)
  • 2021-01-04 16:39

    Use this inbuilt function of PHP,

    <?php
        $tag = id3_get_tag( "path/to/example.mp3" );
        print_r($tag);
    ?>
    
    0 讨论(0)
提交回复
热议问题