NAME
Music::Tag - Interface for collecting information about music files.
VERSION
Music-Tag-0.4103
SYNOPSIS
use Music::Tag (traditional => 1); my $info = Music::Tag->new($filename); # Read basic info $info->get_tag(); print 'Performer is ', $info->artist(); print 'Album is ', $info->album(); print 'Release Date is ', $info->releasedate(); # Change info $info->artist('Throwing Muses'); $info->album('University'); # Augment info from an online database! $info->add_plugin('MusicBrainz'); $info->add_plugin('Amazon'); $info->get_tag(); print 'Record Label is ', $info->label(); # Save back to file $info->set_tag(); $info->close();
DESCRIPTION
Extendable module for working with Music Tags. Music::Tag Is powered by various plugins that collect data about a song based on whatever information has already been discovered.
The motivation behind this was to provide a convenient method for fixing broken tags in music files. This developed into a universal interface to various music file tagging schemes and a convenient way to augment this from online databases.
Several plugin modules to find information about a music file and write it back into the tag are available. These modules will use available information (REQUIRED DATA VALUES andUSED DATA VALUES) and set various data values back to the tag.
EXECUTABLE SCRIPT
An executable script,musictag is included. This script allows quick tagging of MP3 files and access to the plugins. To learn more, use:
musictag --help musictag --longhelp
METHODS
- new()
Takes a filename, an optional hashref of options, and an optional first plugin and returns a new Music::Tag object. For example:
my $info = Music::Tag->new($filename, { quiet => 1 }, 'MP3' ) ;
If no plugin is listed, then it will automatically add the appropriate file plugin based on the extension. It does this by using theMusic::Tag::Auto plugin. If no plugin is appropriate, it will return.
Options are global (apply to all plugins) and default (can be overridden by a plugin).
Plugin specific options can be applied here, if you wish. They will be ignored by plugins that don't know what to do with them. See the POD for each of the plugins for more details on options a particular plugin accepts.
Current global options include:
- verbose
Default is false. Setting this to true causes plugin to generate a lot of noise.
- quiet
Default is false. Setting this to true prevents the plugin from giving status messages. This default may be changed in the future, so always set it.
- autoplugin
Option is a hash reference mapping file extensions to plugins. Technically, this option is for theMusic::Tag::Auto plugin. Default is:
{ mp3 => 'MP3', m4a => 'M4A', m4p => 'M4A', mp4 => 'M4A', m4b => 'M4A', '3gp' => 'M4A', ogg => 'OGG', flac => 'FLAC' }
- optionfile
Array reference of files to load options from. Default is:
[ '/etc/musictag.conf', $ENV{HOME} . '/.musictag.conf' ]
Note that this is only used if the 'load_options' method is called.
Option file is a pure perl config file usingConfig::Options.
- ANSIColor
Default false. Set to true to enable color status messages.
- LevenshteinXS
Default true. Set to true to use Text::LevenshteinXS to allow approximate matching with Amazon and MusicBrainz Plugins. Will reset to false if module is missing.
- Levenshtein
Default true. Same as LevenshteinXS, but with Text::Levenshtein. Will not use if Text::Levenshtein can be loaded. Will reset to false if module is missing.
- Unaccent
Default true. When true, allows accent-neutral matching with Text::Unaccent::PurePerl. Will reset to false if module is missing.
- Inflect
Default false. When true, uses Lingua::EN::Inflect to perform approximate matches. Will reset to false if module is missing.
- available_plugins()
Class method. Returns list of available plugins. For example:
foreach (Music::Tag->available_plugins) { if ($_ eq 'Amazon') { print "Amazon is available!\n"; $info->add_plugin('Amazon', { locale => 'uk' }); }}
This method can also be used to check for a particular plugin, by passing an option. For example:
if (Music::Tag->avaialble_plugins('Amazon') { print "Amazon is available!\n"; $info->add_plugin('Amazon', { locale => 'uk' });}
- default_options()
Class method. Returns default options as aConfig::Options object.
- LoadOptions()
Load options stated in optionfile from file. Default locations are /etc/musictag.conf and ~/.musictag.conf. Can be called as class method or object method. If called as a class method the default values for all future Music::Tag objects are changed.
- add_plugin()
Takes a plugin name and optional set of options. Returns reference to a new plugin object. For example:
my $plugin = $info->add_plugin('MusicBrainz', { preferred_country => 'UK' });
$options is a hashref that can be used to override the global options for a plugin.
First option can be a string such as "MP3" in which case Music::Tag::MP3->new($self, $options) is called, an object name such as "Music::Tag::Custom::MyPlugin" in which case Music::Tag::MP3->new($self, $options) is called, or an object, which is added to the list.
Current plugins includeMP3,OGG,FLAC,M4A,Amazon,File,MusicBrainz, andLyricsFetcher.
Additional plugins can be created and may be available on CPAN. SeeMusic::Tag::Generic for base class for plugins.
Options can also be included in the string, as in Amazon;locale=us;trust_title=1. This was added to make calling frommusictag easier.
- plugin()
my $plugin = $item->plugin('MP3')->strip_tag();
The plugin method takes a regular expression as a string value and returns the first plugin whose package name matches the regular expression. Used to access package methods directly. Please see"PLUGINS" section for more details on standard plugin methods.
- get_tag()
get_tag applies all active plugins to the current Music::Tag object in the order that the plugin was added. Specifically, it runs through the list of plugins and performs the get_tag() method on each. For example:
$info->get_tag();
- set_tag()
set_tag writes info back to disk for all Music::Tag plugins, or submits info if appropriate. Specifically, it runs through the list of plugins and performs the set_tag() method on each. For example:
$info->set_tag();
- strip_tag()
strip_tag removes info from on disc tag for all plugins. Specifically, it performs the strip_tag method on all plugins in the order added. For example:
$info->strip_tag();
- close()
Closes active filehandles on all plugins. Should be called before object destroyed or frozen. For example:
$info->close();
- changed()
Returns true if changed. Optional value $new sets changed set to True of $new is true. A "change" is any data-value additions or changes done by MusicBrainz, Amazon, File, or Lyrics plugins. For example:
# Check if there is a change:$ischanged = $info->changed();# Force there to be a change$info->changed(1);
- data()
Returns a reference to the hash which stores all data about a track and optionally sets it. This is useful if you want to freeze and recreate a track, or use a shared data object in a threaded environment. For example;
use Data::Dumper;my $bighash = $info->data();print Dumper($bighash);
Please note that some values, specifically date values, will be objects.
- options()
This method is used to access or change the options. When called with no options, returns a reference to the options hash. When called with one string option returns the value for that key. When called with one hash value, merges hash with current options. When called with 2 options, the first is a key and the second is a value and the key gets set to the value. This method is for global options. For example:
# Get value for "verbose" optionmy $verbose = $info->options('verbose');# or...my $verbose = $info->options->{verbose};# Set value for "verbose" option$info->options('verbose', 0);# or...$info->options->{verbose} = 0;
- setfileinfo
Sets the mtime and bytes attributes for you from filename. This may be moved to theFile plugin in the future.
- sha1()
Returns a sha1 digest of the file size in little endian then the first 16K of the music file. Should be fairly unique.
- datamethods()
Returns an array reference of all data methods supported. Optionally takes a method which is added. Data methods should be all lower case and not conflict with existing methods. Data method additions are global, and not tied to an object. Array reference should be considered read only. For example:
# Print supported data methods:my $all_methods = Music::Tag->datamethods();foreach (@{$all_methods}) { print '$info->'. $_ . " is supported\n";}# Add is_hairband data method:Music::Tag->datamethods('is_hairband');
- used_datamethods()
Returns an array reference of all data methods that have values set. For example:
my $info = Music::Tag->new($filename);$info->get_tag();foreach (@{$info->used_datamethods}) { print $_ , ': ', $info->$_, "\n";}
- wav_out($fh)
Pipes audio data as a wav file to filehandle $fh. Returns true on success, false on failure, undefined if no plugin supports this.
This is currently experimental.
Data Access Methods
These methods are used to access the Music::Tag data values. Not all methods are supported by all plugins. In fact, no single plugin supports all methods (yet). Each of these is an accessor function. If you pass it a value, it will set the variable. It always returns the value of the variable.
There are three distinct ways of calling these methods: Traditional, PBP, and using the"get_data","set_data", and"has_data" methods.
Damian Conway in his book "Perl Best Practices" states that data access methods should be called with separate methods for getting and setting values. This can be configured by passing pbp => 1 to the use option, e.g.
use Music::Tag ( pbp => 1 );
Once set, data can be accessed by adding get_ as a suffix to the method, written to by adding set__ as a suffix, and checked by adding has_ as a suffix. For example:
use Music::Tag ( pbp => 1 ); use feature qw(say); my $info = Music::Tag->new($filename); # Read basic info $info->get_tag(); if ($info->has_artist()) { say 'Performer is ', $info->get_artist(); } $info->set_artist('Throwing Muses'); if ($info->has_artist()) { say 'Performer is now: ', $info->get_artist(); # Will print 'Throwing Muses' } $info->set_tag(); $info->close();
To force Traditional, add traditional => 1 as an option, e.g.
use Music::Tag (traditional => 1);
You can have pbp and traditional set to get both, if you want. Please note that calling it more than once in the same program, or set of programs, will have the affect of reading the methods. For example
use Music::Tag (traditional => 1);use Music::Tag (pbp => 1);# is the same asuse Music::Tag (traditional =>1, pbp=>1)
When using the traditional methods, an undefined function will return undef. This means that in list context, it will be true even when empty. This also means that the following code works:
my %important = (artist=> $info->artist,album=> $info->album,filename=> $info->filename,);
The best way to determine if a method is defined, is to use the predicate method (e.g. has_album). This is defined if either traditional or pbp is set to true.
The final way to access data is to use the"get_data","set_data", and"has_data" methods. These will work even if pbp and traditional are both set to 0. This is how plugins should access data methods.
Here is a list of the current supported data methods:
- album, get_album, set_album, has_album
The title of the release.
- album_type, get_album_type, set_album_type, has_album_type
The type of the release. Specifically, the MusicBrainz type (ALBUM OFFICIAL, etc.)
- albumartist, get_albumartist, set_albumartist, has_albumartist
The artist responsible for the album. Usually the same as the artist, and will return the value of artist if unset.
- albumartist_sortname, get_albumartist_sortname, set_albumartist_sortname, has_albumartist_sortname
The name of the sort-name of the albumartist (e.g. Hersh, Kristin or Throwing Muses, The)
- albumtags, get_albumtags, set_albumtags, has_albumtags
A array reference or comma separated list of tags in plain text for the album.
- albumrating, get_albumrating, set_albumrating, has_albumrating
The rating (value is 0 - 100) for the album (not supported by any plugins yet).
- artist, get_artist, set_artist, has_artist
The artist responsible for the track. This should be the performer.
- artist_start, get_artist_start, set_artist_start, has_artist_start
The date the artist was born or a group was founded. Sets artist_start_time and artist_start_epoch.
- artist_start_dt, get_artist_start_dt, set_artist_start_dt, has_artist_start_dt
The DateTime object used internally.
- artist_start_time, get_artist_start_time, set_artist_start_time, has_artist_start_time
The time the artist was born or a group was founded. Sets artist_start and artist_start_epoch
- artist_start_epoch, get_artist_start_epoch, set_artist_start_epoch, has_artist_start_epoch
The number of seconds since the epoch when artist was born or a group was founded. Sets artist_start and artist_start_time
See release_epoch.
- artist_end, get_artist_end, set_artist_end, has_artist_end
The date the artist died or a group was disbanded. Sets artist_end_time and artist_end_epoch.
- artist_end_dt, get_artist_end_dt, set_artist_end_dt, has_artist_end_dt
The DateTime object used internally.
- artist_end_time, get_artist_end_time, set_artist_end_time, has_artist_end_time
The time the artist died or a group was disbanded. Sets artist_end and artist_end_epoch
- artist_end_epoch, get_artist_end_epoch, set_artist_end_epoch, has_artist_end_epoch
The number of seconds since the epoch when artist died or a group was disbanded. Sets artist_end and artist_end_time
See release_epoch.
- artisttags, get_artisttags, set_artisttags, has_artisttags
A array reference or comma separated list of tags in plain text for the artist. Always returns a list.
- artist_type, get_artist_type, set_artist_type, has_artist_type
The type of artist. Usually Group or Person.
- asin, get_asin, set_asin, has_asin
The Amazon ASIN number for this album.
- bitrate, get_bitrate, set_bitrate, has_bitrate
Bitrate of file (average).
- booklet, get_booklet, set_booklet, has_booklet
URL to a digital booklet. Usually in PDF format. iTunes passes these out sometimes, or you could scan a booklet and use this to store value.URL is assumed to be relative to file location.
- bytes, get_bytes, set_bytes, has_bytes
Filesize in bytes
- comment, get_comment, set_comment, has_comment
A comment about the track.
- compilation, get_compilation, set_compilation, has_compilation
True if album is Various Artist, false otherwise. I don't set this to true for Best Hits, iTunes sometimes does.
- composer, get_composer, set_composer, has_composer
Composer of song.
- copyright, get_copyright, set_copyright, has_copyright
A copyright message can be placed here.
- country, get_country, set_country, has_country
Return the country that the track was released in. Stored as countrycode, so must be a valid country.
- countrycode, get_countrycode, set_countrycode, has_countrycode
The two digit country code.
- disc, get_disc, set_disc, has_disc
In a multi-volume set, the disc number.
- disctitle, get_disctitle, set_disctitle, has_disctitle
In a multi-volume set, the title of a disc.
- discnum, get_discnum, set_discnum, has_discnum
The disc number and optionally the total number of discs, separated by a slash. Setting it sets the disc and totaldiscs values.
- duration, get_duration, set_duration, has_duration
The length of the track in milliseconds. Returns secs * 1000 if not set. Changes the value of secs when set.
- ean, get_ean, set_ean, has_ean
The European Article Number on the package of product. Must be the EAN-13 (13 digits 0-9).
- encoded_by, get_encoded_by, set_encoded_by, has_encoded_by
Person or company responsible for making the music file.
- encoder, get_encoder, set_encoder, has_encoder
The codec used to encode the song.
- filename, get_filename, set_filename, has_filename
The filename of the track.
- filedir, get_filedir, set_filedir, has_filedir
The path that music file is located in.
- filetype, get_filetype, set_filetype, has_filetype
Name of plugin used to read and store data directly to file.
- genre, get_genre, set_genre, has_genre
The genre of the song. Various music tagging schemes use this field differently. It should be text and not a code. As a result, some plugins may be more restrictive in what can be written to disk,
- jan, get_jan, set_jan, has_jan
Same as ean.
- label, get_label, set_label, has_label
The label responsible for distributing the recording.
- lastplayeddate, get_lastplayeddate, set_lastplayeddate, has_lastplayeddate
The date the song was last played.
- lastplayeddt, get_lastplayeddt, set_lastplayeddt, has_lastplayeddt
The DateTime object used internally.
- lastplayedtime, get_lastplayedtime, set_lastplayedtime, has_lastplayedtime
The time the song was last played.
- lastplayedepoch, get_lastplayedepoch, set_lastplayedepoch, has_lastplayedepoch
The number of seconds since the epoch the time the song was last played.
See release_epoch.
- lyrics, get_lyrics, set_lyrics, has_lyrics
The lyrics of the recording.
- originalartist, get_originalartist, set_originalartist, has_originalartist
Original artist who recorded the song, e.g. for a cover song.
- mdate, get_mdate, set_mdate, has_mdate
The date the file was last modified.
- mdt, get_mdt, set_mdt, has_mdt
The DateTime object used internally.
- mtime, get_mtime, set_mtime, has_mtime
The time the file was last modified.
- mepoch, get_mepoch, set_mepoch, has_mepoch
The number of seconds since the epoch the time the file was last modified.
- mb_albumid, get_mb_albumid, set_mb_albumid, has_mb_albumid
The MusicBrainz database ID of the album or release object.
- mb_artistid, get_mb_artistid, set_mb_artistid, has_mb_artistid
The MusicBrainz database ID for the artist.
- mb_trackid, get_mb_trackid, set_mb_trackid, has_mb_trackid
The MusicBrainz database ID for the track.
- mip_puid, get_mip_puid, set_mip_puid, has_mip_puid
The MusicIP puid for the track.
- mip_fingerprint, get_mip_fingerprint, set_mip_fingerprint, has_mip_fingerprint
The Music Magic fingerprint
- performer, get_performer, set_performer, has_performer
The performer. This is an alias for artist.
- picture, get_picture, set_picture, has_picture
A hashref that contains the following:
{ 'MIME type' => The MIME Type of the picture encoding 'Picture Type' => What the picture is off. Usually set to 'Cover (front)' 'Description' => A short description of the picture '_Data' => The binary data for the picture. 'filename' => A filename for the picture. Data overrides '_Data' and will be returned as _Data if queried. Filename is calculated as relative to the path of the music file as stated in 'filename' or root if no filename for music file available.}
Note hashref MAY be generated each call. Do not modify and assume data-value in object will be modified! Passing a value will modify the data-value as expected. In other words:
# This works:$info->picture( { filename => 'cover.jpg' } ) ;# This may not:my $pic = $info->picture;$pic->{filename} = 'back_cover.jpg';
- picture_filename, get_picture_filename, set_picture_filename, has_picture_filename
Returns filename used for picture data. If no filename returns 0. If no picture returns undef. If a value is passed, sets the filename. The filename is path relative to the music file.
- picture_exists, get_picture_exists, set_picture_exists, has_picture_exists
Returns true if Music::Tag object has picture data (or filename), false if not. Convenience method to prevent reading the file. Will return false of filename listed for picture does not exist.
- playcount, get_playcount, set_playcount, has_playcount
Playcount
- rating, get_rating, set_rating, has_rating
The rating (value is 0 - 100) for the track.
- recorddate, get_recorddate, set_recorddate, has_recorddate
The date track was recorded (not release date). See notes in releasedate for format.
- recorddt, get_recorddt, set_recorddt, has_recorddt
The DateTime object used internally.
- recordepoch, get_recordepoch, set_recordepoch, has_recordepoch
The recorddate in seconds since epoch. See notes in releaseepoch for format.
- recordtime, get_recordtime, set_recordtime, has_recordtime
The time and date track was recoded. See notes in releasetime for format.
- releasedate, get_releasedate, set_releasedate, has_releasedate
The release date in the form YYYY-MM-DD. The day or month values may be left off. Please keep this in mind if you are parsing this data.
Because of bugs in my own code, I have added 2 sanity checks. Will not set the time and return if either of the following are true:
All times should be GMT.
- releasedt, get_releasedt, set_releasedt, has_releasedt
The DateTime object used internally.
- releaseepoch, get_releaseepoch, set_releaseepoch, has_releaseepoch
The release date of an album in terms "UNIX time", or seconds since the SYSTEM epoch (usually Midnight, January 1, 1970 GMT). This can be negative or > 32 bits, so please use caution before assuming this value is a valid UNIX date. This value will update releasedate and vice-versa. Since this accurate to the second and releasedate only to the day, setting releasedate will always set this to 12:00 PM GMT the same day.
Please note that this has some limitations. In 32bit Linux, the only supported dates are Dec 1901 to Jan 2038. In windows, dates before 1970 will not work. Refer to the docs for Time::Local for more details.
- releasetime, get_releasetime, set_releasetime, has_releasetime
Like releasedate, but adds the time. Format should be YYYY-MM-DD HH::MM::SS. Like releasedate, all entries but year are optional.
All times should be GMT.
- secs, get_secs, set_secs, has_secs
The number of seconds in the recording.
- sortname, get_sortname, set_sortname, has_sortname
The name of the sort-name of the artist (e.g. Hersh, Kristin or Throwing Muses, The)
- tempo, get_tempo, set_tempo, has_tempo
The tempo of the track
- title, get_title, set_title, has_title
The name of the song.
- totaldiscs, get_totaldiscs, set_totaldiscs, has_totaldiscs
The total number of discs, if a multi volume set.
- totaltracks, get_totaltracks, set_totaltracks, has_totaltracks
The total number of tracks on the album.
- track, get_track, set_track, has_track
The track number
- tracktags, get_tracktags, set_tracktags, has_tracktags
A array reference or comma separated list of tags in plain text for the track.
- tracknum, get_tracknum, set_tracknum, has_tracknum
The track number and optionally the total number of tracks, separated by a slash. Setting it sets the track and totaltracks values (and vice-versa).
- upc, get_upc, set_upc, has_upc
The Universal Product Code on the package of a product. Returns same value as ean without initial 0 if ean has an initial 0. If set and ean is not set, sets ean and adds initial 0. It is possible for ean and upc to be different if ean does not have an initial 0.
- url, get_url, set_url, has_url
A URL associated with the track (often a link to the details page on Amazon).
- year, get_year, set_year, has_year
The year a track was released. Returns year set in releasedate if available. Does not set releasedate.
Non Standard Data Access Methods
These methods are not currently used by any standard plugin. They may be used in the future, or by other plugins (such as a SQL plugin). Included here to standardize expansion methods.
- albumid, artistid, songid, get_albumid, get_artistid, get_songid, set_albumid, set_artistid, set_songid, has_albumid, has_artistid, has_songid
These three values can be used by a database plugin. They should be GUIDs like the MusicBrainz IDs. I recommend using the same value as mb_albumid, mb_artistid, and mb_trackid by default when possible.
- ipod, ipod_dbid, ipod_location, ipod_trackid, get_ipod, get_ipod_dbid, get_ipod_location, get_ipod_trackid, set_ipod, set_ipod_dbid, set_ipod_location, set_ipod_trackid, has_ipod, has_ipod_dbid, has_ipod_location, has_ipod_trackid
Suggested values for an iPod plugin.
- user, get_user, set_user, has_user
Used for user data. Reserved. Please do not use this in any Music::Tag plugin published on CPAN.
MP3 File information
- frequency, get_frequency, set_frequency, has_frequency
The frequency of the recording (in Hz).
- frames, get_frames, set_frames, has_frames
Number of frames for an MP3 file.
- framesize, get_framesize, set_framesize, has_framesize
Average framesize for an MP3 file.
- path, get_path, set_path, has_path
Path of file, but not set by filename so could be used for a relative path.
- stereo, get_stereo, set_stereo, has_stereo
File is stereo.
- vbr, get_vbr, set_vbr, has_vbr
File has a variable bitrate.
- pregap, postgap, gaplessdata, samplecount, appleid, get_pregap, get_postgap, get_gaplessdata, get_samplecount, get_appleid, set_pregap, set_postgap, set_gaplessdata, set_samplecount, set_appleid, has_pregap, has_postgap, has_gaplessdata, has_samplecount, has_appleid
Used to store gapless data. Some of this is supported byMusic::Tag::MP3 as an optional value requiring a patchedMP3::Info.
- codec, get_codec, set_codec, has_codec
Codec used for encoding file
Semi-internal methods for use by plugins.
- status
Semi-internal method for printing status.
- error
Semi-internal method for printing errors.
- get_data()
Calls the data access method for an attribute. This is the recommended way to access data from a plugin, as the user may have elected to have PBP attribute methods, or not...
Example:
# Get the album artist$info->get_data('albumartist');
- set_data()
Calls the data writer method for an attribute.
Example:
# Set the album artist$info->set_data('albumartist','Sarah Slean');
- has_data()
Calls the data predicate method for an attribute.
Example:
# Does it have an album artist?if ( not $info->has_data('albumartist')) { $info->set_data('albumartist','Sarah Slean');}
PLUGINS
SeeMusic::Tag::Generic for base class for plugins.
BUGS
No method for evaluating an album as a whole, only track-by-track method. Several plugins do not support all data values. Has not been tested in a threaded environment.
Please use github for bug tracking:http://github.com/riemann42/Music-Tag/issues.
SEE ALSO
Music::Tag::Amazon,Music::Tag::File,Music::Tag::FLAC,Music::Tag::Lyrics,Music::Tag::LyricsFetcher,Music::Tag::M4A,Music::Tag::MP3,Music::Tag::MusicBrainz,Music::Tag::OGG,Music::Tag::Option,Term::ANSIColor,Text::LevenshteinXS,Text::Unaccent::PurePerl,Lingua::EN::Inflect
SOURCE
Source is available at github:http://github.com/riemann42/Music-Tag.
AUTHOR
Edward Allen III <ealleniii _at_ cpan _dot_ org>
COPYRIGHT
Copyright © 2007,2008,2010 Edward Allen III. Some rights reserved.
LICENSE
This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself, either:
a) the GNU General Public License as published by the Free Software Foundation; either version 1, or (at your option) any later version, or
b) the "Artistic License" which comes with Perl.
1 POD Error
The following errors were encountered while parsing the POD:
- Around line 2085:
Non-ASCII character seen before =encoding in '©'. Assuming UTF-8
Module Install Instructions
To install Music::Tag, copy and paste the appropriate command in to your terminal.
cpanm Music::Tag
perl -MCPAN -e shellinstall Music::Tag
For more information on module installation, please visitthe detailed CPAN module installation guide.