Source code for xanax.sources.wallhaven.enums
"""
Enumerations and helpers for Wallhaven API parameters.
Provides type-safe options for search parameters and ensures only valid
values reach the API.
"""
from enum import StrEnum
[docs]
class Category(StrEnum):
"""
Wallpaper categories.
- GENERAL: General wallpapers
- ANIME: Anime and manga style
- PEOPLE: People photography
"""
GENERAL = "general"
ANIME = "anime"
PEOPLE = "people"
[docs]
class Purity(StrEnum):
"""
Content purity levels.
- SFW: Safe for work
- SKETCHY: May be questionable
- NSFW: Not safe for work (requires API key)
"""
SFW = "sfw"
SKETCHY = "sketchy"
NSFW = "nsfw"
[docs]
class Sort(StrEnum):
"""
Search result sorting options.
- DATE_ADDED: Sort by upload date (default)
- RELEVANCE: Sort by search relevance
- RANDOM: Random ordering
- VIEWS: Sort by view count
- FAVORITES: Sort by favorites count
- TOPLIST: Sort by toplist (requires ``top_range``)
"""
DATE_ADDED = "date_added"
RELEVANCE = "relevance"
RANDOM = "random"
VIEWS = "views"
FAVORITES = "favorites"
TOPLIST = "toplist"
[docs]
class Order(StrEnum):
"""
Sorting direction.
- DESC: Descending (newest/highest first)
- ASC: Ascending (oldest/lowest first)
"""
DESC = "desc"
ASC = "asc"
[docs]
class TopRange(StrEnum):
"""
Time range for toplist sorting.
- ONE_DAY: Past 24 hours
- THREE_DAYS: Past 3 days
- ONE_WEEK: Past week
- ONE_MONTH: Past month (default)
- THREE_MONTHS: Past 3 months
- SIX_MONTHS: Past 6 months
- ONE_YEAR: Past year
"""
ONE_DAY = "1d"
THREE_DAYS = "3d"
ONE_WEEK = "1w"
ONE_MONTH = "1M"
THREE_MONTHS = "3M"
SIX_MONTHS = "6M"
ONE_YEAR = "1y"
[docs]
class Color(StrEnum):
"""Valid colors for color-based searching on Wallhaven."""
MAROON = "660000"
DARK_RED = "990000"
RED = "cc0000"
CRIMSON = "cc3333"
PINK = "ea4c88"
PURPLE = "993399"
PLUM = "663399"
INDIGO = "333399"
BLUE = "0066cc"
AZURE = "0099cc"
CYAN = "66cccc"
TEAL = "77cc33"
GREEN = "669900"
DARK_GREEN = "336600"
OLIVE = "666600"
YELLOW_GREEN = "999900"
YELLOW = "cccc33"
YELLOW_BRIGHT = "ffff00"
ORANGE = "ffcc33"
ORANGE_BRIGHT = "ff9900"
VERMILLION = "ff6600"
RED_ORANGE = "cc6633"
BROWN = "996633"
DARK_BROWN = "663300"
BLACK = "000000"
GREY = "999999"
SILVER = "cccccc"
WHITE = "ffffff"
CHARCOAL = "424153"
class FileType(StrEnum):
"""File types for searching wallpapers."""
PNG = "png"
JPG = "jpg"
class Resolution:
"""Helper for validating and parsing wallpaper resolutions (``WIDTHxHEIGHT``)."""
@staticmethod
def validate(resolution: str) -> bool:
parts = resolution.lower().split("x")
if len(parts) != 2:
return False
try:
width = int(parts[0])
height = int(parts[1])
return width >= 1 and height >= 1
except ValueError:
return False
@staticmethod
def parse(resolution: str) -> tuple[int, int]:
parts = resolution.lower().split("x")
if len(parts) != 2:
raise ValueError(f"Invalid resolution format: {resolution}. Expected WIDTHxHEIGHT")
width = int(parts[0])
height = int(parts[1])
if width < 1 or height < 1:
raise ValueError(
f"Invalid resolution values: {resolution}. "
"Width and height must be positive integers."
)
return width, height
class Ratio:
"""Helper for validating and parsing aspect ratios (``WIDTH:HEIGHT`` or ``WIDTHxHEIGHT``)."""
@staticmethod
def validate(ratio: str) -> bool:
parts = ratio.lower().split("x")
if len(parts) != 2:
parts = ratio.lower().split(":")
if len(parts) != 2:
return False
try:
width = float(parts[0])
height = float(parts[1])
return width > 0 and height > 0
except ValueError:
return False
@staticmethod
def parse(ratio: str) -> tuple[float, float]:
parts = ratio.lower().split("x")
if len(parts) != 2:
parts = ratio.lower().split(":")
if len(parts) != 2:
raise ValueError(
f"Invalid ratio format: {ratio}. Expected WIDTH:HEIGHT or WIDTHxHEIGHT"
)
width = float(parts[0])
height = float(parts[1])
if width <= 0 or height <= 0:
raise ValueError(
f"Invalid ratio values: {ratio}. Width and height must be positive numbers."
)
return width, height
class Seed:
"""Helper for generating and validating random seeds (6 alphanumeric characters)."""
LENGTH = 6
@staticmethod
def validate(seed: str) -> bool:
return len(seed) == Seed.LENGTH and seed.isalnum()
@staticmethod
def generate() -> str:
import secrets
import string
alphabet = string.ascii_letters + string.digits
return "".join(secrets.choice(alphabet) for _ in range(Seed.LENGTH))