Compare commits
7 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
81dae8c237 | ||
|
|
aa70c91a87 | ||
|
|
3d2ec82e0f | ||
|
|
9c9c1583f7 | ||
|
|
f9a02ae487 | ||
|
|
0cc0ca98e1 | ||
|
|
a4abb31ea1 |
71
README.md
71
README.md
@@ -2,36 +2,21 @@
|
|||||||
|
|
||||||
## English description coming soon
|
## English description coming soon
|
||||||
|
|
||||||
## Erste Testversion
|
## Beschreibung
|
||||||
Wer möchte kann den UmlautAdaptarr jetzt gerne testen! Über Feedback würde ich mich sehr freuen!
|
Wer möchte kann den UmlautAdaptarr jetzt gerne testen! Über Feedback würde ich mich sehr freuen!
|
||||||
|
|
||||||
Es sollte mit allen *arrs funktionieren, hat aber nur bei Sonarr, Readarr und Lidarr schon Auswirkungen (abgesehen vom Caching).
|
Es sollte mit allen *arrs funktionieren, hat aber nur bei Sonarr, Readarr und Lidarr schon Auswirkungen (abgesehen vom Caching).
|
||||||
|
|
||||||
Momentan ist docker dafür nötig, wer kein Docker nutzt muss sich noch etwas gedulden.
|
|
||||||
|
|
||||||
[Link zum Docker Image](https://hub.docker.com/r/pcjones/umlautadaptarr)
|
|
||||||
|
|
||||||
Zusätzlich müsst ihr in Sonarr oder Prowlarr einen neuen Indexer hinzufügen (für jeden Indexer, bei dem UmlautAdapdarr greifen soll).
|
|
||||||
|
|
||||||
Am Beispiel von sceneNZBs:
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
Also alles wie immer, nur dass ihr als API-URL nicht direkt z.B. `https://scenenzbs.com` eingebt, sondern
|
|
||||||
`http://localhost:5005/_/scenenzbs.com`
|
|
||||||
|
|
||||||
Den API-Key müsst ihr natürlich auch ganz normal setzen.
|
|
||||||
|
|
||||||
## Was macht UmlautAdaptarr überhaupt?
|
|
||||||
UmlautAdaptarr löst mehrere Probleme:
|
UmlautAdaptarr löst mehrere Probleme:
|
||||||
- Releases mit Umlauten werden grundsätzlich nicht korrekt von den *Arrs importiert
|
- Releases mit Umlauten werden grundsätzlich nicht korrekt von den *Arrs importiert
|
||||||
- Releases mit Umlauten werden oft nicht korrekt gefunden (*Arrs suchen nach "o" statt "ö" & es fehlt häufig die korrekte Zuordnung zur Serie/zum Film beim Indexer)
|
- Releases mit Umlauten werden oft nicht korrekt gefunden (*Arrs suchen nach "o" statt "ö" & es fehlt häufig die korrekte Zuordnung zur Serie/zum Film beim Indexer)
|
||||||
- Sonarr & Radarr erwarten immer den englischen Titel von https://thetvdb.com/ bzw. https://www.themoviedb.org/. Das führt bei deutschen Produktionen oder deutschen Übersetzungen oft zu Problemen - falls die *arrs schon mal etwas mit der Meldung `Found matching series/movie via grab history, but release was matched to series by ID. Automatic import is not possible/` nicht importiert haben, dann war das der Grund.
|
- Sonarr & Radarr erwarten immer den englischen Titel von https://thetvdb.com/ bzw. https://www.themoviedb.org/. Das führt bei deutschen Produktionen oder deutschen Übersetzungen oft zu Problemen - falls die *arrs schon mal etwas mit der Meldung `Found matching series/movie via grab history, but release was matched to series by ID. Automatic import is not possible/` nicht importiert haben, dann war das der Grund.
|
||||||
|
- Zusätzlich werden einige andere Fehler behoben, die häufig dazu führen, dass Titel nicht erfolgreich gefunden, geladen oder importiert werden.
|
||||||
|
|
||||||
# Wie macht UmlautAdaptarr das?
|
## Wie macht UmlautAdaptarr das?
|
||||||
UmlautAdaptarr tut so, als wäre es ein Indexer. In Wahrheit schaltet sich UmlautAdaptarr aber nur zwischen die *arrs und den echten Indexer und kann somit die Suchen sowie die Ergebnisse abfangen und bearbeiten.
|
UmlautAdaptarr tut so, als wäre es ein Indexer. In Wahrheit schaltet sich UmlautAdaptarr aber nur zwischen die *arrs und den echten Indexer und kann somit die Suchen sowie die Ergebnisse abfangen und bearbeiten.
|
||||||
Am Ende werden die gefundenen Releases immer so umbenannt, dass die Arrs sie einwandfrei erkennen.
|
Am Ende werden die gefundenen Releases immer so umbenannt, dass die Arrs sie einwandfrei erkennen.
|
||||||
Einige Beispiele findet ihr unter Features.
|
Einige Beispiele finden sich [weiter unten](https://github.com/PCJones/UmlautAdaptarr/edit/develop/README.md#beispiel-funktionalit%C3%A4t).
|
||||||
|
|
||||||
|
|
||||||
## Features
|
## Features
|
||||||
@@ -45,7 +30,7 @@ Einige Beispiele findet ihr unter Features.
|
|||||||
| Releases mit deutschem Titel werden erkannt | ✓ |
|
| Releases mit deutschem Titel werden erkannt | ✓ |
|
||||||
| Releases mit TVDB-Alias Titel werden erkannt | ✓ |
|
| Releases mit TVDB-Alias Titel werden erkannt | ✓ |
|
||||||
| Korrekte Suche und Erkennung von Titel mit Umlauten | ✓ |
|
| Korrekte Suche und Erkennung von Titel mit Umlauten | ✓ |
|
||||||
| Anfragen-Caching für 5 Minuten zur Reduzierung der API-Zugriffe | ✓ |
|
| Anfragen-Caching für 12 Minuten zur Reduzierung der API-Zugriffe | ✓ |
|
||||||
| Usenet (newznab) Support |✓|
|
| Usenet (newznab) Support |✓|
|
||||||
| Torrent (torznab) Support |✓|
|
| Torrent (torznab) Support |✓|
|
||||||
| Radarr Support | Geplant |
|
| Radarr Support | Geplant |
|
||||||
@@ -53,6 +38,50 @@ Einige Beispiele findet ihr unter Features.
|
|||||||
| Unterstützung weiterer Sprachen neben Deutsch | Geplant |
|
| Unterstützung weiterer Sprachen neben Deutsch | Geplant |
|
||||||
| Wünsche? | Vorschläge? |
|
| Wünsche? | Vorschläge? |
|
||||||
|
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
Momentan ist Docker dafür nötig, wer kein Docker nutzt muss sich noch etwas gedulden. Eine Unraid-App gibt es auch, einfach nach `umlautadaptarr` suchen.
|
||||||
|
|
||||||
|
[Link zum Docker Image](https://hub.docker.com/r/pcjones/umlautadaptarr)
|
||||||
|
|
||||||
|
Nicht benötigte Umgebungsvariablen, z.B. wenn Readarr oder Lidarr nicht benötigt werden, können entfernt werden.
|
||||||
|
|
||||||
|
### Konfiguration in Prowlarr (**empfohlen**)
|
||||||
|
Das ist die **empfohlene** Methode um den UmlautAdaptarr einzurichten. Sie hat den Vorteil, dass es, sofern man mehrere Indexer nutzt, keinen Geschwindigkeitsverlust bei der Suche geben sollte.
|
||||||
|
|
||||||
|
1) In Prowlarr: Settings>Indexers bzw. Einstellungen>Indexer öffnen
|
||||||
|
2) Lege einen neuen HTTP-Proxy an:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
- Name: UmlautAdaptarr HTTP Proxy (Beispiel)
|
||||||
|
- Port: `5006` (Port beachten!)
|
||||||
|
- Tag: `umlautadaptarr`
|
||||||
|
- Host: Je nachdem, wie deine Docker-Konfiguration ist, kann es sein, dass du entweder `umlautadaptarr` oder `localhost`, oder ggf. die IP des Host setzen musst. Probiere es sonst einfach aus, indem du auf Test klickst.
|
||||||
|
- Die Username- und Passwort-Felder können leergelassen werden.
|
||||||
|
3) Gehe zur Indexer-Übersichtsseite
|
||||||
|
4) Für alle Indexer/Tracker, die den UmlautAdaptarr nutzen sollen:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
- Füge den `umlautadaptarr` Tag hinzu
|
||||||
|
- **Wichtig:** Ändere die URL von `https` zu `http`. (Dies ist erforderlich, damit der UmlautAdaptarr die Anfragen **lokal** abfangen kann. **Ausgehende** Anfragen an den Indexer verwenden natürlich weiterhin https).
|
||||||
|
5) Klicke danach auf `Test All Indexers` bzw `Alle Indexer Testen`. Falls du irgendwo noch `https` statt `http` stehen hast, sollte in den UmlautAdaptarr logs eine Warnung auftauchen. Mindestens solltest du aber noch ein zweites Mal alle Indexer durchgehen und überprüfen, ob überall `http` eingestellt ist - Indexer, bei denen noch `https` steht, werden nämlich einwandfrei funktionieren - allerdings ohne, dass der UmlautAdaptarr bei diesen wirken kann.
|
||||||
|
|
||||||
|
### Konfiguration in Sonarr/Radarr oder Prowlarr ohne Proxy
|
||||||
|
Falls du kein Prowlarr nutzt oder nur 1-3 Indexer nutzt, kannst du diese alternative Konfigurationsmöglichkeit nutzen.
|
||||||
|
|
||||||
|
Dafür musst du einfach nur alle Indexer, bei denen der UmlautAdaptarr greifen soll, bearbeiten:
|
||||||
|
|
||||||
|
Am Beispiel von sceneNZBs:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Also alles wie immer, nur dass als API-URL nicht direkt z.B. `https://scenenzbs.com` gesetzt wird, sondern
|
||||||
|
`http://localhost:5005/_/scenenzbs.com`
|
||||||
|
|
||||||
|
Der API-Key muss natürlich auch ganz normal gesetzt werden.
|
||||||
|
|
||||||
## Beispiel-Funktionalität
|
## Beispiel-Funktionalität
|
||||||
In den Klammern am Ende des Releasenamens (Bild 2 & 4) steht zu Anschauungszwecken der deutsche Titel der vorher nicht gefunden bzw. akzeptiert wurde. Das bleibt natürlich nicht so ;)
|
In den Klammern am Ende des Releasenamens (Bild 2 & 4) steht zu Anschauungszwecken der deutsche Titel der vorher nicht gefunden bzw. akzeptiert wurde. Das bleibt natürlich nicht so ;)
|
||||||
|
|
||||||
@@ -66,7 +95,7 @@ In den Klammern am Ende des Releasenamens (Bild 2 & 4) steht zu Anschauungszweck
|
|||||||
**Vorher:** Es werden nur Releases mit dem englischen Titel der Serie gefunden
|
**Vorher:** Es werden nur Releases mit dem englischen Titel der Serie gefunden
|
||||||

