mirror of
https://github.com/spl0k/supysonic.git
synced 2024-12-22 17:06:17 +00:00
Porting supysonic.api.annotation
This commit is contained in:
parent
2b472b4d97
commit
7401b4dec9
@ -28,16 +28,16 @@ def star_single(cls, starcls, eid):
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
e = cls[eid]
|
e = cls[eid]
|
||||||
except ObjectNotFound:
|
except cls.DoesNotExist:
|
||||||
raise NotFound("{} {}".format(cls.__name__, eid))
|
raise NotFound("{} {}".format(cls.__name__, eid))
|
||||||
|
|
||||||
try:
|
try:
|
||||||
starcls[request.user, eid]
|
starcls[request.user, eid]
|
||||||
raise GenericError("{} {} already starred".format(cls.__name__, eid))
|
raise GenericError("{} {} already starred".format(cls.__name__, eid))
|
||||||
except ObjectNotFound:
|
except starcls.DoesNotExist:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
starcls(user=request.user, starred=e)
|
starcls.create(user=request.user, starred=e)
|
||||||
|
|
||||||
|
|
||||||
def unstar_single(cls, starcls, eid):
|
def unstar_single(cls, starcls, eid):
|
||||||
@ -48,7 +48,9 @@ def unstar_single(cls, starcls, eid):
|
|||||||
:param eid: id of the entity to unstar
|
:param eid: id of the entity to unstar
|
||||||
"""
|
"""
|
||||||
|
|
||||||
delete(s for s in starcls if s.user.id == request.user.id and s.starred.id == eid)
|
starcls.delete().where(
|
||||||
|
starcls.user == request.user, starcls.starred == eid
|
||||||
|
).execute()
|
||||||
|
|
||||||
|
|
||||||
def handle_star_request(func):
|
def handle_star_request(func):
|
||||||
@ -139,17 +141,13 @@ def rate():
|
|||||||
|
|
||||||
if rating == 0:
|
if rating == 0:
|
||||||
if tid is not None:
|
if tid is not None:
|
||||||
delete(
|
RatingTrack.delete().where(
|
||||||
r
|
RatingTrack.user == request.user, RatingTrack.rated == tid
|
||||||
for r in RatingTrack
|
).execute()
|
||||||
if r.user.id == request.user.id and r.rated.id == tid
|
|
||||||
)
|
|
||||||
else:
|
else:
|
||||||
delete(
|
RatingFolder.delete().where(
|
||||||
r
|
RatingFolder.user == request.user, RatingFolder.rated == fid
|
||||||
for r in RatingFolder
|
).execute()
|
||||||
if r.user.id == request.user.id and r.rated.id == fid
|
|
||||||
)
|
|
||||||
else:
|
else:
|
||||||
if tid is not None:
|
if tid is not None:
|
||||||
rated = Track[tid]
|
rated = Track[tid]
|
||||||
@ -163,8 +161,9 @@ def rate():
|
|||||||
try:
|
try:
|
||||||
rating_info = rating_cls[request.user, uid]
|
rating_info = rating_cls[request.user, uid]
|
||||||
rating_info.rating = rating
|
rating_info.rating = rating
|
||||||
except ObjectNotFound:
|
rating_info.save()
|
||||||
rating_cls(user=request.user, rated=rated, rating=rating)
|
except rating_cls.DoesNotExist:
|
||||||
|
rating_cls.create(user=request.user, rated=rated, rating=rating)
|
||||||
|
|
||||||
return request.formatter.empty
|
return request.formatter.empty
|
||||||
|
|
||||||
|
@ -1,15 +1,13 @@
|
|||||||
# This file is part of Supysonic.
|
# This file is part of Supysonic.
|
||||||
# Supysonic is a Python implementation of the Subsonic server API.
|
# Supysonic is a Python implementation of the Subsonic server API.
|
||||||
#
|
#
|
||||||
# Copyright (C) 2017 Alban 'spl0k' Féron
|
# Copyright (C) 2017-2022 Alban 'spl0k' Féron
|
||||||
#
|
#
|
||||||
# Distributed under terms of the GNU AGPLv3 license.
|
# Distributed under terms of the GNU AGPLv3 license.
|
||||||
|
|
||||||
import unittest
|
import unittest
|
||||||
import uuid
|
import uuid
|
||||||
|
|
||||||
from pony.orm import db_session
|
|
||||||
|
|
||||||
from supysonic.db import Folder, Artist, Album, Track, User, ClientPrefs
|
from supysonic.db import Folder, Artist, Album, Track, User, ClientPrefs
|
||||||
|
|
||||||
from .apitestbase import ApiTestBase
|
from .apitestbase import ApiTestBase
|
||||||
@ -19,35 +17,37 @@ class AnnotationTestCase(ApiTestBase):
|
|||||||
def setUp(self):
|
def setUp(self):
|
||||||
super().setUp()
|
super().setUp()
|
||||||
|
|
||||||
with db_session:
|
root = Folder.create(name="Root", root=True, path="tests")
|
||||||
root = Folder(name="Root", root=True, path="tests")
|
folder = Folder.create(
|
||||||
folder = Folder(name="Folder", path="tests/assets", parent=root)
|
name="Folder", root=False, path="tests/assets", parent=root
|
||||||
artist = Artist(name="Artist")
|
)
|
||||||
album = Album(name="Album", artist=artist)
|
artist = Artist.create(name="Artist")
|
||||||
|
album = Album.create(name="Album", artist=artist)
|
||||||
|
|
||||||
# Populate folder ids
|
# Populate folder ids
|
||||||
root = Folder.get(name="Root")
|
root = Folder.get(name="Root")
|
||||||
folder = Folder.get(name="Folder")
|
folder = Folder.get(name="Folder")
|
||||||
|
|
||||||
track = Track(
|
track = Track.create(
|
||||||
title="Track",
|
title="Track",
|
||||||
album=album,
|
album=album,
|
||||||
artist=artist,
|
artist=artist,
|
||||||
disc=1,
|
disc=1,
|
||||||
number=1,
|
number=1,
|
||||||
path="tests/assets/empty",
|
path="tests/assets/empty",
|
||||||
folder=folder,
|
folder=folder,
|
||||||
root_folder=root,
|
root_folder=root,
|
||||||
duration=2,
|
duration=2,
|
||||||
bitrate=320,
|
bitrate=320,
|
||||||
last_modification=0,
|
last_modification=0,
|
||||||
)
|
)
|
||||||
|
|
||||||
self.folderid = folder.id
|
self.folderid = folder.id
|
||||||
self.artistid = artist.id
|
self.artistid = artist.id
|
||||||
self.albumid = album.id
|
self.albumid = album.id
|
||||||
self.trackid = track.id
|
self.trackid = track.id
|
||||||
self.user = User.get(name="alice")
|
self.user = User.get(name="alice")
|
||||||
|
self.prefs = ClientPrefs.create(user=self.user, client_name="tests")
|
||||||
|
|
||||||
def test_star(self):
|
def test_star(self):
|
||||||
self._make_request("star", error=10)
|
self._make_request("star", error=10)
|
||||||
@ -61,36 +61,27 @@ class AnnotationTestCase(ApiTestBase):
|
|||||||
self._make_request("star", {"id": str(self.artistid)}, error=70)
|
self._make_request("star", {"id": str(self.artistid)}, error=70)
|
||||||
self._make_request("star", {"id": str(self.albumid)}, error=70)
|
self._make_request("star", {"id": str(self.albumid)}, error=70)
|
||||||
self._make_request("star", {"id": str(self.trackid)}, skip_post=True)
|
self._make_request("star", {"id": str(self.trackid)}, skip_post=True)
|
||||||
with db_session:
|
self.assertIn(
|
||||||
prefs = ClientPrefs.get(
|
"starred", Track[self.trackid].as_subsonic_child(self.user, self.prefs)
|
||||||
lambda p: p.user.name == "alice" and p.client_name == "tests"
|
)
|
||||||
)
|
|
||||||
self.assertIn(
|
|
||||||
"starred", Track[self.trackid].as_subsonic_child(self.user, prefs)
|
|
||||||
)
|
|
||||||
self._make_request("star", {"id": str(self.trackid)}, error=0)
|
self._make_request("star", {"id": str(self.trackid)}, error=0)
|
||||||
|
|
||||||
self._make_request("star", {"id": str(self.folderid)}, skip_post=True)
|
self._make_request("star", {"id": str(self.folderid)}, skip_post=True)
|
||||||
with db_session:
|
self.assertIn("starred", Folder[self.folderid].as_subsonic_child(self.user))
|
||||||
self.assertIn("starred", Folder[self.folderid].as_subsonic_child(self.user))
|
|
||||||
self._make_request("star", {"id": str(self.folderid)}, error=0)
|
self._make_request("star", {"id": str(self.folderid)}, error=0)
|
||||||
|
|
||||||
self._make_request("star", {"albumId": str(self.folderid)}, error=0)
|
self._make_request("star", {"albumId": str(self.folderid)}, error=0)
|
||||||
self._make_request("star", {"albumId": str(self.artistid)}, error=70)
|
self._make_request("star", {"albumId": str(self.artistid)}, error=70)
|
||||||
self._make_request("star", {"albumId": str(self.trackid)}, error=70)
|
self._make_request("star", {"albumId": str(self.trackid)}, error=70)
|
||||||
self._make_request("star", {"albumId": str(self.albumid)}, skip_post=True)
|
self._make_request("star", {"albumId": str(self.albumid)}, skip_post=True)
|
||||||
with db_session:
|
self.assertIn("starred", Album[self.albumid].as_subsonic_album(self.user))
|
||||||
self.assertIn("starred", Album[self.albumid].as_subsonic_album(self.user))
|
|
||||||
self._make_request("star", {"albumId": str(self.albumid)}, error=0)
|
self._make_request("star", {"albumId": str(self.albumid)}, error=0)
|
||||||
|
|
||||||
self._make_request("star", {"artistId": str(self.folderid)}, error=0)
|
self._make_request("star", {"artistId": str(self.folderid)}, error=0)
|
||||||
self._make_request("star", {"artistId": str(self.albumid)}, error=70)
|
self._make_request("star", {"artistId": str(self.albumid)}, error=70)
|
||||||
self._make_request("star", {"artistId": str(self.trackid)}, error=70)
|
self._make_request("star", {"artistId": str(self.trackid)}, error=70)
|
||||||
self._make_request("star", {"artistId": str(self.artistid)}, skip_post=True)
|
self._make_request("star", {"artistId": str(self.artistid)}, skip_post=True)
|
||||||
with db_session:
|
self.assertIn("starred", Artist[self.artistid].as_subsonic_artist(self.user))
|
||||||
self.assertIn(
|
|
||||||
"starred", Artist[self.artistid].as_subsonic_artist(self.user)
|
|
||||||
)
|
|
||||||
self._make_request("star", {"artistId": str(self.artistid)}, error=0)
|
self._make_request("star", {"artistId": str(self.artistid)}, error=0)
|
||||||
|
|
||||||
def test_unstar(self):
|
def test_unstar(self):
|
||||||
@ -110,31 +101,18 @@ class AnnotationTestCase(ApiTestBase):
|
|||||||
self._make_request("unstar", {"artistId": "unknown"}, error=0)
|
self._make_request("unstar", {"artistId": "unknown"}, error=0)
|
||||||
|
|
||||||
self._make_request("unstar", {"id": str(self.trackid)}, skip_post=True)
|
self._make_request("unstar", {"id": str(self.trackid)}, skip_post=True)
|
||||||
with db_session:
|
self.assertNotIn(
|
||||||
prefs = ClientPrefs.get(
|
"starred", Track[self.trackid].as_subsonic_child(self.user, self.prefs)
|
||||||
lambda p: p.user.name == "alice" and p.client_name == "tests"
|
)
|
||||||
)
|
|
||||||
self.assertNotIn(
|
|
||||||
"starred", Track[self.trackid].as_subsonic_child(self.user, prefs)
|
|
||||||
)
|
|
||||||
|
|
||||||
self._make_request("unstar", {"id": str(self.folderid)}, skip_post=True)
|
self._make_request("unstar", {"id": str(self.folderid)}, skip_post=True)
|
||||||
with db_session:
|
self.assertNotIn("starred", Folder[self.folderid].as_subsonic_child(self.user))
|
||||||
self.assertNotIn(
|
|
||||||
"starred", Folder[self.folderid].as_subsonic_child(self.user)
|
|
||||||
)
|
|
||||||
|
|
||||||
self._make_request("unstar", {"albumId": str(self.albumid)}, skip_post=True)
|
self._make_request("unstar", {"albumId": str(self.albumid)}, skip_post=True)
|
||||||
with db_session:
|
self.assertNotIn("starred", Album[self.albumid].as_subsonic_album(self.user))
|
||||||
self.assertNotIn(
|
|
||||||
"starred", Album[self.albumid].as_subsonic_album(self.user)
|
|
||||||
)
|
|
||||||
|
|
||||||
self._make_request("unstar", {"artistId": str(self.artistid)}, skip_post=True)
|
self._make_request("unstar", {"artistId": str(self.artistid)}, skip_post=True)
|
||||||
with db_session:
|
self.assertNotIn("starred", Artist[self.artistid].as_subsonic_artist(self.user))
|
||||||
self.assertNotIn(
|
|
||||||
"starred", Artist[self.artistid].as_subsonic_artist(self.user)
|
|
||||||
)
|
|
||||||
|
|
||||||
def test_set_rating(self):
|
def test_set_rating(self):
|
||||||
self._make_request("setRating", error=10)
|
self._make_request("setRating", error=10)
|
||||||
@ -158,58 +136,44 @@ class AnnotationTestCase(ApiTestBase):
|
|||||||
)
|
)
|
||||||
self._make_request("setRating", {"id": str(self.trackid), "rating": 6}, error=0)
|
self._make_request("setRating", {"id": str(self.trackid), "rating": 6}, error=0)
|
||||||
|
|
||||||
with db_session:
|
self.assertNotIn(
|
||||||
prefs = ClientPrefs.get(
|
"userRating", Track[self.trackid].as_subsonic_child(self.user, self.prefs)
|
||||||
lambda p: p.user.name == "alice" and p.client_name == "tests"
|
)
|
||||||
)
|
|
||||||
self.assertNotIn(
|
|
||||||
"userRating", Track[self.trackid].as_subsonic_child(self.user, prefs)
|
|
||||||
)
|
|
||||||
|
|
||||||
for i in range(1, 6):
|
for i in range(1, 6):
|
||||||
self._make_request(
|
self._make_request(
|
||||||
"setRating", {"id": str(self.trackid), "rating": i}, skip_post=True
|
"setRating", {"id": str(self.trackid), "rating": i}, skip_post=True
|
||||||
)
|
)
|
||||||
with db_session:
|
self.assertEqual(
|
||||||
prefs = ClientPrefs.get(
|
Track[self.trackid].as_subsonic_child(self.user, self.prefs)[
|
||||||
lambda p: p.user.name == "alice" and p.client_name == "tests"
|
"userRating"
|
||||||
)
|
],
|
||||||
self.assertEqual(
|
i,
|
||||||
Track[self.trackid].as_subsonic_child(self.user, prefs)[
|
)
|
||||||
"userRating"
|
|
||||||
],
|
|
||||||
i,
|
|
||||||
)
|
|
||||||
|
|
||||||
self._make_request(
|
self._make_request(
|
||||||
"setRating", {"id": str(self.trackid), "rating": 0}, skip_post=True
|
"setRating", {"id": str(self.trackid), "rating": 0}, skip_post=True
|
||||||
)
|
)
|
||||||
with db_session:
|
self.assertNotIn(
|
||||||
prefs = ClientPrefs.get(
|
"userRating", Track[self.trackid].as_subsonic_child(self.user, self.prefs)
|
||||||
lambda p: p.user.name == "alice" and p.client_name == "tests"
|
)
|
||||||
)
|
|
||||||
self.assertNotIn(
|
|
||||||
"userRating", Track[self.trackid].as_subsonic_child(self.user, prefs)
|
|
||||||
)
|
|
||||||
|
|
||||||
self.assertNotIn(
|
self.assertNotIn(
|
||||||
"userRating", Folder[self.folderid].as_subsonic_child(self.user)
|
"userRating", Folder[self.folderid].as_subsonic_child(self.user)
|
||||||
)
|
)
|
||||||
for i in range(1, 6):
|
for i in range(1, 6):
|
||||||
self._make_request(
|
self._make_request(
|
||||||
"setRating", {"id": str(self.folderid), "rating": i}, skip_post=True
|
"setRating", {"id": str(self.folderid), "rating": i}, skip_post=True
|
||||||
)
|
)
|
||||||
with db_session:
|
self.assertEqual(
|
||||||
self.assertEqual(
|
Folder[self.folderid].as_subsonic_child(self.user)["userRating"], i
|
||||||
Folder[self.folderid].as_subsonic_child(self.user)["userRating"], i
|
)
|
||||||
)
|
|
||||||
self._make_request(
|
self._make_request(
|
||||||
"setRating", {"id": str(self.folderid), "rating": 0}, skip_post=True
|
"setRating", {"id": str(self.folderid), "rating": 0}, skip_post=True
|
||||||
)
|
)
|
||||||
with db_session:
|
self.assertNotIn(
|
||||||
self.assertNotIn(
|
"userRating", Folder[self.folderid].as_subsonic_child(self.user)
|
||||||
"userRating", Folder[self.folderid].as_subsonic_child(self.user)
|
)
|
||||||
)
|
|
||||||
|
|
||||||
def test_scrobble(self):
|
def test_scrobble(self):
|
||||||
self._make_request("scrobble", error=10)
|
self._make_request("scrobble", error=10)
|
||||||
|
Loading…
Reference in New Issue
Block a user