LINUX.ORG.RU
ФорумTalks

MP3


0

0

Возник вопрос - можно ли каким-то образом перекодировать ~500 mp3шек с тэгами в cp1251 в UTF-8, не разломав их и не вручную? А то это, пожалуй единственный оставшийся у меня кириллический ресурс в этой сраной кодировке. Есть ведь какие-то TagV2? OGG не предлагать, так как есть еще iPod и не хочется ничего перекодировать-пережимать-курочить. Короче как-то так, но надоели вечные проблемы с русским в свежих билдай самых разных плееров.

★★★★★
Ответ на: комментарий от hateful_dead

А примеры есть? И вообще, это технически реализуемо? И еще надо проверить, что какие-то файлики уже в UTF-8. Ребус :-)

Shaman007 ★★★★★
() автор топика
Ответ на: комментарий от Shaman007

Я беру eyeD3, id3info и прогоняю следующий наколеночный скрипт по всем mp3'шкам

#!/bin/bash

author="`id3info "$1" | iconv -f WINDOWS-1251 -t KOI8R | grep TPE1 | awk -F':' '{print $2}' | sed s/' '//`"
title="`id3info "$1" | iconv -f WINDOWS-1251 -t KOI8R | grep TIT2 | awk -F':' '{print $2}' | sed s/' '//`"
album="`id3info "$1" | iconv -f WINDOWS-1251 -t KOI8R | grep TALB | awk -F':' '{print $2}' | sed s/' '//`"
year="`id3info "$1" | iconv -f WINDOWS-1251 -t KOI8R | grep TYER | awk -F':' '{print $2}' | sed s/' '//`"
track="`id3info "$1" | iconv -f WINDOWS-1251 -t KOI8R | grep TRCK | awk -F':' '{print $2}' | sed s/' '//`"

eyeD3 --remove-all "$1"
eyeD3 --force-update --set-encoding=utf8 -A "$album" -a "$author" -t "$title" -n "$track" -Y "$year" "$1"

Можно лекго прикрутить проверку на существование v2.4 тэга средствами того же eyeD3.

grob ★★★★★
()

eyed3 - умеет писать utf16. с утф8 (и вообще id3v2.4) были траблы.

лучше всего заюзать easyTag. всамой последней версии он научился правильно писать utf8. при этом умеет cp1251 читать. хоть он и GUI, но процесс довольно простой, т.к. он поддерживает mass update.

svyatogor ★★★★★
()
Ответ на: комментарий от svyatogor

eyeD3 нормально пишет id3v2.4 в utf8, все замечательно читается и mpd и iTunes.

grob ★★★★★
()
Ответ на: комментарий от JB

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

grob ★★★★★
()

Как раз этим сейчас и занимаюсь:)

// retagger.cpp
// g++ -o retagger retagger.cpp -O0 -g -I/usr/lib/qt-3.3/include -L/usr/lib/qt-3.3/lib -lqt-mt -I/usr/include/taglib -ltag

#include <tbytevector.h>
#include <mpegfile.h>
#include <audioproperties.h>
#include <id3v1tag.h>
#include <id3v2tag.h>
#include <fileref.h>

#include <qtextcodec.h>
#include <qstring.h>

#include <iostream>

class ID3v1StringHandler : public TagLib::ID3v1::StringHandler
{
    QTextCodec *m_codec;

    virtual TagLib::String parse( const TagLib::ByteVector &data ) const
    {
        return QStringToTString( m_codec->toUnicode( data.data(), data.size() ) );
    }

    virtual TagLib::ByteVector render( const TagLib::String &ts ) const
    {
        const QCString qcs = m_codec->fromUnicode( TStringToQString ( ts ) );
        return TagLib::ByteVector( qcs, qcs.length() );
    }

public:
    ID3v1StringHandler( const QString & codecName )
            : m_codec( QTextCodec::codecForName( codecName ) )
    {
    }
};

using namespace std;

int main( int argc, char * argv[])
{
	if ( argc < 2 )
	{
		cout << "Using: retagger /path/to/file.mp3" << endl;
		return 0;
	}

        TagLib::ID3v1::Tag::setStringHandler( new ID3v1StringHandler( "cp1251" ) );
	TagLib::ID3v2::FrameFactory::instance()->setDefaultTextEncoding(TagLib::Stri
ng::UTF8);

	TagLib::MPEG::File *f = new TagLib::MPEG::File( argv[1] );
	
	QString title;
	QString artist;
	QString album;
	QString comment;
	QString genre;
	int year;
	int track;

	TagLib::Tag *tag = f->ID3v1Tag();
	
	if ( !tag )
	{
	    cout << "No ID3v1 tag found. Exiting ..." << endl;
	    return 0;
	}
	
	title = TStringToQString(tag->title());
	artist = TStringToQString(tag->artist());
	album = TStringToQString(tag->album());
	comment = TStringToQString(tag->comment());
	genre = TStringToQString(tag->genre());
	track = tag->track();
	year = tag->year();

	TagLib::FileRef *f1 = new TagLib::FileRef( argv[1], false );
	
	tag = f1->tag();

	tag->setTitle( QStringToTString( title ) );
	tag->setArtist( QStringToTString( artist ) );
	tag->setAlbum( QStringToTString( album ) );
	tag->setComment( QStringToTString( comment ) );
	tag->setGenre( QStringToTString( genre ) );
	
	cout << "Writing recoded tags from id3v1 (cp1251) to id3v2 (utf8)" << endl;

	f1->save( );

	return 0;
}

Delay ★★
()
Ответ на: комментарий от grob

А как насчёт сборной солянки из mp3-й, у части которых теги прописаны правильно?

Xellos ★★★★★
()
Ответ на: комментарий от svyatogor

> eyed3 - умеет писать utf16. с утф8 (и вообще id3v2.4) были траблы.

Враки!!!

anonymous
()

rusxmms.

патчим tagwriter и натравливаем его на файл. он автоматом чинит кодировку на уникод и теги на вторую версию

Muromec ☆☆
()
Ответ на: комментарий от anonymous

>Надоело что наш язык везде зажимают, надо подать ноту протеста.

Типа CP-1251-говорящее сексуальное меньшинство?

FatBastard ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.