diff --git a/approot/messages.xml b/approot/messages.xml
index a48a3cd2..485ab554 100644
--- a/approot/messages.xml
+++ b/approot/messages.xml
@@ -44,7 +44,7 @@
User not found
-
+
@@ -63,7 +63,7 @@
Path must be an existing directory
Root directory
-Add library
+
Daily
Hourly
@@ -81,6 +81,7 @@
Update start time
Weekly
+
Cannot get track duration
Cannot parse file
Cannot read file
diff --git a/approot/messages_fr.xml b/approot/messages_fr.xml
index 60e79fc8..0333e61d 100644
--- a/approot/messages_fr.xml
+++ b/approot/messages_fr.xml
@@ -15,7 +15,6 @@
Chargement...
Login
Quitter
-N'est pas un répertoire
Ok
Mot de passe
Mauvaise combinaison login / mot de passe
@@ -28,6 +27,7 @@
Les mots de passe ne correspondent pas
Une autre session a été ouverte. Reouvrir celle-ci ?
Sauvegarder
+Paramètres sauvegardés!
{1} piste
{1} pistes
@@ -44,19 +44,36 @@
L'utilisateur n'existe pas
+
+
+
+
+
+
+Bibliothèques musicales
+Créer une bibliothèque
+Supprimer la bibliothèque?
+Editer la bibliothèque
+Bibliothèque créée !
+Bibilothèque supprimée !
+Nom de la bibliothèque
+Ce nom de bibliothèque existe déjà
+Le chemin doit être absolu
+Le chemin ne doit pas recouvrir celui d'une autre bibliothèque
+Le chemin doit référencer un répertoire existant
+Répertoire racine
+
+
Tous les jours
-Collection de musiques
Toutes les heures
Scanner maintenant !
Tous les mois
-
Jamais
-Dossier racine des fichiers de musique
+Scan interrompu !
Scan terminé : {1} fichiers, {2} ajouts, {3} mises à jour, {4} suppressions, {5} duplicatas, {6} erreurs
Scan lancé !
Options
-Nouveaux paramètres sauvegardés !
Moteur de similarité
Basé sur les tags
Aucun
@@ -64,6 +81,7 @@
Heure de départ de la mise à jour
Toutes les semaines
+
Impossible de récupérer la durée de la piste
Impossible d'analyser le fichier
Impossible de lire le fichier
@@ -98,7 +116,6 @@
Supprimer l'utilisateur ?
Demo
Utilisateurs
-
Compte de démonstration
diff --git a/approot/messages_it.xml b/approot/messages_it.xml
index ffa01c6e..8ff7f2df 100644
--- a/approot/messages_it.xml
+++ b/approot/messages_it.xml
@@ -15,8 +15,7 @@
Caricamento...
Login
Logout
-Non è una directory
-
+Ok
Password
Errata combinazione di Login / Password
Superati i tentativi di accesso, riprova più tardi
@@ -32,6 +31,7 @@
+
Utente
@@ -44,20 +44,36 @@
Utente non trovato
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Giornaliera
-Raccolta musicale
Ogni ora
Scansiona ora!
Mensile
-
Mai
-Cartella dei file multimediali
Scansione completata: {1} file totali, {2} aggiunti, {3} aggiornati, {4} eliminati, {5} duplicati, {6} errati
Scansione avviata!
-Impostazioni scansione
-Impostazioni salvate!
+
@@ -65,6 +81,7 @@
Orario di aggiornamento
Settimanale
+
Non sono stato in grado di determinare la durata della traccia
Non in grado di analizzare il file
Non in grado di leggere il file
@@ -99,7 +116,6 @@
Elimina l'utente ?
Demo
Utenti
-
Account demo
diff --git a/approot/messages_zh.xml b/approot/messages_zh.xml
index d559d788..466c745e 100644
--- a/approot/messages_zh.xml
+++ b/approot/messages_zh.xml
@@ -15,7 +15,6 @@
加载中...
登陆
注销
-不是一个目录
密码
用户名或密码无效
@@ -32,6 +31,7 @@
+
用户
@@ -44,19 +44,36 @@
用户未找到
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
每日
-音乐收藏
每小时
立即扫描!
每月
-
从不
-媒体根目录
+
扫描完成:总文件 {1},添加文件 {2},更新文件 {3},删除文件 {4},重复文件 {5},错误文件 {6}
扫描已完成!
扫描选项
-新设置已保存!
@@ -64,6 +81,7 @@
更新开始时间
每周
+
无法获得音轨时间
无法解析文件
无法读取文件
@@ -98,7 +116,6 @@
删除用户?
演示
用户
-
演示账号
diff --git a/src/libs/database/impl/Listen.cpp b/src/libs/database/impl/Listen.cpp
index df308871..ae173cd6 100644
--- a/src/libs/database/impl/Listen.cpp
+++ b/src/libs/database/impl/Listen.cpp
@@ -34,8 +34,10 @@ namespace Database
auto query{ session.query("SELECT a.id from artist a")
.join("track t ON t.id = t_a_l.track_id")
.join("track_artist_link t_a_l ON t_a_l.artist_id = a.id")
- .join("listen l ON l.track_id = t.id")
- .where("l.user_id = ?").bind(params.user) };
+ .join("listen l ON l.track_id = t.id") };
+
+ if (params.user.isValid())
+ query.where("l.user_id = ?").bind(params.user);
if (params.backend)
query.where("l.backend = ?").bind(*params.backend);
@@ -77,8 +79,10 @@ namespace Database
{
auto query{ session.query("SELECT r.id from release r")
.join("track t ON t.release_id = r.id")
- .join("listen l ON l.track_id = t.id")
- .where("l.user_id = ?").bind(params.user) };
+ .join("listen l ON l.track_id = t.id") };
+
+ if (params.user.isValid())
+ query.where("l.user_id = ?").bind(params.user);
if (params.backend)
query.where("l.backend = ?").bind(*params.backend);
@@ -119,8 +123,10 @@ namespace Database
Wt::Dbo::Query createTracksQuery(Wt::Dbo::Session& session, const Listen::StatsFindParameters& params)
{
auto query{ session.query("SELECT t.id from track t")
- .join("listen l ON l.track_id = t.id")
- .where("l.user_id = ?").bind(params.user) };
+ .join("listen l ON l.track_id = t.id") };
+
+ if (params.user.isValid())
+ query.where("l.user_id = ?").bind(params.user);
if (params.backend)
query.where("l.backend = ?").bind(*params.backend);
diff --git a/src/libs/database/test/Listen.cpp b/src/libs/database/test/Listen.cpp
index ecfe9541..1615b908 100644
--- a/src/libs/database/test/Listen.cpp
+++ b/src/libs/database/test/Listen.cpp
@@ -1045,6 +1045,45 @@ TEST_F(DatabaseFixture, Listen_getRecentArtists_cluster)
}
}
+
+TEST_F(DatabaseFixture, Listen_getRecentArtists_mediaLibrary)
+{
+ ScopedTrack track{ session, "MyTrack" };
+ ScopedUser user{ session, "MyUser" };
+ ScopedArtist artist{ session, "MyArtist" };
+ ScopedMediaLibrary library{ session };
+ ScopedMediaLibrary otherLibrary{ session };
+
+ {
+ auto transaction{ session.createWriteTransaction() };
+ TrackArtistLink::create(session, track.get(), artist.get(), TrackArtistLinkType::Artist);
+ track.get().modify()->setMediaLibrary(library.get());
+ }
+
+ const Wt::WDateTime dateTime{ Wt::WDate {2000, 1, 2}, Wt::WTime {12,0, 1} };
+ ScopedListen listen1{ session, user.lockAndGet(), track.lockAndGet(), ScrobblingBackend::Internal, dateTime };
+
+ {
+ auto transaction{ session.createReadTransaction() };
+
+ Listen::ArtistStatsFindParameters params;
+ params.setMediaLibrary(library.getId());
+
+ auto artists{ Listen::getRecentArtists(session, params) };
+ ASSERT_EQ(artists.results.size(), 1);
+ EXPECT_EQ(artists.results[0], artist->getId());
+ }
+ {
+ auto transaction{ session.createReadTransaction() };
+
+ Listen::ArtistStatsFindParameters params;
+ params.setMediaLibrary(otherLibrary.getId());
+
+ auto artists{ Listen::getRecentArtists(session, params) };
+ EXPECT_EQ(artists.results.size(), 0);
+ }
+}
+
TEST_F(DatabaseFixture, Listen_getRecentReleases)
{
ScopedTrack track{ session, "MyTrack" };
@@ -1096,7 +1135,6 @@ TEST_F(DatabaseFixture, Listen_getRecentReleases)
}
}
-
TEST_F(DatabaseFixture, Listen_getMostRecentRelease)
{
ScopedTrack track{ session, "MyTrack" };
@@ -1282,6 +1320,46 @@ TEST_F(DatabaseFixture, Listen_getRecentReleases_cluster)
}
}
+TEST_F(DatabaseFixture, Listen_getRecentReleases_mediaLibrary)
+{
+ ScopedTrack track{ session, "MyTrack" };
+ ScopedUser user{ session, "MyUser" };
+ ScopedRelease release{ session, "MyRelease" };
+ ScopedMediaLibrary library{ session };
+ ScopedMediaLibrary otherLibrary{ session };
+
+ {
+ auto transaction{ session.createWriteTransaction() };
+ track.get().modify()->setRelease(release.get());
+ track.get().modify()->setMediaLibrary(library.get());
+ }
+
+ const Wt::WDateTime dateTime{ Wt::WDate {2000, 1, 2}, Wt::WTime {12,0, 1} };
+ ScopedListen listen1{ session, user.lockAndGet(), track.lockAndGet(), ScrobblingBackend::Internal, dateTime };
+
+ {
+ auto transaction{ session.createReadTransaction() };
+
+ Listen::StatsFindParameters params;
+ params.setMediaLibrary(library.getId());
+
+ auto releases{ Listen::getRecentReleases(session, params) };
+ EXPECT_EQ(releases.moreResults, false);
+ ASSERT_EQ(releases.results.size(), 1);
+ EXPECT_EQ(releases.results[0], release.getId());
+ }
+ {
+ auto transaction{ session.createReadTransaction() };
+
+ Listen::StatsFindParameters params;
+ params.setMediaLibrary(otherLibrary.getId());
+
+ auto releases{ Listen::getRecentReleases(session, params) };
+ EXPECT_EQ(releases.moreResults, false);
+ EXPECT_EQ(releases.results.size(), 0);
+ }
+}
+
TEST_F(DatabaseFixture, Listen_getRecentTracks)
{
ScopedTrack track{ session, "MyTrack" };
@@ -1328,6 +1406,46 @@ TEST_F(DatabaseFixture, Listen_getRecentTracks)
}
}
+
+TEST_F(DatabaseFixture, Listen_getRecentTracks_mediaLibrary)
+{
+ ScopedTrack track{ session, "MyTrack" };
+ ScopedUser user{ session, "MyUser" };
+ ScopedMediaLibrary library{ session };
+ ScopedMediaLibrary otherLibrary{ session };
+
+ const Wt::WDateTime dateTime{ Wt::WDate {2000, 1, 2}, Wt::WTime {12,0, 1} };
+ ScopedListen listen1{ session, user.lockAndGet(), track.lockAndGet(), ScrobblingBackend::Internal, dateTime };
+
+ {
+ auto transaction{ session.createWriteTransaction() };
+ track.get().modify()->setMediaLibrary(library.get());
+ }
+
+ {
+ auto transaction{ session.createReadTransaction() };
+
+ Listen::StatsFindParameters params;
+ params.setMediaLibrary(library.getId());
+
+ auto tracks{ Listen::getRecentTracks(session, params) };
+ EXPECT_EQ(tracks.moreResults, false);
+ ASSERT_EQ(tracks.results.size(), 1);
+ EXPECT_EQ(tracks.results[0], track.getId());
+ }
+
+ {
+ auto transaction{ session.createReadTransaction() };
+
+ Listen::StatsFindParameters params;
+ params.setMediaLibrary(otherLibrary.getId());
+
+ auto tracks{ Listen::getRecentTracks(session, params) };
+ EXPECT_EQ(tracks.moreResults, false);
+ EXPECT_EQ(tracks.results.size(), 0);
+ }
+}
+
TEST_F(DatabaseFixture, Listen_getCount_track)
{
ScopedTrack track{ session, "MyTrack" };