File indexing completed on 2024-04-28 12:37:46
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 ÷r); 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