File indexing completed on 2024-05-12 05:10:10
0001 /*************************************************************************** 0002 Copyright (C) 2017 Robby Stephenson <robby@periapsis.org> 0003 ***************************************************************************/ 0004 0005 /*************************************************************************** 0006 * * 0007 * This program is free software; you can redistribute it and/or * 0008 * modify it under the terms of the GNU General Public License as * 0009 * published by the Free Software Foundation; either version 2 of * 0010 * the License or (at your option) version 3 or any later version * 0011 * accepted by the membership of KDE e.V. (or its successor approved * 0012 * by the membership of KDE e.V.), which shall act as a proxy * 0013 * defined in Section 14 of version 3 of the license. * 0014 * * 0015 * This program is distributed in the hope that it will be useful, * 0016 * but WITHOUT ANY WARRANTY; without even the implied warranty of * 0017 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * 0018 * GNU General Public License for more details. * 0019 * * 0020 * You should have received a copy of the GNU General Public License * 0021 * along with this program. If not, see <http://www.gnu.org/licenses/>. * 0022 * * 0023 ***************************************************************************/ 0024 0025 #include <config.h> 0026 0027 #include "freedbimporter.h" 0028 #include "../tellico_debug.h" 0029 0030 #include <QList> 0031 0032 extern "C" { 0033 #ifdef HAVE_CDIO 0034 #include <cdio/cdio.h> 0035 #include <cdio/cdtext.h> 0036 #endif 0037 } 0038 0039 namespace { 0040 #ifdef HAVE_CDIO 0041 class CloseCdio { 0042 public: 0043 CloseCdio(CdIo_t* d) : cdio(d) {} 0044 ~CloseCdio() { cdio_destroy(cdio); } 0045 private: 0046 CdIo_t* cdio; 0047 }; 0048 #endif 0049 } 0050 0051 using Tellico::Import::FreeDBImporter; 0052 0053 QList<uint> FreeDBImporter::offsetList(const QByteArray& drive_, QList<uint>& trackLengths_) { 0054 QList<uint> list; 0055 #ifdef HAVE_CDIO 0056 // CDDB needs the Logical Block Addresses (LBA) for the track sector offsets 0057 CdIo_t* cdio_p = cdio_open(drive_.constData(), DRIVER_UNKNOWN); 0058 if(cdio_p == nullptr) { 0059 myDebug() << "no cdio pointer"; 0060 return list; 0061 } 0062 CloseCdio closer(cdio_p); 0063 0064 track_t i_track = cdio_get_first_track_num(cdio_p); 0065 track_t i_tracks = i_track + cdio_get_num_tracks(cdio_p); 0066 0067 trackLengths_.clear(); 0068 list.reserve(i_tracks+1); 0069 for( ; i_track < i_tracks; ++i_track) { 0070 list.append(cdio_get_track_lba(cdio_p, i_track)); 0071 // add 1 so the conversion to int rounds up 0072 trackLengths_.append(1+cdio_get_track_sec_count(cdio_p, i_track) / CDIO_CD_FRAMES_PER_SEC); 0073 } 0074 list.append(cdio_lsn_to_lba(cdio_get_disc_last_lsn(cdio_p))); 0075 0076 #else 0077 Q_UNUSED(drive_); 0078 Q_UNUSED(trackLengths_); 0079 #endif 0080 return list; 0081 } 0082 0083 FreeDBImporter::CDText FreeDBImporter::getCDText(const QByteArray& drive_) { 0084 CDText cdtext; 0085 #if defined(ENABLE_CDTEXT) && defined(HAVE_CDIO) 0086 CdIo_t* cdio_p = cdio_open(drive_.constData(), DRIVER_UNKNOWN); 0087 if(cdio_p == nullptr) { 0088 myDebug() << "no cdio pointer"; 0089 return cdtext; 0090 } 0091 CloseCdio closer(cdio_p); 0092 0093 #if LIBCDIO_VERSION_NUM >= 90 0094 const cdtext_t* cdtext_p = cdio_get_cdtext(cdio_p); 0095 #else 0096 const cdtext_t* cdtext_p = cdio_get_cdtext(cdio_p, 0); 0097 #endif 0098 if(cdtext_p == nullptr) { 0099 myDebug() << "no cdtext pointer"; 0100 return cdtext; 0101 } 0102 0103 #if LIBCDIO_VERSION_NUM >= 90 0104 const char* title = cdtext_get_const(cdtext_p, CDTEXT_FIELD_TITLE, 0); 0105 #else 0106 const char* title = cdtext_get_const(CDTEXT_TITLE, cdtext_p); 0107 #endif 0108 cdtext.title = QString::fromUtf8(title); 0109 #if LIBCDIO_VERSION_NUM >= 90 0110 const char* performer = cdtext_get_const(cdtext_p, CDTEXT_FIELD_PERFORMER, 0); 0111 #else 0112 const char* performer = cdtext_get_const(CDTEXT_PERFORMER, cdtext_p); 0113 #endif 0114 cdtext.artist = QString::fromUtf8(performer); 0115 #if LIBCDIO_VERSION_NUM >= 90 0116 const char* message = cdtext_get_const(cdtext_p, CDTEXT_FIELD_MESSAGE, 0); 0117 #else 0118 const char* message = cdtext_get_const(CDTEXT_MESSAGE, cdtext_p); 0119 #endif 0120 cdtext.message = QString::fromUtf8(message); 0121 0122 track_t i_track = cdio_get_first_track_num(cdio_p); 0123 track_t i_tracks = i_track + cdio_get_num_tracks(cdio_p); 0124 for( ; i_track < i_tracks; ++i_track) { 0125 #if LIBCDIO_VERSION_NUM >= 90 0126 const char* title = cdtext_get_const(cdtext_p, CDTEXT_FIELD_TITLE, i_track); 0127 cdtext.trackTitles.append(QString::fromUtf8(title)); 0128 const char* performer = cdtext_get_const(cdtext_p, CDTEXT_FIELD_PERFORMER, i_track); 0129 cdtext.trackArtists.append(QString::fromUtf8(performer)); 0130 #else 0131 const cdtext_t *track_cdtext_p = cdio_get_cdtext(cdio_p, i_track); 0132 const char* title = cdtext_get_const(CDTEXT_TITLE, track_cdtext_p); 0133 cdtext.trackTitles.append(QString::fromUtf8(title)); 0134 const char* performer = cdtext_get_const(CDTEXT_PERFORMER, track_cdtext_p); 0135 cdtext.trackArtists.append(QString::fromUtf8(performer)); 0136 #endif 0137 } 0138 #else 0139 Q_UNUSED(drive_); 0140 #endif 0141 return cdtext; 0142 }