File indexing completed on 2024-04-14 04:49:13
0001 /* 0002 SPDX-FileCopyrightText: 2002 Rik Hemsley (rikkus) <rik@kde.org> 0003 SPDX-FileCopyrightText: 2002 Benjamin Meyer <ben-devel@meyerhome.net> 0004 SPDX-FileCopyrightText: 2002 Nadeem Hasan <nhasan@kde.org> 0005 0006 SPDX-License-Identifier: LGPL-2.0-or-later 0007 */ 0008 0009 #include "cddb.h" 0010 0011 #include "categories.h" 0012 #include "kcddbi18n.h" 0013 0014 0015 #include <QStringList> 0016 0017 namespace KCDDB 0018 { 0019 CDDB::CDDB() 0020 : user_( QLatin1String( "libkcddb-user" ) ), 0021 localHostName_( QLatin1String( "localHost" ) ), 0022 readOnly_( false ) 0023 { 0024 0025 } 0026 0027 CDDB::~CDDB() 0028 { 0029 // Empty. 0030 } 0031 0032 QString 0033 CDDB::trackOffsetListToId() 0034 { 0035 return trackOffsetListToId( trackOffsetList_ ); 0036 } 0037 QString 0038 CDDB::trackOffsetListToId( const TrackOffsetList & list ) 0039 { 0040 // Taken from version by Michael Matz in kio_audiocd. 0041 unsigned int id = 0; 0042 if ( list.isEmpty() ) 0043 return QString(); 0044 int numTracks = list.count() - 1; 0045 0046 // The last two in the list are disc begin and disc end. 0047 for ( int i = numTracks-1; i >= 0; i-- ) 0048 { 0049 int n = list[ i ]/75; 0050 while ( n > 0 ) 0051 { 0052 id += n % 10; 0053 n /= 10; 0054 } 0055 } 0056 0057 unsigned int l = list[numTracks] / 75; 0058 l -= list[0] / 75; 0059 0060 id = ( ( id % 255 ) << 24 ) | ( l << 8 ) | numTracks; 0061 0062 return QString::number( id, 16 ).rightJustified( 8, QLatin1Char( '0' ) ); 0063 } 0064 0065 QString 0066 CDDB::trackOffsetListToString() 0067 { 0068 QString ret; 0069 uint numTracks = trackOffsetList_.count()-1; 0070 0071 // Disc start. 0072 ret.append( QString::number( numTracks ) ); 0073 ret.append( QLatin1String( " " ) ); 0074 0075 for ( uint i = 0; i < numTracks; i++ ) 0076 { 0077 ret.append( QString::number( trackOffsetList_[ i ] ) ); 0078 ret.append( QLatin1String( " " ) ); 0079 } 0080 0081 unsigned int discLengthInSec = ( trackOffsetList_[ numTracks ] ) / 75; 0082 0083 ret.append( QString::number( discLengthInSec ) ); 0084 0085 return ret; 0086 } 0087 0088 uint 0089 CDDB::statusCode( const QString & line ) 0090 { 0091 const QStringList tokenList = line.split(QLatin1Char( ' ' ), Qt::SkipEmptyParts ); 0092 0093 if (tokenList.isEmpty()) 0094 return 410; 0095 0096 return tokenList[ 0 ].toUInt(); 0097 } 0098 0099 CDInfoList 0100 CDDB::cacheFiles(const TrackOffsetList &offsetList, const Config& config ) 0101 { 0102 Categories c; 0103 QStringList categories = c.cddbList(); 0104 // Also load user-created entries 0105 categories << QLatin1String( "user" ); 0106 0107 CDInfoList infoList; 0108 QStringList cddbCacheDirs = config.cacheLocations(); 0109 0110 for (QStringList::const_iterator cddbCacheDir = cddbCacheDirs.constBegin(); 0111 cddbCacheDir != cddbCacheDirs.constEnd(); ++cddbCacheDir) 0112 { 0113 for (const QString &category : qAsConst(categories)) { 0114 QFile f( *cddbCacheDir + QLatin1Char( '/' ) + category + QLatin1Char( '/' ) + trackOffsetListToId(offsetList) ); 0115 if ( f.exists() && f.open(QIODevice::ReadOnly) ) 0116 { 0117 QTextStream ts(&f); 0118 #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) 0119 ts.setCodec("UTF-8"); 0120 #endif 0121 QString cddbData = ts.readAll(); 0122 f.close(); 0123 CDInfo info; 0124 info.load(cddbData); 0125 if (category != QLatin1String( "user" )) 0126 { 0127 info.set(Category,category); 0128 info.set(QLatin1String( "source" ), QLatin1String( "freedb" )); 0129 } 0130 else 0131 { 0132 info.set(QLatin1String( "source" ), QLatin1String( "user" )); 0133 } 0134 0135 infoList.append( info ); 0136 } 0137 } 0138 } 0139 0140 return infoList; 0141 } 0142 } 0143 0144 // vim:tabstop=2:shiftwidth=2:expandtab:cinoptions=(s,U1,m1