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

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 #ifndef CDDAMODEL_H
0009 #define CDDAMODEL_H
0010 
0011 #include <QAbstractTableModel>
0012 #include <QBuffer>
0013 #include <QImage>
0014 #include <QImageReader>
0015 #include <QInputDialog>
0016 #include <QMimeDatabase>
0017 #include <QModelIndexList>
0018 #include <QSet>
0019 #include <QString>
0020 #include <QTimer>
0021 #include <QVariant>
0022 
0023 #include <KLocalizedString>
0024 
0025 #include <KCDDB/CDInfo>
0026 #include <KCDDB/Client>
0027 #include <KCDDB/KCDDB>
0028 
0029 #include "utils/cddacdio.h"
0030 #include "utils/cddadevices.h"
0031 
0032 #include "utils/error.h"
0033 
0034 #define CDDA_MODEL_COLUMN_RIP_LABEL i18n("Rip")
0035 #define CDDA_MODEL_COLUMN_TRACK_LABEL i18n("Track")
0036 #define CDDA_MODEL_COLUMN_ARTIST_LABEL i18n("Artist")
0037 #define CDDA_MODEL_COLUMN_TITLE_LABEL i18n("Title")
0038 #define CDDA_MODEL_COLUMN_LENGTH_LABEL i18n("Length")
0039 
0040 enum CDDAColumms {
0041     CDDA_MODEL_COLUMN_RIP_INDEX = 0,
0042     CDDA_MODEL_COLUMN_TRACK_INDEX,
0043     CDDA_MODEL_COLUMN_ARTIST_INDEX,
0044     CDDA_MODEL_COLUMN_TITLE_INDEX,
0045     CDDA_MODEL_COLUMN_LENGTH_INDEX,
0046 
0047     CDDA_MODEL_COLUMN_COUNT
0048 };
0049 
0050 #define CDDA_MODEL_INTERNAL_ROLE 1982
0051 
0052 /** kde audio disc model **/
0053 class CDDAModel : public QAbstractTableModel
0054 {
0055     Q_OBJECT
0056 
0057 public:
0058     explicit CDDAModel(QObject *parent = nullptr);
0059     ~CDDAModel() override;
0060 
0061     inline CDDACDIO *cdio() const
0062     {
0063         return p_cdio;
0064     }
0065     inline const QString deviceFile() const
0066     {
0067         return device_file;
0068     }
0069 
0070     int rowCount(const QModelIndex &parent = QModelIndex()) const override;
0071     int columnCount(const QModelIndex &parent = QModelIndex()) const override;
0072     QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
0073     bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override;
0074     QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;
0075 
0076     Qt::ItemFlags flags(const QModelIndex &index) const override;
0077 
0078     void setArtist(const QString &a);
0079     const QString artist() const;
0080     void setTitle(const QString &t);
0081     const QString title() const;
0082 
0083     // category must be cddb compatible
0084     //(blues, classical, country, data,
0085     // folk, jazz, misc, newage, reggae,
0086     // rock, soundtrack)
0087     void setCategory(const QString &c);
0088     const QString category() const;
0089 
0090     void setGenre(const QString &g);
0091     const QString genre() const;
0092     void setYear(const QString &year);
0093     const QString year() const;
0094     void setExtendedData(const QStringList &e);
0095     const QStringList extendedData() const;
0096     void setCDNum(const int n);
0097     int cdNum() const;
0098     void setTrackOffset(const int n);
0099     int trackOffset() const;
0100 
0101     int guessMultiCD(QString &newTitle) const;
0102     void setMultiCD(const bool multi);
0103     bool isMultiCD() const;
0104 
0105     void setCustomData(const QString &type, const QVariant &data);
0106     const QVariant customData(const QString &type) const;
0107 
0108     void setCustomDataPerTrack(const int n, const QString &type, const QVariant &data);
0109     const QVariant getCustomDataPerTrack(const int n, const QString &type);
0110 
0111     const QImage &cover() const;
0112     bool setCover(const QByteArray &data);
0113     bool setCover(const QString &filename);
0114     bool saveCoverToFile(const QString &filename);
0115     bool isCoverEmpty() const;
0116     void clearCover();
0117     const QString coverSupportedMimeTypeList() const;
0118 
0119     bool guessVarious() const;
0120     void setVarious(bool various);
0121     bool isVarious();
0122 
0123     void swapArtistAndTitleOfTracks();
0124     void swapArtistAndTitle();
0125     void splitTitleOfTracks(const QString &divider);
0126     void capitalizeTracks();
0127     void capitalizeHeader();
0128     void setTitleArtistsFromHeader();
0129 
0130     int numOfTracks() const;
0131     int numOfAudioTracks() const;
0132     int numOfAudioTracksInSelection() const;
0133 
0134     int length() const;
0135     int lengthOfAudioTracks() const;
0136     int lengthOfAudioTracksInSelection() const;
0137     int lengthOfTrack(int n) const;
0138 
0139     const QList<quint32> discSignature() const;
0140 
0141     bool isAudioTrack(int n) const;
0142 
0143     void clear();
0144 
0145     inline bool empty()
0146     {
0147         return p_empty;
0148     }
0149 
0150     inline const QSet<int> &selectedTracks() const
0151     {
0152         return sel_tracks;
0153     }
0154     void toggle(int row);
0155     bool isTrackInSelection(int n) const;
0156     void invertSelection();
0157     void selectAll();
0158     void selectNone();
0159 
0160     bool isModified() const;
0161     void confirm();
0162 
0163     Error lastError() const;
0164 
0165 public Q_SLOTS:
0166     void lookupCDDB();
0167     bool submitCDDB();
0168 
0169     void eject();
0170 
0171 Q_SIGNALS:
0172     void audioDiscDetected();
0173     void audioDiscRemoved();
0174 
0175     void cddbLookupStarted();
0176     void cddbLookupDone(const bool successful);
0177 
0178     void cddbDataModified();
0179     void cddbDataSubmited(const bool successful);
0180 
0181     void hasSelection(bool has_selection);
0182     void selectionChanged(const int num_selected);
0183 
0184 private Q_SLOTS:
0185     void new_audio_disc_available(const QString &udi);
0186     void audio_disc_removed(const QString &udi);
0187 
0188     void disc_information_modified();
0189 
0190     void lookup_cddb_done(KCDDB::Result result);
0191 
0192 private:
0193     QString device_file;
0194     QString udi;
0195     CDDACDIO *p_cdio;
0196     CDDADevices *devices;
0197 
0198     KCDDB::Client *cddb;
0199     KCDDB::CDInfo cd_info;
0200     QImage p_cover;
0201     bool modified;
0202     bool p_empty; // no metadata available yet
0203     Error error;
0204     bool cddb_transaction_pending;
0205 
0206     QSet<int> sel_tracks;
0207     void p_toggle(const unsigned int track);
0208 
0209     const QString capitalize(const QString &s);
0210 
0211     void set_default_values();
0212 
0213     void modify();
0214 };
0215 
0216 #endif