diff --git a/src/collection/collectionbackend.cpp b/src/collection/collectionbackend.cpp index 4ba290364..28b7f8039 100644 --- a/src/collection/collectionbackend.cpp +++ b/src/collection/collectionbackend.cpp @@ -21,6 +21,8 @@ #include "config.h" +#include + #include #include #include @@ -429,7 +431,7 @@ SongList CollectionBackend::SongsWithMissingFingerprint(const int id) { } -void CollectionBackend::SongPathChanged(const Song &song, const QFileInfo &new_file) { +void CollectionBackend::SongPathChanged(const Song &song, const QFileInfo &new_file, const std::optional new_collection_directory_id) { // Take a song and update its path Song updated_song = song; @@ -437,6 +439,9 @@ void CollectionBackend::SongPathChanged(const Song &song, const QFileInfo &new_f updated_song.set_url(QUrl::fromLocalFile(new_file.absoluteFilePath())); updated_song.set_basefilename(new_file.fileName()); updated_song.InitArtManual(); + if (updated_song.is_collection_song() && new_collection_directory_id) { + updated_song.set_directory_id(new_collection_directory_id.value()); + } AddOrUpdateSongs(SongList() << updated_song); diff --git a/src/collection/collectionbackend.h b/src/collection/collectionbackend.h index 46d0a5328..8a6d124ce 100644 --- a/src/collection/collectionbackend.h +++ b/src/collection/collectionbackend.h @@ -24,6 +24,8 @@ #include "config.h" +#include + #include #include #include @@ -228,7 +230,7 @@ class CollectionBackend : public CollectionBackendInterface { void IncrementPlayCount(const int id); void IncrementSkipCount(const int id, const float progress); void ResetStatistics(const int id); - void SongPathChanged(const Song &song, const QFileInfo &new_file); + void SongPathChanged(const Song &song, const QFileInfo &new_file, const std::optional new_collection_directory_id); SongList GetSongsBy(const QString &artist, const QString &album, const QString &title); void UpdateLastPlayed(const QString &artist, const QString &album, const QString &title, const qint64 lastplayed); diff --git a/src/collection/collectiondirectorymodel.cpp b/src/collection/collectiondirectorymodel.cpp index 331a6825f..dbd150a93 100644 --- a/src/collection/collectiondirectorymodel.cpp +++ b/src/collection/collectiondirectorymodel.cpp @@ -51,7 +51,7 @@ void CollectionDirectoryModel::DirectoryDiscovered(const Directory &dir) { QStandardItem *item = new QStandardItem(dir.path); item->setData(dir.id, kIdRole); item->setIcon(dir_icon_); - storage_ << std::make_shared(dir.path); + storage_ << std::make_shared(dir.path, dir.id); appendRow(item); } diff --git a/src/core/filesystemmusicstorage.cpp b/src/core/filesystemmusicstorage.cpp index a2f338550..473306cbe 100644 --- a/src/core/filesystemmusicstorage.cpp +++ b/src/core/filesystemmusicstorage.cpp @@ -21,6 +21,8 @@ #include "config.h" +#include + #include #include #include @@ -35,7 +37,7 @@ #include "filesystemmusicstorage.h" -FilesystemMusicStorage::FilesystemMusicStorage(const QString &root) : root_(root) {} +FilesystemMusicStorage::FilesystemMusicStorage(const QString &root, const std::optional collection_directory_id) : root_(root), collection_directory_id_(collection_directory_id) {} bool FilesystemMusicStorage::CopyToStorage(const CopyJob &job) { diff --git a/src/core/filesystemmusicstorage.h b/src/core/filesystemmusicstorage.h index 2fbc73647..e479886e0 100644 --- a/src/core/filesystemmusicstorage.h +++ b/src/core/filesystemmusicstorage.h @@ -24,21 +24,25 @@ #include "config.h" +#include + #include #include "musicstorage.h" class FilesystemMusicStorage : public virtual MusicStorage { public: - explicit FilesystemMusicStorage(const QString &root); + explicit FilesystemMusicStorage(const QString &root, const std::optional collection_directory_id = std::optional()); QString LocalPath() const override { return root_; } + std::optional collection_directory_id() const { return collection_directory_id_; } bool CopyToStorage(const CopyJob &job) override; bool DeleteFromStorage(const DeleteJob &job) override; private: QString root_; + std::optional collection_directory_id_; Q_DISABLE_COPY(FilesystemMusicStorage) }; diff --git a/src/core/musicstorage.h b/src/core/musicstorage.h index f1e38af18..22dce8244 100644 --- a/src/core/musicstorage.h +++ b/src/core/musicstorage.h @@ -28,6 +28,7 @@ #include #include +#include #include #include @@ -78,6 +79,7 @@ class MusicStorage { }; virtual QString LocalPath() const { return QString(); } + virtual std::optional collection_directory_id() const { return std::optional(); } virtual TranscodeMode GetTranscodeMode() const { return Transcode_Never; } virtual Song::FileType GetTranscodeFormat() const { return Song::FileType_Unknown; } diff --git a/src/organize/organize.cpp b/src/organize/organize.cpp index c33c0646c..ccfa9d727 100644 --- a/src/organize/organize.cpp +++ b/src/organize/organize.cpp @@ -256,11 +256,11 @@ void Organize::ProcessSomeFiles() { files_with_errors_ << task.song_info_.song_.basefilename(); } else { - if (job.remove_original_ && song.source() == Song::Source_Device) { + 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); + emit SongPathChanged(song, new_file, destination_->collection_directory_id()); } if (job.mark_as_listened_) { emit FileCopied(job.metadata_.id()); diff --git a/src/organize/organize.h b/src/organize/organize.h index a371686d4..a070df860 100644 --- a/src/organize/organize.h +++ b/src/organize/organize.h @@ -25,6 +25,7 @@ #include "config.h" #include +#include #include #include @@ -73,7 +74,7 @@ class Organize : public QObject { signals: void Finished(QStringList files_with_errors, QStringList); void FileCopied(int database_id); - void SongPathChanged(Song song, QFileInfo new_file); + void SongPathChanged(Song song, QFileInfo new_file, std::optional new_collection_directory_id); protected: void timerEvent(QTimerEvent *e) override;