Merge branch 'Radarr:develop' into develop

This commit is contained in:
Gauvino 2024-03-06 03:15:46 +01:00 committed by GitHub
commit e00b1e85a2
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
14 changed files with 259 additions and 78 deletions

View File

@ -9,7 +9,7 @@ variables:
testsFolder: './_tests'
yarnCacheFolder: $(Pipeline.Workspace)/.yarn
nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages
majorVersion: '5.4.1'
majorVersion: '5.4.2'
minorVersion: $[counter('minorVersion', 2000)]
radarrVersion: '$(majorVersion).$(minorVersion)'
buildName: '$(Build.SourceBranchName).$(radarrVersion)'

View File

@ -1,7 +1,9 @@
using System;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Net.NetworkInformation;
using System.Net.Security;
using System.Net.Sockets;
using System.Text;
@ -246,6 +248,18 @@ namespace NzbDrone.Common.Http.Dispatchers
return _credentialCache.Get("credentialCache", () => new CredentialCache());
}
private static bool HasRoutableIPv4Address()
{
// Get all IPv4 addresses from all interfaces and return true if there are any with non-loopback addresses
var networkInterfaces = NetworkInterface.GetAllNetworkInterfaces();
return networkInterfaces.Any(ni =>
ni.OperationalStatus == OperationalStatus.Up &&
ni.GetIPProperties().UnicastAddresses.Any(ip =>
ip.Address.AddressFamily == AddressFamily.InterNetwork &&
!IPAddress.IsLoopback(ip.Address)));
}
private static async ValueTask<Stream> onConnect(SocketsHttpConnectionContext context, CancellationToken cancellationToken)
{
// Until .NET supports an implementation of Happy Eyeballs (https://tools.ietf.org/html/rfc8305#section-2), let's make IPv4 fallback work in a simple way.
@ -269,10 +283,8 @@ namespace NzbDrone.Common.Http.Dispatchers
}
catch
{
// very naively fallback to ipv4 permanently for this execution based on the response of the first connection attempt.
// note that this may cause users to eventually get switched to ipv4 (on a random failure when they are switching networks, for instance)
// but in the interest of keeping this implementation simple, this is acceptable.
useIPv6 = false;
// Do not retry IPv6 if a routable IPv4 address is available, otherwise continue to attempt IPv6 connections.
useIPv6 = !HasRoutableIPv4Address();
}
finally
{

View File

@ -1,10 +1,12 @@
using System;
using System.Collections.Generic;
using System.Dynamic;
using System.Linq;
using System.Net;
using Newtonsoft.Json.Linq;
using NLog;
using NzbDrone.Common.Cache;
using NzbDrone.Common.Extensions;
using NzbDrone.Common.Http;
using NzbDrone.Common.Serializer;
@ -101,11 +103,21 @@ namespace NzbDrone.Core.Download.Clients.Deluge
public string AddTorrentFromMagnet(string magnetLink, DelugeSettings settings)
{
var options = new
dynamic options = new ExpandoObject();
options.add_paused = settings.AddPaused;
options.remove_at_ratio = false;
if (settings.DownloadDirectory.IsNotNullOrWhiteSpace())
{
add_paused = settings.AddPaused,
remove_at_ratio = false
};
options.download_location = settings.DownloadDirectory;
}
if (settings.CompletedDirectory.IsNotNullOrWhiteSpace())
{
options.move_completed_path = settings.CompletedDirectory;
options.move_completed = true;
}
var response = ProcessRequest<string>(settings, "core.add_torrent_magnet", magnetLink, options);
@ -114,11 +126,21 @@ namespace NzbDrone.Core.Download.Clients.Deluge
public string AddTorrentFromFile(string filename, byte[] fileContent, DelugeSettings settings)
{
var options = new
dynamic options = new ExpandoObject();
options.add_paused = settings.AddPaused;
options.remove_at_ratio = false;
if (settings.DownloadDirectory.IsNotNullOrWhiteSpace())
{
add_paused = settings.AddPaused,
remove_at_ratio = false
};
options.download_location = settings.DownloadDirectory;
}
if (settings.CompletedDirectory.IsNotNullOrWhiteSpace())
{
options.move_completed_path = settings.CompletedDirectory;
options.move_completed = true;
}
var response = ProcessRequest<string>(settings, "core.add_torrent_file", filename, fileContent, options);

View File

@ -61,6 +61,12 @@ namespace NzbDrone.Core.Download.Clients.Deluge
[FieldDefinition(9, Label = "DownloadClientSettingsAddPaused", Type = FieldType.Checkbox)]
public bool AddPaused { get; set; }
[FieldDefinition(10, Label = "DownloadClientDelugeSettingsDirectory", Type = FieldType.Textbox, Advanced = true, HelpText = "DownloadClientDelugeSettingsDirectoryHelpText")]
public string DownloadDirectory { get; set; }
[FieldDefinition(11, Label = "DownloadClientDelugeSettingsDirectoryCompleted", Type = FieldType.Textbox, Advanced = true, HelpText = "DownloadClientDelugeSettingsDirectoryCompletedHelpText")]
public string CompletedDirectory { get; set; }
public NzbDroneValidationResult Validate()
{
return new NzbDroneValidationResult(Validator.Validate(this));

View File

@ -228,6 +228,7 @@
"ConnectionLost": "Connection Lost",
"ConnectionLostReconnect": "{appName} will try to connect automatically, or you can click reload below.",
"ConnectionLostToBackend": "{appName} has lost its connection to the backend and will need to be reloaded to restore functionality.",
"ConnectionSettingsUrlBaseHelpText": "Adds a prefix to the {connectionName} url, such as {url}",
"Connections": "Connections",
"ConsideredAvailable": "Considered Available",
"CopyToClipboard": "Copy to Clipboard",
@ -372,6 +373,10 @@
"DownloadClientCheckDownloadingToRoot": "Download client {downloadClientName} places downloads in the root folder {path}. You should not download to a root folder.",
"DownloadClientCheckNoneAvailableMessage": "No download client is available",
"DownloadClientCheckUnableToCommunicateMessage": "Unable to communicate with {downloadClientName}. {errorMessage}",
"DownloadClientDelugeSettingsDirectory": "Download Directory",
"DownloadClientDelugeSettingsDirectoryCompleted": "Move When Completed Directory",
"DownloadClientDelugeSettingsDirectoryCompletedHelpText": "Optional location to move completed downloads to, leave blank to use the default Deluge location",
"DownloadClientDelugeSettingsDirectoryHelpText": "Optional location to put downloads in, leave blank to use the default Deluge location",
"DownloadClientDelugeSettingsUrlBaseHelpText": "Adds a prefix to the deluge json url, see {url}",
"DownloadClientDelugeTorrentStateError": "Deluge is reporting an error",
"DownloadClientDelugeValidationLabelPluginFailure": "Configuration of label failed",

View File

@ -119,8 +119,8 @@
"PreviewRename": "Previsualizar Renombrado",
"Path": "Ruta",
"Options": "Opciones",
"NoChange": "Sin Cambio",
"NoChanges": "Sin Cambios",
"NoChange": "Sin cambio",
"NoChanges": "Sin cambios",
"ImportListStatusCheckSingleClientMessage": "Listas no disponibles debido a errores: {importListNames}",
"ImportListStatusCheckAllClientMessage": "Las listas no están disponibles debido a errores",
"Movies": "Películas",
@ -128,9 +128,9 @@
"MovieIndex": "Índice de Películas",
"MovieEditor": "Editor de Películas",
"Movie": "Película",
"MoreInfo": "Más Información",
"MoreInfo": "Más información",
"Month": "Mes",
"Monitor": "Monitorear",
"Monitor": "Monitorizar",
"Missing": "Faltantes",
"MinimumAvailability": "Disponibilidad Mínima",
"MinAvailability": "Disponibilidad mínima",
@ -169,7 +169,7 @@
"OutputPath": "Ruta de Output",
"MovieTitle": "Título de la Película",
"MountCheckMessage": "El punto de montaje que contiene la ruta de una película es de read-only: ",
"MonitoredOnly": "Monitoreadas Solamente",
"MonitoredOnly": "Solo monitorizados",
"MetadataSettingsMovieSummary": "Crear archivos de metadatos cuando las películas se importen ó actualicen",
"MediaManagementSettingsSummary": "Ajustes de nombrado y gestión de archivos",
"MassMovieSearch": "Búsqueda en masa de películas",
@ -224,7 +224,7 @@
"Ok": "Ok",
"OAuthPopupMessage": "Pop-ups bloqueados por su navegador",
"Name": "Nombre",
"MoveFiles": "Mover Archivos",
"MoveFiles": "Mover archivos",
"Monitored": "Monitorizado",
"Message": "Mensaje",
"Location": "Ubicación",
@ -497,16 +497,16 @@
"PackageVersion": "Versión del paquete",
"Original": "Original",
"NotMonitored": "No Monitoreadas",
"NotificationTriggers": "Desencadenantes de Notificaciones",
"NotificationTriggers": "Disparadores de notificación",
"NotAvailable": "No Disponible",
"NoMinimumForAnyRuntime": "Sin mínimo para el tiempo de ejecución",
"NoLimitForAnyRuntime": "SIn límite para el tiempo de ejecución",
"NoLeaveIt": "No, Déjalo",
"NoMinimumForAnyRuntime": "No hay mínimo para ningún tiempo de ejecución",
"NoLimitForAnyRuntime": "No hay límites para ningún tiempo de ejecución",
"NoLeaveIt": "No, déjalo",
"New": "Nuevo",
"NetCore": ".NET",
"NamingSettings": "Ajustes de Renombrado",
"MustNotContain": "No Debe Contener",
"MustContain": "Debe Contener",
"NamingSettings": "Opciones de nombrado",
"MustNotContain": "No debe contener",
"MustContain": "Debe contener",
"MovieYearHelpText": "Año de la película a excluir",
"MovieYear": "Año de la Película",
"MovieTitleHelpText": "Ttítulo de la película a excluir (puedes ser cualquier cosa)",
@ -517,12 +517,12 @@
"MovieFiles": "Archivos",
"MonitoredHelpText": "Descargar película si está disponible",
"Mode": "Modo",
"MinimumLimits": "Límites Mínimos",
"MinimumFreeSpaceHelpText": "Evitar importación si dejase menos de esta cantidad en disco disponible",
"MinimumFreeSpace": "Espacio Libre Mínimo",
"MinimumAgeHelpText": "Sólo Usenet: Edad mínima en minutos de los NZB para ser descargados. Usa esto para dar a los nuevos lanzamientos tiempo de propagarse en tu proveedor de usenet.",
"MinimumAge": "Edad Mínima",
"MinimumCustomFormatScoreHelpText": "Puntuación mínima del formato propio permitida para descargar",
"MinimumLimits": "Límites mínimos",
"MinimumFreeSpaceHelpText": "Evita importar si se quedaría menos que esta cantidad de disco disponible",
"MinimumFreeSpace": "Espacio libre mínimo",
"MinimumAgeHelpText": "Solo Usenet: Edad mínima en minutos de NZBs antes de que sean capturados. Usa esto para dar tiempo a los nuevos lanzamientos para propagarse a tu proveedor usenet.",
"MinimumAge": "Edad mínima",
"MinimumCustomFormatScoreHelpText": "Puntuación mínima de formato personalizado permitida para descargar",
"MIA": "MIA",
"MetadataSettings": "Opciones de metadatos",
"MediaManagementSettings": "Opciones de gestión de medios",
@ -542,7 +542,7 @@
"LanguageHelpText": "Idioma de los Lanzamientos",
"Interval": "Intervalo",
"IndexerSettings": "Ajustes de Indexer",
"IndexerFlags": "Marcas de Indexer",
"IndexerFlags": "Banderas del indexador",
"IncludeUnmonitored": "Incluir sin monitorizar",
"IncludeHealthWarningsHelpText": "Incluir Alertas de Salud",
"IncludeCustomFormatWhenRenamingHelpText": "Incluir en formato de renombrado {Custom Formats}",
@ -598,7 +598,7 @@
"Queued": "Encolado",
"Pending": "Pendiente",
"Paused": "Pausado",
"NegateHelpText": "Si se activa, el formato propio no se aplicará si esta condición {0} se iguala.",
"NegateHelpText": "Si se elige, el formato personalizado no se aplica si coincide la condición {implementationName}.",
"MoviesSelectedInterp": "{0} Película(s) Seleccionada(s)",
"MovieIsUnmonitored": "La película no está monitoreada",
"MovieIsMonitored": "La película está monitoreada",
@ -644,7 +644,7 @@
"UiSettingsLoadError": "No se han podido cargar los ajustes de UI",
"CalendarLoadError": "No se ha podido cargar el calendario",
"UnableToLoadRootFolders": "No se han podido cargar las carpetas raiz",
"NamingSettingsLoadError": "No se han podido cargar los ajustes de renombrado",
"NamingSettingsLoadError": "No se pudo cargar las opciones de nombrado",
"UnableToLoadMovies": "No se han podido cargar las películas",
"MediaManagementSettingsLoadError": "No se puede cargar las opciones de gestión de medios",
"ListOptionsLoadError": "No se pueden cargar opciones de lista",
@ -669,14 +669,14 @@
"SupportedIndexers": "{appName} soporta cualquier indexer que utilice el estandar Newznab, como también cualquiera de los indexers listados debajo.",
"SupportedDownloadClients": "{appName} es compatible con muchos clientes de descarga de Torrent y Usenet populares.",
"NoUpdatesAreAvailable": "No hay actualizaciones disponibles",
"NoTagsHaveBeenAddedYet": "No se han añadido etiquetas todavía",
"NoLogFiles": "Sin archivos de registro",
"NoTagsHaveBeenAddedYet": "Ninguna etiqueta ha sido añadida aún",
"NoLogFiles": "No hay archivos de registro",
"NoHistory": "Sin historial",
"NoBackupsAreAvailable": "No hay copias de seguridad disponibles",
"MoreDetails": "Más detalles",
"MissingNotMonitored": "No encontrada (No Monitoreada)",
"MissingMonitoredAndConsideredAvailable": "No encontrada (Monitoreada)",
"MinutesSixty": "60 Minutos: {0}",
"MinutesSixty": "60 minutos: {sixty}",
"MinutesNinety": "90 Minutos: {0}",
"MinutesHundredTwenty": "120 Minutos: {0}",
"MaintenanceRelease": "Lanzamiento de mantenimiento: Corrección de errores y otras mejoras. Ver historial de commits de Github para mas detalle",
@ -736,7 +736,7 @@
"SearchFailedPleaseTryAgainLater": "La búsqueda ha fallado, por favor inténtalo de nuevo más tarde.",
"Released": "Estrenada",
"ProcessingFolders": "Procesando Carpetas",
"NoMatchFound": "No se han encontrado coincidencias!",
"NoMatchFound": "¡Ninguna coincidencia encontrada!",
"ImportRootPath": "Dirige {appName} a la carpeta con todas tus películas, no a una específica. ej. {0} y no {1}. Adicionalmente, cada película debe estar en su propia carpeta dentro de la carpeta root/librería.",
"ImportIncludeQuality": "Asegúrate de que los archivos incluyen la calidad en el nombre. ej. {0}",
"ImportErrors": "Importar errores",
@ -761,7 +761,7 @@
"AllFiles": "Todos los archivos",
"ImportLibrary": "Importar biblioteca",
"ExcludeTitle": "¿Excluir {0}? Esto evitará que {appName} agregue automáticamente mediante la sincronización de listas.",
"None": "Ninguna",
"None": "Ninguno",
"QualitiesHelpText": "Las calidades situadas mas arriba en la lista son las preferidas aunque no estén marcadas. Las calidades del mismo grupo son iguales. Sólo se buscarán las calidades marcadas",
"DeleteFilesLabel": "Eliminar {0} archivos de película",
"MappedDrivesRunningAsService": "Las unidades de red asignadas no están disponibles cuando se ejecutan como un servicio de Windows. Consulte las preguntas frecuentes para obtener más información",
@ -790,15 +790,15 @@
"Max": "Máximo",
"Medium": "Mediano",
"Minutes": "Minutos",
"Monday": "lunes",
"Monday": "Lunes",
"MovieIsRecommend": "Se recomienda la película según la adición reciente",
"NextExecution": "Siguiente ejecución",
"NoAltTitle": "Sin títulos alternativos.",
"NoEventsFound": "No se encontraron eventos",
"NoEventsFound": "Ningún evento encontrado",
"NoLinks": "Sin enlaces",
"NoMoveFilesSelf": " No, moveré los archivos yo mismo",
"NoMoviesExist": "No se encontraron películas, para comenzar, querrá agregar una nueva película o importar algunas existentes.",
"NoResultsFound": "No se han encontrado resultados",
"NoResultsFound": "Ningún resultado encontrado",
"MovieFilesTotaling": "Totalización de archivos de película",
"OnGrab": "Al Capturar",
"OnHealthIssue": "En Problema de Salud",
@ -876,14 +876,14 @@
"MegabytesPerMinute": "Megabytes por minuto",
"Min": "Min",
"MinimumCustomFormatScore": "Puntuación mínima de formato personalizado",
"MonitoredStatus": "Monitoreado / Estado",
"MonitoredStatus": "Monitorizados/Estado",
"Months": "Meses",
"MoveFolders1": "¿Le gustaría mover las carpetas de películas a '{0}'?",
"MovieChat": "Chat de películas",
"MovieInvalidFormat": "Película: formato no válido",
"MultiLanguage": "Multi lenguaje",
"Negate": "Negar",
"Negated": "Negado",
"Negated": "Anulado",
"NoListRecommendations": "No se encontraron elementos de lista ni recomendaciones; para comenzar, querrá agregar una nueva película, importar algunas existentes o agregar una lista.",
"OrganizeConfirm": "¿Está seguro de que desea organizar todos los archivos de las {0} películas seleccionadas?",
"OrganizeSelectedMovies": "Organizar películas seleccionadas",
@ -969,7 +969,7 @@
"ClickToChangeReleaseGroup": "Clic para cambiar el grupo de lanzamiento",
"ImportList": "Lista",
"ManualImportSetReleaseGroup": "Importación manual - Configurar el grupo de lanzamiento",
"NotificationTriggersHelpText": "Seleccione qué eventos deben activar esta notificación",
"NotificationTriggersHelpText": "Selecciona qué eventos deberían disparar esta notificación",
"OnApplicationUpdate": "Al Actualizar La Aplicación",
"RemotePathMappingCheckFileRemoved": "El archivo {path} fue eliminado a mitad del proceso.",
"RemotePathMappingCheckBadDockerPath": "Está utilizando docker; el cliente de descarga {downloadClientName} coloca las descargas en {path} pero esta no es una ruta válida {osName}. Revisa tus mapeos de rutas remotas y la configuración del cliente de descarga.",
@ -1278,5 +1278,37 @@
"ListQualityProfileHelpText": "Los elementos de la lista del Perfil de Calidad se añadirán con",
"ListRootFolderHelpText": "Los elementos de la lista de carpetas raíz se añadirán a",
"BlackholeFolderHelpText": "La carpeta en donde {appName} se almacenaran los {extension} file",
"MediaInfoFootNote": "MediaInfo Full/Idiomas de audio/Idiomas de subtítulo soporta un sufijo `:ES+DE` que te permite filtrar los idiomas incluidos en el nombre de archivo. Usa `-DE` para excluir idiomas específicos. Añadir `+` (eg `:ES+`) devolverá `[ES]`/`[ES+--]`/`[--]` dependiendo de los idiomas excluidos. Por ejemplo `{MediaInfo Full:ES+DE}`."
"MediaInfoFootNote": "MediaInfo Full/Idiomas de audio/Idiomas de subtítulo soporta un sufijo `:ES+DE` que te permite filtrar los idiomas incluidos en el nombre de archivo. Usa `-DE` para excluir idiomas específicos. Añadir `+` (eg `:ES+`) devolverá `[ES]`/`[ES+--]`/`[--]` dependiendo de los idiomas excluidos. Por ejemplo `{MediaInfo Full:ES+DE}`.",
"NotificationsAppriseSettingsNotificationType": "Tipo de notificación de Apprise",
"NotificationsAppriseSettingsPasswordHelpText": "Autenticación básica HTTP de contraseña",
"NotificationsCustomScriptSettingsArgumentsHelpText": "Argumentos a pasar al script",
"NotificationsCustomScriptSettingsProviderMessage": "El test ejecutará el script con el EventType establecido en {eventTypeSet}, asegúrate de que tu script maneja esto correctamente",
"ClickToChangeIndexerFlags": "Clic para cambiar las banderas del indexador",
"NotificationsDiscordSettingsAvatarHelpText": "Cambia el avatar que es usado para mensajes desde esta integración",
"MustContainHelpText": "El lanzamiento debe contener al menos uno de estos términos (insensible a mayúsculas)",
"MustNotContainHelpText": "El lanzamiento será rechazado si contiene uno o más de estos términos (insensible a mayúsculas)",
"No": "No",
"NoDelay": "Sin retraso",
"NotificationsAppriseSettingsStatelessUrlsHelpText": "Una o más URLs separadas por comas identificando a dónde debería ser enviada la notificación. Dejar vacío si se usa Almacenamiento persistente.",
"NotificationsDiscordSettingsAuthorHelpText": "Sobrescribe el autor incrustado que se muestra para esta notificación. En blanco es el nombre de la instancia",
"NoImportListsFound": "Ninguna lista de importación encontrada",
"NotificationsAppriseSettingsTags": "Etiquetas de Apprise",
"NotificationStatusAllClientHealthCheckMessage": "Las notificaciones no están disponibles debido a fallos",
"NotificationsCustomScriptSettingsName": "Script personalizado",
"NotificationsAppriseSettingsConfigurationKey": "Clave de configuración de Apprise",
"NotificationsAppriseSettingsConfigurationKeyHelpText": "Clave de configuración para la Solución de almacenamiento persistente. Dejar vacío si se usan URLs sin estado.",
"NotificationsAppriseSettingsStatelessUrls": "URLs sin estado de Apprise",
"NotificationsAppriseSettingsServerUrlHelpText": "URL de servidor de Apprise, incluyendo http(s):// y puerto si es necesario",
"NotificationsAppriseSettingsServerUrl": "URL de servidor de Apprise",
"NotificationsAppriseSettingsUsernameHelpText": "Autenticación básica HTTP de usuario",
"NotificationsAppriseSettingsTagsHelpText": "Opcionalmente notifica solo esas etiquetas en consecuencia.",
"NotificationsCustomScriptSettingsArguments": "Argumentos",
"CustomFilter": "Filtros personalizados",
"CustomFormatsSpecificationFlag": "Bandera",
"LabelIsRequired": "Se requiere etiqueta",
"Label": "Etiqueta",
"NotificationStatusSingleClientHealthCheckMessage": "Notificaciones no disponible debido a fallos: {notificationNames}",
"NotificationsCustomScriptValidationFileDoesNotExist": "El archivo no existe",
"NotificationsDiscordSettingsAvatar": "Avatar",
"AddAutoTagError": "No se pudo añadir una nueva etiqueta automática, por favor inténtalo de nuevo."
}

View File

@ -153,7 +153,7 @@
"DigitalRelease": "Dijital Yayın",
"DelayProfiles": "Gecikme Profilleri",
"CustomFilters": "Özel Filtreler",
"ConnectSettingsSummary": "Bildirimler, medya sunucularına/oynatıcılara bağlantılar ve özel komut kodları",
"ConnectSettingsSummary": "Bildirimler, medya sunucularına/oynatıcılara bağlantılar ve özel komut dosyaları",
"CompletedDownloadHandling": "Tamamlanan İndirme İşlemleri",
"ChooseAnotherFolder": "Başka bir dosya seç",
"Analytics": "Analitik",
@ -423,8 +423,8 @@
"AddIndexer": "Dizin Oluşturucu Ekle",
"AllResultsHiddenFilter": "Tüm sonuçlar, uygulanan filtre tarafından gizlenir",
"AnalyseVideoFiles": "Video dosyalarını analiz edin",
"AppDataDirectory": "AppData dizini",
"CustomFormatUnknownCondition": "Bilinmeyen Özel Biçim koşulu '{0}'",
"AppDataDirectory": "Uygulama Veri Dizini",
"CustomFormatUnknownCondition": "Bilinmeyen Özel Biçim koşulu '{implementation}'",
"AuthBasic": "Temel (Tarayıcıılır Penceresi)",
"AuthForm": "Formlar (Giriş Sayfası)",
"Branch": "Şube",
@ -533,9 +533,9 @@
"Backups": "Yedeklemeler",
"BeforeUpdate": "Güncellemeden önce",
"BindAddress": "Bağlama Adresi",
"BindAddressHelpText": "Tüm arayüzler için geçerli IP4 adresi veya '*'",
"BindAddressHelpText": "Tüm arayüzler için geçerli IP adresi, localhost veya '*'",
"CertificateValidation": "Sertifika Doğrulama",
"CertificateValidationHelpText": "HTTPS sertifika doğrulamasının ne kadar katı olduğunu değiştirin",
"CertificateValidationHelpText": "HTTPS sertifika doğrulamasının sıkılığını değiştirin. Riskleri anlamadığınız sürece değişmeyin.",
"Certification": "Sertifikasyon",
"BranchUpdate": "{appName}'ı güncellemek için kullanılacak dal",
"BranchUpdateMechanism": "Harici güncelleme mekanizması tarafından kullanılan dal",
@ -596,7 +596,7 @@
"AllowHardcodedSubs": "Sabit Kodlu Aboneliklere İzin Ver",
"AddRemotePathMapping": "Uzak Yol Eşleme Ekleme",
"AudioInfo": "Ses Bilgileri",
"Cancel": "İptal etmek",
"Cancel": "Vazgeç",
"PhysicalRelease": "Fiziksel Salınım",
"Port": "Liman",
"Close": "Kapat",
@ -652,7 +652,7 @@
"ConsideredAvailable": "Mevcut Kabul Edilen",
"CopyToClipboard": "Panoya kopyala",
"CopyUsingHardlinksMovieHelpText": "Hala tohumlanmakta olan torrentlerden dosya kopyalamaya çalışırken Sabit Bağlantıları kullanın",
"CouldNotFindResults": "'{0}' için hiçbir sonuç bulunamadı",
"CouldNotFindResults": "'{term}' için herhangi bir sonuç bulunamadı",
"CreateEmptyMovieFolders": "Boş film klasörleri oluşturun",
"CreateGroup": "Grup oluştur",
"CurrentlyInstalled": "Şu anda Yüklü",
@ -661,7 +661,7 @@
"CustomFormatHelpText": "{appName}, özel biçimlerle eşleşen puanların toplamını kullanarak her sürümü puanlar. Yeni bir sürüm, puanı aynı veya daha iyi kalitede iyileştirecekse, {appName} onu alacaktır.",
"CustomFormatScore": "Özel Biçim Puanı",
"CustomFormatsSettings": "Özel Biçim Ayarları",
"CustomFormatUnknownConditionOption": "'{1}' koşulu için bilinmeyen '{0}' seçeneği",
"CustomFormatUnknownConditionOption": "'{implementation}' koşulu için bilinmeyen seçenek '{key}'",
"Cutoff": "Ayırmak",
"UpgradeUntilCustomFormatScoreMovieHelpText": "Bu özel format puanına ulaşıldığında, {appName} artık film indirmeyecektir",
"CutoffUnmet": "Kesme Karşılanmadı",
@ -994,5 +994,86 @@
"AddDownloadClientImplementation": "İndirme İstemcisi Ekle - {implementationName}",
"AddImportList": "İçe Aktarım Listesi Ekle",
"AddImportListImplementation": "İçe Aktarım Listesi Ekle -{implementationName}",
"AddReleaseProfile": "Sürüm Profili Ekle"
"AddReleaseProfile": "Sürüm Profili Ekle",
"CollectionOptions": "Koleksiyon Seçenekleri",
"AutoRedownloadFailedFromInteractiveSearch": "Etkileşimli Aramadan Yeniden İndirme Başarısız Oldu",
"AutoTaggingNegateHelpText": "İşaretlenirse, {implementationName} koşulu eşleştiğinde otomatik etiketleme kuralı uygulanmayacaktır.",
"AutomaticUpdatesDisabledDocker": "Docker güncelleme mekanizması kullanıldığında otomatik güncellemeler doğrudan desteklenmez. Kapsayıcı görüntüsünü {appName} dışında güncellemeniz veya bir komut dosyası kullanmanız gerekecek",
"BypassDelayIfHighestQuality": "En Yüksek Kalitedeyse Atla",
"AppUpdated": "{appName} Güncellendi",
"AppUpdatedVersion": "{appName}, `{version}` sürümüne güncellendi; en son değişikliklerin etkin olabilmesi için {appName} uygulamasını yeniden başlatmanız gerekli",
"ApplyTagsHelpTextHowToApplyIndexers": "Seçilen indeksleyicilere etiketler nasıl uygulanır?",
"ApplyTagsHelpTextHowToApplyMovies": "Seçilen filmlere etiketler nasıl uygulanır?",
"ApplyTagsHelpTextRemove": "Kaldır: Girilen etiketleri kaldırın",
"Complete": "Tamamla",
"ClickToChangeReleaseGroup": "Sürüm grubunu değiştirmek için tıklayın",
"ApplyChanges": "Değişiklikleri Uygula",
"AnnouncedMsg": "Film duyuruldu",
"AutomaticAdd": "Otomatik Ekle",
"CollectionShowOverviewsHelpText": "Koleksiyonda genel bakışı göster",
"BlocklistAndSearchHint": "Engellenenler listesine ekledikten sonra yenisini aramaya başlayın",
"BlocklistAndSearchMultipleHint": "Engellenenler listesine ekledikten sonra yedekleri aramaya başlayın",
"BlocklistAndSearch": "Engellenenler Listesi ve Arama",
"BlocklistOnly": "Yalnızca Engellenenler Listesi",
"BlocklistOnlyHint": "Yenisini aramadan engelleme listesi",
"BlocklistMultipleOnlyHint": "Yedekleri aramadan engelleme listesi",
"CountImportListsSelected": "{count} içe aktarma listesi seçildi",
"ApplicationURL": "Uygulama URL'si",
"ApplicationUrlHelpText": "Bu uygulamanın http(s)://, bağlantı noktası ve URL tabanını içeren harici URL'si",
"CollectionShowDetailsHelpText": "Koleksiyon durumunu ve özelliklerini göster",
"BlackholeFolderHelpText": "{appName} uygulamasının {extension} dosyasını depolayacağı klasör",
"BlackholeWatchFolder": "İzleme Klasörü",
"BlackholeWatchFolderHelpText": "{appName} uygulamasının tamamlanmış indirmeleri içe aktaracağı klasör",
"Category": "Kategori",
"ChangeCategory": "Kategoriyi Değiştir",
"ChangeCategoryMultipleHint": "İndirme istemcisinden indirmeleri 'İçe Aktarma Sonrası Kategorisi' olarak değiştirir",
"CollectionShowPostersHelpText": "Koleksiyon öğesi posterlerini göster",
"CloneCondition": "Klon Durumu",
"ApiKeyValidationHealthCheckMessage": "Lütfen API anahtarınızı en az {length} karakter uzunluğunda olacak şekilde güncelleyin. Bunu ayarlar veya yapılandırma dosyası aracılığıyla yapabilirsiniz.",
"AutoRedownloadFailed": "Yeniden İndirme Başarısız",
"AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Yeni şifreyi onayla",
"BypassDelayIfAboveCustomFormatScoreMinimumScore": "Minimum Özel Format Puanı",
"BypassDelayIfAboveCustomFormatScoreMinimumScoreHelpText": "Tercih edilen protokolde gecikmeyi atlamak için gereken Minimum Özel Format Puanı",
"BypassDelayIfAboveCustomFormatScoreHelpText": "Sürümün puanı, yapılandırılan minimum özel format puanından yüksek olduğunda bypass'ı etkinleştirin",
"ClearBlocklistMessageText": "Engellenenler listesindeki tüm öğeleri temizlemek istediğinizden emin misiniz?",
"CloneAutoTag": "Otomatik Etiketi Klonla",
"ChooseImportMode": "İçe Aktarma Modunu Seçin",
"ClearBlocklist": "Engellenenler listesini temizle",
"AudioLanguages": "Ses Dilleri",
"BlocklistReleaseHelpText": "Bu sürümün {appName} tarafından RSS veya Otomatik Arama yoluyla yeniden indirilmesi engelleniyor",
"BlocklistLoadError": "Engellenenler listesi yüklenemiyor",
"CountDownloadClientsSelected": "{count} indirme istemcisi seçildi",
"AuthenticationRequiredHelpText": "İstekler için Kimlik doğrulamanın gereklilik ayarını değiştirin. Riskleri anlamadığınız sürece değiştirmeyin.",
"AuthenticationRequiredWarning": "Kimlik doğrulaması olmadan uzaktan erişimi engellemek için, {appName}'da artık kimlik doğrulamanın etkinleştirilmesini gerektiriyor. İsteğe bağlı olarak yerel adresler için kimlik doğrulamayı devre dışı bırakabilirsiniz.",
"AuthenticationRequired": "Kimlik Doğrulama Gerekli",
"AuthenticationMethod": "Kimlik Doğrulama Yöntemi",
"AuthenticationMethodHelpTextWarning": "Lütfen geçerli bir kimlik doğrulama yöntemi seçin",
"ClickToChangeIndexerFlags": "Dizin oluşturucu bayraklarını değiştirmek için tıklayın",
"BypassDelayIfHighestQualityHelpText": "Tercih edilen protokolle kalite profilinde en yüksek etkin kaliteye sahip sürüm olduğunda gecikmeyi atlayın",
"AutoTaggingRequiredHelpText": "Otomatik etiketleme kuralının uygulanabilmesi için bu {implementationName} koşulunun eşleşmesi gerekir. Aksi takdirde tek bir {implementationName} eşleşmesi yeterlidir.",
"CustomFilter": "Özel Filtre",
"ApplyTagsHelpTextAdd": "Ekle: Etiketleri mevcut etiket listesine ekleyin",
"ApplyTagsHelpTextHowToApplyDownloadClients": "Seçilen indirme istemcilerine etiketler nasıl uygulanır?",
"ApplyTagsHelpTextHowToApplyImportLists": "Seçilen içe aktarma listelerine etiketler nasıl uygulanır?",
"ApplyTagsHelpTextReplace": "Değiştir: Etiketleri girilen etiketlerle değiştirin (tüm etiketleri kaldırmak için etiket girmeyin)",
"Auto": "Otomatik",
"CountIndexersSelected": "{count} dizin oluşturucu seçildi",
"CustomFormatsSpecificationFlag": "Bayrak",
"CountCollectionsSelected": "{count} koleksiyon seçildi",
"CustomFormatJson": "Özel JSON Formatı",
"AddListExclusion": "Hariç Tutma Listesine Ekle",
"AuthenticationRequiredPasswordHelpTextWarning": "Yeni şifre girin",
"AuthenticationRequiredUsernameHelpTextWarning": "Yeni kullanıcı adınızı girin",
"AutoRedownloadFailedFromInteractiveSearchHelpText": "Başarısız indirmeler, etkileşimli aramada bulunduğunda otomatik olarak farklı bir versiyonu arayın ve indirmeyi deneyin",
"AutoTagging": "Otomatik Etiketleme",
"ChangeCategoryHint": "İndirme İstemcisi'nden indirme işlemini 'İçe Aktarma Sonrası Kategorisi' olarak değiştirir",
"Clone": "Klon",
"CustomFormatsSpecificationRegularExpression": "Düzenli ifade",
"CustomFormatsSpecificationRegularExpressionHelpText": "Özel Format RegEx Büyük/Küçük Harfe Duyarsızdır",
"ConnectionLostToBackend": "{appName}'ın arka uçla bağlantısı kesildi ve işlevselliğin geri kazanılması için yeniden yüklenmesi gerekecek.",
"BypassDelayIfAboveCustomFormatScore": "Özel Format Koşullarının Üstündeyse Baypas Et",
"ChownGroup": "Chown Grubu",
"AutoTaggingLoadError": "Otomatik etiketleme yüklenemiyor",
"ConditionUsingRegularExpressions": "Bu koşul Normal İfadeler kullanılarak eşleşir. `\\^$.|?*+()[{` karakterlerinin özel anlamlara sahip olduğunu ve `\\` ile kaçılması gerektiğini unutmayın.",
"ConnectionLostReconnect": "{appName} otomatik bağlanmayı deneyecek veya aşağıda yeniden yükle seçeneğini işaretleyebilirsiniz."
}

