setting album art of a mp3 with php
Asked Answered
S

10

10

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

Suggestions?

Subcontract answered 11/7, 2009 at 18:31 Comment(0)
P
5

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.

Parlay answered 11/7, 2009 at 23:12 Comment(0)
M
3

A better (faster) way to do this would be through an external application and the PHP exec() function to fun a command. I would recommend eyeD3.

Measure answered 7/11, 2010 at 16:43 Comment(1)
Don't know if I can do that with the shared server I am using now but will come in useful when I roll my own. Thanks.Subcontract
I
1

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.

Improbable answered 13/1, 2010 at 1:9 Comment(0)
P
1

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'=> '[email protected]', '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

Pocketful answered 28/4, 2014 at 8:57 Comment(3)
What is \GetId3\GetId3Core ?Lindgren
Can you please verify, which package you are using?Vestavestal
@Vestavestal it's been very long, but this is what I used getid3.orgPocketful
S
1

Install getId3 using composer composer require james-heinrich/getid3 Then Use this code to update your id3 tags

// 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));
}
Sage answered 4/10, 2018 at 10:40 Comment(0)
H
0

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.

Homiletic answered 11/7, 2009 at 20:36 Comment(0)
M
0

Here is the basic code for adding an image and ID3 data using getID3. (@frostymarvelous' wrapper includes equivalent code, however I think that it is helpful to show the basics.)

<?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'
            )
        )
    );
?>
Maintenance answered 1/11, 2017 at 21:48 Comment(0)
S
0

@carrp the $Tagdata code won't work unless each value property is an array e.g.

$TagData = array(
    'title' => ['My Title'],
    'artist' => ['My Artist'],        
    'attached_picture' => array(   
        array (
            'data'=> $pictureFile,
            'picturetypeid'=> 3,
            'mime'=> 'image/jpeg',
            'description' => 'My Picture'
        )
    )
);
Stutsman answered 4/8, 2021 at 18:45 Comment(0)
K
-1

Use this inbuilt function of PHP,

<?php
    $tag = id3_get_tag( "path/to/example.mp3" );
    print_r($tag);
?>
Kumar answered 6/2, 2018 at 7:23 Comment(0)
M
-3

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

Moran answered 11/7, 2009 at 19:38 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.