File indexing completed on 2024-04-21 04:48:14

0001 /* AUDEX CDDA EXTRACTOR
0002  * SPDX-FileCopyrightText: Copyright (C) 2007 Marco Nelles
0003  * <https://userbase.kde.org/Audex>
0004  *
0005  * SPDX-License-Identifier: GPL-3.0-or-later
0006  */
0007 
0008 #include "cuesheetwriter.h"
0009 
0010 CueSheetWriter::CueSheetWriter(CDDAModel *model)
0011 {
0012     this->model = model;
0013 }
0014 
0015 CueSheetWriter::~CueSheetWriter()
0016 {
0017 }
0018 
0019 QStringList CueSheetWriter::cueSheet(const QString &binFilename, const int frameOffset, const bool writeMCN, const bool writeISRC) const
0020 {
0021     QStringList result;
0022 
0023     result << "REM cue file written by Audex Version " AUDEX_VERSION;
0024     result << QString("REM DISCID %1").arg(DiscIDCalculator::CDDBId(model->discSignature()), 8, 16, QLatin1Char('g')).toUpper();
0025     result << QString("REM GENRE \"%1\"").arg(model->genre());
0026     result << QString("REM DATE \"%1\"").arg(model->year());
0027     if (writeMCN) {
0028         QString mcn = model->cdio()->getMCN();
0029         if (!mcn.isEmpty() && mcn != "0")
0030             result << QString("CATALOG %1").arg(mcn);
0031     }
0032     result << QString("PERFORMER \"%1\"").arg(model->artist());
0033     result << QString("TITLE \"%1\"").arg(model->title());
0034 
0035     QFileInfo info(binFilename);
0036     result << QString("FILE \"%1\" %2").arg(info.fileName(), p_filetype(binFilename));
0037 
0038     for (int i = 0; i < model->cdio()->numOfTracks(); ++i) {
0039         if (!model->isAudioTrack(i + 1))
0040             continue;
0041         result << QString("  TRACK %1 AUDIO").arg(i + 1, 2, 10, QChar('0'));
0042         if (writeISRC) {
0043             QString isrc = model->cdio()->getISRC(i + 1);
0044             if (!isrc.isEmpty() && isrc != "0")
0045                 result << QString("    ISRC %1").arg(isrc);
0046         }
0047         result << QString("    PERFORMER \"%1\"").arg(model->data(model->index(i, CDDA_MODEL_COLUMN_ARTIST_INDEX)).toString());
0048         result << QString("    TITLE \"%1\"").arg(model->data(model->index(i, CDDA_MODEL_COLUMN_TITLE_INDEX)).toString());
0049 
0050         if (i == 0 && model->cdio()->firstSectorOfDisc() < model->cdio()->firstSectorOfTrack(1) + frameOffset) {
0051             result << QString("    INDEX 00 %1").arg(CDDACDIO::LSN2MSF(model->cdio()->firstSectorOfDisc()));
0052         }
0053 
0054         result << QString("    INDEX 01 %1").arg(model->cdio()->msfOfTrack(i + 1));
0055     }
0056 
0057     return result;
0058 }
0059 
0060 QStringList CueSheetWriter::cueSheet(const QStringList &filenames, const int frameOffset, const bool writeMCN, const bool writeISRC) const
0061 {
0062     Q_UNUSED(frameOffset);
0063 
0064     QStringList result;
0065     result << "REM cue file written by Audex Version " AUDEX_VERSION;
0066     result << QString("REM DISCID %1").arg(DiscIDCalculator::CDDBId(model->discSignature()), 8, 16, QLatin1Char('g')).toUpper();
0067     result << QString("REM GENRE \"%1\"").arg(model->genre());
0068     result << QString("REM DATE \"%1\"").arg(model->year());
0069     if (writeMCN) {
0070         QString mcn = model->cdio()->getMCN();
0071         if (!mcn.isEmpty() && mcn != "0")
0072             result << QString("CATALOG %1").arg(mcn);
0073     }
0074     result << QString("PERFORMER \"%1\"").arg(model->artist());
0075     result << QString("TITLE \"%1\"").arg(model->title());
0076 
0077     for (int i = 0; i < filenames.count(); ++i) {
0078         QFileInfo info(filenames.at(i));
0079         result << QString("FILE \"%1\" %2").arg(info.fileName(), p_filetype(filenames.at(i)));
0080 
0081         result << QString("  TRACK %1 AUDIO").arg(i + 1, 2, 10, QChar('0'));
0082         if (writeISRC) {
0083             QString isrc = model->cdio()->getISRC(i + 1);
0084             if (!isrc.isEmpty() && isrc != "0")
0085                 result << QString("    ISRC %1").arg(isrc);
0086         }
0087         result << QString("    PERFORMER \"%1\"").arg(model->data(model->index(i, CDDA_MODEL_COLUMN_ARTIST_INDEX)).toString());
0088         result << QString("    TITLE \"%1\"").arg(model->data(model->index(i, CDDA_MODEL_COLUMN_TITLE_INDEX)).toString());
0089         result << QString("    INDEX 01 00:00:00");
0090     }
0091 
0092     return result;
0093 }
0094 
0095 QString CueSheetWriter::p_filetype(const QString &filename) const
0096 {
0097     QString result = "WAVE";
0098     if ((filename.endsWith(QLatin1String("aiff"), Qt::CaseInsensitive)) || (filename.endsWith(QLatin1String("aif"), Qt::CaseInsensitive))) {
0099         result = "AIFF";
0100     } else if (filename.endsWith(QLatin1String("mp3"), Qt::CaseInsensitive)) {
0101         result = "MP3";
0102     }
0103 
0104     return result;
0105 }