Ejemplo n.º 1
0
def get_single_user(user_id, current_user_id):
    args = {"id": [user_id], "current_user_id": current_user_id}
    users = get_users(args)
    if not users:
        abort_not_found(user_id, ns)
    user = extend_user(users[0])
    return success_response(user)
Ejemplo n.º 2
0
 def get(self, user_id):
     """Fetch a single user."""
     decoded_id = decode_with_abort(user_id, ns)
     args = {"id": [decoded_id]}
     users = get_users(args)
     if not users:
         abort_not_found(user_id, ns)
     user = extend_user(users[0])
     return success_response(user)
Ejemplo n.º 3
0
    def get(self, handle):
        args = full_user_handle_parser.parse_args()
        current_user_id = get_current_user_id(args)

        args = {"handle": handle, "current_user_id": current_user_id}
        users = get_users(args)
        if not users:
            abort_not_found(handle, ns)
        user = extend_user(users[0])
        return success_response(user)
Ejemplo n.º 4
0
def search_es_full(args: dict):
    if not esclient:
        raise Exception("esclient is None")

    search_str = args.get("query")
    current_user_id = args.get("current_user_id")
    limit = args.get("limit", 10)
    offset = args.get("offset", 0)
    search_type = args.get("kind", "all")
    only_downloadable = args.get("only_downloadable")
    do_tracks = search_type == "all" or search_type == "tracks"
    do_users = search_type == "all" or search_type == "users"
    do_playlists = search_type == "all" or search_type == "playlists"
    do_albums = search_type == "all" or search_type == "albums"

    mdsl: Any = []

    # Scoring Summary
    # Query score * Function score multiplier
    # Query score = boosted on text similarity, verified artists, personalization (current user saved or reposted or followed)
    # Function score multiplier = popularity (repost count)

    # tracks
    if do_tracks:
        mdsl.extend(
            [
                {"index": ES_TRACKS},
                track_dsl(
                    search_str,
                    current_user_id,
                    must_saved=False,
                    only_downloadable=only_downloadable,
                ),
            ]
        )

        # saved tracks
        if current_user_id:
            mdsl.extend(
                [
                    {"index": ES_TRACKS},
                    track_dsl(
                        search_str,
                        current_user_id,
                        must_saved=True,
                        only_downloadable=only_downloadable,
                    ),
                ]
            )

    # users
    if do_users:
        mdsl.extend(
            [
                {"index": ES_USERS},
                user_dsl(search_str, current_user_id),
            ]
        )
        if current_user_id:
            mdsl.extend(
                [
                    {"index": ES_USERS},
                    user_dsl(search_str, current_user_id, True),
                ]
            )

    # playlists
    if do_playlists:
        mdsl.extend(
            [
                {"index": ES_PLAYLISTS},
                playlist_dsl(search_str, current_user_id),
            ]
        )

        # saved playlists
        if current_user_id:
            mdsl.extend(
                [
                    {"index": ES_PLAYLISTS},
                    playlist_dsl(search_str, current_user_id, True),
                ]
            )

    # albums
    if do_albums:
        mdsl.extend(
            [
                {"index": ES_PLAYLISTS},
                album_dsl(search_str, current_user_id),
            ]
        )
        # saved albums
        if current_user_id:
            mdsl.extend(
                [
                    {"index": ES_PLAYLISTS},
                    album_dsl(search_str, current_user_id, True),
                ]
            )

    # add size and limit with some
    # over-fetching for sake of drop_copycats
    index_name = ""
    for dsl in mdsl:
        if "index" in dsl:
            index_name = dsl["index"]
            continue
        dsl["size"] = limit
        dsl["from"] = offset
        if index_name == ES_USERS:
            dsl["size"] = limit + 5

    mfound = esclient.msearch(searches=mdsl)

    response: Dict = {
        "tracks": [],
        "saved_tracks": [],
        "users": [],
        "followed_users": [],
        "playlists": [],
        "saved_playlists": [],
        "albums": [],
        "saved_albums": [],
    }

    if do_tracks:
        response["tracks"] = pluck_hits(mfound["responses"].pop(0))
        if current_user_id:
            response["saved_tracks"] = pluck_hits(mfound["responses"].pop(0))

    if do_users:
        response["users"] = pluck_hits(mfound["responses"].pop(0))
        if current_user_id:
            response["followed_users"] = pluck_hits(mfound["responses"].pop(0))

    if do_playlists:
        response["playlists"] = pluck_hits(mfound["responses"].pop(0))
        if current_user_id:
            response["saved_playlists"] = pluck_hits(mfound["responses"].pop(0))

    if do_albums:
        response["albums"] = pluck_hits(mfound["responses"].pop(0))
        if current_user_id:
            response["saved_albums"] = pluck_hits(mfound["responses"].pop(0))

    # hydrate users, saves, reposts
    item_keys = []
    user_ids = set()
    if current_user_id:
        user_ids.add(current_user_id)

    # collect keys for fetching
    for k in [
        "tracks",
        "saved_tracks",
        "playlists",
        "saved_playlists",
        "albums",
        "saved_albums",
    ]:
        for item in response[k]:
            item_keys.append(item_key(item))
            user_ids.add(item.get("owner_id", item.get("playlist_owner_id")))

    # fetch users
    users_by_id = {}
    current_user = None

    if user_ids:
        users_mget = esclient.mget(index=ES_USERS, ids=list(user_ids))
        users_by_id = {d["_id"]: d["_source"] for d in users_mget["docs"] if d["found"]}
        if current_user_id:
            current_user = users_by_id.get(str(current_user_id))
        for id, user in users_by_id.items():
            users_by_id[id] = populate_user_metadata_es(user, current_user)

    # fetch followed saves + reposts
    # TODO: instead of limit param (20) should do an agg to get 3 saves / reposts per item_key
    (follow_saves, follow_reposts) = fetch_followed_saves_and_reposts(
        current_user_id, item_keys, 20
    )

    # tracks: finalize
    for k in ["tracks", "saved_tracks"]:
        tracks = response[k]
        hydrate_user(tracks, users_by_id)
        hydrate_saves_reposts(tracks, follow_saves, follow_reposts)
        response[k] = transform_tracks(tracks, users_by_id, current_user)

    # users: finalize
    for k in ["users", "followed_users"]:
        users = drop_copycats(response[k])
        users = users[:limit]
        response[k] = [
            extend_user(populate_user_metadata_es(user, current_user)) for user in users
        ]

    # playlists: finalize
    for k in ["playlists", "saved_playlists"]:
        playlists = response[k]
        hydrate_saves_reposts(playlists, follow_saves, follow_reposts)
        hydrate_user(playlists, users_by_id)
        response[k] = [
            extend_playlist(populate_track_or_playlist_metadata_es(item, current_user))
            for item in playlists
        ]

    return response