View File

@ -43,7 +43,7 @@ namespace NzbDrone.Core.Notifications.Emby
{
try
{
_logger.Debug("Testing connection to MediaBrowser: {0}", settings.Address);
_logger.Debug("Testing connection to Emby/Jellyfin : {0}", settings.Address);
Notify(settings, "Test from Radarr", "Success! MediaBrowser has been successfully configured!");
}

View File

@ -13,6 +13,7 @@ namespace NzbDrone.Core.Notifications.Emby
{
RuleFor(c => c.Host).ValidHost();
RuleFor(c => c.ApiKey).NotEmpty();
RuleFor(c => c.UrlBase).ValidUrlBase();
}
}
@ -35,17 +36,22 @@ namespace NzbDrone.Core.Notifications.Emby
[FieldToken(TokenField.HelpText, "UseSsl", "serviceName", "Emby/Jellyfin")]
public bool UseSsl { get; set; }
[FieldDefinition(3, Label = "ApiKey", Privacy = PrivacyLevel.ApiKey)]
[FieldDefinition(3, Label = "UrlBase", Type = FieldType.Textbox, Advanced = true, HelpText = "ConnectionSettingsUrlBaseHelpText")]
[FieldToken(TokenField.HelpText, "UrlBase", "connectionName", "Emby/Jellyfin")]
[FieldToken(TokenField.HelpText, "UrlBase", "url", "http://[host]:[port]/[urlBase]/mediabrowser")]
public string UrlBase { get; set; }
[FieldDefinition(4, Label = "ApiKey", Privacy = PrivacyLevel.ApiKey)]
public string ApiKey { get; set; }
[FieldDefinition(4, Label = "NotificationsEmbySettingsSendNotifications", HelpText = "NotificationsEmbySettingsSendNotificationsHelpText", Type = FieldType.Checkbox)]
[FieldDefinition(5, Label = "NotificationsEmbySettingsSendNotifications", HelpText = "NotificationsEmbySettingsSendNotificationsHelpText", Type = FieldType.Checkbox)]
public bool Notify { get; set; }
[FieldDefinition(5, Label = "NotificationsSettingsUpdateLibrary", HelpText = "NotificationsEmbySettingsUpdateLibraryHelpText", Type = FieldType.Checkbox)]
[FieldDefinition(6, Label = "NotificationsSettingsUpdateLibrary", HelpText = "NotificationsEmbySettingsUpdateLibraryHelpText", Type = FieldType.Checkbox)]
public bool UpdateLibrary { get; set; }
[JsonIgnore]
public string Address => $"{Host.ToUrlHost()}:{Port}";
public string Address => $"{Host.ToUrlHost()}:{Port}{UrlBase}";
public bool IsValid => !string.IsNullOrWhiteSpace(Host) && Port > 0;

