From dcc899bd5c144f523fcf90932238af60138723e7 Mon Sep 17 00:00:00 2001 From: MrOrange9 JCT <66780535+MrOrange9-JCT@users.noreply.github.com> Date: Sat, 28 Sep 2024 12:37:57 +0200 Subject: [PATCH 1/2] Add season and episode search (#x##) TorznabApi.kt --- app/src/main/kotlin/amarr/torznab/TorznabApi.kt | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/app/src/main/kotlin/amarr/torznab/TorznabApi.kt b/app/src/main/kotlin/amarr/torznab/TorznabApi.kt index 2dbdf80..42a8918 100644 --- a/app/src/main/kotlin/amarr/torznab/TorznabApi.kt +++ b/app/src/main/kotlin/amarr/torznab/TorznabApi.kt @@ -53,10 +53,15 @@ private suspend fun ApplicationCall.handleRequests(indexer: Indexer) { private suspend fun ApplicationCall.performSearch(indexer: Indexer, xmlFormat: XML) { val query = request.queryParameters["q"].orEmpty() + val season = request.queryParameters["season"].orEmpty() + val episode = request.queryParameters["episode"].orEmpty().padStart(2, '0') + + val finalQuery = "$query ${season}x$episode" + val offset = request.queryParameters["offset"]?.toIntOrNull() ?: 0 val limit = request.queryParameters["limit"]?.toIntOrNull() ?: 100 val cat = request.queryParameters["cat"]?.split(",")?.map { cat -> cat.toInt() } ?: emptyList() - application.log.debug("Handling search request: {}, {}, {}, {}", query, offset, limit, cat) + application.log.debug("Handling search request: {}, {}, {}, {}", finalQuery, offset, limit, cat) try { respondText( xmlFormat.encodeToString(indexer.search(query, offset, limit, cat)), @@ -69,4 +74,4 @@ private suspend fun ApplicationCall.performSearch(indexer: Indexer, xmlFormat: X application.log.warn("Unauthorized, returning 401") respondText("Unauthorized, check your credentials.", status = HttpStatusCode.Unauthorized) } -} \ No newline at end of file +} From 4abdf5e187364c32feb1b0fd7144cfeb31b7b114 Mon Sep 17 00:00:00 2001 From: MrOrange9 JCT <66780535+MrOrange9-JCT@users.noreply.github.com> Date: Sat, 28 Sep 2024 13:55:17 +0200 Subject: [PATCH 2/2] Modified episode search to only work with t=tvsearch --- .../main/kotlin/amarr/torznab/TorznabApi.kt | 25 +++++++++++++------ 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/app/src/main/kotlin/amarr/torznab/TorznabApi.kt b/app/src/main/kotlin/amarr/torznab/TorznabApi.kt index 42a8918..be8ad40 100644 --- a/app/src/main/kotlin/amarr/torznab/TorznabApi.kt +++ b/app/src/main/kotlin/amarr/torznab/TorznabApi.kt @@ -36,6 +36,7 @@ private suspend fun ApplicationCall.handleRequests(indexer: Indexer) { xmlDeclMode = XmlDeclMode.Charset xmlVersion = XmlVersion.XML10 } // This API uses XML instead of JSON + request.queryParameters["t"]?.let { when (it) { "caps" -> { @@ -43,28 +44,36 @@ private suspend fun ApplicationCall.handleRequests(indexer: Indexer) { respondText(xmlFormat.encodeToString(indexer.capabilities()), contentType = ContentType.Application.Xml) } - "tvsearch" -> performSearch(indexer, xmlFormat) - "search" -> performSearch(indexer, xmlFormat) + "tvsearch" -> performSearch(indexer, xmlFormat, isTvSearch = true) + + "movie" -> performSearch(indexer, xmlFormat, isTvSearch = false) else -> throw IllegalArgumentException("Unknown action: $it") } } ?: throw IllegalArgumentException("Missing action") } -private suspend fun ApplicationCall.performSearch(indexer: Indexer, xmlFormat: XML) { +private suspend fun ApplicationCall.performSearch(indexer: Indexer, xmlFormat: XML, isTvSearch: Boolean) { val query = request.queryParameters["q"].orEmpty() - val season = request.queryParameters["season"].orEmpty() - val episode = request.queryParameters["episode"].orEmpty().padStart(2, '0') + val finalQuery = if (isTvSearch) { + // Handle season and episode + val season = request.queryParameters["season"].orEmpty() + val episode = request.queryParameters["episode"].orEmpty().padStart(2, '0') + "$query ${season}x$episode" + } else { + // Only use the query for movies + query + } - val finalQuery = "$query ${season}x$episode" - val offset = request.queryParameters["offset"]?.toIntOrNull() ?: 0 val limit = request.queryParameters["limit"]?.toIntOrNull() ?: 100 val cat = request.queryParameters["cat"]?.split(",")?.map { cat -> cat.toInt() } ?: emptyList() + application.log.debug("Handling search request: {}, {}, {}, {}", finalQuery, offset, limit, cat) + try { respondText( - xmlFormat.encodeToString(indexer.search(query, offset, limit, cat)), + xmlFormat.encodeToString(indexer.search(finalQuery, offset, limit, cat)), contentType = ContentType.Application.Xml ) } catch (e: ThrottledException) {