From 48d58229af569b084e77978a76a19859e92d524a Mon Sep 17 00:00:00 2001 From: Fred Gleason Date: Sat, 31 Aug 2019 19:00:20 -0400 Subject: [PATCH] 2019-08-31 Fred Gleason * Refactored 'RDCddbLookup' to use CDDB protocol level 6. --- ChangeLog | 2 + lib/librd_cs.ts | 19 ++++++ lib/librd_de.ts | 19 ++++++ lib/librd_es.ts | 19 ++++++ lib/librd_fr.ts | 19 ++++++ lib/librd_nb.ts | 19 ++++++ lib/librd_nn.ts | 19 ++++++ lib/librd_pt_BR.ts | 19 ++++++ lib/rdcddblookup.cpp | 134 ++++++++++++++++++++++++++++++++++---- lib/rdcddblookup.h | 62 +++++++++++------- rdlibrary/cdripper.cpp | 6 +- rdlibrary/disk_ripper.cpp | 6 +- 12 files changed, 302 insertions(+), 41 deletions(-) diff --git a/ChangeLog b/ChangeLog index b32a750b..8cdd421b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -19053,3 +19053,5 @@ text fields when modifying cart labels. 2019-08-31 Fred Gleason * Updated ripper profiling code in rdlibrary(1) to be UTF-8 clean. +2019-08-31 Fred Gleason + * Refactored 'RDCddbLookup' to use CDDB protocol level 6. diff --git a/lib/librd_cs.ts b/lib/librd_cs.ts index 7e659054..5e3a5c13 100644 --- a/lib/librd_cs.ts +++ b/lib/librd_cs.ts @@ -1218,6 +1218,25 @@ ze &souboru Konec + + RDCddbLookup + + CDDB Query + + + + Multiple Matches Found! + + + + OK + OK + + + Cancel + Zrušit + + RDCueEdit diff --git a/lib/librd_de.ts b/lib/librd_de.ts index efcc9b6b..16b5bd26 100644 --- a/lib/librd_de.ts +++ b/lib/librd_de.ts @@ -1209,6 +1209,25 @@ senden Ende + + RDCddbLookup + + CDDB Query + + + + Multiple Matches Found! + + + + OK + OK + + + Cancel + Abbrechen + + RDCueEdit diff --git a/lib/librd_es.ts b/lib/librd_es.ts index d713eab3..cd065c63 100644 --- a/lib/librd_es.ts +++ b/lib/librd_es.ts @@ -1209,6 +1209,25 @@ Color Final + + RDCddbLookup + + CDDB Query + + + + Multiple Matches Found! + + + + OK + + + + Cancel + Cancelar + + RDCueEdit diff --git a/lib/librd_fr.ts b/lib/librd_fr.ts index 61fbf55f..3db0a25a 100644 --- a/lib/librd_fr.ts +++ b/lib/librd_fr.ts @@ -1095,6 +1095,25 @@ La Couleur Fin + + RDCddbLookup + + CDDB Query + + + + Multiple Matches Found! + + + + OK + + + + Cancel + + + RDCueEdit diff --git a/lib/librd_nb.ts b/lib/librd_nb.ts index 3ca46584..79858fc7 100644 --- a/lib/librd_nb.ts +++ b/lib/librd_nb.ts @@ -1208,6 +1208,25 @@ farge Slutten + + RDCddbLookup + + CDDB Query + + + + Multiple Matches Found! + + + + OK + OK + + + Cancel + + + RDCueEdit diff --git a/lib/librd_nn.ts b/lib/librd_nn.ts index 3ca46584..79858fc7 100644 --- a/lib/librd_nn.ts +++ b/lib/librd_nn.ts @@ -1208,6 +1208,25 @@ farge Slutten + + RDCddbLookup + + CDDB Query + + + + Multiple Matches Found! + + + + OK + OK + + + Cancel + + + RDCueEdit diff --git a/lib/librd_pt_BR.ts b/lib/librd_pt_BR.ts index 9e64ab27..ebd44143 100644 --- a/lib/librd_pt_BR.ts +++ b/lib/librd_pt_BR.ts @@ -1209,6 +1209,25 @@ Cor Fim + + RDCddbLookup + + CDDB Query + + + + Multiple Matches Found! + + + + OK + OK + + + Cancel + Cancelar + + RDCueEdit diff --git a/lib/rdcddblookup.cpp b/lib/rdcddblookup.cpp index 610f5b94..5d3aa80f 100644 --- a/lib/rdcddblookup.cpp +++ b/lib/rdcddblookup.cpp @@ -25,13 +25,13 @@ #include #include #include -#include #include #include -RDCddbLookup::RDCddbLookup(FILE *profile_msgs,QObject *parent) - : QObject(parent) +RDCddbLookup::RDCddbLookup(const QString &caption,FILE *profile_msgs, + QWidget *parent) + : QDialog(parent) { lookup_state=0; lookup_profile_msgs=profile_msgs; @@ -46,12 +46,32 @@ RDCddbLookup::RDCddbLookup(FILE *profile_msgs,QObject *parent) lookup_hostname=getenv("HOSTNAME"); } + setWindowTitle(caption+" - "+tr("CDDB Query")); + + QFont label_font("Helvetica",12,QFont::Bold); + label_font.setPixelSize(12); + + lookup_titles_label=new QLabel(tr("Multiple Matches Found!"),this); + lookup_titles_label->setAlignment(Qt::AlignCenter|Qt::AlignVCenter); + lookup_titles_label->setFont(label_font); + + lookup_titles_box=new QComboBox(this); + + lookup_ok_button=new QPushButton(tr("OK"),this); + lookup_ok_button->setFont(label_font); + connect(lookup_ok_button,SIGNAL(clicked()),this,SLOT(okData())); + + lookup_cancel_button=new QPushButton(tr("Cancel"),this); + lookup_cancel_button->setFont(label_font); + connect(lookup_cancel_button,SIGNAL(clicked()),this,SLOT(cancelData())); + // // Socket // lookup_socket=new QTcpSocket(this); connect(lookup_socket,SIGNAL(readyRead()),this,SLOT(readyReadData())); - connect(lookup_socket,SIGNAL(error(QAbstractSocket::SocketError)),this,SLOT(errorData(QAbstractSocket::SocketError))); + connect(lookup_socket,SIGNAL(error(QAbstractSocket::SocketError)), + this,SLOT(errorData(QAbstractSocket::SocketError))); } @@ -61,6 +81,12 @@ RDCddbLookup::~RDCddbLookup() } +QSize RDCddbLookup::sizeHint() const +{ + return QSize(400,120); +} + + void RDCddbLookup::setCddbRecord(RDCddbRecord *rec) { lookup_record=rec; @@ -139,7 +165,7 @@ void RDCddbLookup::readyReadData() while(lookup_socket->canReadLine()) { line=QString::fromUtf8(lookup_socket->readLine()); Profile("recevied from server: \""+line+"\""); - sscanf((const char *)line,"%d",&code); + code=line.split(" ").at(0).toInt(); switch(lookup_state) { case 0: // Login Banner if((code==200)||(code==201)) { @@ -158,6 +184,16 @@ void RDCddbLookup::readyReadData() case 1: // Handshake Response if((code==200)||(code==402)) { + SendToServer("proto 6"); + lookup_state=2; + } + else { + FinishCddbLookup(RDCddbLookup::ProtocolError); + } + break; + + case 2: // Protocol Level Response + if(code==201) { snprintf(buffer,2048,"cddb query %08x %d", lookup_record->discId(),lookup_record->tracks()); for(int i=0;itracks();i++) { @@ -167,14 +203,14 @@ void RDCddbLookup::readyReadData() snprintf(offset,256," %d",lookup_record->discLength()/75); strcat(buffer,offset); SendToServer(buffer); - lookup_state=2; + lookup_state=3; } else { FinishCddbLookup(RDCddbLookup::ProtocolError); } break; - case 2: // Query Response + case 3: // Query Response switch(code) { case 200: // Exact Match f0=line.split(" "); @@ -192,13 +228,19 @@ void RDCddbLookup::readyReadData() (const char *)lookup_record->discGenre().utf8(), lookup_record->discId()); SendToServer(buffer); - lookup_state=3; + lookup_state=5; } else { FinishCddbLookup(RDCddbLookup::ProtocolError); } break; + case 210: // Multiple Exact Matches + lookup_titles_box->clear(); + lookup_titles_key.clear(); + lookup_state=4; + break; + case 211: // Inexact Match FinishCddbLookup(RDCddbLookup::PartialMatch); break; @@ -209,16 +251,58 @@ void RDCddbLookup::readyReadData() } break; - case 3: // Read Response + case 4: // Process Multiple Matches + if(line.trimmed()==".") { + Profile("Match list complete, showing chooser dialog..."); + if(exec()) { + f0=lookup_titles_key.at(lookup_titles_box->currentItem()). + split(" ",QString::SkipEmptyParts); + if(f0.size()!=2) { + FinishCddbLookup(RDCddbLookup::ProtocolError); + } + lookup_record->setDiscId(f0.at(1).toUInt(&ok,16)); + if(!ok) { + FinishCddbLookup(RDCddbLookup::ProtocolError); + } + lookup_record->setDiscGenre(f0.at(0)); + f0=lookup_titles_box->currentText().split("/"); + if(f0.size()==2) { + lookup_record->setDiscTitle(f0.at(1).trimmed()); + } + else { + lookup_record->setDiscTitle(lookup_titles_box->currentText().trimmed()); + } + snprintf(buffer,2048,"cddb read %s %08x\n", + (const char *)lookup_record->discGenre().utf8(), + lookup_record->discId()); + SendToServer(buffer); + lookup_state=5; + } + else { + FinishCddbLookup(RDCddbLookup::NoMatch); + } + } + else { + f0.clear(); + f0=line.split(" "); + lookup_titles_key.push_back(f0.at(0).trimmed()+" "+ + f0.at(1).trimmed()); + f0.removeFirst(); + f0.removeFirst(); + lookup_titles_box->insertItem(lookup_titles_box->count(),f0.join(" ").trimmed()); + } + break; + + case 5: // Read Response if((code==210)) { - lookup_state=4; + lookup_state=6; } else { FinishCddbLookup(RDCddbLookup::ProtocolError); } break; - case 4: // Record Lines + case 6: // Record Lines if(line[0]!='#') { // Ignore Comments if(line[0]=='.') { // Done FinishCddbLookup(RDCddbLookup::ExactMatch); @@ -273,12 +357,38 @@ void RDCddbLookup::errorData(QAbstractSocket::SocketError err) } +void RDCddbLookup::okData() +{ + done(true); +} + + +void RDCddbLookup::cancelData() +{ + done(false); +} + + +void RDCddbLookup::resizeEvent(QResizeEvent *e) +{ + int w=size().width(); + int h=size().height(); + + lookup_titles_label->setGeometry(15,2,w-30,20); + + lookup_titles_box->setGeometry(10,24,w-20,20); + + lookup_ok_button->setGeometry(w-180,h-60,80,50); + lookup_cancel_button->setGeometry(w-90,h-60,80,50); +} + + void RDCddbLookup::FinishCddbLookup(RDCddbLookup::Result res) { SendToServer("quit"); lookup_socket->close(); lookup_state=0; - emit done(res); + emit lookupDone(res); Profile("CDDB lookup finished"); } diff --git a/lib/rdcddblookup.h b/lib/rdcddblookup.h index aa15b1bd..204fc8d0 100644 --- a/lib/rdcddblookup.h +++ b/lib/rdcddblookup.h @@ -2,7 +2,7 @@ // // A Qt class for accessing the FreeDB CD Database. // -// (C) Copyright 2003,2016 Fred Gleason +// (C) Copyright 2003-2019 Fred Gleason // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU Library General Public License @@ -24,9 +24,14 @@ #include -#include +#include +#include +#include +#include +#include #include -#include + +#include "rdcddbrecord.h" // // Default Settings @@ -43,31 +48,37 @@ * database server. **/ -class RDCddbLookup : public QObject +class RDCddbLookup : public QDialog { Q_OBJECT - public: - enum Result {ExactMatch=0,PartialMatch=1,NoMatch=2, - ProtocolError=3,NetworkError=4}; - RDCddbLookup(FILE *profile_msgs,QObject *parent=0); - ~RDCddbLookup(); - void setCddbRecord(RDCddbRecord *); - void lookupRecord(const QString &cdda_dir,const QString &cdda_dev, - const QString &hostname, - Q_UINT16 port=RDCDDBLOOKUP_DEFAULT_PORT, - const QString &username="", - const QString &appname=PACKAGE_NAME, - const QString &ver=VERSION); - bool readIsrc(const QString &cdda_dir,const QString &cdda_dev); + public: + enum Result {ExactMatch=0,PartialMatch=1,NoMatch=2, + ProtocolError=3,NetworkError=4}; + RDCddbLookup(const QString &caption,FILE *profile_msgs,QWidget *parent=0); + ~RDCddbLookup(); + QSize sizeHint() const; + void setCddbRecord(RDCddbRecord *); + void lookupRecord(const QString &cdda_dir,const QString &cdda_dev, + const QString &hostname, + Q_UINT16 port=RDCDDBLOOKUP_DEFAULT_PORT, + const QString &username="", + const QString &appname=PACKAGE_NAME, + const QString &ver=VERSION); + bool readIsrc(const QString &cdda_dir,const QString &cdda_dev); - private slots: - void readyReadData(); - void errorData(QAbstractSocket::SocketError); + private slots: + void readyReadData(); + void errorData(QAbstractSocket::SocketError); + void okData(); + void cancelData(); - signals: - void done(RDCddbLookup::Result); + signals: + void lookupDone(RDCddbLookup::Result); - private: + protected: + void resizeEvent(QResizeEvent *e); + + private: void FinishCddbLookup(RDCddbLookup::Result res); QString DecodeString(QString &str); void ParsePair(QString *line,QString *tag,QString *value,int *index); @@ -76,6 +87,11 @@ class RDCddbLookup : public QObject bool ReadIsrcs(const QString &cdda_dir,const QString &cdda_dev); void SendToServer(const QString &msg); void Profile(const QString &msg); + QLabel *lookup_titles_label; + QComboBox *lookup_titles_box; + QStringList lookup_titles_key; + QPushButton *lookup_ok_button; + QPushButton *lookup_cancel_button; RDCddbRecord *lookup_record; QTcpSocket *lookup_socket; int lookup_state; diff --git a/rdlibrary/cdripper.cpp b/rdlibrary/cdripper.cpp index 82822d9e..56de3598 100644 --- a/rdlibrary/cdripper.cpp +++ b/rdlibrary/cdripper.cpp @@ -124,12 +124,12 @@ CdRipper::CdRipper(QString cutname,RDCddbRecord *rec,RDLibraryConf *conf, // CDDB Stuff // if(rip_profile_rip) { - rip_cddb_lookup=new RDCddbLookup(stdout,this); + rip_cddb_lookup=new RDCddbLookup("RDLibrary",stdout,this); } else { - rip_cddb_lookup=new RDCddbLookup(NULL,this); + rip_cddb_lookup=new RDCddbLookup("RDLibrary",NULL,this); } - connect(rip_cddb_lookup,SIGNAL(done(RDCddbLookup::Result)), + connect(rip_cddb_lookup,SIGNAL(lookupDone(RDCddbLookup::Result)), this,SLOT(cddbDoneData(RDCddbLookup::Result))); // diff --git a/rdlibrary/disk_ripper.cpp b/rdlibrary/disk_ripper.cpp index 7ad9db36..49198a1b 100644 --- a/rdlibrary/disk_ripper.cpp +++ b/rdlibrary/disk_ripper.cpp @@ -119,12 +119,12 @@ DiskRipper::DiskRipper(QString *filter,QString *group,QString *schedcode, // CDDB Stuff // if(rip_profile_rip) { - rip_cddb_lookup=new RDCddbLookup(stdout,this); + rip_cddb_lookup=new RDCddbLookup("RDLibrary",stdout,this); } else { - rip_cddb_lookup=new RDCddbLookup(NULL,this); + rip_cddb_lookup=new RDCddbLookup("RDLibrary",NULL,this); } - connect(rip_cddb_lookup,SIGNAL(done(RDCddbLookup::Result)), + connect(rip_cddb_lookup,SIGNAL(lookupDone(RDCddbLookup::Result)), this,SLOT(cddbDoneData(RDCddbLookup::Result))); //