1
0
mirror of https://github.com/spl0k/supysonic.git synced 2024-12-22 08:56:17 +00:00

User object and name stored in the request object to provide easy access

This commit is contained in:
spl0k 2013-06-13 18:17:33 +02:00
parent afe167d58a
commit 20e09a6321
5 changed files with 31 additions and 56 deletions

View File

@ -39,8 +39,12 @@ def authorize():
error = request.error_formatter(40, 'Unauthorized'), 401
if request.authorization and UserManager.try_auth(request.authorization.username, request.authorization.password)[0] == UserManager.SUCCESS:
return
if request.authorization:
status, user = UserManager.try_auth(request.authorization.username, request.authorization.password)
if status == UserManager.SUCCESS:
request.username = request.authorization.username
request.user = user
return
(username, decoded_pass) = map(request.args.get, [ 'u', 'p' ])
if not username or not decoded_pass:
@ -49,9 +53,13 @@ def authorize():
if decoded_pass.startswith('enc:'):
decoded_pass = hexdecode(decoded_pass[4:])
if UserManager.try_auth(username, decoded_pass)[0] != UserManager.SUCCESS:
status, user = UserManager.try_auth(username, decoded_pass)
if status != UserManager.SUCCESS:
return error
request.username = username
request.user = user
@app.after_request
def set_content_type(response):
if not request.path.startswith('/rest/'):

View File

@ -44,16 +44,13 @@ def rand_songs():
@app.route('/rest/getAlbumList.view', methods = [ 'GET', 'POST' ])
def album_list():
username, ltype, size, offset = map(request.args.get, [ 'u', 'type', 'size', 'offset' ])
ltype, size, offset = map(request.args.get, [ 'type', 'size', 'offset' ])
try:
size = int(size) if size else 10
offset = int(offset) if offset else 0
except:
return request.error_formatter(0, 'Invalid parameter format')
if not username:
username = request.authorization.username
query = Folder.query.filter(Folder.tracks.any())
if ltype == 'random':
albums = query.all()
@ -71,7 +68,7 @@ def album_list():
elif ltype == 'recent':
query = query.join(Track, Folder.tracks).group_by(Folder.id).order_by(desc(func.max(Track.last_play)))
elif ltype == 'starred':
query = query.join(StarredFolder).join(User).filter(User.name == username)
query = query.join(StarredFolder).join(User).filter(User.name == request.username)
elif ltype == 'alphabeticalByName':
query = query.order_by(Folder.name)
elif ltype == 'alphabeticalByArtist':
@ -88,16 +85,13 @@ def album_list():
@app.route('/rest/getAlbumList2.view', methods = [ 'GET', 'POST' ])
def album_list_id3():
username, ltype, size, offset = map(request.args.get, [ 'u', 'type', 'size', 'offset' ])
ltype, size, offset = map(request.args.get, [ 'type', 'size', 'offset' ])
try:
size = int(size) if size else 10
offset = int(offset) if offset else 0
except:
return request.error_formatter(0, 'Invalid parameter format')
if not username:
username = request.authorization.username
query = Album.query
if ltype == 'random':
albums = query.all()
@ -113,7 +107,7 @@ def album_list_id3():
elif ltype == 'recent':
query = query.join(Track, Album.tracks).group_by(Album.id).order_by(desc(func.max(Track.last_play)))
elif ltype == 'starred':
query = query.join(StarredAlbum).join(User).filter(User.name == username)
query = query.join(StarredAlbum).join(User).filter(User.name == request.username)
elif ltype == 'alphabeticalByName':
query = query.order_by(Album.name)
elif ltype == 'alphabeticalByArtist':
@ -142,29 +136,21 @@ def now_playing():
@app.route('/rest/getStarred.view', methods = [ 'GET', 'POST' ])
def get_starred():
username = request.args.get('u')
if not username:
username = request.authorization.username
return request.formatter({
'starred': {
'artist': [ { 'id': sf.starred.name, 'name': sf.starred_id } for sf in StarredFolder.query.join(User).join(Folder).filter(User.name == username).filter(~ Folder.tracks.any()) ],
'album': [ sf.starred.as_subsonic_child() for sf in StarredFolder.query.join(User).join(Folder).filter(User.name == username).filter(Folder.tracks.any()) ],
'song': [ st.starred.as_subsonic_child() for st in StarredTrack.query.join(User).filter(User.name == username) ]
'artist': [ { 'id': sf.starred.name, 'name': sf.starred_id } for sf in StarredFolder.query.join(User).join(Folder).filter(User.name == request.username).filter(~ Folder.tracks.any()) ],
'album': [ sf.starred.as_subsonic_child() for sf in StarredFolder.query.join(User).join(Folder).filter(User.name == request.username).filter(Folder.tracks.any()) ],
'song': [ st.starred.as_subsonic_child() for st in StarredTrack.query.join(User).filter(User.name == request.username) ]
}
})
@app.route('/rest/getStarred2.view', methods = [ 'GET', 'POST' ])
def get_starred_id3():
username = request.args.get('u')
if not username:
username = request.authorization.username
return request.formatter({
'starred2': {
'artist': [ sa.starred.as_subsonic_artist() for sa in StarredArtist.query.join(User).filter(User.name == username) ],
'album': [ sa.starred.as_subsonic_album() for sa in StarredAlbum.query.join(User).filter(User.name == username) ],
'song': [ st.starred.as_subsonic_child() for st in StarredTrack.query.join(User).filter(User.name == username) ]
'artist': [ sa.starred.as_subsonic_artist() for sa in StarredArtist.query.join(User).filter(User.name == request.username) ],
'album': [ sa.starred.as_subsonic_album() for sa in StarredAlbum.query.join(User).filter(User.name == request.username) ],
'song': [ st.starred.as_subsonic_child() for st in StarredTrack.query.join(User).filter(User.name == request.username) ]
}
})