View File

@ -94,7 +94,7 @@ namespace NzbDrone.Core.Notifications.Plex.Server
{
var scheme = settings.UseSsl ? "https" : "http";
var requestBuilder = new HttpRequestBuilder($"{scheme}://{settings.Host.ToUrlHost()}:{settings.Port}")
var requestBuilder = new HttpRequestBuilder($"{scheme}://{settings.Host.ToUrlHost()}:{settings.Port}{settings.UrlBase}")
.Accept(HttpAccept.Json)
.AddQueryParam("X-Plex-Client-Identifier", _configService.PlexClientIdentifier)
.AddQueryParam("X-Plex-Product", BuildInfo.AppName)

View File

@ -38,20 +38,25 @@ namespace NzbDrone.Core.Notifications.Plex.Server
[FieldToken(TokenField.HelpText, "UseSsl", "serviceName", "Plex")]
public bool UseSsl { get; set; }
[FieldDefinition(3, Label = "NotificationsPlexSettingsAuthToken", Type = FieldType.Textbox, Privacy = PrivacyLevel.ApiKey, Advanced = true)]
[FieldDefinition(3, Label = "UrlBase", Type = FieldType.Textbox, Advanced = true, HelpText = "ConnectionSettingsUrlBaseHelpText")]
[FieldToken(TokenField.HelpText, "UrlBase", "connectionName", "Plex")]
[FieldToken(TokenField.HelpText, "UrlBase", "url", "http://[host]:[port]/[urlBase]/plex")]
public string UrlBase { get; set; }
[FieldDefinition(4, Label = "NotificationsPlexSettingsAuthToken", Type = FieldType.Textbox, Privacy = PrivacyLevel.ApiKey, Advanced = true)]
public string AuthToken { get; set; }
[FieldDefinition(4, Label = "NotificationsPlexSettingsAuthenticateWithPlexTv", Type = FieldType.OAuth)]
[FieldDefinition(5, Label = "NotificationsPlexSettingsAuthenticateWithPlexTv", Type = FieldType.OAuth)]
public string SignIn { get; set; }
[FieldDefinition(5, Label = "NotificationsSettingsUpdateLibrary", Type = FieldType.Checkbox)]
[FieldDefinition(6, Label = "NotificationsSettingsUpdateLibrary", Type = FieldType.Checkbox)]
public bool UpdateLibrary { get; set; }
[FieldDefinition(6, Label = "NotificationsSettingsUpdateMapPathsFrom", Type = FieldType.Textbox, Advanced = true, HelpText = "NotificationsSettingsUpdateMapPathsFromHelpText")]
[FieldDefinition(7, Label = "NotificationsSettingsUpdateMapPathsFrom", Type = FieldType.Textbox, Advanced = true, HelpText = "NotificationsSettingsUpdateMapPathsFromHelpText")]
[FieldToken(TokenField.HelpText, "NotificationsSettingsUpdateMapPathsFrom", "serviceName", "Plex")]
public string MapFrom { get; set; }
[FieldDefinition(7, Label = "NotificationsSettingsUpdateMapPathsTo", Type = FieldType.Textbox, Advanced = true, HelpText = "NotificationsSettingsUpdateMapPathsToHelpText")]
[FieldDefinition(8, Label = "NotificationsSettingsUpdateMapPathsTo", Type = FieldType.Textbox, Advanced = true, HelpText = "NotificationsSettingsUpdateMapPathsToHelpText")]
[FieldToken(TokenField.HelpText, "NotificationsSettingsUpdateMapPathsTo", "serviceName", "Plex")]
public string MapTo { get; set; }

View File

@ -75,7 +75,7 @@ namespace NzbDrone.Core.Notifications.Xbmc
private string ProcessRequest(XbmcSettings settings, string method, params object[] parameters)
{
var url = HttpRequestBuilder.BuildBaseUrl(settings.UseSsl, settings.Host, settings.Port, "jsonrpc");
var url = HttpRequestBuilder.BuildBaseUrl(settings.UseSsl, settings.Host, settings.Port, settings.UrlBase);
var requestBuilder = new JsonRpcRequestBuilder(url, method, parameters);
requestBuilder.LogResponseContent = true;

View File

@ -14,16 +14,18 @@ namespace NzbDrone.Core.Notifications.Xbmc
{
RuleFor(c => c.Host).ValidHost();
RuleFor(c => c.DisplayTime).GreaterThanOrEqualTo(2);
RuleFor(c => c.UrlBase).ValidUrlBase();
}
}
public class XbmcSettings : IProviderConfig
{
private static readonly XbmcSettingsValidator Validator = new XbmcSettingsValidator();
private static readonly XbmcSettingsValidator Validator = new ();
public XbmcSettings()
{
Port = 8080;
UrlBase = "/jsonrpc";
DisplayTime = 5;
}
@ -37,30 +39,35 @@ namespace NzbDrone.Core.Notifications.Xbmc
[FieldToken(TokenField.HelpText, "UseSsl", "serviceName", "Kodi")]
public bool UseSsl { get; set; }
[FieldDefinition(3, Label = "Username", Privacy = PrivacyLevel.UserName)]
[FieldDefinition(3, Label = "UrlBase", Type = FieldType.Textbox, Advanced = true, HelpText = "ConnectionSettingsUrlBaseHelpText")]
[FieldToken(TokenField.HelpText, "UrlBase", "connectionName", "Kodi")]
[FieldToken(TokenField.HelpText, "UrlBase", "url", "http://[host]:[port]/[urlBase]/kodi")]
public string UrlBase { get; set; }
[FieldDefinition(4, Label = "Username", Privacy = PrivacyLevel.UserName)]
public string Username { get; set; }
[FieldDefinition(4, Label = "Password", Type = FieldType.Password, Privacy = PrivacyLevel.Password)]
[FieldDefinition(5, Label = "Password", Type = FieldType.Password, Privacy = PrivacyLevel.Password)]
public string Password { get; set; }
[DefaultValue(5)]
[FieldDefinition(5, Label = "NotificationsKodiSettingsDisplayTime", HelpText = "NotificationsKodiSettingsDisplayTimeHelpText")]
[FieldDefinition(6, Label = "NotificationsKodiSettingsDisplayTime", HelpText = "NotificationsKodiSettingsDisplayTimeHelpText")]
public int DisplayTime { get; set; }
[FieldDefinition(6, Label = "NotificationsKodiSettingsGuiNotification", Type = FieldType.Checkbox)]
[FieldDefinition(7, Label = "NotificationsKodiSettingsGuiNotification", Type = FieldType.Checkbox)]
public bool Notify { get; set; }
[FieldDefinition(7, Label = "NotificationsSettingsUpdateLibrary", HelpText = "NotificationsKodiSettingsUpdateLibraryHelpText", Type = FieldType.Checkbox)]
[FieldDefinition(8, Label = "NotificationsSettingsUpdateLibrary", HelpText = "NotificationsKodiSettingsUpdateLibraryHelpText", Type = FieldType.Checkbox)]
public bool UpdateLibrary { get; set; }
[FieldDefinition(8, Label = "NotificationsKodiSettingsCleanLibrary", HelpText = "NotificationsKodiSettingsCleanLibraryHelpText", Type = FieldType.Checkbox)]
[FieldDefinition(9, Label = "NotificationsKodiSettingsCleanLibrary", HelpText = "NotificationsKodiSettingsCleanLibraryHelpText", Type = FieldType.Checkbox)]
public bool CleanLibrary { get; set; }
[FieldDefinition(9, Label = "NotificationsKodiSettingAlwaysUpdate", HelpText = "NotificationsKodiSettingAlwaysUpdateHelpText", Type = FieldType.Checkbox)]
[FieldDefinition(10, Label = "NotificationsKodiSettingAlwaysUpdate", HelpText = "NotificationsKodiSettingAlwaysUpdateHelpText", Type = FieldType.Checkbox)]
public bool AlwaysUpdate { get; set; }
[JsonIgnore]
public string Address => $"{Host.ToUrlHost()}:{Port}";
public string Address => $"{Host.ToUrlHost()}:{Port}{UrlBase}";
public NzbDroneValidationResult Validate()
{

View File

@ -7,6 +7,7 @@ using NzbDrone.Common.Composition;
using NzbDrone.Common.Serializer;
using NzbDrone.Common.TPL;
using NzbDrone.Core.Datastore.Events;
using NzbDrone.Core.MediaFiles.MovieImport.Manual;
using NzbDrone.Core.Messaging.Commands;
using NzbDrone.Core.Messaging.Events;
using NzbDrone.Core.ProgressMessaging;
@ -59,6 +60,9 @@ namespace Radarr.Api.V3.Commands
using (var reader = new StreamReader(Request.Body))
{
var body = reader.ReadToEnd();
var priority = commandType == typeof(ManualImportCommand)
? CommandPriority.High
: CommandPriority.Normal;
dynamic command = STJson.Deserialize(body, commandType);
@ -67,7 +71,8 @@ namespace Radarr.Api.V3.Commands
command.SendUpdatesToClient = true;
command.ClientUserAgent = Request.Headers["UserAgent"];
var trackedCommand = _commandQueueManager.Push(command, CommandPriority.Normal, CommandTrigger.Manual);
var trackedCommand = _commandQueueManager.Push(command, priority, CommandTrigger.Manual);
return Created(trackedCommand.Id);
}
}