Skip to content

Commit

Permalink
Update playlist routes to support client (#889)
Browse files Browse the repository at this point in the history
* Update playlist routes to support client

* Fix current user passing and lint

* Remove unused
  • Loading branch information
raymondjacobson committed Oct 6, 2020
1 parent bcab5a5 commit 6eaec0c
Show file tree
Hide file tree
Showing 8 changed files with 49 additions and 23 deletions.
20 changes: 19 additions & 1 deletion discovery-provider/src/api/v1/helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,19 @@ def add_playlist_artwork(playlist):
playlist["artwork"] = artwork
return playlist


def add_playlist_added_timestamps(playlist):
if not "playlist_contents" in playlist:
return playlist
added_timestamps = []
for track in playlist["playlist_contents"]["track_ids"]:
added_timestamps.append({
"track_id": encode_int_id(track["track"]),
"timestamp": track["time"]
})
return added_timestamps


def add_user_artwork(user):
# Legacy CID-only references to images
user["cover_photo_legacy"] = user["cover_photo"]
Expand Down Expand Up @@ -159,6 +172,7 @@ def extend_track(track):

return track


def extend_playlist(playlist):
playlist_id = encode_int_id(playlist["playlist_id"])
owner_id = encode_int_id(playlist["playlist_owner_id"])
Expand All @@ -168,12 +182,16 @@ def extend_playlist(playlist):
playlist["user"] = extend_user(playlist["user"])
playlist = add_playlist_artwork(playlist)

playlist["followee_favorites"] = list(map(extend_favorite, playlist["followee_saves"]))
playlist["followee_reposts"] = list(map(extend_repost, playlist["followee_reposts"]))
playlist["followee_saves"] = list(map(extend_favorite, playlist["followee_saves"]))

playlist["favorite_count"] = playlist["save_count"]
playlist["added_timestamps"] = add_playlist_added_timestamps(playlist)
playlist["cover_art"] = playlist["playlist_image_multihash"]
playlist["cover_art_sizes"] = playlist["playlist_image_sizes_multihash"]
return playlist


def extend_activity(item):
if item.get("track_id"):
return {
Expand Down
21 changes: 10 additions & 11 deletions discovery-provider/src/api/v1/models/playlists.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,9 @@
"1000x1000": fields.String,
})

playlist_track = ns.model('playlist_track', {
"time": fields.Integer(required=True),
"track": fields.Integer(required=True)
})

