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 - Music libraries + Libraries Scan settings Scanner Users @@ -63,7 +63,7 @@ Path must be an existing directory Root directory -Add library + Daily Extra tags to scan (use ; as separator) 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 + Paramètres du scan + Scanner + Utilisateurs + + +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 Tags supplémentaires à scanner (utiliser ; comme séparateur) Toutes les heures Scanner maintenant ! Tous les mois - Collection de musiques 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 - 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 - Raccolta musicale 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 - 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" };