View File

@ -12,22 +12,17 @@ from db import *
def star():
id, albumId, artistId = map(request.args.getlist, [ 'id', 'albumId', 'artistId' ])
username = request.args.get('u')
if not username:
username = request.authorization.username
user = User.query.filter(User.name == username).one()
def try_star(ent, starred_ent, eid):
try:
uid = uuid.UUID(eid)
except:
return 2, request.error_formatter(0, 'Invalid %s id' % ent.__name__)
if starred_ent.query.filter(starred_ent.user_id == user.id).filter(starred_ent.starred_id == uid).first():
if starred_ent.query.filter(starred_ent.user_id == request.user.id).filter(starred_ent.starred_id == uid).first():
return 2, request.error_formatter(0, '%s already starred' % ent.__name__)
e = ent.query.get(uid)
if e:
session.add(starred_ent(user = user, starred = e))
session.add(starred_ent(user = request.user, starred = e))
else:
return 1, request.error_formatter(70, 'Unknown %s id' % ent.__name__)
@ -59,18 +54,13 @@ def star():
def unstar():
id, albumId, artistId = map(request.args.getlist, [ 'id', 'albumId', 'artistId' ])
username = request.args.get('u')
if not username:
username = request.authorization.username
user = User.query.filter(User.name == username).one()
def try_unstar(ent, eid):
try:
uid = uuid.UUID(eid)
except:
return request.error_formatter(0, 'Invalid id')
ent.query.filter(ent.user_id == user.id).filter(ent.starred_id == uid).delete()
ent.query.filter(ent.user_id == request.user.id).filter(ent.starred_id == uid).delete()
return None
for eid in id:
@ -100,7 +90,7 @@ def scrobble():
if not status:
return res
t, submission, u = map(request.args.get, [ 'time', 'submission', 'u' ])
t, submission = map(request.args.get, [ 'time', 'submission' ])
if t:
try:
@ -110,11 +100,7 @@ def scrobble():
else:
t = int(time())
if u:
user = User.query.filter(User.name == u).one()
else:
user = User.query.filter(User.name == request.authorization.username).one()
lfm = LastFm(user, app.logger)
lfm = LastFm(request.user, app.logger)
if submission in (None, '', True, 'true', 'True', 1, '1'):
lfm.scrobble(res, t)

View File

@ -15,7 +15,7 @@ def stream_media():
if not status:
return res
maxBitRate, format, timeOffset, size, estimateContentLength, u = map(request.args.get, [ 'maxBitRate', 'format', 'timeOffset', 'size', 'estimateContentLength', 'u' ])
maxBitRate, format, timeOffset, size, estimateContentLength = map(request.args.get, [ 'maxBitRate', 'format', 'timeOffset', 'size', 'estimateContentLength' ])
if maxBitRate:
try:
@ -31,15 +31,10 @@ def stream_media():
# TODO transcode
pass
if u:
user = User.query.filter(User.name == u).one()
else:
user = User.query.filter(User.name == request.authorization.username).one()
res.play_count = res.play_count + 1
res.last_play = now()
user.last_play = res
user.last_play_date = now()
request.user.last_play = res
request.user.last_play_date = now()
session.commit()
if estimateContentLength == 'true':

View File

@ -20,8 +20,8 @@ def user_info():
'email': user.mail,
'scrobblingEnabled': user.lastfm_session is not None and user.lastfm_status,
'adminRole': user.admin,
'settingsRole': False,
'downloadRole': False,
'settingsRole': user.admin,
'downloadRole': True,
'uploadRole': False,
'playlistRole': False,
'coverArtRole': False,