Compare commits

..

10 Commits

Author SHA1 Message Date
Romain Lecat
583239deb2 Custom build with patches
Some checks failed
Build Prowlarr Container / build (push) Failing after 4m40s
2026-02-16 11:07:30 +01:00
LinuxServer-CI
b9c76fbdff Bot Updating Package Versions 2026-02-11 05:24:59 +00:00
LinuxServer-CI
725a39b3f1 Bot Updating Templated Files 2026-02-11 05:21:36 +00:00
LinuxServer-CI
ab403c0441 Bot Updating Templated Files 2026-02-11 05:19:13 +00:00
LinuxServer-CI
c69d919784 Bot Updating Package Versions 2026-02-04 04:59:21 +00:00
LinuxServer-CI
6ed3988fe6 Bot Updating Package Versions 2026-01-16 17:08:42 +00:00
LinuxServer-CI
fbf2563f26 Bot Updating Templated Files 2026-01-16 17:04:51 +00:00
Simen
8e31ad54c5 Merge pull request #78 from linuxserver/main-3.23 2026-01-16 18:02:46 +01:00
thespad
f036459d3f Rebase to 3.23 2026-01-15 09:19:54 +00:00
LinuxServer-CI
94a918a787 Bot Updating Package Versions 2025-12-17 04:09:58 +00:00
8 changed files with 838 additions and 69 deletions

View File

@@ -0,0 +1,67 @@
name: Build Prowlarr Container
on:
push:
branches:
- main
- develop
workflow_dispatch:
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Set build variables
id: vars
run: |
# Date ISO 8601
echo "build_date=$(date -u +%Y-%m-%dT%H:%M:%S%z)" >> "$GITHUB_OUTPUT"
# Short SHA
echo "sha_short=$(echo ${GITHUB_SHA} | cut -c1-7)" >> "$GITHUB_OUTPUT"
# Prowlarr version from upstream API
PROWLARR_BRANCH="develop"
if [ "${GITHUB_REF_NAME}" = "main" ]; then
PROWLARR_BRANCH="master"
fi
echo "prowlarr_branch=${PROWLARR_BRANCH}" >> "$GITHUB_OUTPUT"
PROWLARR_VERSION=$(curl -sL "https://prowlarr.servarr.com/v1/update/${PROWLARR_BRANCH}/changes?runtime=netcore&os=linuxmusl" | jq -r '.[0].version')
echo "prowlarr_version=${PROWLARR_VERSION}" >> "$GITHUB_OUTPUT"
# Image name
REGISTRY="${{ vars.OCI_REGISTRY }}"
# Remove trailing slash if present
REGISTRY="${REGISTRY%/}"
echo "image_name=${REGISTRY}/prowlarr" >> "$GITHUB_OUTPUT"
- name: Login to OCI Registry
uses: docker/login-action@v3
with:
registry: ${{ vars.OCI_REGISTRY }}
username: ${{ vars.OCI_USERNAME }}
password: ${{ vars.OCI_PASSWORD }}
- name: Build and push
uses: docker/build-push-action@v6
with:
context: .
file: ./Dockerfile
push: true
build-args: |
BUILD_DATE=${{ steps.vars.outputs.build_date }}
VERSION=${{ steps.vars.outputs.prowlarr_version }}-custom
PROWLARR_BRANCH=${{ steps.vars.outputs.prowlarr_branch }}
tags: |
${{ steps.vars.outputs.image_name }}:latest
${{ steps.vars.outputs.image_name }}:${{ steps.vars.outputs.sha_short }}
${{ steps.vars.outputs.image_name }}:${{ steps.vars.outputs.prowlarr_version }}-custom
cache-from: type=gha
cache-to: type=gha,mode=max

View File

