Amarok lyrics fix

May 03, 2013 02:06

А вот давайте я вам расскажу как задроты-линуксоиды живут.
Заметил я, что мой любимый Amarok 1.4 не отображает текст одной песни, для которой я не мог в своё время не заморочиться добавлением текста, причём в дампе коллекции для носимого плеера текст есть. Challenge accepted!

MariaDB [amarok]> describe lyrics;
+----------+----------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+----------------+------+-----+---------+-------+
| url | varbinary(255) | YES | MUL | NULL | |
| deviceid | int(11) | YES | | NULL | |
| lyrics | text | YES | | NULL | |
| uniqueid | varbinary(32) | YES | MUL | NULL | |
+----------+----------------+------+-----+---------+-------+

MariaDB [amarok]> SELECT deviceid,uniqueid,url FROM lyrics WHERE url LIKE '%The Dark Side of the Moon%' ORDER By url;
+----------+----------------------------------+------------------------------------------------------------------------------------------------------------------------+
| deviceid | uniqueid | url |
+----------+----------------------------------+------------------------------------------------------------------------------------------------------------------------+
| 3 | 4907a0f4031a1d7f5fd3bde68ebf0dd2 | ./Music/Pink Floyd/1973 - The Dark Side of the Moon (Black Triangle)/01 - Speak to MeBreathe (Breathe in the Air).flac |
| 3 | b34775fbfb5005080ea4efcd77ba0f9b | ./Music/Pink Floyd/1973 - The Dark Side of the Moon (Black Triangle)/02 - On the Run.flac |
| 3 | aef73e46876c0359009822ecf71e76e6 | ./Music/Pink Floyd/1973 - The Dark Side of the Moon (Black Triangle)/03 - Time.flac |
| 3 | 9f906a830ff164a17cb446f5ed939951 | ./Music/Pink Floyd/1973 - The Dark Side of the Moon (Black Triangle)/04 - The Great Gig in the Sky.flac |
| 3 | 3dfc12b0f82f9bf9fea45efdd89f7ad3 | ./Music/Pink Floyd/1973 - The Dark Side of the Moon (Black Triangle)/05 - Money.flac |
| 3 | 286030c685438d18c2865cb3b1561d26 | ./Music/Pink Floyd/1973 - The Dark Side of the Moon (Black Triangle)/06 - Us and Them.flac |
| 3 | 872eb634a3e6cc899b6adb6ebce14101 | ./Music/Pink Floyd/1973 - The Dark Side of the Moon (Black Triangle)/07 - Any Colour You Like.flac |
| 3 | cc518956388544ba03c46cd40acae9a0 | ./Music/Pink Floyd/1973 - The Dark Side of the Moon (Black Triangle)/08 - Brain Damage.flac |
| 3 | 26d47bd8757756a527fe600eafe40304 | ./Music/Pink Floyd/1973 - The Dark Side of the Moon (Black Triangle)/09 - Eclipse.flac |
| -1 | b34775fbfb5005080ea4efcd77ba0f9b | ./media/storage/Music/Pink Floyd/1973 - The Dark Side of the Moon (Black Triangle)/02 - On the Run.flac |
| -1 | aef73e46876c0359009822ecf71e76e6 | ./media/storage/Music/Pink Floyd/1973 - The Dark Side of the Moon (Black Triangle)/03 - Time.flac |
| -1 | 9f906a830ff164a17cb446f5ed939951 | ./media/storage/Music/Pink Floyd/1973 - The Dark Side of the Moon (Black Triangle)/04 - The Great Gig in the Sky.flac |
| -1 | 3dfc12b0f82f9bf9fea45efdd89f7ad3 | ./media/storage/Music/Pink Floyd/1973 - The Dark Side of the Moon (Black Triangle)/05 - Money.flac |
| -1 | 286030c685438d18c2865cb3b1561d26 | ./media/storage/Music/Pink Floyd/1973 - The Dark Side of the Moon (Black Triangle)/06 - Us and Them.flac |
| -1 | 872eb634a3e6cc899b6adb6ebce14101 | ./media/storage/Music/Pink Floyd/1973 - The Dark Side of the Moon (Black Triangle)/07 - Any Colour You Like.flac |
| -1 | cc518956388544ba03c46cd40acae9a0 | ./media/storage/Music/Pink Floyd/1973 - The Dark Side of the Moon (Black Triangle)/08 - Brain Damage.flac |
| -1 | 26d47bd8757756a527fe600eafe40304 | ./media/storage/Music/Pink Floyd/1973 - The Dark Side of the Moon (Black Triangle)/09 - Eclipse.flac |
+----------+----------------------------------+------------------------------------------------------------------------------------------------------------------------+

Видим странное. Почему-то для всех треков кроме первого текст хранится дважды. uniqueid, как видно из исходников

