mirror of
https://github.com/tomahawk-player/tomahawk.git
synced 2025-08-18 03:41:27 +02:00
Use VLC to parse tags if needed features are supported
This commit is contained in:
@@ -392,13 +392,62 @@ MusicScanner::scanFile( const QFileInfo& fi )
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QString
|
||||||
|
vlcMetaToQString( libvlc_media_t* media, libvlc_meta_t meta )
|
||||||
|
{
|
||||||
|
char *str = libvlc_media_get_meta(media, meta);
|
||||||
|
if ( str )
|
||||||
|
{
|
||||||
|
QString qstr = QString::fromUtf8( str );
|
||||||
|
libvlc_free( str );
|
||||||
|
return qstr;
|
||||||
|
}
|
||||||
|
return QString();
|
||||||
|
}
|
||||||
|
|
||||||
QVariant
|
QVariant
|
||||||
MusicScanner::readTags( const QFileInfo& fi )
|
MusicScanner::readTags( const QFileInfo& fi, libvlc_instance_t* vlcInstance )
|
||||||
{
|
{
|
||||||
tLog( LOGVERBOSE ) << Q_FUNC_INFO << "Parsing tags for file:" << fi.absoluteFilePath();
|
tLog( LOGVERBOSE ) << Q_FUNC_INFO << "Parsing tags for file:" << fi.absoluteFilePath();
|
||||||
|
|
||||||
const QString suffix = fi.suffix().toLower();
|
const QString suffix = fi.suffix().toLower();
|
||||||
|
const QString mimetype = TomahawkUtils::extensionToMimetype( suffix );
|
||||||
|
const QString url( "file://%1" );
|
||||||
|
|
||||||
|
QVariantMap m;
|
||||||
|
m["url"] = url.arg( fi.canonicalFilePath() );
|
||||||
|
m["mtime"] = fi.lastModified().toUTC().toTime_t();
|
||||||
|
m["size"] = (unsigned int)fi.size();
|
||||||
|
m["mimetype"] = mimetype;
|
||||||
|
|
||||||
|
#ifdef HAVE_VLC_ALBUMARTIST
|
||||||
|
libvlc_media_t* media = libvlc_media_new_path( vlcInstance, fi.canonicalFilePath().toUtf8().constData() );
|
||||||
|
libvlc_media_parse( media );
|
||||||
|
|
||||||
|
m["duration"] = (qlonglong)( libvlc_media_get_duration( media ) / 1000 );
|
||||||
|
libvlc_media_track_t **tracks;
|
||||||
|
uint track_count;
|
||||||
|
if ( ( track_count = libvlc_media_tracks_get( media, &tracks ) ) > 0 )
|
||||||
|
{
|
||||||
|
// FIXME: Should we count all or just one track?
|
||||||
|
// Or only the first audio tracks?
|
||||||
|
// For most audio files we only have a single audio track.
|
||||||
|
m["bitrate"] = tracks[0]->i_bitrate / 1000;
|
||||||
|
libvlc_media_tracks_release(tracks, track_count);
|
||||||
|
}
|
||||||
|
m["artist"] = vlcMetaToQString( media, libvlc_meta_Artist );
|
||||||
|
m["album"] = vlcMetaToQString( media, libvlc_meta_Album );
|
||||||
|
m["albumartist"] = vlcMetaToQString( media, libvlc_meta_AlbumArtist );
|
||||||
|
m["track"] = vlcMetaToQString( media, libvlc_meta_Title );
|
||||||
|
m["albumpos"] = vlcMetaToQString( media, libvlc_meta_TrackNumber );
|
||||||
|
m["year"] = vlcMetaToQString( media, libvlc_meta_Date );
|
||||||
|
// m["composer"] = tag->composer();
|
||||||
|
// m["discnumber"] = tag->discNumber();
|
||||||
|
|
||||||
|
libvlc_media_release( media );
|
||||||
|
#else
|
||||||
|
Q_UNUSED( vlcInstance );
|
||||||
|
|
||||||
if ( !TomahawkUtils::supportedExtensions().contains( suffix ) )
|
if ( !TomahawkUtils::supportedExtensions().contains( suffix ) )
|
||||||
return QVariantMap(); // invalid extension
|
return QVariantMap(); // invalid extension
|
||||||
|
|
||||||
@@ -432,14 +481,6 @@ MusicScanner::readTags( const QFileInfo& fi )
|
|||||||
if ( artist.isEmpty() || track.isEmpty() )
|
if ( artist.isEmpty() || track.isEmpty() )
|
||||||
return QVariantMap();
|
return QVariantMap();
|
||||||
|
|
||||||
const QString mimetype = TomahawkUtils::extensionToMimetype( suffix );
|
|
||||||
const QString url( "file://%1" );
|
|
||||||
|
|
||||||
QVariantMap m;
|
|
||||||
m["url"] = url.arg( fi.canonicalFilePath() );
|
|
||||||
m["mtime"] = fi.lastModified().toUTC().toTime_t();
|
|
||||||
m["size"] = (unsigned int)fi.size();
|
|
||||||
m["mimetype"] = mimetype;
|
|
||||||
m["duration"] = duration;
|
m["duration"] = duration;
|
||||||
m["bitrate"] = bitrate;
|
m["bitrate"] = bitrate;
|
||||||
m["artist"] = artist;
|
m["artist"] = artist;
|
||||||
@@ -451,6 +492,7 @@ MusicScanner::readTags( const QFileInfo& fi )
|
|||||||
m["composer"] = tag->composer();
|
m["composer"] = tag->composer();
|
||||||
m["discnumber"] = tag->discNumber();
|
m["discnumber"] = tag->discNumber();
|
||||||
m["hash"] = ""; // TODO
|
m["hash"] = ""; // TODO
|
||||||
|
#endif
|
||||||
|
|
||||||
return m;
|
return m;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user