@@ -1,47 +1,83 @@
# syntax=docker/dockerfile:1
FROM ghcr.io/linuxserver/baseimage-alpine:3.22
#===========================
# Stage 1: Build Prowlarr from source
#===========================
FROM mcr.microsoft.com/dotnet/sdk:8.0-alpine AS build
# Install build dependencies
RUN apk add --no-cache \
bash \
git \
curl \
icu-libs \
nodejs \
npm \
yarn
# Arguments for upstream source
ARG PROWLARR_BRANCH="develop"
ARG PROWLARR_REPO="https://github.com/Prowlarr/Prowlarr.git"
WORKDIR /src
# Clone upstream Prowlarr
RUN git clone --depth 1 --branch "${PROWLARR_BRANCH}" "${PROWLARR_REPO}" .
# Copy and apply patches
COPY patches/ /tmp/patches/
RUN git config user.email "build@local" && \
git config user.name "Build" && \
git am /tmp/patches/*.patch
# Install frontend dependencies and build
RUN yarn install --frozen-lockfile --network-timeout 120000
RUN yarn run build --env production
# Build backend for linux-musl-x64 (Alpine)
RUN bash build.sh --backend -r linux-musl-x64 -f net8.0
# Package
RUN bash build.sh --packages -r linux-musl-x64 -f net8.0
#===========================
# Stage 2: Runtime
#===========================
FROM ghcr.io/linuxserver/baseimage-alpine:3.23
# set version label
ARG BUILD_DATE
ARG VERSION
ARG PROWLARR_RELEASE
LABEL build_version="Linuxserver.io version:- ${VERSION} Build-date:- ${BUILD_DATE}"
LABEL maintainer="Roxedus,thespad"
ARG PROWLARR_BRANCH="develop"
LABEL build_version="Custom build version:- ${VERSION} Build-date:- ${BUILD_DATE}"
LABEL maintainer="romain"
# environment settings
ARG PROWLARR_BRANCH="master"
ENV XDG_CONFIG_HOME="/config/xdg" \
COMPlus_EnableDiagnostics=0 \
TMPDIR=/run/prowlarr-temp
RUN \
echo "**** install packages ****" && \
echo "**** install runtime packages ****" && \
apk add -U --upgrade --no-cache \
icu-libs \
sqlite-libs \
xmlstarlet && \
echo "**** install prowlarr ****" && \
mkdir -p /app/prowlarr/bin && \
if [ -z ${PROWLARR_RELEASE+x} ]; then \
PROWLARR_RELEASE=$(curl -sL "https://prowlarr.servarr.com/v1/update/${PROWLARR_BRANCH}/changes?runtime=netcore&os=linuxmusl" \
| jq -r '.[0].version'); \
fi && \
curl -o \
/tmp/prowlarr.tar.gz -L \
"https://prowlarr.servarr.com/v1/update/${PROWLARR_BRANCH}/updatefile?version=${PROWLARR_RELEASE}&os=linuxmusl&runtime=netcore&arch=x64" && \
tar xzf \
/tmp/prowlarr.tar.gz -C \
/app/prowlarr/bin --strip-components=1 && \
echo -e "UpdateMethod=docker\nBranch=${PROWLARR_BRANCH}\nPackageVersion=${VERSION}\nPackageAuthor=[linuxserver.io](https://www.linuxserver.io/)" > /app/prowlarr/package_info && \
printf "Linuxserver.io version: ${VERSION}\nBuild-date: ${BUILD_DATE}" > /build_version && \
xmlstarlet
# Copy compiled Prowlarr from build stage
RUN mkdir -p /app/prowlarr/bin
COPY --from=build /src/_artifacts/linux-musl-x64/net8.0/Prowlarr/ /app/prowlarr/bin/
# Write package info
RUN echo -e "UpdateMethod=docker\nBranch=${PROWLARR_BRANCH}\nPackageVersion=${VERSION}\nPackageAuthor=custom-build" > /app/prowlarr/package_info && \
printf "Custom build version: ${VERSION}\nBuild-date: ${BUILD_DATE}" > /build_version && \
echo "**** cleanup ****" && \
rm -rf \
/app/prowlarr/bin/Prowlarr.Update \
/tmp/* \
/var/tmp/*
# copy local files
# copy local files (s6 services)
COPY root/ /
# ports and volumes

View File

@@ -1,6 +1,6 @@
# syntax=docker/dockerfile:1
FROM ghcr.io/linuxserver/baseimage-alpine:arm64v8-3.22
FROM ghcr.io/linuxserver/baseimage-alpine:arm64v8-3.23
# set version label
ARG BUILD_DATE

2
Jenkinsfile vendored
View File

@@ -283,7 +283,7 @@ pipeline {
-v ${WORKSPACE}:/mnt \
-e AWS_ACCESS_KEY_ID=\"${S3_KEY}\" \
-e AWS_SECRET_ACCESS_KEY=\"${S3_SECRET}\" \
ghcr.io/linuxserver/baseimage-alpine:3 s6-envdir -fn -- /var/run/s6/container_environment /bin/bash -c "\
ghcr.io/linuxserver/baseimage-alpine:3.23 s6-envdir -fn -- /var/run/s6/container_environment /bin/bash -c "\
apk add --no-cache python3 && \
python3 -m venv /lsiopy && \
pip install --no-cache-dir -U pip && \

View File

@@ -83,7 +83,7 @@ This image can be run with a non-root user. For details please [read the docs](h
To help you get started creating a container from this image you can either use docker-compose or the docker cli.
>[!NOTE]
>Unless a parameter is flaged as 'optional', it is *mandatory* and a value must be provided.
>Unless a parameter is flagged as 'optional', it is *mandatory* and a value must be provided.
### docker-compose (recommended, [click here for more info](https://docs.linuxserver.io/general/docker-compose))
@@ -294,6 +294,7 @@ Once registered you can define the dockerfile to use with `-f Dockerfile.aarch64
## Versions
* **15.01.26:** - Rebase to Alpine 3.23.
* **05.07.25:** - Rebase Alpine 3.22.
* **23.12.24:** - Rebase Alpine 3.21.
* **31.05.24:** - Rebase Alpine 3.20.

View File

@@ -141,54 +141,55 @@ System.Threading.Tasks 4.3.0
System.Windows.Extensions 4.7.0 dotnet (+5 duplicates)
YamlDotNet 16.3.0 dotnet (+5 duplicates)
acl-libs 2.3.2-r1 apk
alpine-baselayout 3.7.0-r0 apk
alpine-baselayout-data 3.7.0-r0 apk
alpine-keys 2.5-r0 apk
alpine-release 3.22.2-r0 apk
apk-tools 2.14.9-r3 apk
bash 5.2.37-r0 apk
brotli-libs 1.1.0-r2 apk
busybox 1.37.0-r20 apk
busybox-binsh 1.37.0-r20 apk
c-ares 1.34.5-r0 apk
ca-certificates 20250911-r0 apk
ca-certificates-bundle 20250911-r0 apk
alpine-baselayout 3.7.1-r8 apk
alpine-baselayout-data 3.7.1-r8 apk
alpine-keys 2.6-r0 apk
alpine-release 3.23.3-r0 apk
apk-tools 3.0.4-r0 apk
bash 5.3.3-r1 apk
brotli-libs 1.2.0-r0 apk
busybox 1.37.0-r30 apk
busybox-binsh 1.37.0-r30 apk
c-ares 1.34.6-r0 apk
ca-certificates 20251003-r0 apk
ca-certificates-bundle 20251003-r0 apk
catatonit 0.2.1-r0 apk
coreutils 9.7-r1 apk
coreutils-env 9.7-r1 apk
coreutils-fmt 9.7-r1 apk
coreutils-sha512sum 9.7-r1 apk
curl 8.14.1-r2 apk
coreutils 9.8-r1 apk
coreutils-env 9.8-r1 apk
coreutils-fmt 9.8-r1 apk
coreutils-sha512sum 9.8-r1 apk
curl 8.17.0-r1 apk
findutils 4.10.0-r0 apk
icu-data-en 76.1-r1 apk
icu-libs 76.1-r1 apk
jq 1.8.1-r0 apk
libapk2 2.14.9-r3 apk
libapk 3.0.4-r0 apk
libattr 2.5.2-r2 apk
libbsd 0.12.2-r0 apk
libcrypto3 3.5.4-r0 apk
libcurl 8.14.1-r2 apk
libgcc 14.2.0-r6 apk
libidn2 2.3.7-r0 apk
libintl 0.24.1-r0 apk
libcrypto3 3.5.5-r0 apk
libcurl 8.17.0-r1 apk
libgcc 15.2.0-r2 apk
libidn2 2.3.8-r0 apk
libintl 0.24.1-r1 apk
libmd 1.1.0-r0 apk
libncursesw 6.5_p20250503-r0 apk
libproc2 4.0.4-r3 apk
libncursesw 6.5_p20251123-r0 apk
libproc2 4.0.5-r0 apk
libpsl 0.21.5-r3 apk
libssl3 3.5.4-r0 apk
libstdc++ 14.2.0-r6 apk
libunistring 1.3-r0 apk
libssl3 3.5.5-r0 apk
libstdc++ 15.2.0-r2 apk
libunistring 1.4.1-r0 apk
libxml2 2.13.9-r0 apk
libxslt 1.1.43-r3 apk
linux-pam 1.7.0-r4 apk
musl 1.2.5-r10 apk
musl-utils 1.2.5-r10 apk
ncurses-terminfo-base 6.5_p20250503-r0 apk
netcat-openbsd 1.229.1-r0 apk
nghttp2-libs 1.65.0-r0 apk
linux-pam 1.7.1-r2 apk
musl 1.2.5-r21 apk
musl-utils 1.2.5-r21 apk
ncurses-terminfo-base 6.5_p20251123-r0 apk
netcat-openbsd 1.234.1-r0 apk
nghttp2-libs 1.68.0-r0 apk
nghttp3 1.13.1-r0 apk
oniguruma 6.9.10-r0 apk
procps-ng 4.0.4-r3 apk
readline 8.2.13-r1 apk
procps-ng 4.0.5-r0 apk
readline 8.3.1-r0 apk
runtime.any.System.IO 4.3.0 dotnet (+5 duplicates)
runtime.any.System.Reflection 4.3.0 dotnet (+5 duplicates)
runtime.any.System.Reflection.Primitives 4.3.0 dotnet (+5 duplicates)
@@ -198,14 +199,14 @@ runtime.any.System.Threading.Tasks 4.3.0
runtime.unix.System.Private.Uri 4.3.0 dotnet (+5 duplicates)
runtimepack.Microsoft.AspNetCore.App.Runtime.linux-musl-x64 8.0.12 dotnet (+4 duplicates)
runtimepack.Microsoft.NETCore.App.Runtime.linux-musl-x64 8.0.12 dotnet (+7 duplicates)
scanelf 1.3.8-r1 apk
shadow 4.17.3-r0 apk
scanelf 1.3.8-r2 apk
shadow 4.18.0-r0 apk
skalibs-libs 2.14.4.0-r0 apk
sqlite-libs 3.49.2-r1 apk
ssl_client 1.37.0-r20 apk
tzdata 2025b-r0 apk
sqlite-libs 3.51.2-r0 apk
ssl_client 1.37.0-r30 apk
tzdata 2025c-r0 apk
utmps-libs 0.1.3.1-r0 apk
xmlstarlet 1.6.1-r2 apk
xz-libs 5.8.1-r0 apk
xz-libs 5.8.2-r0 apk
zlib 1.3.1-r2 apk
zstd-libs 1.5.7-r0 apk
zstd-libs 1.5.7-r2 apk

View File

@@ -0,0 +1,663 @@
From f7ad90f98669386f4abfde0345a43e4ce13b1dfa Mon Sep 17 00:00:00 2001
From: Romain Lecat <romain@lecat.pro>
Date: Mon, 16 Feb 2026 10:49:13 +0100
Subject: [PATCH] Fork for AvistaZ family language filter
---
.../Indexers/Definitions/AvistaZ.cs | 26 +-
.../Definitions/Avistaz/AvistazBase.cs | 3 +-
.../Definitions/Avistaz/AvistazSettings.cs | 359 ++++++++++++++++++
.../Definitions/Avistaz/CinemaZSettings.cs | 21 +
.../Definitions/Avistaz/PrivateHDSettings.cs | 21 +
.../Indexers/Definitions/CinemaZ.cs | 42 +-
.../Indexers/Definitions/ExoticaZ.cs | 2 +-
.../Indexers/Definitions/PrivateHD.cs | 42 +-
8 files changed, 511 insertions(+), 5 deletions(-)
create mode 100644 src/NzbDrone.Core/Indexers/Definitions/Avistaz/CinemaZSettings.cs
create mode 100644 src/NzbDrone.Core/Indexers/Definitions/Avistaz/PrivateHDSettings.cs
diff --git a/src/NzbDrone.Core/Indexers/Definitions/AvistaZ.cs b/src/NzbDrone.Core/Indexers/Definitions/AvistaZ.cs
index cc1be98b5..edb0ab464 100644
--- a/src/NzbDrone.Core/Indexers/Definitions/AvistaZ.cs
+++ b/src/NzbDrone.Core/Indexers/Definitions/AvistaZ.cs
@@ -1,4 +1,5 @@
using System.Collections.Generic;
+using System.Linq;
using NLog;
using NzbDrone.Common.Extensions;
using NzbDrone.Core.Configuration;
@@ -8,7 +9,7 @@
namespace NzbDrone.Core.Indexers.Definitions
{
- public class AvistaZ : AvistazBase
+ public class AvistaZ : AvistazBase<AvistaZSettings>
{
public override string Name => "AvistaZ";
public override string[] IndexerUrls => new[] { "https://avistaz.to/" };
@@ -68,6 +69,29 @@ protected override IndexerCapabilities SetCapabilities()
public class AvistaZRequestGenerator : AvistazRequestGenerator
{
+ public new AvistaZSettings Settings
+ {
+ get => (AvistaZSettings)base.Settings;
+ set => base.Settings = value;
+ }
+
+ protected override List<KeyValuePair<string, string>> GetBasicSearchParameters(SearchCriteriaBase searchCriteria, string genre = null)
+ {
+ var parameters = base.GetBasicSearchParameters(searchCriteria, genre);
+
+ foreach (var languageId in Settings.SearchAudioLanguages.Distinct())
+ {
+ parameters.Add("language[]", languageId.ToString());
+ }
+
+ foreach (var languageId in Settings.SearchSubtitleLanguages.Distinct())
+ {
+ parameters.Add("subtitle[]", languageId.ToString());
+ }
+
+ return parameters;
+ }
+
// AvistaZ has episodes without season. eg Running Man E323
protected override string GetEpisodeSearchTerm(TvSearchCriteria searchCriteria)
{
diff --git a/src/NzbDrone.Core/Indexers/Definitions/Avistaz/AvistazBase.cs b/src/NzbDrone.Core/Indexers/Definitions/Avistaz/AvistazBase.cs
index b14bac702..1aabd470f 100644
--- a/src/NzbDrone.Core/Indexers/Definitions/Avistaz/AvistazBase.cs
+++ b/src/NzbDrone.Core/Indexers/Definitions/Avistaz/AvistazBase.cs
@@ -12,7 +12,8 @@
namespace NzbDrone.Core.Indexers.Definitions.Avistaz
{
- public abstract class AvistazBase : TorrentIndexerBase<AvistazSettings>
+ public abstract class AvistazBase<TSettings> : TorrentIndexerBase<TSettings>
+ where TSettings : AvistazSettings, new()
{
public override bool SupportsRss => true;
public override bool SupportsSearch => true;
diff --git a/src/NzbDrone.Core/Indexers/Definitions/Avistaz/AvistazSettings.cs b/src/NzbDrone.Core/Indexers/Definitions/Avistaz/AvistazSettings.cs
index bb431c47b..3a535df21 100644
--- a/src/NzbDrone.Core/Indexers/Definitions/Avistaz/AvistazSettings.cs
+++ b/src/NzbDrone.Core/Indexers/Definitions/Avistaz/AvistazSettings.cs
@@ -1,3 +1,5 @@
+using System;
+using System.Collections.Generic;
using FluentValidation;
using NzbDrone.Core.Annotations;
using NzbDrone.Core.Indexers.Settings;
@@ -44,4 +46,361 @@ public override NzbDroneValidationResult Validate()
return new NzbDroneValidationResult(Validator.Validate(this));
}
}
+
+ public class AvistaZSettings : AvistazSettings
+ {
+ public AvistaZSettings()
+ {
+ SearchAudioLanguages = Array.Empty<int>();
+ SearchSubtitleLanguages = Array.Empty<int>();
+ }
+
+ [FieldDefinition(6, Label = "Search Audio Languages", Type = FieldType.Select, SelectOptions = typeof(AvistaZAudioLanguage), HelpText = "Filter by audio language. The language settings are AND searches, e.g. selecting English audio with Basque and Catalan subtitles will only return results with all three of these.", Advanced = true)]
+ public IEnumerable<int> SearchAudioLanguages { get; set; }
+
+ [FieldDefinition(7, Label = "Search Subtitle Languages", Type = FieldType.Select, SelectOptions = typeof(AvistaZSubtitleLanguage), HelpText = "Filter by subtitle language. The language settings are AND searches, e.g. selecting English audio with Basque and Catalan subtitles will only return results with all three of these.", Advanced = true)]
+ public IEnumerable<int> SearchSubtitleLanguages { get; set; }
+ }
+
+ public enum AvistaZAudioLanguage
+ {
+ [FieldOption(Hint = "Arabic")]
+ Arabic = 7,
+ [FieldOption(Hint = "Assamese")]
+ Assamese = 10,
+ [FieldOption(Hint = "Basque")]
+ Basque = 17,
+ [FieldOption(Hint = "Bengali")]
+ Bengali = 19,
+ [FieldOption(Hint = "Bosnian")]
+ Bosnian = 23,
+ [FieldOption(Hint = "Brazilian Portuguese")]
+ BrazilianPortuguese = 189,
+ [FieldOption(Hint = "Burmese")]
+ Burmese = 26,
+ [FieldOption(Hint = "Cantonese")]
+ Cantonese = 27,
+ [FieldOption(Hint = "Catalan")]
+ Catalan = 28,
+ [FieldOption(Hint = "Central Khmer")]
+ CentralKhmer = 29,
+ [FieldOption(Hint = "Chamorro")]
+ Chamorro = 30,
+ [FieldOption(Hint = "Chinese")]
+ Chinese = 33,
+ [FieldOption(Hint = "Croatian")]
+ Croatian = 39,
+ [FieldOption(Hint = "Czech")]
+ Czech = 40,
+ [FieldOption(Hint = "Danish")]
+ Danish = 41,
+ [FieldOption(Hint = "Dutch")]
+ Dutch = 43,
+ [FieldOption(Hint = "Dzongkha")]
+ Dzongkha = 44,
+ [FieldOption(Hint = "English")]
+ English = 45,
+ [FieldOption(Hint = "Esperanto")]
+ Esperanto = 46,
+ [FieldOption(Hint = "Filipino")]
+ Filipino = 188,
+ [FieldOption(Hint = "Finnish")]
+ Finnish = 51,
+ [FieldOption(Hint = "French")]
+ French = 52,
+ [FieldOption(Hint = "German")]
+ German = 58,
+ [FieldOption(Hint = "Greek")]
+ Greek = 59,
+ [FieldOption(Hint = "Gujarati")]
+ Gujarati = 61,
+ [FieldOption(Hint = "Hausa")]
+ Hausa = 63,
+ [FieldOption(Hint = "Hebrew")]
+ Hebrew = 64,
+ [FieldOption(Hint = "Hindi")]
+ Hindi = 66,
+ [FieldOption(Hint = "Hungarian")]
+ Hungarian = 68,
+ [FieldOption(Hint = "Indonesian")]
+ Indonesian = 72,
+ [FieldOption(Hint = "Inuktitut")]
+ Inuktitut = 75,
+ [FieldOption(Hint = "Italian")]
+ Italian = 78,
+ [FieldOption(Hint = "Japanese")]
+ Japanese = 79,
+ [FieldOption(Hint = "Javanese")]
+ Javanese = 80,
+ [FieldOption(Hint = "Kannada")]
+ Kannada = 82,
+ [FieldOption(Hint = "Kashmiri")]
+ Kashmiri = 84,
+ [FieldOption(Hint = "Kazakh")]
+ Kazakh = 85,
+ [FieldOption(Hint = "Kirghiz")]
+ Kirghiz = 88,
+ [FieldOption(Hint = "Korean")]
+ Korean = 91,
+ [FieldOption(Hint = "Lao")]
+ Lao = 94,
+ [FieldOption(Hint = "Malay")]
+ Malay = 104,
+ [FieldOption(Hint = "Malayalam")]
+ Malayalam = 105,
+ [FieldOption(Hint = "Mandarin")]
+ Mandarin = 107,
+ [FieldOption(Hint = "Marathi")]
+ Marathi = 110,
+ [FieldOption(Hint = "Mongolian")]
+ Mongolian = 112,
+ [FieldOption(Hint = "Nepali")]
+ Nepali = 118,
+ [FieldOption(Hint = "Ojibwa")]
+ Ojibwa = 123,
+ [FieldOption(Hint = "Oriya")]
+ Oriya = 124,
+ [FieldOption(Hint = "Pali")]
+ Pali = 127,
+ [FieldOption(Hint = "Panjabi")]
+ Panjabi = 128,
+ [FieldOption(Hint = "Persian")]
+ Persian = 129,
+ [FieldOption(Hint = "Polish")]
+ Polish = 130,
+ [FieldOption(Hint = "Portuguese")]
+ Portuguese = 131,
+ [FieldOption(Hint = "Quechua")]
+ Quechua = 133,
+ [FieldOption(Hint = "Romanian")]
+ Romanian = 134,
+ [FieldOption(Hint = "Russian")]
+ Russian = 137,
+ [FieldOption(Hint = "Sanskrit")]
+ Sanskrit = 140,
+ [FieldOption(Hint = "Sinhala")]
+ Sinhala = 146,
+ [FieldOption(Hint = "Slovak")]
+ Slovak = 147,
+ [FieldOption(Hint = "Spanish")]
+ Spanish = 151,
+ [FieldOption(Hint = "Swedish")]
+ Swedish = 155,
+ [FieldOption(Hint = "Tagalog")]
+ Tagalog = 156,
+ [FieldOption(Hint = "Tamil")]
+ Tamil = 159,
+ [FieldOption(Hint = "Telugu")]
+ Telugu = 161,
+ [FieldOption(Hint = "Thai")]
+ Thai = 162,
+ [FieldOption(Hint = "Tibetan")]
+ Tibetan = 163,
+ [FieldOption(Hint = "Turkish")]
+ Turkish = 168,
+ [FieldOption(Hint = "Uighur")]
+ Uighur = 171,
+ [FieldOption(Hint = "Ukrainian")]
+ Ukrainian = 172,
+ [FieldOption(Hint = "Urdu")]
+ Urdu = 173,
+ [FieldOption(Hint = "Vietnamese")]
+ Vietnamese = 176,
+ [FieldOption(Hint = "Xhosa")]
+ Xhosa = 182,
+ }
+
+ public enum AvistaZSubtitleLanguage
+ {
+ [FieldOption(Hint = "Abkhazian")]
+ Abkhazian = 1,
+ [FieldOption(Hint = "Afar")]
+ Afar = 2,
+ [FieldOption(Hint = "Afrikaans")]
+ Afrikaans = 3,
+ [FieldOption(Hint = "Albanian")]
+ Albanian = 5,
+ [FieldOption(Hint = "Amharic")]
+ Amharic = 6,
+ [FieldOption(Hint = "Arabic")]
+ Arabic = 7,
+ [FieldOption(Hint = "Basque")]
+ Basque = 17,
+ [FieldOption(Hint = "Belarusian")]
+ Belarusian = 18,
+ [FieldOption(Hint = "Bengali")]
+ Bengali = 19,
+ [FieldOption(Hint = "Norwegian Bokmål")]
+ NorwegianBokmal = 22,
+ [FieldOption(Hint = "Bosnian")]
+ Bosnian = 23,
+ [FieldOption(Hint = "Bulgarian")]
+ Bulgarian = 25,
+ [FieldOption(Hint = "Brazilian Portuguese")]
+ BrazilianPortuguese = 189,
+ [FieldOption(Hint = "Burmese")]
+ Burmese = 26,
+ [FieldOption(Hint = "Cantonese")]
+ Cantonese = 27,
+ [FieldOption(Hint = "Catalan")]
+ Catalan = 28,
+ [FieldOption(Hint = "Central Khmer")]
+ CentralKhmer = 29,
+ [FieldOption(Hint = "Chichewa")]
+ Chichewa = 32,
+ [FieldOption(Hint = "Chinese")]
+ Chinese = 33,
+ [FieldOption(Hint = "Corsican")]
+ Corsican = 37,
+ [FieldOption(Hint = "Croatian")]
+ Croatian = 39,
+ [FieldOption(Hint = "Czech")]
+ Czech = 40,
+ [FieldOption(Hint = "Danish")]
+ Danish = 41,
+ [FieldOption(Hint = "Dutch")]
+ Dutch = 43,
+ [FieldOption(Hint = "English")]
+ English = 45,
+ [FieldOption(Hint = "Esperanto")]
+ Esperanto = 46,
+ [FieldOption(Hint = "Estonian")]
+ Estonian = 47,
+ [FieldOption(Hint = "Fijian")]
+ Fijian = 50,
+ [FieldOption(Hint = "Filipino")]
+ Filipino = 188,
+ [FieldOption(Hint = "Finnish")]
+ Finnish = 51,
+ [FieldOption(Hint = "French")]
+ French = 52,
+ [FieldOption(Hint = "Galician")]
+ Galician = 55,
+ [FieldOption(Hint = "Georgian")]
+ Georgian = 57,
+ [FieldOption(Hint = "German")]
+ German = 58,
+ [FieldOption(Hint = "Greek")]
+ Greek = 59,
+ [FieldOption(Hint = "Gujarati")]
+ Gujarati = 61,
+ [FieldOption(Hint = "Haitian")]
+ Haitian = 62,
+ [FieldOption(Hint = "Hebrew")]
+ Hebrew = 64,
+ [FieldOption(Hint = "Hindi")]
+ Hindi = 66,
+ [FieldOption(Hint = "Hungarian")]
+ Hungarian = 68,
+ [FieldOption(Hint = "Icelandic")]
+ Icelandic = 69,
+ [FieldOption(Hint = "Indonesian")]
+ Indonesian = 72,
+ [FieldOption(Hint = "Irish")]
+ Irish = 77,
+ [FieldOption(Hint = "Italian")]
+ Italian = 78,
+ [FieldOption(Hint = "Japanese")]
+ Japanese = 79,
+ [FieldOption(Hint = "Javanese")]
+ Javanese = 80,
+ [FieldOption(Hint = "Kannada")]
+ Kannada = 82,
+ [FieldOption(Hint = "Kazakh")]
+ Kazakh = 85,
+ [FieldOption(Hint = "Korean")]
+ Korean = 91,
+ [FieldOption(Hint = "Kurdish")]
+ Kurdish = 93,
+ [FieldOption(Hint = "Lao")]
+ Lao = 94,
+ [FieldOption(Hint = "Latin")]
+ Latin = 95,
+ [FieldOption(Hint = "Latvian")]
+ Latvian = 96,
+ [FieldOption(Hint = "Lithuanian")]
+ Lithuanian = 99,
+ [FieldOption(Hint = "Macedonian")]
+ Macedonian = 102,
+ [FieldOption(Hint = "Malagasy")]
+ Malagasy = 103,
+ [FieldOption(Hint = "Malay")]
+ Malay = 104,
+ [FieldOption(Hint = "Malayalam")]
+ Malayalam = 105,
+ [FieldOption(Hint = "Mandarin")]
+ Mandarin = 107,
+ [FieldOption(Hint = "Maori")]
+ Maori = 109,
+ [FieldOption(Hint = "Marathi")]
+ Marathi = 110,
+ [FieldOption(Hint = "Mongolian")]
+ Mongolian = 112,
+ [FieldOption(Hint = "Nepali")]
+ Nepali = 118,
+ [FieldOption(Hint = "Norwegian")]
+ Norwegian = 120,
+ [FieldOption(Hint = "Oriya")]
+ Oriya = 124,
+ [FieldOption(Hint = "Panjabi")]
+ Panjabi = 128,
+ [FieldOption(Hint = "Persian")]
+ Persian = 129,
+ [FieldOption(Hint = "Polish")]
+ Polish = 130,
+ [FieldOption(Hint = "Portuguese")]
+ Portuguese = 131,
+ [FieldOption(Hint = "Romanian")]
+ Romanian = 134,
+ [FieldOption(Hint = "Romansh")]
+ Romansh = 135,
+ [FieldOption(Hint = "Russian")]
+ Russian = 137,
+ [FieldOption(Hint = "Sardinian")]
+ Sardinian = 141,
+ [FieldOption(Hint = "Serbian")]
+ Serbian = 142,
+ [FieldOption(Hint = "Sinhala")]
+ Sinhala = 146,
+ [FieldOption(Hint = "Slovak")]
+ Slovak = 147,
+ [FieldOption(Hint = "Slovenian")]
+ Slovenian = 148,
+ [FieldOption(Hint = "Somali")]
+ Somali = 149,
+ [FieldOption(Hint = "Spanish")]
+ Spanish = 151,
+ [FieldOption(Hint = "Sundanese")]
+ Sundanese = 152,
+ [FieldOption(Hint = "Swahili")]
+ Swahili = 153,
+ [FieldOption(Hint = "Swedish")]
+ Swedish = 155,
+ [FieldOption(Hint = "Tagalog")]
+ Tagalog = 156,
+ [FieldOption(Hint = "Tamil")]
+ Tamil = 159,
+ [FieldOption(Hint = "Telugu")]
+ Telugu = 161,
+ [FieldOption(Hint = "Thai")]
+ Thai = 162,
+ [FieldOption(Hint = "Turkish")]
+ Turkish = 168,
+ [FieldOption(Hint = "Twi")]
+ Twi = 170,
+ [FieldOption(Hint = "Ukrainian")]
+ Ukrainian = 172,
+ [FieldOption(Hint = "Urdu")]
+ Urdu = 173,
+ [FieldOption(Hint = "Venda")]
+ Venda = 175,
+ [FieldOption(Hint = "Vietnamese")]
+ Vietnamese = 176,
+ [FieldOption(Hint = "Volapük")]
+ Volapuk = 177,
+ [FieldOption(Hint = "Welsh")]
+ Welsh = 179,
+ [FieldOption(Hint = "Wolof")]
+ Wolof = 181,
+ }
}
diff --git a/src/NzbDrone.Core/Indexers/Definitions/Avistaz/CinemaZSettings.cs b/src/NzbDrone.Core/Indexers/Definitions/Avistaz/CinemaZSettings.cs
new file mode 100644
index 000000000..fa133a0ed
--- /dev/null
+++ b/src/NzbDrone.Core/Indexers/Definitions/Avistaz/CinemaZSettings.cs
@@ -0,0 +1,21 @@
+using System;
+using System.Collections.Generic;
+using NzbDrone.Core.Annotations;
+
+namespace NzbDrone.Core.Indexers.Definitions.Avistaz
+{
+ public class CinemaZSettings : AvistazSettings
+ {
+ public CinemaZSettings()
+ {
+ SearchAudioLanguages = Array.Empty<int>();
+ SearchSubtitleLanguages = Array.Empty<int>();
+ }
+
+ [FieldDefinition(6, Label = "Search Audio Languages", Type = FieldType.Select, SelectOptions = typeof(AvistaZAudioLanguage), HelpText = "Filter by audio language. The language settings are AND searches, e.g. selecting English audio with Basque and Catalan subtitles will only return results with all three of these.", Advanced = true)]
+ public IEnumerable<int> SearchAudioLanguages { get; set; }
+
+ [FieldDefinition(7, Label = "Search Subtitle Languages", Type = FieldType.Select, SelectOptions = typeof(AvistaZSubtitleLanguage), HelpText = "Filter by subtitle language. The language settings are AND searches, e.g. selecting English audio with Basque and Catalan subtitles will only return results with all three of these.", Advanced = true)]
+ public IEnumerable<int> SearchSubtitleLanguages { get; set; }
+ }
+}
diff --git a/src/NzbDrone.Core/Indexers/Definitions/Avistaz/PrivateHDSettings.cs b/src/NzbDrone.Core/Indexers/Definitions/Avistaz/PrivateHDSettings.cs
new file mode 100644
index 000000000..31967b586
--- /dev/null
+++ b/src/NzbDrone.Core/Indexers/Definitions/Avistaz/PrivateHDSettings.cs
@@ -0,0 +1,21 @@
+using System;
+using System.Collections.Generic;
+using NzbDrone.Core.Annotations;
+
+namespace NzbDrone.Core.Indexers.Definitions.Avistaz
+{
+ public class PrivateHDSettings : AvistazSettings
+ {
+ public PrivateHDSettings()
+ {
+ SearchAudioLanguages = Array.Empty<int>();
+ SearchSubtitleLanguages = Array.Empty<int>();
+ }
+
+ [FieldDefinition(6, Label = "Search Audio Languages", Type = FieldType.Select, SelectOptions = typeof(AvistaZAudioLanguage), HelpText = "Filter by audio language. The language settings are AND searches, e.g. selecting English audio with Basque and Catalan subtitles will only return results with all three of these.", Advanced = true)]
+ public IEnumerable<int> SearchAudioLanguages { get; set; }
+
+ [FieldDefinition(7, Label = "Search Subtitle Languages", Type = FieldType.Select, SelectOptions = typeof(AvistaZSubtitleLanguage), HelpText = "Filter by subtitle language. The language settings are AND searches, e.g. selecting English audio with Basque and Catalan subtitles will only return results with all three of these.", Advanced = true)]
+ public IEnumerable<int> SearchSubtitleLanguages { get; set; }
+ }
+}
diff --git a/src/NzbDrone.Core/Indexers/Definitions/CinemaZ.cs b/src/NzbDrone.Core/Indexers/Definitions/CinemaZ.cs
index 3f0fdd913..e3318c195 100644
--- a/src/NzbDrone.Core/Indexers/Definitions/CinemaZ.cs
+++ b/src/NzbDrone.Core/Indexers/Definitions/CinemaZ.cs
@@ -1,12 +1,14 @@
using System.Collections.Generic;
+using System.Linq;
using NLog;
using NzbDrone.Core.Configuration;
using NzbDrone.Core.Indexers.Definitions.Avistaz;
+using NzbDrone.Core.IndexerSearch.Definitions;
using NzbDrone.Core.Messaging.Events;
namespace NzbDrone.Core.Indexers.Definitions
{
- public class CinemaZ : AvistazBase
+ public class CinemaZ : AvistazBase<CinemaZSettings>
{
public override string Name => "CinemaZ";
public override string[] IndexerUrls => new[] { "https://cinemaz.to/" };
@@ -23,6 +25,18 @@ public CinemaZ(IIndexerRepository indexerRepository,
{
}
+ public override IIndexerRequestGenerator GetRequestGenerator()
+ {
+ return new CinemaZRequestGenerator
+ {
+ Settings = Settings,
+ Capabilities = Capabilities,
+ PageSize = PageSize,
+ HttpClient = _httpClient,
+ Logger = _logger
+ };
+ }
+
protected override IndexerCapabilities SetCapabilities()
{
var caps = new IndexerCapabilities
@@ -51,4 +65,30 @@ protected override IndexerCapabilities SetCapabilities()
return caps;
}
}
+
+ public class CinemaZRequestGenerator : AvistazRequestGenerator
+ {
+ public new CinemaZSettings Settings
+ {
+ get => (CinemaZSettings)base.Settings;
+ set => base.Settings = value;
+ }
+
+ protected override List<KeyValuePair<string, string>> GetBasicSearchParameters(SearchCriteriaBase searchCriteria, string genre = null)
+ {
+ var parameters = base.GetBasicSearchParameters(searchCriteria, genre);
+
+ foreach (var languageId in Settings.SearchAudioLanguages.Distinct())
+ {
+ parameters.Add("language[]", languageId.ToString());
+ }
+
+ foreach (var languageId in Settings.SearchSubtitleLanguages.Distinct())
+ {
+ parameters.Add("subtitle[]", languageId.ToString());
+ }
+
+ return parameters;
+ }
+ }
}
diff --git a/src/NzbDrone.Core/Indexers/Definitions/ExoticaZ.cs b/src/NzbDrone.Core/Indexers/Definitions/ExoticaZ.cs
index 954d2442c..41202ab21 100644
--- a/src/NzbDrone.Core/Indexers/Definitions/ExoticaZ.cs
+++ b/src/NzbDrone.Core/Indexers/Definitions/ExoticaZ.cs
@@ -7,7 +7,7 @@
namespace NzbDrone.Core.Indexers.Definitions
{
- public class ExoticaZ : AvistazBase
+ public class ExoticaZ : AvistazBase<AvistazSettings>
{
public override string Name => "ExoticaZ";
public override string[] IndexerUrls => new[] { "https://exoticaz.to/" };
diff --git a/src/NzbDrone.Core/Indexers/Definitions/PrivateHD.cs b/src/NzbDrone.Core/Indexers/Definitions/PrivateHD.cs
index 21fc76ede..df33867c1 100644
--- a/src/NzbDrone.Core/Indexers/Definitions/PrivateHD.cs
+++ b/src/NzbDrone.Core/Indexers/Definitions/PrivateHD.cs
@@ -1,12 +1,14 @@
using System.Collections.Generic;
+using System.Linq;
using NLog;
using NzbDrone.Core.Configuration;
using NzbDrone.Core.Indexers.Definitions.Avistaz;
+using NzbDrone.Core.IndexerSearch.Definitions;
using NzbDrone.Core.Messaging.Events;
namespace NzbDrone.Core.Indexers.Definitions
{
- public class PrivateHD : AvistazBase
+ public class PrivateHD : AvistazBase<PrivateHDSettings>
{
public override string Name => "PrivateHD";
public override string[] IndexerUrls => new[] { "https://privatehd.to/" };
@@ -23,6 +25,18 @@ public PrivateHD(IIndexerRepository indexerRepository,
{
}
+ public override IIndexerRequestGenerator GetRequestGenerator()
+ {
+ return new PrivateHDRequestGenerator
+ {
+ Settings = Settings,
+ Capabilities = Capabilities,
+ PageSize = PageSize,
+ HttpClient = _httpClient,
+ Logger = _logger
+ };
+ }
+
protected override IndexerCapabilities SetCapabilities()
{
var caps = new IndexerCapabilities
@@ -51,4 +65,30 @@ protected override IndexerCapabilities SetCapabilities()
return caps;
}
}
+
+ public class PrivateHDRequestGenerator : AvistazRequestGenerator
+ {
+ public new PrivateHDSettings Settings
+ {
+ get => (PrivateHDSettings)base.Settings;
+ set => base.Settings = value;
+ }
+
+ protected override List<KeyValuePair<string, string>> GetBasicSearchParameters(SearchCriteriaBase searchCriteria, string genre = null)
+ {
+ var parameters = base.GetBasicSearchParameters(searchCriteria, genre);
+
+ foreach (var languageId in Settings.SearchAudioLanguages.Distinct())
+ {
+ parameters.Add("language[]", languageId.ToString());
+ }
+
+ foreach (var languageId in Settings.SearchSubtitleLanguages.Distinct())
+ {
+ parameters.Add("subtitle[]", languageId.ToString());
+ }
+
+ return parameters;
+ }
+ }
}
--
2.50.1

View File

@@ -71,11 +71,12 @@ init_diagram: |
svc-prowlarr -> legacy-services
}
Base Images: {
"baseimage-alpine:3.22"
"baseimage-alpine:3.23"
}
"prowlarr:latest" <- Base Images
# changelog
changelogs:
- {date: "15.01.26:", desc: "Rebase to Alpine 3.23."}
- {date: "05.07.25:", desc: "Rebase Alpine 3.22."}
- {date: "23.12.24:", desc: "Rebase Alpine 3.21."}
- {date: "31.05.24:", desc: "Rebase Alpine 3.20."}