[фрагмент metabundle.cpp]

const TagLib::ByteVector
MetaBundle::readUniqueIdHelper( TagLib::FileRef fileref ) const
{
if ( TagLib::MPEG::File *file = dynamic_cast( fileref.file() ) )
{
if( file->ID3v2Tag() )
return file->ID3v2Tag()->render();
else if( file->ID3v1Tag() )
return file->ID3v1Tag()->render();
else if( file->APETag() )
return file->APETag()->render();
}
else if ( TagLib::Ogg::Vorbis::File *file = dynamic_cast( fileref.file() ) )
{
if( file->tag() )
return file->tag()->render();
}
else if ( TagLib::FLAC::File *file = dynamic_cast( fileref.file() ) )
{
if( file->ID3v2Tag() )
return file->ID3v2Tag()->render();
else if( file->ID3v1Tag() )
return file->ID3v1Tag()->render();
else if( file->xiphComment() )
return file->xiphComment()->render();
}
else if ( TagLib::Ogg::FLAC::File *file = dynamic_cast( fileref.file() ) )
{
if( file->tag() )
return file->tag()->render();
}
else if ( TagLib::MPC::File *file = dynamic_cast( fileref.file() ) )
{
if( file->ID3v1Tag() )
return file->ID3v1Tag()->render();
else if( file->APETag() )
return file->APETag()->render();
}
TagLib::ByteVector bv;
return bv;
}

QString
MetaBundle::readUniqueId( TagLib::FileRef* fileref )
{
//This is used in case we don't get given a fileref
TagLib::FileRef tmpfileref;

if( !fileref && isFile() )
{
const QString path = url().path();
//Make it get cleaned up at the end of the function automagically
tmpfileref = TagLib::FileRef( QFile::encodeName( path ), true, TagLib::AudioProperties::Fast );
fileref = &tmpfileref;
}

if( !fileref || fileref->isNull() )
return QString();

TagLib::ByteVector bv = readUniqueIdHelper( *fileref );

//get our unique id
KMD5 md5( 0, 0 );

QFile qfile( url().path() );

char databuf[8192];
int readlen = 0;
QCString size = 0;
QString returnval;

md5.update( bv.data(), bv.size() );

if( qfile.open( IO_Raw | IO_ReadOnly ) )
{
if( ( readlen = qfile.readBlock( databuf, 8192 ) ) > 0 )
{
md5.update( databuf, readlen );
md5.update( size.setNum( (ulong)qfile.size() ) );
return QString( md5.hexDigest().data() );
}
else
return QString();
}

return QString::null;
}


есть md5 от байт вектора тегов и первых 8КиБ файла. Это нам не очень помогает. А вот посмотрим на deviceid

MariaDB [amarok]> SELECT * FROM devices WHERE id=3;
+----+------+-------+----------------+-------------------------------------------------------------------------------+------------+-----------+
| id | type | label | lastmountpoint | uuid | servername | sharename |
+----+------+-------+----------------+-------------------------------------------------------------------------------+------------+-----------+
| 3 | uuid | NULL | /media/storage | /org/freedesktop/Hal/devices/volume_uuid_ba55e6a7_9cc6_584c_6904_d3140a8aa83f | NULL | NULL |
+----+------+-------+----------------+-------------------------------------------------------------------------------+------------+-----------+

Это объясняет в чём дело даже без курения исходников. HAL у меня долго время выключен, как deprecated. Приходилось недавно включать, чтобы потестировать просмотр киношек с ivi.ru, т.к. без HAL используемый там DRM не работает, но на постоянной основе у меня его больше не будет. Видимо в отсутствие HAL Amarok 1.4 не может определить устройство, на котором лежит файл. Теперь посмотрим, сколько у меня дублей текстов и текстов для старого варианта определения урлов

MariaDB [amarok]> select count(*) from (select REPLACE(url,'/media/storage','') as normalized_url from lyrics group by normalized_url having count(*)>1) sq;
+----------+
| count(*) |
+----------+
| 1727 |
+----------+

MariaDB [amarok]> SELECT count(*) FROM lyrics WHERE url like './Music%';
+----------+
| count(*) |
+----------+
| 1831 |
+----------+

Ну и наконец фикс

MariaDB [amarok]> UPDATE IGNORE lyrics SET deviceid=-1, url=REPLACE(url,'./Music/','./media/storage/Music/') WHERE url like './Music/%';
Query OK, 108 rows affected (0.08 sec)
Rows matched: 1831 Changed: 108 Warnings: 0

MariaDB [amarok]> DELETE FROM lyrics WHERE deviceid=3;
Query OK, 1735 rows affected (0.05 sec)

И текст для песни в Амароке стал виден. Лан-ца-дри-ца-лан-ца-ца!

music, amarok, stuckinbuttons

Previous post Next post
Up