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 }