示例#1
0
文件: disk.cpp 项目: flacon/flacon
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;
        }
    }
示例#2
0
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);
}
示例#3
0
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;
}
示例#4
0
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;
}