File indexing completed on 2024-04-28 08:46:49

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