|

|
||||||
|
|
||||||
**Jetzt:** Es werden auch Titel mit dem deutschen Namen gefunden :D (haben nicht alle Suchergebnisse auf den Screenshot gepasst)
|
**Jetzt:** Es werden auch Titel mit dem deutschen Namen gefunden :D
|
||||||

|

|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -10,11 +10,15 @@ namespace UmlautAdaptarr.Services
|
|||||||
private readonly ILogger<HttpProxyService> _logger;
|
private readonly ILogger<HttpProxyService> _logger;
|
||||||
private readonly int _proxyPort = 5006; // TODO move to appsettings.json
|
private readonly int _proxyPort = 5006; // TODO move to appsettings.json
|
||||||
private readonly IHttpClientFactory _clientFactory;
|
private readonly IHttpClientFactory _clientFactory;
|
||||||
|
private HashSet<string> _knownHosts = [];
|
||||||
|
private readonly object _hostsLock = new object();
|
||||||
|
|
||||||
|
|
||||||
public HttpProxyService(ILogger<HttpProxyService> logger, IHttpClientFactory clientFactory)
|
public HttpProxyService(ILogger<HttpProxyService> logger, IHttpClientFactory clientFactory)
|
||||||
{
|
{
|
||||||
_logger = logger;
|
_logger = logger;
|
||||||
_clientFactory = clientFactory;
|
_clientFactory = clientFactory;
|
||||||
|
_knownHosts.Add("prowlarr.servarr.com");
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task HandleRequests(CancellationToken stoppingToken)
|
private async Task HandleRequests(CancellationToken stoppingToken)
|
||||||
@@ -47,16 +51,18 @@ namespace UmlautAdaptarr.Services
|
|||||||
|
|
||||||
private async Task HandleHttpsConnect(string requestString, NetworkStream clientStream, Socket clientSocket)
|
private async Task HandleHttpsConnect(string requestString, NetworkStream clientStream, Socket clientSocket)
|
||||||
{
|
{
|
||||||
var targetInfo = ParseTargetInfo(requestString);
|
var (host, port) = ParseTargetInfo(requestString);
|
||||||
if (targetInfo.host != "prowlarr.servarr.com")
|
|
||||||
|
// Prowlarr will send grab requests via https which cannot be changed
|
||||||
|
if (!_knownHosts.Contains(host))
|
||||||
{
|
{
|
||||||
_logger.LogWarning($"IMPORTANT! {Environment.NewLine} Indexer {targetInfo.host} needs to be set to http:// instead of https:// {Environment.NewLine}" +
|
_logger.LogWarning($"IMPORTANT! {Environment.NewLine} Indexer {host} needs to be set to http:// instead of https:// {Environment.NewLine}" +
|
||||||
$"UmlautAdaptarr will not work for {targetInfo.host}!");
|
$"UmlautAdaptarr will not work for {host}!");
|
||||||
}
|
}
|
||||||
using var targetSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
|
using var targetSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
await targetSocket.ConnectAsync(targetInfo.host, targetInfo.port);
|
await targetSocket.ConnectAsync(host, port);
|
||||||
await clientStream.WriteAsync(Encoding.ASCII.GetBytes("HTTP/1.1 200 Connection Established\r\n\r\n"));
|
await clientStream.WriteAsync(Encoding.ASCII.GetBytes("HTTP/1.1 200 Connection Established\r\n\r\n"));
|
||||||
using var targetStream = new NetworkStream(targetSocket, ownsSocket: true);
|
using var targetStream = new NetworkStream(targetSocket, ownsSocket: true);
|
||||||
await RelayTraffic(clientStream, targetStream);
|
await RelayTraffic(clientStream, targetStream);
|
||||||
@@ -74,8 +80,17 @@ namespace UmlautAdaptarr.Services
|
|||||||
{
|
{
|
||||||
var headers = ParseHeaders(buffer, bytesRead);
|
var headers = ParseHeaders(buffer, bytesRead);
|
||||||
string userAgent = headers.FirstOrDefault(h => h.Key == "User-Agent").Value;
|
string userAgent = headers.FirstOrDefault(h => h.Key == "User-Agent").Value;
|
||||||
|
|
||||||
var uri = new Uri(requestString.Split(' ')[1]);
|
var uri = new Uri(requestString.Split(' ')[1]);
|
||||||
|
|
||||||
|
// Add to known hosts if not already present
|
||||||
|
lock (_hostsLock)
|
||||||
|
{
|
||||||
|
if (!_knownHosts.Contains(uri.Host))
|
||||||
|
{
|
||||||
|
_knownHosts.Add(uri.Host);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
var modifiedUri = $"http://localhost:5005/_/{uri.Host}{uri.PathAndQuery}"; // TODO read port from appsettings?
|
var modifiedUri = $"http://localhost:5005/_/{uri.Host}{uri.PathAndQuery}"; // TODO read port from appsettings?
|
||||||
using var client = _clientFactory.CreateClient();
|
using var client = _clientFactory.CreateClient();
|
||||||
var httpRequestMessage = new HttpRequestMessage(HttpMethod.Get, modifiedUri);
|
var httpRequestMessage = new HttpRequestMessage(HttpMethod.Get, modifiedUri);
|
||||||
|
|||||||
Reference in New Issue
Block a user