File size: 2,639 Bytes
21db53c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
from typing import Annotated

from fastapi.params import Query


class SearchPagingParams:
    def __init__(
            self,
            count: Annotated[int, Query(ge=1, le=100, description="The number of results you want to get.")] = 10,
            skip: Annotated[int, Query(ge=0, description="The number of results you want to skip.")] = 0
    ):
        self.count = count
        self.skip = skip


class FilterParams:
    def __init__(
            self,
            preferred_ratio: Annotated[
                float | None, Query(gt=0, description="The preferred aspect ratio of the image.")] = None,
            ratio_tolerance: Annotated[
                float, Query(gt=0, lt=1, description="The tolerance of the aspect ratio.")] = 0.1,
            min_width: Annotated[int | None, Query(geq=0, description="The minimum width of the image.")] = None,
            min_height: Annotated[int | None, Query(geq=0, description="The minimum height of the image.")] = None,
            starred: Annotated[bool | None, Query(description="Whether the image is starred.")] = None,
            categories: Annotated[str | None, Query(
                description="The categories whitelist of the image. Image with **any of** the given categories will "
                            "be included. The entries should be seperated by comma.",
                examples=["stickers, cg"])] = None,
            categories_negative: Annotated[
                str | None, Query(
                    description="The categories blacklist of the image. Image with **any of** the given categories "
                                "will be ignored. The entries should be seperated by comma.",
                    examples=["stickers, cg"])] = None,
    ):
        self.preferred_ratio = preferred_ratio
        self.ratio_tolerance = ratio_tolerance
        self.min_width = min_width
        self.min_height = min_height
        self.starred = starred
        self.categories = [t.strip() for t in categories.split(',') if t.strip()] if categories else None
        self.categories_negative = [t.strip() for t in categories_negative.split(',') if
                                    t.strip()] if categories_negative else None
        self.ocr_text = None  # For exact search

    @property
    def min_ratio(self) -> float | None:
        if self.preferred_ratio is None:
            return None
        return self.preferred_ratio * (1 - self.ratio_tolerance)

    @property
    def max_ratio(self) -> float | None:
        if self.preferred_ratio is None:
            return None
        return self.preferred_ratio * (1 + self.ratio_tolerance)