Notify collection backend about renamed files when organising files

This commit is contained in:
Jonas Kvinge
2019-03-25 00:53:12 +01:00
parent fc1a2dac90
commit 15c8f2a3ee
9 changed files with 34 additions and 7 deletions

View File

@@ -323,6 +323,17 @@ SongList CollectionBackend::FindSongsInDirectory(int id) {
} }
void CollectionBackend::SongPathChanged(const Song &song, const QFileInfo &new_file) {
// Take a song and update its path
Song updated_song = song;
updated_song.InitFromFilePartial(new_file.absoluteFilePath());
SongList updated_songs;
updated_songs << updated_song;
AddOrUpdateSongs(updated_songs);
}
void CollectionBackend::AddOrUpdateSubdirs(const SubdirectoryList &subdirs) { void CollectionBackend::AddOrUpdateSubdirs(const SubdirectoryList &subdirs) {
QMutexLocker l(db_->Mutex()); QMutexLocker l(db_->Mutex());
@@ -575,10 +586,8 @@ QStringList CollectionBackend::GetAllArtistsWithAlbums(const QueryOptions &opt)
} }
} }
// QStringList ret;
QSet<QString> artists; QSet<QString> artists;
while (query.Next()) { while (query.Next()) {
//ret << query.Value(0).toString();
artists << query.Value(0).toString(); artists << query.Value(0).toString();
} }
@@ -586,8 +595,8 @@ QStringList CollectionBackend::GetAllArtistsWithAlbums(const QueryOptions &opt)
artists << query2.Value(0).toString(); artists << query2.Value(0).toString();
} }
// return ret;
return QStringList(artists.toList()); return QStringList(artists.toList());
} }
CollectionBackend::AlbumList CollectionBackend::GetAllAlbums(const QueryOptions &opt) { CollectionBackend::AlbumList CollectionBackend::GetAllAlbums(const QueryOptions &opt) {

View File

@@ -27,6 +27,7 @@
#include <QtGlobal> #include <QtGlobal>
#include <QObject> #include <QObject>
#include <QFileInfo>
#include <QList> #include <QList>
#include <QVector> #include <QVector>
#include <QSet> #include <QSet>
@@ -194,6 +195,7 @@ class CollectionBackend : public CollectionBackendInterface {
void IncrementPlayCount(int id); void IncrementPlayCount(int id);
void IncrementSkipCount(int id, float progress); void IncrementSkipCount(int id, float progress);
void ResetStatistics(int id); void ResetStatistics(int id);
void SongPathChanged(const Song &song, const QFileInfo &new_file);
signals: signals:
void DirectoryDiscovered(const Directory &dir, const SubdirectoryList &subdirs); void DirectoryDiscovered(const Directory &dir, const SubdirectoryList &subdirs);

View File

@@ -655,7 +655,7 @@ SongList CollectionView::GetSelectedSongs() const {
void CollectionView::Organise() { void CollectionView::Organise() {
if (!organise_dialog_) if (!organise_dialog_)
organise_dialog_.reset(new OrganiseDialog(app_->task_manager())); organise_dialog_.reset(new OrganiseDialog(app_->task_manager(), app_->collection_backend()));
organise_dialog_->SetDestinationModel(app_->collection_model()->directory_model()); organise_dialog_->SetDestinationModel(app_->collection_model()->directory_model());
organise_dialog_->SetCopy(false); organise_dialog_->SetCopy(false);

View File

@@ -197,7 +197,7 @@ MainWindow::MainWindow(Application *app, SystemTrayIcon *tray_icon, OSD *osd, co
//organise_dialog_(new OrganiseDialog(app_->task_manager())), //organise_dialog_(new OrganiseDialog(app_->task_manager())),
equalizer_(new Equalizer), equalizer_(new Equalizer),
organise_dialog_([=]() { organise_dialog_([=]() {
OrganiseDialog *dialog = new OrganiseDialog(app->task_manager()); OrganiseDialog *dialog = new OrganiseDialog(app->task_manager(), app->collection_backend());
dialog->SetDestinationModel(app->collection()->model()->directory_model()); dialog->SetDestinationModel(app->collection()->model()->directory_model());
return dialog; return dialog;
}), }),

View File

@@ -67,6 +67,7 @@ void RegisterMetaTypes() {
qRegisterMetaType<const char*>("const char*"); qRegisterMetaType<const char*>("const char*");
qRegisterMetaType<QList<int>>("QList<int>"); qRegisterMetaType<QList<int>>("QList<int>");
qRegisterMetaType<QList<QUrl>>("QList<QUrl>"); qRegisterMetaType<QList<QUrl>>("QList<QUrl>");
qRegisterMetaType<QFileInfo>("QFileInfo");
qRegisterMetaType<QAbstractSocket::SocketState>(); qRegisterMetaType<QAbstractSocket::SocketState>();
qRegisterMetaType<QAbstractSocket::SocketState>("QAbstractSocket::SocketState"); qRegisterMetaType<QAbstractSocket::SocketState>("QAbstractSocket::SocketState");
qRegisterMetaType<QNetworkCookie>("QNetworkCookie"); qRegisterMetaType<QNetworkCookie>("QNetworkCookie");

View File

@@ -216,6 +216,12 @@ void Organise::ProcessSomeFiles() {
files_with_errors_ << task.song_info_.song_.basefilename(); files_with_errors_ << task.song_info_.song_.basefilename();
} }
else { else {
if (job.remove_original_) {
// Notify other aspects of system that song has been invalidated
QString root = destination_->LocalPath();
QFileInfo new_file = QFileInfo(root + "/" + task.song_info_.new_filename_);
emit SongPathChanged(song, new_file);
}
if (job.mark_as_listened_) { if (job.mark_as_listened_) {
emit FileCopied(job.metadata_.id()); emit FileCopied(job.metadata_.id());
} }

View File

@@ -30,6 +30,7 @@
#include <QObject> #include <QObject>
#include <QThread> #include <QThread>
#include <QBasicTimer> #include <QBasicTimer>
#include <QFileInfo>
#include <QList> #include <QList>
#include <QVector> #include <QVector>
#include <QMap> #include <QMap>
@@ -72,6 +73,7 @@ class Organise : public QObject {
signals: signals:
void Finished(const QStringList &files_with_errors, QStringList); void Finished(const QStringList &files_with_errors, QStringList);
void FileCopied(int database_id); void FileCopied(int database_id);
void SongPathChanged(const Song &song, const QFileInfo &new_file);
protected: protected:
void timerEvent(QTimerEvent *e); void timerEvent(QTimerEvent *e);

View File

@@ -60,6 +60,7 @@
#include "core/utilities.h" #include "core/utilities.h"
#include "widgets/freespacebar.h" #include "widgets/freespacebar.h"
#include "widgets/linetextedit.h" #include "widgets/linetextedit.h"
#include "collection/collectionbackend.h"
#include "organise.h" #include "organise.h"
#include "organisedialog.h" #include "organisedialog.h"
#include "organiseerrordialog.h" #include "organiseerrordialog.h"
@@ -71,10 +72,11 @@ using std::stable_sort;
const char *OrganiseDialog::kDefaultFormat = "%albumartist/%album{ (Disc %disc)}/{%track - }%albumartist - %album - %title.%extension"; const char *OrganiseDialog::kDefaultFormat = "%albumartist/%album{ (Disc %disc)}/{%track - }%albumartist - %album - %title.%extension";
const char *OrganiseDialog::kSettingsGroup = "OrganiseDialog"; const char *OrganiseDialog::kSettingsGroup = "OrganiseDialog";
OrganiseDialog::OrganiseDialog(TaskManager *task_manager, QWidget *parent) OrganiseDialog::OrganiseDialog(TaskManager *task_manager, CollectionBackend *backend, QWidget *parent)
: QDialog(parent), : QDialog(parent),
ui_(new Ui_OrganiseDialog), ui_(new Ui_OrganiseDialog),
task_manager_(task_manager), task_manager_(task_manager),
backend_(backend),
total_size_(0) { total_size_(0) {
ui_->setupUi(this); ui_->setupUi(this);
@@ -402,6 +404,9 @@ void OrganiseDialog::accept() {
Organise *organise = new Organise(task_manager_, storage, format_, copy, ui_->overwrite->isChecked(), ui_->mark_as_listened->isChecked(), ui_->albumcover->isChecked(), new_songs_info_, ui_->eject_after->isChecked()); Organise *organise = new Organise(task_manager_, storage, format_, copy, ui_->overwrite->isChecked(), ui_->mark_as_listened->isChecked(), ui_->albumcover->isChecked(), new_songs_info_, ui_->eject_after->isChecked());
connect(organise, SIGNAL(Finished(QStringList, QStringList)), SLOT(OrganiseFinished(QStringList, QStringList))); connect(organise, SIGNAL(Finished(QStringList, QStringList)), SLOT(OrganiseFinished(QStringList, QStringList)));
connect(organise, SIGNAL(FileCopied(int)), this, SIGNAL(FileCopied(int))); connect(organise, SIGNAL(FileCopied(int)), this, SIGNAL(FileCopied(int)));
if (backend_)
connect(organise, SIGNAL(SongPathChanged(const Song&, const QFileInfo&)), backend_, SLOT(SongPathChanged(const Song&, const QFileInfo&)));
organise->Start(); organise->Start();
SaveGeometry(); SaveGeometry();

View File

@@ -48,6 +48,7 @@ class QResizeEvent;
class QShowEvent; class QShowEvent;
class TaskManager; class TaskManager;
class CollectionBackend;
class OrganiseErrorDialog; class OrganiseErrorDialog;
class Ui_OrganiseDialog; class Ui_OrganiseDialog;
@@ -55,7 +56,7 @@ class OrganiseDialog : public QDialog {
Q_OBJECT Q_OBJECT
public: public:
OrganiseDialog(TaskManager *task_manager, QWidget *parent = nullptr); OrganiseDialog(TaskManager *task_manager, CollectionBackend *backend = nullptr, QWidget *parent = nullptr);
~OrganiseDialog(); ~OrganiseDialog();
QSize sizeHint() const; QSize sizeHint() const;
@@ -104,6 +105,7 @@ class OrganiseDialog : public QDialog {
Ui_OrganiseDialog *ui_; Ui_OrganiseDialog *ui_;
TaskManager *task_manager_; TaskManager *task_manager_;
CollectionBackend *backend_;
OrganiseFormat format_; OrganiseFormat format_;