playlist_contents = ns.model('playlist_contents', {
"track_ids": fields.List(fields.Nested(playlist_track))
playlist_added_timestamp = ns.model('playlist_added_timestamp', {
"timestamp": fields.Integer(required=True),
"track_id": fields.String(required=True),
})

playlist_model = ns.model('playlist', {
Expand All @@ -32,14 +28,17 @@

full_playlist_model = ns.clone('playlist_full', playlist_model, {
"created_at": fields.String,
"followee_reposts": fields.List(fields.Nested(repost)),
"followee_saves": fields.List(fields.Nested(favorite)),
"followee_reposts": fields.List(fields.Nested(repost), required=True),
"followee_favorites": fields.List(fields.Nested(favorite), required=True),
"has_current_user_reposted": fields.Boolean(required=True),
"has_current_user_saved": fields.Boolean(required=True),
"is_delete": fields.Boolean(required=True),
"is_private": fields.Boolean(required=True),
"updated_at": fields.String,
"playlist_contents": fields.Nested(playlist_contents, required=True),
"added_timestamps": fields.List(fields.Nested(playlist_added_timestamp), required=True),
"user_id": fields.String(required=True),
"user": fields.Nested(user_model_full, required=True),
"tracks": fields.List(fields.Nested(track_full), required=True)
"tracks": fields.List(fields.Nested(track_full), required=True),
"cover_art": fields.String,
"cover_art_sizes": fields.String,
})
2 changes: 1 addition & 1 deletion discovery-provider/src/api/v1/playlists.py
Original file line number Diff line number Diff line change
Expand Up @@ -231,7 +231,7 @@ def get(self, playlist_id):
playlist_reposts_route_parser.add_argument('offset', required=False, type=int)
playlist_reposts_response = make_response("following_response", full_ns, fields.List(fields.Nested(user_model_full)))
@full_ns.route("/<string:playlist_id>/reposts")
class FullTrackReposts(Resource):
class FullPlaylistReposts(Resource):
@full_ns.expect(playlist_reposts_route_parser)
@full_ns.doc(
id="""Get Users that Reposted a Playlist""",
Expand Down
7 changes: 7 additions & 0 deletions discovery-provider/src/api/v1/users.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import logging
from src.api.v1.playlists import get_tracks_for_playlist
from src.queries.get_repost_feed_for_user import get_repost_feed_for_user
from flask_restx import Resource, Namespace, fields, reqparse
from src.api.v1.models.common import favorite
Expand Down Expand Up @@ -334,6 +335,9 @@ def get(self, user_id):
"offset": offset
}
reposts = get_repost_feed_for_user(decoded_id, args)
for repost in reposts:
if "playlist_id" in repost:
repost["tracks"] = get_tracks_for_playlist(repost["playlist_id"], current_user_id)
activities = list(map(extend_activity, reposts))

return success_response(activities)
Expand Down Expand Up @@ -376,6 +380,9 @@ def get(self, handle):
"offset": offset
}
reposts = get_repost_feed_for_user(None, args)
for repost in reposts:
if "playlist_id" in repost:
repost["tracks"] = get_tracks_for_playlist(repost["playlist_id"], current_user_id)
activities = list(map(extend_activity, reposts))

return success_response(activities)
Expand Down
13 changes: 7 additions & 6 deletions discovery-provider/src/queries/get_playlist_tracks.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,15 @@
from src.models import Playlist, Track
from src.utils import helpers
from src.utils.db_session import get_db_read_replica
from src.queries.query_helpers import get_pagination_vars, \
populate_track_metadata, add_users_to_tracks
from src.queries.query_helpers import populate_track_metadata, add_users_to_tracks

logger = logging.getLogger(__name__)

def get_playlist_tracks(args):
playlists = []
current_user_id = args.get("current_user_id")
limit = args.get("limit")
offset = args.get("offset")

db = get_db_read_replica()
with db.scoped_session() as session:
Expand All @@ -31,15 +32,15 @@ def get_playlist_tracks(args):

playlist_track_ids = [track_id['track']
for track_id in playlist.playlist_contents['track_ids']]
(limit, offset) = get_pagination_vars()
query_playlist_track_ids = playlist_track_ids[offset:offset+limit]
if limit and offset:
playlist_track_ids = playlist_track_ids[offset:offset+limit]

playlist_tracks = (
session
.query(Track)
.filter(
Track.is_current == True,
Track.track_id.in_(query_playlist_track_ids)
Track.track_id.in_(playlist_track_ids)
)
.all()
)
Expand All @@ -54,7 +55,7 @@ def get_playlist_tracks(args):
tracks_dict = {track['track_id']: track for track in tracks}

playlist_tracks = []
for track_id in query_playlist_track_ids:
for track_id in playlist_track_ids:
playlist_tracks.append(tracks_dict[track_id])

return playlist_tracks
Expand Down
2 changes: 1 addition & 1 deletion discovery-provider/src/queries/get_playlists.py
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ def get_unpopulated_playlists():

if args.get("with_users", False):
user_id_list = get_users_ids(playlists)
users = get_users_by_id(session, user_id_list)
users = get_users_by_id(session, user_id_list, current_user_id)
for playlist in playlists:
user = users[playlist['playlist_owner_id']]
if user:
Expand Down
5 changes: 3 additions & 2 deletions discovery-provider/src/queries/get_repost_feed_for_user.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,15 @@
from src.utils import helpers
from src.utils.db_session import get_db_read_replica
from src.queries import response_name_constants
from src.queries.query_helpers import get_current_user_id, get_repost_counts, get_save_counts, \
from src.queries.query_helpers import get_repost_counts, get_save_counts, \
paginate_query, get_users_by_id, get_users_ids


def get_repost_feed_for_user(user_id, args):
feed_results = {}
db = get_db_read_replica()
current_user_id = args.get("current_user_id")

with db.scoped_session() as session:
if "handle" in args:
handle = args.get("handle")
Expand Down Expand Up @@ -116,7 +118,6 @@ def get_repost_feed_for_user(user_id, args):
if save_type in (SaveType.playlist, SaveType.album)
}

current_user_id = get_current_user_id(required=False)
requested_user_is_current_user = False
user_reposted_track_ids = {}
user_reposted_playlist_ids = {}
Expand Down
2 changes: 1 addition & 1 deletion discovery-provider/src/queries/queries.py
Original file line number Diff line number Diff line change
Expand Up @@ -175,7 +175,7 @@ def get_repost_feed_for_user_route(user_id):
args = to_dict(request.args)
if "with_users" in request.args:
args["with_users"] = parse_bool_param(request.args.get("with_users"))
args["current_user_id"] = get_current_user_id(required=False)
args["current_user_id"] = get_current_user_id(required=False)
feed_results = get_repost_feed_for_user(user_id, args)
return api_helpers.success_response(feed_results)

Expand Down

0 comments on commit 6eaec0c

Please sign in to comment.