playcount
This commit is contained in:
parent
0c48fc013c
commit
5a7fe3a013
|
@ -96,10 +96,10 @@ class PysonicSubsonicApi(object):
|
||||||
title=album["name"],
|
title=album["name"],
|
||||||
album=album["name"],
|
album=album["name"],
|
||||||
artist=album["artistname"],
|
artist=album["artistname"],
|
||||||
coverArt=album["coverid"]
|
coverArt=album["coverid"],
|
||||||
|
playCount=album["plays"],
|
||||||
#year=TODO
|
#year=TODO
|
||||||
# playCount="0"
|
#created="2016-05-08T05:31:31.000Z"/>)
|
||||||
# created="2016-05-08T05:31:31.000Z"/>)
|
|
||||||
)
|
)
|
||||||
response.add_child("album", _parent="albumList", **album_kw)
|
response.add_child("album", _parent="albumList", **album_kw)
|
||||||
return response
|
return response
|
||||||
|
@ -108,16 +108,26 @@ class PysonicSubsonicApi(object):
|
||||||
@formatresponse
|
@formatresponse
|
||||||
def getMusicDirectory_view(self, id, **kwargs):
|
def getMusicDirectory_view(self, id, **kwargs):
|
||||||
"""
|
"""
|
||||||
List an artist dir
|
List either and artist or album dir
|
||||||
"""
|
"""
|
||||||
dir_id = int(id)
|
dir_id = int(id)
|
||||||
dirtype, dirinfo, entity = self.library.db.get_subsonic_musicdir(dirid=dir_id)
|
dirtype, dirinfo, entity = self.library.db.get_subsonic_musicdir(dirid=dir_id)
|
||||||
|
|
||||||
response = ApiResponse()
|
response = ApiResponse()
|
||||||
response.add_child("directory")
|
|
||||||
response.set_attrs(_path="directory", name=entity['name'], id=entity['id'],
|
|
||||||
parent=dirinfo['parent'], playCount=420)
|
|
||||||
|
|
||||||
|
# artists just need this
|
||||||
|
response.add_child("directory",
|
||||||
|
name=entity['name'],
|
||||||
|
id=entity['id'])
|
||||||
|
|
||||||
|
if dirtype == "album":
|
||||||
|
# albums can also have
|
||||||
|
# - parent (album dir id)
|
||||||
|
# - playcount
|
||||||
|
response.set_attrs(_path="directory",
|
||||||
|
parent=dirinfo["parent"],
|
||||||
|
playCount=entity["plays"])
|
||||||
|
#TODO Meeeeee
|
||||||
for childtype, child in entity["children"]:
|
for childtype, child in entity["children"]:
|
||||||
# omit not dirs and media in browser
|
# omit not dirs and media in browser
|
||||||
# if not item["isdir"] and item["type"] not in MUSIC_TYPES:
|
# if not item["isdir"] and item["type"] not in MUSIC_TYPES:
|
||||||
|
@ -229,6 +239,29 @@ class PysonicSubsonicApi(object):
|
||||||
|
|
||||||
@cherrypy.expose
|
@cherrypy.expose
|
||||||
def getCoverArt_view(self, id, **kwargs):
|
def getCoverArt_view(self, id, **kwargs):
|
||||||
|
"""
|
||||||
|
id is a string and if it's a number it's the album at for a...?? could be song or album either by id or directory id lol
|
||||||
|
it could also be:
|
||||||
|
pl-1234 - playlist
|
||||||
|
|
||||||
|
for now, if the first character isn't a number, we error
|
||||||
|
"""
|
||||||
|
if id.startswith("pl-"): # get art from first track in playlist
|
||||||
|
playlist_id = int(id[len("pl-"):])
|
||||||
|
_, songs = self.library.get_playlist(playlist_id)
|
||||||
|
for song in songs:
|
||||||
|
if song["albumcoverid"]:
|
||||||
|
id = song["albumcoverid"]
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
raise cherrypy.HTTPError(404, message=f"no art for any of the {len(songs)} tracks in playlist {playlist_id}")
|
||||||
|
elif id[0] not in "0123456789":
|
||||||
|
#TODO
|
||||||
|
print("TODO support getCoverArt id format", repr(id))
|
||||||
|
raise cherrypy.HTTPError(500, message=f"coverid format {repr(id)} not supported")
|
||||||
|
else:
|
||||||
|
id = int(id)
|
||||||
|
|
||||||
cover = self.library.get_cover(id)
|
cover = self.library.get_cover(id)
|
||||||
fpath = cover["_fullpath"]
|
fpath = cover["_fullpath"]
|
||||||
type2ct = {
|
type2ct = {
|
||||||
|
@ -405,10 +438,10 @@ class PysonicSubsonicApi(object):
|
||||||
title=album["name"],
|
title=album["name"],
|
||||||
album=album["name"],
|
album=album["name"],
|
||||||
artist=album["artistname"],
|
artist=album["artistname"],
|
||||||
coverArt=album["coverid"]
|
coverArt=album["coverid"],
|
||||||
|
playCount=album["plays"],
|
||||||
#year=TODO
|
#year=TODO
|
||||||
# playCount="0"
|
#created="2016-05-08T05:31:31.000Z"/>)
|
||||||
# created="2016-05-08T05:31:31.000Z"/>)
|
|
||||||
)
|
)
|
||||||
albums += 1
|
albums += 1
|
||||||
if albums >= albumCount:
|
if albums >= albumCount:
|
||||||
|
@ -416,7 +449,7 @@ class PysonicSubsonicApi(object):
|
||||||
|
|
||||||
# TODO make this more efficient
|
# TODO make this more efficient
|
||||||
songs = 0
|
songs = 0
|
||||||
for song in self.library.db.get_songs():
|
for song in self.library.db.get_songs(): #TODO Meeee too
|
||||||
if query not in song["title"].lower():
|
if query not in song["title"].lower():
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
@ -436,7 +469,7 @@ class PysonicSubsonicApi(object):
|
||||||
duration=song["length"],
|
duration=song["length"],
|
||||||
bitRate=song["bitrate"],
|
bitRate=song["bitrate"],
|
||||||
path=song["file"],
|
path=song["file"],
|
||||||
playCount=420,
|
playCount=song["plays"],
|
||||||
albumId=song["albumid"],
|
albumId=song["albumid"],
|
||||||
type="music"
|
type="music"
|
||||||
# suffix="mp3"
|
# suffix="mp3"
|
||||||
|
@ -457,11 +490,13 @@ class PysonicSubsonicApi(object):
|
||||||
|
|
||||||
@cherrypy.expose
|
@cherrypy.expose
|
||||||
def savePlayQueue_view(self, id, current, position, **kwargs):
|
def savePlayQueue_view(self, id, current, position, **kwargs):
|
||||||
print("TODO save playqueue with items {} current {} position {}".format(id, current, position))
|
print("TODO save playqueue with items {} current {} position {}".format(id, repr(current), repr(position)))
|
||||||
|
current = int(current)
|
||||||
song = self.library.get_song(int(current))
|
song = self.library.get_song(current)
|
||||||
self.library.db.update_album_played(song['albumid'], time())
|
self.library.db.update_album_played(song['albumid'], time())
|
||||||
self.library.db.increment_album_plays(song['albumid'])
|
self.library.db.increment_album_plays(song['albumid'])
|
||||||
|
if int(position) == 0:
|
||||||
|
self.library.db.increment_track_plays(current)
|
||||||
# TODO save playlist with items ['378', '386', '384', '380', '383'] current 383 position 4471
|
# TODO save playlist with items ['378', '386', '384', '380', '383'] current 383 position 4471
|
||||||
# id entries are strings!
|
# id entries are strings!
|
||||||
|
|
||||||
|
@ -493,7 +528,7 @@ class PysonicSubsonicApi(object):
|
||||||
duration=420,
|
duration=420,
|
||||||
# changed="2018-04-05T23:23:38.263Z"
|
# changed="2018-04-05T23:23:38.263Z"
|
||||||
# created="2018-04-05T23:23:38.252Z"
|
# created="2018-04-05T23:23:38.252Z"
|
||||||
# coverArt="pl-1"
|
coverArt="pl-{}".format(playlist["id"])
|
||||||
)
|
)
|
||||||
|
|
||||||
return response
|
return response
|
||||||
|
@ -529,9 +564,9 @@ class PysonicSubsonicApi(object):
|
||||||
contentType=song["format"],
|
contentType=song["format"],
|
||||||
# suffix="mp3"
|
# suffix="mp3"
|
||||||
duration=song["length"],
|
duration=song["length"],
|
||||||
bitRate=song["bitrate"] / 1024,
|
bitRate=song["bitrate"] / 1024 if song["bitrate"] else None, #TODO macro for this sort of logic
|
||||||
path=song["file"],
|
path=song["file"],
|
||||||
playCount="1",
|
playCount=song["plays"],
|
||||||
# created="2015-06-09T15:26:01.000Z"
|
# created="2015-06-09T15:26:01.000Z"
|
||||||
albumId=song["albumid"],
|
albumId=song["albumid"],
|
||||||
artistId=song["artistid"],
|
artistId=song["artistid"],
|
||||||
|
|
|
@ -98,7 +98,8 @@ class PysonicDatabase(object):
|
||||||
'length' INTEGER,
|
'length' INTEGER,
|
||||||
'bitrate' INTEGER,
|
'bitrate' INTEGER,
|
||||||
'track' INTEGER,
|
'track' INTEGER,
|
||||||
'year' INTEGER
|
'year' INTEGER,
|
||||||
|
'plays' INTEGER NOT NULL DEFAULT 0
|
||||||
)""",
|
)""",
|
||||||
"""CREATE TABLE 'covers' (
|
"""CREATE TABLE 'covers' (
|
||||||
'id' INTEGER PRIMARY KEY AUTOINCREMENT,
|
'id' INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
@ -478,6 +479,11 @@ class PysonicDatabase(object):
|
||||||
cursor.execute("UPDATE albums SET plays = plays + 1 WHERE id=?", (album_id, ))
|
cursor.execute("UPDATE albums SET plays = plays + 1 WHERE id=?", (album_id, ))
|
||||||
cursor.execute("COMMIT")
|
cursor.execute("COMMIT")
|
||||||
|
|
||||||
|
@readcursor
|
||||||
|
def increment_track_plays(self, cursor, track_id):
|
||||||
|
cursor.execute("UPDATE songs SET plays = plays + 1 WHERE id=?", (track_id, ))
|
||||||
|
cursor.execute("COMMIT")
|
||||||
|
|
||||||
# User related
|
# User related
|
||||||
@readcursor
|
@readcursor
|
||||||
def add_user(self, cursor, username, password, is_admin=False):
|
def add_user(self, cursor, username, password, is_admin=False):
|
||||||
|
|
Loading…
Reference in New Issue