QFileInfoList matchedAudioFiles(const CueDisk &cueDisk, const QFileInfoList &audioFiles) { QFileInfoList res; QFileInfo cueFile(cueDisk.fileName()); QStringList patterns; if (cueDisk.diskCount() > 1) { patterns << QRegExp::escape(QFileInfo(cueDisk.first().tag(TagId::File)).completeBaseName()); patterns << QRegExp::escape(cueFile.completeBaseName()) + QString("(.*\\D)?" "0*" "%1" "(.*\\D)?").arg(cueDisk.diskNum()); patterns << QString(".*" "(disk|disc|side)" "(.*\\D)?" "0*" "%1" "(.*\\D)?").arg(cueDisk.diskNum()); } else { patterns << QRegExp::escape(QFileInfo(cueDisk.first().tag(TagId::File)).completeBaseName()); patterns << QRegExp::escape(cueFile.completeBaseName()) + ".*"; } QString audioExt; foreach (const AudioFormat *format, AudioFormat::inputFormats()) audioExt += (audioExt.isEmpty() ? "\\." : "|\\.") + format->ext(); foreach (const QString &pattern, patterns) { QRegExp re(QString("%1(%2)+").arg(pattern).arg(audioExt), Qt::CaseInsensitive, QRegExp::RegExp2); foreach (const QFileInfo &audio, audioFiles) { if (re.exactMatch(audio.fileName())) res << audio; } }
QList<QByteArray> MetaDetector::detectEncodings(const MetaPtr meta) { if (meta->localPath.isEmpty()) { return QList<QByteArray>() << "UTF-8"; } QByteArray detectByte; if (!meta->cuePath.isEmpty()) { QFile cueFile(meta->cuePath); if (cueFile.open(QIODevice::ReadOnly)) { detectByte = cueFile.readAll(); return detectEncodings(detectByte); } } #ifdef _WIN32 TagLib::FileRef f(meta->localPath.toStdWString().c_str()); #else TagLib::FileRef f(meta->localPath.toStdString().c_str()); #endif TagLib::Tag *tag = f.tag(); if (tag) { detectByte += tag->title().toCString(); detectByte += tag->artist().toCString(); detectByte += tag->album().toCString(); } return detectEncodings(detectByte); }
QStringList CueFile::parse( const QString &filePath ) { // TODO: zip detection QFile cueFile( filePath ); QFileInfo info( filePath ); QStringList gameFiles; if( !cueFile.open( QIODevice::ReadOnly ) ) { return gameFiles; } while( !cueFile.atEnd() ) { auto line = cueFile.readLine(); QString obtainedTitle; bool eatChars = false; for( auto &subStr : line ) { if( subStr == '"' ) { if( eatChars ) { eatChars = false; } else { eatChars = true; if( obtainedTitle.isEmpty() ) { continue; } } } if( eatChars ) { obtainedTitle.append( subStr ); } } if( !obtainedTitle.isEmpty() ) { QDir dir = info.absoluteDir(); gameFiles.append( dir.path() % '/' % obtainedTitle ); } } return gameFiles; }
int CueSheetModel::loadCueSheet(const QString &cueFileName, QCoreApplication *application, QTextCodec *forceCodec) { QMutexLocker lock(&m_mutex); const QTextCodec *codec = (forceCodec != NULL) ? forceCodec : QTextCodec::codecForName("System"); QFile cueFile(cueFileName); if(!cueFile.open(QIODevice::ReadOnly)) { return ErrorIOFailure; } clearData(); beginResetModel(); int iResult = parseCueFile(cueFile, QDir(QFileInfo(cueFile).canonicalPath()), application, codec); endResetModel(); return iResult; }