File indexing completed on 2024-05-19 04:49:44
0001 /**************************************************************************************** 0002 * Copyright (c) 2013 Konrad Zemek <konrad.zemek@gmail.com> * 0003 * * 0004 * This program is free software; you can redistribute it and/or modify it under * 0005 * the terms of the GNU General Public License as published by the Free Software * 0006 * Foundation; either version 2 of the License, or (at your option) any later * 0007 * version. * 0008 * * 0009 * This program is distributed in the hope that it will be useful, but WITHOUT ANY * 0010 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A * 0011 * PARTICULAR PURPOSE. See the GNU General Public License for more details. * 0012 * * 0013 * You should have received a copy of the GNU General Public License along with * 0014 * this program. If not, see <http://www.gnu.org/licenses/>. * 0015 ****************************************************************************************/ 0016 0017 #include "AmarokProvider.h" 0018 0019 #include "AmarokTrack.h" 0020 #include "AmarokEmbeddedSqlConnection.h" 0021 #include "importers/ImporterSqlConnection.h" 0022 0023 using namespace StatSyncing; 0024 0025 AmarokProvider::AmarokProvider( const QVariantMap &config, ImporterManager *importer ) 0026 : ImporterProvider( config, importer ) 0027 { 0028 if( config.value( "embedded" ).toBool() ) 0029 { 0030 QFileInfo mysqld( m_config.value( "mysqlBinary" ).toString() ); 0031 QDir datadir( m_config.value( "dbPath" ).toString() ); 0032 m_connection = ImporterSqlConnectionPtr( 0033 new AmarokEmbeddedSqlConnection( mysqld, datadir ) ); 0034 } 0035 else 0036 { 0037 m_connection = ImporterSqlConnectionPtr( new ImporterSqlConnection( 0038 "MYSQL", 0039 m_config.value( "dbHost" ).toString(), 0040 m_config.value( "dbPort" ).toUInt(), 0041 m_config.value( "dbName" ).toString(), 0042 m_config.value( "dbUser" ).toString(), 0043 m_config.value( "dbPass" ).toString() 0044 ) ); 0045 } 0046 } 0047 0048 AmarokProvider::~AmarokProvider() 0049 { 0050 } 0051 0052 qint64 0053 AmarokProvider::reliableTrackMetaData() const 0054 { 0055 return Meta::valTitle | Meta::valArtist | Meta::valAlbum | Meta::valComposer 0056 | Meta::valYear | Meta::valTrackNr | Meta::valDiscNr; 0057 } 0058 0059 qint64 0060 AmarokProvider::writableTrackStatsData() const 0061 { 0062 return Meta::valRating | Meta::valFirstPlayed | Meta::valLastPlayed 0063 | Meta::valPlaycount | Meta::valLabel; 0064 } 0065 0066 QSet<QString> 0067 AmarokProvider::artists() 0068 { 0069 QSet<QString> result; 0070 foreach( const QVariantList &row, m_connection->query( "SELECT name FROM artists" ) ) 0071 result.insert( row[0].toString() ); 0072 0073 return result; 0074 } 0075 0076 TrackList 0077 AmarokProvider::artistTracks( const QString &artistName ) 0078 { 0079 const QString query = "SELECT t.url, t.title, ar.name, al.name, c.name, y.name, " 0080 "t.tracknumber, t.discnumber, s.rating, s.createdate, " 0081 "s.accessdate, s.playcount " 0082 "FROM tracks t " 0083 "INNER JOIN artists ar ON ar.id = t.artist " 0084 "LEFT JOIN albums al ON al.id = t.album " 0085 "LEFT JOIN composers c ON c.id = t.composer " 0086 "LEFT JOIN years y ON y.id = t.year " 0087 "LEFT JOIN statistics s ON s.id = t.id " 0088 "WHERE ar.name = :artist"; 0089 0090 QVariantMap bindValues; 0091 bindValues.insert( ":artist", artistName ); 0092 0093 const QList<qint64> fields = QList<qint64>() << Meta::valTitle << Meta::valArtist 0094 << Meta::valAlbum << Meta::valComposer << Meta::valYear << Meta::valTrackNr 0095 << Meta::valDiscNr << Meta::valRating << Meta::valFirstPlayed 0096 << Meta::valLastPlayed << Meta::valPlaycount; 0097 0098 TrackList result; 0099 foreach( const QVariantList &row, m_connection->query( query, bindValues ) ) 0100 { 0101 const qint64 urlId = row[0].toInt(); 0102 0103 // Add one to i in query.value(), because the first value is a url id 0104 Meta::FieldHash metadata; 0105 for( int i = 0; i < fields.size(); ++i ) 0106 metadata.insert( fields[i], row[i + 1] ); 0107 0108 const QString lblQuery = "SELECT l.label FROM labels l " 0109 "INNER JOIN urls_labels ul ON ul.label = l.id " 0110 "WHERE ul.url = :url"; 0111 QVariantMap lblBindValues; 0112 lblBindValues.insert( ":url", urlId ); 0113 0114 QSet<QString> labels; 0115 foreach( const QVariantList &lbl, m_connection->query( lblQuery, lblBindValues ) ) 0116 labels.insert( lbl[0].toString() ); 0117 0118 result << TrackPtr( new AmarokTrack( urlId, m_connection, metadata, labels ) ); 0119 } 0120 0121 return result; 0122 }