Esempio n. 1
0
    def search3(self, request, *args, **kwargs):
        data = request.GET or request.POST
        query = str(data.get("query", "")).replace("*", "")
        actor = utils.get_actor_from_request(request)
        conf = [
            {
                "subsonic":
                "artist",
                "search_fields": ["name"],
                "queryset":
                (music_models.Artist.objects.with_albums_count().values(
                    "id", "_albums_count", "name")),
                "serializer":
                lambda qs: [serializers.get_artist_data(a) for a in qs],
            },
            {
                "subsonic":
                "album",
                "search_fields": ["title"],
                "queryset":
                (music_models.Album.objects.with_tracks_count().select_related(
                    "artist")),
                "serializer":
                serializers.get_album_list2_data,
            },
            {
                "subsonic":
                "song",
                "search_fields": ["title"],
                "queryset": (music_models.Track.objects.prefetch_related(
                    "uploads").select_related("album__artist")),
                "serializer":
                serializers.get_song_list_data,
            },
        ]
        payload = {"searchResult3": {}}
        for c in conf:
            offsetKey = "{}Offset".format(c["subsonic"])
            countKey = "{}Count".format(c["subsonic"])
            try:
                offset = int(data[offsetKey])
            except (TypeError, KeyError, ValueError):
                offset = 0

            try:
                size = int(data[countKey])
            except (TypeError, KeyError, ValueError):
                size = 20

            size = min(size, 100)
            queryset = c["queryset"]
            if query:
                queryset = c["queryset"].filter(
                    utils.get_query(query, c["search_fields"]))
            queryset = queryset.playable_by(actor)
            queryset = common_utils.order_for_search(queryset,
                                                     c["search_fields"][0])
            queryset = queryset[offset:offset + size]
            payload["searchResult3"][c["subsonic"]] = c["serializer"](queryset)
        return response.Response(payload)
Esempio n. 2
0
 def filter_q(self, queryset, name, value):
     query = utils.get_query(value, ["name", "user__username"])
     return queryset.filter(query)