Now using new artwork table everywhere in app and subsonic API to refer to artworks
This commit is contained in:
@@ -19,6 +19,8 @@
|
||||
|
||||
#include "database/Artwork.hpp"
|
||||
|
||||
#include <Wt/Dbo/WtSqlTraits.h>
|
||||
|
||||
#include "database/Image.hpp"
|
||||
#include "database/Session.hpp"
|
||||
#include "database/TrackEmbeddedImage.hpp"
|
||||
@@ -74,4 +76,15 @@ namespace lms::db
|
||||
return utils::fetchQuerySingleResult(session.getDboSession()->query<Wt::Dbo::ptr<Artwork>>("SELECT a FROM artwork a").where("a.image_id = ?").bind(id));
|
||||
}
|
||||
|
||||
Wt::WDateTime Artwork::getLastWrittenTime() const
|
||||
{
|
||||
auto query{ session()->query<Wt::WDateTime>("SELECT MAX(COALESCE(image.file_last_write, track.file_last_write)) AS last_written_datetime FROM artwork") };
|
||||
query.leftJoin("image ON artwork.image_id = image.id");
|
||||
query.leftJoin("track_embedded_image ON artwork.track_embedded_image_id = track_embedded_image.id");
|
||||
query.leftJoin("track_embedded_image_link ON track_embedded_image.id = track_embedded_image_link.track_embedded_image_id");
|
||||
query.leftJoin("track ON track.id = track_embedded_image_link.track_id");
|
||||
query.where("artwork.id = ?").bind(getId());
|
||||
|
||||
return utils::fetchQuerySingleResult(query);
|
||||
}
|
||||
} // namespace lms::db
|
||||
|
||||
@@ -374,11 +374,21 @@ namespace lms::db
|
||||
return _preferredArtwork;
|
||||
}
|
||||
|
||||
ArtworkId Track::getPreferredArtworkId() const
|
||||
{
|
||||
return _preferredArtwork.id();
|
||||
}
|
||||
|
||||
ObjectPtr<Artwork> Track::getPreferredMediaArtwork() const
|
||||
{
|
||||
return _preferredMediaArtwork;
|
||||
}
|
||||
|
||||
ArtworkId Track::getPreferredMediaArtworkId() const
|
||||
{
|
||||
return _preferredMediaArtwork.id();
|
||||
}
|
||||
|
||||
RangeResults<TrackId> Track::findIds(Session& session, const FindParameters& parameters)
|
||||
{
|
||||
session.checkReadTransaction();
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
#pragma once
|
||||
|
||||
#include <Wt/Dbo/Dbo.h>
|
||||
#include <Wt/WDateTime.h>
|
||||
|
||||
#include "database/ArtworkId.hpp"
|
||||
#include "database/ImageId.hpp"
|
||||
@@ -46,6 +47,7 @@ namespace lms::db
|
||||
// getters
|
||||
TrackEmbeddedImageId getTrackEmbeddedImageId() const { return _trackEmbeddedImage.id(); }
|
||||
ImageId getImageId() const { return _image.id(); }
|
||||
Wt::WDateTime getLastWrittenTime() const;
|
||||
|
||||
template<class Action>
|
||||
void persist(Action& a)
|
||||
|
||||
@@ -306,7 +306,9 @@ namespace lms::db
|
||||
ObjectPtr<MediaLibrary> getMediaLibrary() const;
|
||||
ObjectPtr<Directory> getDirectory() const;
|
||||
ObjectPtr<Artwork> getPreferredArtwork() const;
|
||||
ArtworkId getPreferredArtworkId() const;
|
||||
ObjectPtr<Artwork> getPreferredMediaArtwork() const;
|
||||
ArtworkId getPreferredMediaArtworkId() const;
|
||||
|
||||
std::vector<std::vector<ObjectPtr<Cluster>>> getClusterGroups(const std::vector<ClusterTypeId>& clusterTypes, std::size_t size) const;
|
||||
|
||||
|
||||
@@ -0,0 +1,83 @@
|
||||
/*
|
||||
* Copyright (C) 2025of LMS.
|
||||
*
|
||||
* LMS is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* LMS is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with LMS. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "Common.hpp"
|
||||
|
||||
#include "database/Artwork.hpp"
|
||||
#include "database/Image.hpp"
|
||||
#include "database/TrackEmbeddedImage.hpp"
|
||||
#include "database/TrackEmbeddedImageLink.hpp"
|
||||
|
||||
namespace lms::db::tests
|
||||
{
|
||||
using ScopedArtwork = ScopedEntity<db::Artwork>;
|
||||
using ScopedImage = ScopedEntity<db::Image>;
|
||||
using ScopedTrackEmbeddedImage = ScopedEntity<db::TrackEmbeddedImage>;
|
||||
|
||||
TEST_F(DatabaseFixture, Artwork_image)
|
||||
{
|
||||
{
|
||||
auto transaction{ session.createReadTransaction() };
|
||||
EXPECT_EQ(Artwork::getCount(session), 0);
|
||||
}
|
||||
|
||||
ScopedImage image{ session, "/MyImage" };
|
||||
ScopedArtwork artwork{ session, image.lockAndGet() };
|
||||
|
||||
const Wt::WDateTime dateTime{ Wt::WDate{ 2025, 1, 1 } };
|
||||
|
||||
{
|
||||
auto transaction{ session.createReadTransaction() };
|
||||
EXPECT_EQ(Artwork::getCount(session), 1);
|
||||
}
|
||||
|
||||
{
|
||||
auto transaction{ session.createWriteTransaction() };
|
||||
image.get().modify()->setLastWriteTime(dateTime);
|
||||
}
|
||||
|
||||
{
|
||||
auto transaction{ session.createReadTransaction() };
|
||||
EXPECT_EQ(artwork.get()->getLastWrittenTime(), dateTime);
|
||||
}
|
||||
}
|
||||
|
||||
TEST_F(DatabaseFixture, Artwork_trackEmbeddedImage)
|
||||
{
|
||||
{
|
||||
auto transaction{ session.createReadTransaction() };
|
||||
EXPECT_EQ(Artwork::getCount(session), 0);
|
||||
}
|
||||
|
||||
ScopedTrackEmbeddedImage image{ session };
|
||||
ScopedTrack track{ session };
|
||||
ScopedArtwork artwork{ session, image.lockAndGet() };
|
||||
|
||||
const Wt::WDateTime dateTime{ Wt::WDate{ 2025, 1, 1 } };
|
||||
|
||||
{
|
||||
auto transaction{ session.createWriteTransaction() };
|
||||
session.create<db::TrackEmbeddedImageLink>(track.get(), image.get());
|
||||
track.get().modify()->setLastWriteTime(dateTime);
|
||||
}
|
||||
|
||||
{
|
||||
auto transaction{ session.createReadTransaction() };
|
||||
EXPECT_EQ(artwork.get()->getLastWrittenTime(), dateTime);
|
||||
}
|
||||
}
|
||||
} // namespace lms::db::tests
|
||||
@@ -2,6 +2,7 @@
|
||||
add_executable(test-database
|
||||
Artist.cpp
|
||||
ArtistInfo.cpp
|
||||
Artwork.cpp
|
||||
AuthToken.cpp
|
||||
Cluster.cpp
|
||||
Common.cpp
|
||||
|
||||
Reference in New Issue
Block a user