Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 15 additions & 2 deletions app/internal/audible/search.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ class CacheQuery(BaseModel, frozen=True):
num_results: int
page: int
audible_region: audible_region_type
search_type: str = "all"


class CacheResult[T](BaseModel, frozen=True):
Expand Down Expand Up @@ -135,6 +136,7 @@ async def search_audible_books(
num_results: int = 20,
page: int = 0,
audible_region: audible_region_type | None = None,
search_type: str = "all",
) -> list[Audiobook]:
"""
https://audible.readthedocs.io/en/latest/misc/external_api.html#get--1.0-catalog-products
Expand All @@ -149,6 +151,7 @@ async def search_audible_books(
num_results=num_results,
page=page,
audible_region=audible_region,
search_type=search_type,
)
cache_result = search_cache.get(cache_key)

Expand All @@ -161,9 +164,9 @@ async def search_audible_books(
params = {
"num_results": num_results,
"products_sort_by": "Relevance",
"keywords": query,
"page": page,
"response_groups": ["media"],
"keywords": query,
}

try:
Expand All @@ -184,9 +187,19 @@ async def search_audible_books(
)
return []

# do not fetch book results we already have locally
books = audible_response.audiobooks()

if search_type == "title":
query_lower = query.lower()
books = [b for b in books if query_lower in b.title.lower()]
elif search_type == "author":
query_lower = query.lower()
books = [
b
for b in books
if any(query_lower in author.lower() for author in b.authors)
]

logger.debug(
"Search results fetched",
query=query,
Expand Down
2 changes: 2 additions & 0 deletions app/routers/api/search.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ async def search_books(
num_results: int = 20,
page: int = 0,
region: audible_region_type | None = None,
search_type: str = "all",
):
if region is None:
region = get_region_from_settings()
Expand All @@ -40,6 +41,7 @@ async def search_books(
num_results=num_results,
page=page,
audible_region=region,
search_type=search_type,
)
else:
results = []
Expand Down
3 changes: 3 additions & 0 deletions app/routers/pages/search/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ async def read_search(
num_results: int = 20,
page: int = 0,
region: audible_region_type | None = None,
search_type: str = "all",
):
if region is None:
region = get_region_from_settings()
Expand All @@ -45,6 +46,7 @@ async def read_search(
num_results=num_results,
page=page,
region=region,
search_type=search_type,
)

prowlarr_configured = prowlarr_config.is_valid(session)
Expand All @@ -55,6 +57,7 @@ async def read_search(
search_term=query or "",
search_results=results,
selected_region=region,
selected_search_type=search_type,
page=page,
auto_start_download=quality_config.get_auto_download(session)
and user.is_above(GroupEnum.trusted),
Expand Down
15 changes: 13 additions & 2 deletions templates/pages/Search/Index.jinja
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
user: DetailedUser,
search_term: str,
selected_region: audible_region_type,
selected_search_type: str = "all",
search_results: list[AudiobookSearchResult],
page: int,
auto_start_download: bool,
Expand All @@ -12,11 +13,14 @@
<BaseLayout title="Search" user={{ user }}>
<script>
const onSearch = () => {
const search_term = document.querySelector("input").value;
const form = document.querySelector("form");
const search_term = form.querySelector("input").value;
const search_type = form.querySelector("select[name='search_type']").value;
const region = form.querySelector("select[name='region']").value;
document.getElementById("search").disabled = true;
document.getElementById("search-text").style.display = "none";
document.getElementById("search-spinner").style.display = "inline-block";
window.location.href = `/search?q=${encodeURIComponent(search_term)}`;
window.location.href = `/search?q=${encodeURIComponent(search_term)}&search_type=${encodeURIComponent(search_type)}&region=${encodeURIComponent(region)}`;
};
const onPageChange = page => {
const url = new URL(window.location);
Expand Down Expand Up @@ -54,6 +58,13 @@

<Search.Suggestions id="search-suggestions" suggestions={{ suggestions }} />

<select class="select join-item max-w-24 sm:max-w-28 focus:z-10"
name="search_type">
<option value="all" {% if selected_search_type.__eq__("all") %}selected="selected"{% endif %}>All</option>
<option value="title" {% if selected_search_type.__eq__("title") %}selected="selected"{% endif %}>Title</option>
<option value="author" {% if selected_search_type.__eq__("author") %}selected="selected"{% endif %}>Author</option>
</select>

<select class="select join-item max-w-16 sm:max-w-20 focus:z-10"
name="region">
{% for region in audible_regions.keys() %}
Expand Down
Loading