aboutsummaryrefslogtreecommitdiff
path: root/src/plugins/General/rgscan/rgscandialog.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/General/rgscan/rgscandialog.cpp')
-rw-r--r--src/plugins/General/rgscan/rgscandialog.cpp91
1 files changed, 68 insertions, 23 deletions
diff --git a/src/plugins/General/rgscan/rgscandialog.cpp b/src/plugins/General/rgscan/rgscandialog.cpp
index 88de4a58f..af7d9b7fb 100644
--- a/src/plugins/General/rgscan/rgscandialog.cpp
+++ b/src/plugins/General/rgscan/rgscandialog.cpp
@@ -28,6 +28,9 @@
#include <qmmp/metadatamanager.h>
#include <taglib/mpegfile.h>
#include <taglib/apetag.h>
+#include <taglib/flacfile.h>
+#include <taglib/xiphcomment.h>
+#include <taglib/oggflacfile.h>
#include "rgscanner.h"
#include "gain_analysis.h"
#include "rgscandialog.h"
@@ -47,25 +50,33 @@ RGScanDialog::RGScanDialog(QList <PlayListTrack *> tracks, QWidget *parent) : Q
m_ui.tableWidget->verticalHeader()->setDefaultSectionSize(fontMetrics().height() + 2);
m_ui.tableWidget->verticalHeader()->setResizeMode(QHeaderView::Fixed);
- MetaDataFormatter formatter("%p%if(%p&%t, - ,)%t - %l");
-
- //FIXME remove dupliacates
- foreach(PlayListTrack *track , tracks)
+ QStringList paths;
+ MetaDataFormatter formatter("%if(%p&%t,%p - %t,%f) - %l");
+ foreach(PlayListTrack *track, tracks)
{
+ //skip streams
if(track->length() == 0 || track->url().contains("://"))
continue;
-
- if(!track->url().toLower().endsWith(".mp3"))
+ //skip duplicates
+ if(paths.contains(track->url()))
continue;
- QString text = formatter.parse(track);
- QTableWidgetItem *item = new QTableWidgetItem(text);
- item->setData(Qt::UserRole, track->url());
- m_ui.tableWidget->insertRow(m_ui.tableWidget->rowCount());
- m_ui.tableWidget->setItem(m_ui.tableWidget->rowCount() - 1, 0, item);
- QProgressBar *progressBar = new QProgressBar(this);
- progressBar->setRange(0, 100);
- m_ui.tableWidget->setCellWidget(m_ui.tableWidget->rowCount() - 1, 1, progressBar);
+ QString ext = track->url().section(".", -1).toLower();
+ if(ext == "mp3" || //mpeg 1 layer 3
+ ext == "flac" || //flac
+ ext == "oga") //native flac
+ {
+ paths.append(track->url());
+ QString name = formatter.parse(track);
+ QTableWidgetItem *item = new QTableWidgetItem(name);
+ item->setData(Qt::UserRole, track->url());
+ item->setData(Qt::ToolTipRole, track->url());
+ m_ui.tableWidget->insertRow(m_ui.tableWidget->rowCount());
+ m_ui.tableWidget->setItem(m_ui.tableWidget->rowCount() - 1, 0, item);
+ QProgressBar *progressBar = new QProgressBar(this);
+ progressBar->setRange(0, 100);
+ m_ui.tableWidget->setCellWidget(m_ui.tableWidget->rowCount() - 1, 1, progressBar);
+ }
}
m_ui.tableWidget->resizeColumnsToContents();
@@ -254,6 +265,34 @@ TagLib::String RGScanDialog::peakToString(double value)
return QStringToTString_qt4(QString("%1").arg(value, 0, 'f', 6));
}
+void RGScanDialog::writeAPETag(TagLib::APE::Tag *tag, ReplayGainInfoItem *item)
+{
+ if(m_ui.trackCheckBox->isChecked())
+ {
+ tag->addValue("REPLAYGAIN_TRACK_GAIN", gainToString(item->info[Qmmp::REPLAYGAIN_TRACK_GAIN]));
+ tag->addValue("REPLAYGAIN_TRACK_PEAK", peakToString(item->info[Qmmp::REPLAYGAIN_TRACK_PEAK]));
+ }
+ if(m_ui.albumCheckBox->isChecked())
+ {
+ tag->addValue("REPLAYGAIN_ALBUM_GAIN", gainToString(item->info[Qmmp::REPLAYGAIN_ALBUM_GAIN]));
+ tag->addValue("REPLAYGAIN_ALBUM_PEAK", peakToString(item->info[Qmmp::REPLAYGAIN_ALBUM_PEAK]));
+ }
+}
+
+void RGScanDialog::writeVorbisComment(TagLib::Ogg::XiphComment *tag, ReplayGainInfoItem *item)
+{
+ if(m_ui.trackCheckBox->isChecked())
+ {
+ tag->addField("REPLAYGAIN_TRACK_GAIN", gainToString(item->info[Qmmp::REPLAYGAIN_TRACK_GAIN]));
+ tag->addField("REPLAYGAIN_TRACK_PEAK", peakToString(item->info[Qmmp::REPLAYGAIN_TRACK_PEAK]));
+ }
+ if(m_ui.albumCheckBox->isChecked())
+ {
+ tag->addField("REPLAYGAIN_ALBUM_GAIN", gainToString(item->info[Qmmp::REPLAYGAIN_ALBUM_GAIN]));
+ tag->addField("REPLAYGAIN_ALBUM_PEAK", peakToString(item->info[Qmmp::REPLAYGAIN_ALBUM_PEAK]));
+ }
+}
+
void RGScanDialog::on_writeButton_clicked()
{
if(m_replayGainItemList.isEmpty())
@@ -263,19 +302,25 @@ void RGScanDialog::on_writeButton_clicked()
foreach (ReplayGainInfoItem *item, m_replayGainItemList)
{
- TagLib::MPEG::File file(qPrintable(item->url));
- TagLib::APE::Tag *tag = file.APETag(true);
+ QString ext = item->url.section(".", -1).toLower();
- if(m_ui.trackCheckBox->isChecked())
+ if(ext == "mp3") //mpeg 1 layer 3
+ {
+ TagLib::MPEG::File file(qPrintable(item->url));
+ writeAPETag(file.APETag(true), item);
+ file.save(TagLib::MPEG::File::APE, false);
+ }
+ else if(ext == "flac") //flac
{
- tag->addValue("REPLAYGAIN_TRACK_GAIN", gainToString(item->info[Qmmp::REPLAYGAIN_TRACK_GAIN]));
- tag->addValue("REPLAYGAIN_TRACK_PEAK", peakToString(item->info[Qmmp::REPLAYGAIN_TRACK_PEAK]));
+ TagLib::FLAC::File file(qPrintable(item->url));
+ writeVorbisComment(file.xiphComment(true), item);
+ file.save();
}
- if(m_ui.albumCheckBox->isChecked())
+ else if(ext == "oga")
{
- tag->addValue("REPLAYGAIN_ALBUM_GAIN", gainToString(item->info[Qmmp::REPLAYGAIN_ALBUM_GAIN]));
- tag->addValue("REPLAYGAIN_ALBUM_PEAK", peakToString(item->info[Qmmp::REPLAYGAIN_ALBUM_PEAK]));
+ TagLib::Ogg::FLAC::File file(qPrintable(item->url));
+ writeVorbisComment(file.tag(), item);
+ file.save();
}
- file.save(TagLib::MPEG::File::APE, false);
}
}