From 98fd82a3718e927730816de27db6225fb453ad37 Mon Sep 17 00:00:00 2001 From: Mattias Andersson Date: Mon, 12 May 2014 23:57:11 +0200 Subject: [PATCH] Use the TagReaderClient to tag the files in the CD ripper instead of using Taglib directly. --- src/transcoder/transcoder.cpp | 1 - src/transcoder/transcoder.h | 6 +- src/ui/ripcd.cpp | 117 +++++++++++++++------------------- src/ui/ripcd.h | 27 ++++++-- 4 files changed, 77 insertions(+), 74 deletions(-) diff --git a/src/transcoder/transcoder.cpp b/src/transcoder/transcoder.cpp index 5a9696b97..1c2ed0625 100644 --- a/src/transcoder/transcoder.cpp +++ b/src/transcoder/transcoder.cpp @@ -324,7 +324,6 @@ Transcoder::StartJobStatus Transcoder::MaybeStartNextJob() { Job job = queued_jobs_.takeFirst(); if (StartJob(job)) { - emit(JobOutputName(job.output)); return StartedSuccessfully; } diff --git a/src/transcoder/transcoder.h b/src/transcoder/transcoder.h index 61d45f2b8..78e5d015b 100644 --- a/src/transcoder/transcoder.h +++ b/src/transcoder/transcoder.h @@ -70,7 +70,6 @@ signals: void JobComplete(const QString& filename, bool success); void LogLine(const QString& message); void AllJobsComplete(); - void JobOutputName(const QString& filename); protected: bool event(QEvent* e); @@ -125,7 +124,8 @@ signals: StartJobStatus MaybeStartNextJob(); bool StartJob(const Job& job); - GstElement* CreateElement(const QString& factory_name, GstElement* bin = nullptr, + GstElement* CreateElement(const QString& factory_name, + GstElement* bin = nullptr, const QString& name = QString()); GstElement* CreateElementForMimeType(const QString& element_type, const QString& mime_type, @@ -138,7 +138,7 @@ signals: gpointer data); private: - typedef QList > JobStateList; + typedef QList> JobStateList; int max_threads_; QList queued_jobs_; diff --git a/src/ui/ripcd.cpp b/src/ui/ripcd.cpp index f3b7d4a0b..3f7dcce59 100644 --- a/src/ui/ripcd.cpp +++ b/src/ui/ripcd.cpp @@ -22,6 +22,8 @@ #include "transcoder/transcoderoptionsdialog.h" #include "ui/iconloader.h" #include "core/logging.h" +#include "core/song.h" +#include "core/tagreaderclient.h" #include "core/utilities.h" #include @@ -35,14 +37,6 @@ #include #include #include -#include -#include -#include -#include -#include -#include -#include -#include // winspool.h defines this :( #ifdef AddJob @@ -108,8 +102,6 @@ RipCD::RipCD(QWidget* parent) connect(transcoder_, SIGNAL(JobComplete(QString, bool)), SLOT(JobComplete(QString, bool))); connect(transcoder_, SIGNAL(AllJobsComplete()), SLOT(AllJobsComplete())); - connect(transcoder_, SIGNAL(JobOutputName(QString)), - SLOT(AppendOutput(QString))); connect(this, SIGNAL(RippingComplete()), SLOT(ThreadedTranscoding())); connect(this, SIGNAL(SignalUpdateProgress()), SLOT(UpdateProgress())); @@ -213,20 +205,15 @@ void RipCD::ThreadClickedRipButton() { // Set up progress bar emit(SignalUpdateProgress()); - tracks_to_rip_.clear(); - for (int i = 1; i <= i_tracks_; i++) { - if (!checkboxes_.value(i - 1)->isChecked()) { - continue; - } - tracks_to_rip_.append(i); - QString filename = temporary_directory_ + - ParseFileFormatString(ui_->format_filename->text(), i) + - ".wav"; + + for (const TrackInformation& track : tracks_) { + QString filename = + QString("%1%2.wav").arg(temporary_directory_).arg(track.track_number); QFile* destination_file = new QFile(filename); destination_file->open(QIODevice::WriteOnly); - lsn_t i_first_lsn = cdio_get_track_lsn(cdio_, i); - lsn_t i_last_lsn = cdio_get_track_last_lsn(cdio_, i); + lsn_t i_first_lsn = cdio_get_track_lsn(cdio_, track.track_number); + lsn_t i_last_lsn = cdio_get_track_last_lsn(cdio_, track.track_number); WriteWAVHeader(destination_file, (i_last_lsn - i_first_lsn + 1) * CDIO_CD_FRAMESIZE_RAW); @@ -253,29 +240,18 @@ void RipCD::ThreadClickedRipButton() { TranscoderPreset preset = ui_->format->itemData(ui_->format->currentIndex()) .value(); - QString outfilename = GetOutputFileName(filename, preset); - transcoder_->AddJob(filename, preset, outfilename); + transcoder_->AddJob(filename, preset, track.transcoded_filename); } emit(RippingComplete()); } -// Returns the rightmost non-empty part of 'path'. -QString RipCD::TrimPath(const QString& path) const { - return path.section('/', -1, -1, QString::SectionSkipEmpty); -} - -QString RipCD::GetOutputFileName(const QString& input, - const TranscoderPreset& preset) const { +QString RipCD::GetOutputFileName(const QString& basename) const { QString path = ui_->destination->itemData(ui_->destination->currentIndex()).toString(); - if (path.isEmpty()) { - // Keep the original path. - return input.section('.', 0, -2) + '.' + preset.extension_; - } else { - QString file_name = TrimPath(input); - file_name = file_name.section('.', 0, -2); - return path + '/' + file_name + '.' + preset.extension_; - } + QString extension = ui_->format->itemData(ui_->format->currentIndex()) + .value() + .extension_; + return path + '/' + basename + '.' + extension; } QString RipCD::ParseFileFormatString(const QString& file_format, @@ -323,6 +299,20 @@ void RipCD::ClickedRipButton() { } return; } + + // Add tracks to the rip list. + tracks_.clear(); + for (int i = 1; i <= i_tracks_; ++i) { + if (!checkboxes_.value(i - 1)->isChecked()) { + continue; + } + QString transcoded_filename = GetOutputFileName( + ParseFileFormatString(ui_->format_filename->text(), i)); + QString title = track_names_.value(i - 1)->text(); + AddTrack(i, title, transcoded_filename); + } + + // Start ripping. SetWorking(true); { QMutexLocker l(&mutex_); @@ -331,6 +321,12 @@ void RipCD::ClickedRipButton() { QtConcurrent::run(this, &RipCD::ThreadClickedRipButton); } +void RipCD::AddTrack(int track_number, const QString& title, + const QString& transcoded_filename) { + TrackInformation track(track_number, title, transcoded_filename); + tracks_.append(track); +} + void RipCD::JobComplete(const QString& filename, bool success) { (*(success ? &finished_success_ : &finished_failed_))++; emit(SignalUpdateProgress()); @@ -338,35 +334,28 @@ void RipCD::JobComplete(const QString& filename, bool success) { void RipCD::AllJobsComplete() { RemoveTemporaryDirectory(); - - // having a little trouble on wav files, works fine on ogg-vorbis - qSort(generated_files_); - - for (int i = 0; i < generated_files_.length(); i++) { - TagLib::FileRef f(generated_files_.value(i).toUtf8().constData()); - - f.tag()->setTitle(track_names_.value(tracks_to_rip_.value(i) - 1) - ->text() - .toUtf8() - .constData()); - f.tag()->setAlbum(ui_->albumLineEdit->text().toUtf8().constData()); - f.tag()->setArtist(ui_->artistLineEdit->text().toUtf8().constData()); - f.tag()->setGenre(ui_->genreLineEdit->text().toUtf8().constData()); - f.tag()->setYear(ui_->yearLineEdit->text().toInt()); - f.tag()->setTrack(tracks_to_rip_.value(i) - 1); - // Need to check this - // f.tag()->setDisc(ui_->discLineEdit->text().toInt()); - f.save(); - } - // Resets lists - generated_files_.clear(); - tracks_to_rip_.clear(); - + TagFiles(); SetWorking(false); } -void RipCD::AppendOutput(const QString& filename) { - generated_files_.append(filename); +void RipCD::TagFiles() { + TranscoderPreset preset = ui_->format->itemData(ui_->format->currentIndex()) + .value(); + for (const TrackInformation& track : tracks_) { + Song song; + song.InitFromFilePartial(track.transcoded_filename); + song.set_title(track.title); + song.set_album(ui_->albumLineEdit->text()); + song.set_artist(ui_->artistLineEdit->text()); + song.set_genre(ui_->genreLineEdit->text()); + song.set_year(ui_->yearLineEdit->text().toInt()); + song.set_track(track.track_number); + song.set_disc(ui_->discLineEdit->text().toInt()); + song.set_filetype(preset.type_); + + TagReaderClient::Instance()->SaveFileBlocking(song.url().toLocalFile(), + song); + } } void RipCD::Options() { diff --git a/src/ui/ripcd.h b/src/ui/ripcd.h index 9b1a98cad..228540881 100644 --- a/src/ui/ripcd.h +++ b/src/ui/ripcd.h @@ -44,6 +44,18 @@ class RipCD : public QDialog { void showEvent(QShowEvent* event); private: + struct TrackInformation { + TrackInformation(int track_number, const QString& title, + const QString& transcoded_filename) + : track_number(track_number), + title(title), + transcoded_filename(transcoded_filename) {} + + int track_number; + QString title; + QString transcoded_filename; + }; + static const char* kSettingsGroup; static const int kProgressInterval; static const int kMaxDestinationItems; @@ -55,9 +67,8 @@ class RipCD : public QDialog { std::unique_ptr ui_; CdIo_t* cdio_; QList checkboxes_; - QList generated_files_; - QList tracks_to_rip_; QList track_names_; + QList tracks_; QString last_add_dir_; QPushButton* cancel_button_; QPushButton* close_button_; @@ -68,14 +79,19 @@ class RipCD : public QDialog { void WriteWAVHeader(QFile* stream, int32_t i_bytecount); int NumTracksToRip(); + void AddTrack(int track_number, const QString& title, + const QString& transcoded_filename); void ThreadClickedRipButton(); - QString TrimPath(const QString& path) const; - QString GetOutputFileName(const QString& input, - const TranscoderPreset& preset) const; + // Constructs a filename from the given base name with a path taken + // from the ui dialog and an extension that corresponds to the audio + // format chosen in the ui. + QString GetOutputFileName(const QString& basename) const; + QString ParseFileFormatString(const QString& file_format, int track_no) const; void SetWorking(bool working); void AddDestinationDirectory(QString dir); void RemoveTemporaryDirectory(); + void TagFiles(); signals: void RippingComplete(); @@ -86,7 +102,6 @@ signals: void ClickedRipButton(); void JobComplete(const QString& filename, bool success); void AllJobsComplete(); - void AppendOutput(const QString& filename); void Options(); void AddDestination(); void Cancel();