From 1bdcf910146d2088b1a4f349fff65dd4c80ac587 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 5 May 2024 12:32:12 +0300 Subject: [PATCH 001/348] Bump version to 2.3.3 --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index f0fd6957f..948d446ec 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -9,7 +9,7 @@ variables: testsFolder: './_tests' yarnCacheFolder: $(Pipeline.Workspace)/.yarn nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages - majorVersion: '2.3.2' + majorVersion: '2.3.3' minorVersion: $[counter('minorVersion', 1076)] lidarrVersion: '$(majorVersion).$(minorVersion)' buildName: '$(Build.SourceBranchName).$(lidarrVersion)' From f4a02ffc838ae9336082c6b65cf2f6ba37e47394 Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Sun, 28 Apr 2024 09:25:42 -0700 Subject: [PATCH 002/348] Forward X-Forwarded-Host header (cherry picked from commit 3fbe4361386e9fb8dafdf82ad9f00f02bec746cc) --- src/NzbDrone.Host/Startup.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NzbDrone.Host/Startup.cs b/src/NzbDrone.Host/Startup.cs index 849bf6a68..0d264734b 100644 --- a/src/NzbDrone.Host/Startup.cs +++ b/src/NzbDrone.Host/Startup.cs @@ -59,7 +59,7 @@ namespace NzbDrone.Host services.Configure(options => { - options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto; + options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto | ForwardedHeaders.XForwardedHost; options.KnownNetworks.Clear(); options.KnownProxies.Clear(); }); From a25e5aae1094f5158a8afe0a1a61cdd1ac637ad0 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 5 May 2024 04:56:52 +0300 Subject: [PATCH 003/348] Fixed: Indexer flags for torrent release pushes (cherry picked from commit 47ba002806fe2c2004a649aa193ae318343a84e4) --- src/Lidarr.Api.V1/Indexers/ReleaseResource.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Lidarr.Api.V1/Indexers/ReleaseResource.cs b/src/Lidarr.Api.V1/Indexers/ReleaseResource.cs index e8fc6f891..cc8261bcc 100644 --- a/src/Lidarr.Api.V1/Indexers/ReleaseResource.cs +++ b/src/Lidarr.Api.V1/Indexers/ReleaseResource.cs @@ -132,7 +132,8 @@ namespace Lidarr.Api.V1.Indexers MagnetUrl = resource.MagnetUrl, InfoHash = resource.InfoHash, Seeders = resource.Seeders, - Peers = (resource.Seeders.HasValue && resource.Leechers.HasValue) ? (resource.Seeders + resource.Leechers) : null + Peers = (resource.Seeders.HasValue && resource.Leechers.HasValue) ? (resource.Seeders + resource.Leechers) : null, + IndexerFlags = (IndexerFlags)resource.IndexerFlags }; } else From 94d2a20b6a79306fc3075d5dd9ad3c6dee4f39a9 Mon Sep 17 00:00:00 2001 From: Weblate Date: Sun, 5 May 2024 09:32:25 +0000 Subject: [PATCH 004/348] Multiple Translations updated by Weblate ignore-downstream Co-authored-by: GkhnGRBZ Co-authored-by: Michael5564445 Co-authored-by: Weblate Co-authored-by: fordas Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/es/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/tr/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/uk/ Translation: Servarr/Lidarr --- src/NzbDrone.Core/Localization/Core/es.json | 4 +- src/NzbDrone.Core/Localization/Core/tr.json | 211 +++++++++++++------- src/NzbDrone.Core/Localization/Core/uk.json | 8 +- 3 files changed, 142 insertions(+), 81 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/es.json b/src/NzbDrone.Core/Localization/Core/es.json index bf41b4b4f..cad6f8872 100644 --- a/src/NzbDrone.Core/Localization/Core/es.json +++ b/src/NzbDrone.Core/Localization/Core/es.json @@ -170,7 +170,7 @@ "ShowUnknownArtistItems": "Mostrar Elementos Desconocidos", "SSLCertPassword": "Contraseña del Certificado SSL", "SSLCertPath": "Ruta del Certificado SSL", - "SslCertPathHelpText": "Ruta al archivo pfx", + "SslCertPathHelpText": "Ruta del archivo pfx", "SslCertPathHelpTextWarning": "Requiere reiniciar para que surta efecto", "SSLPort": "Puerto SSL", "SslPortHelpTextWarning": "Requiere reiniciar para que surta efecto", @@ -423,7 +423,7 @@ "RemoveCompletedDownloadsHelpText": "Elimina las descargas importadas desde el historial del cliente de descarga", "RemovedFromTaskQueue": "Eliminar de la cola de tareas", "Reset": "Reiniciar", - "SslCertPasswordHelpText": "Contraseña para el archivo pfx", + "SslCertPasswordHelpText": "Contraseña para archivo pfx", "SslCertPasswordHelpTextWarning": "Requiere reiniciar para que surta efecto", "TotalFileSize": "Tamaño total de archivo", "Track": "Pista", diff --git a/src/NzbDrone.Core/Localization/Core/tr.json b/src/NzbDrone.Core/Localization/Core/tr.json index aa900d51c..f3e22548f 100644 --- a/src/NzbDrone.Core/Localization/Core/tr.json +++ b/src/NzbDrone.Core/Localization/Core/tr.json @@ -11,14 +11,14 @@ "UpdateMechanismHelpText": "{appName}'ın yerleşik güncelleyicisini veya bir komut dosyasını kullanın", "UpdateScriptPathHelpText": "Çıkarılan bir güncelleme paketini alan ve güncelleme işleminin geri kalanını işleyen özel bir komut dosyasına giden yol", "UpgradeAllowedHelpText": "Devre dışı bırakılırsa nitelikler yükseltilmez", - "Uptime": "Uptime", + "Uptime": "Çalışma süresi", "URLBase": "URL Tabanı", "UrlBaseHelpText": "Ters proxy desteği için varsayılan boştur", "UrlBaseHelpTextWarning": "Etkili olması için yeniden başlatma gerektirir", "UseHardlinksInsteadOfCopy": "Kopyalama yerine Sabit Bağlantıları Kullanın", "Usenet": "Usenet", "UsenetDelay": "Usenet Gecikmesi", - "UsenetDelayHelpText": "Usenet'ten bir sürüm almadan önce beklemek için dakika cinsinden gecikme", + "UsenetDelayHelpText": "Usenet'ten bir yayın almadan önce beklemek için dakika cinsinden gecikme", "UseProxy": "Proxy kullan", "Username": "Kullanıcı adı", "UsingExternalUpdateMechanismBranchToUseToUpdateLidarr": "{appName}'ı güncellemek için kullanılacak dal", @@ -39,11 +39,11 @@ "AlternateTitles": "Alternatif Başlık", "AlternateTitleslength1Title": "Başlık", "AlternateTitleslength1Titles": "Başlıklar", - "Analytics": "Analiz", + "Analytics": "Analitik", "AnalyticsEnabledHelpText": "Anonim kullanım ve hata bilgilerini {appName} sunucularına gönderin. Buna, tarayıcınız, hangi {appName} WebUI sayfalarını kullandığınız, hata raporlamanın yanı sıra işletim sistemi ve çalışma zamanı sürümü hakkındaki bilgiler de dahildir. Bu bilgiyi özelliklere ve hata düzeltmelerine öncelik vermek için kullanacağız.", "AnalyticsEnabledHelpTextWarning": "Etkili olması için yeniden başlatma gerektirir", "ApiKeyHelpTextWarning": "Etkili olması için yeniden başlatma gerektirir", - "Scheduled": "Tarifeli", + "Scheduled": "Planlı", "ScriptPath": "Komut Dosyası Yolu", "Search": "Ara", "SearchForMissing": "Kayıpları Ara", @@ -70,7 +70,7 @@ "ArtistAlbumClickToChangeTrack": "Filmi değiştirmek için tıklayın", "Authentication": "Doğrulama", "AuthenticationMethodHelpText": "{appName}'a erişmek için Kullanıcı Adı ve Şifre gerektir", - "AutoRedownloadFailedHelpText": "Otomatik olarak farklı bir sürüm arayın ve indirmeye çalışın", + "AutoRedownloadFailedHelpText": "Otomatik olarak farklı bir Yayın arayın ve indirmeye çalışın", "BackupFolderHelpText": "Göreli yollar {appName}'ın AppData dizini altında olacaktır", "BackupNow": "Şimdi yedekle", "BackupRetentionHelpText": "Saklama süresinden daha eski olan otomatik yedeklemeler otomatik olarak temizlenecektir", @@ -79,7 +79,7 @@ "BindAddressHelpText": "Tüm arayüzler için geçerli IP adresi, localhost veya '*'", "BindAddressHelpTextWarning": "Etkili olması için yeniden başlatma gerektirir", "Blocklist": "Kara liste", - "BlocklistRelease": "Kara Liste Yayını", + "BlocklistRelease": "Kara Liste Sürümü", "Branch": "Şube", "BypassProxyForLocalAddresses": "Yerel Adresler için Proxy'yi Atla", "Calendar": "Takvim", @@ -117,29 +117,29 @@ "DelayProfiles": "Gecikme Profilleri", "Delete": "Sil", "DeleteBackup": "Yedeklemeyi Sil", - "DeleteBackupMessageText": "'{0}' yedeğini silmek istediğinizden emin misiniz?", + "DeleteBackupMessageText": "'{name}' yedeğini silmek istediğinizden emin misiniz?", "DeleteDelayProfile": "Gecikme Profilini Sil", "DeleteDelayProfileMessageText": "Bu gecikme profilini silmek istediğinizden emin misiniz?", "DeleteDownloadClient": "İndirme İstemcisini Sil", - "DeleteDownloadClientMessageText": "İndirme istemcisini '{0}' silmek istediğinizden emin misiniz?", + "DeleteDownloadClientMessageText": "'{name}' indirme istemcisini silmek istediğinizden emin misiniz?", "DeleteEmptyFolders": "Boş klasörleri silin", "DeleteImportListExclusion": "İçe Aktarma Listesi Hariç Tutmasını Sil", "DeleteImportListExclusionMessageText": "Bu içe aktarma listesi hariç tutma işlemini silmek istediğinizden emin misiniz?", "DeleteImportListMessageText": "'{name}' listesini silmek istediğinizden emin misiniz?", "DeleteIndexer": "Dizinleyiciyi Sil", - "DeleteIndexerMessageText": "Dizin oluşturucuyu '{0}' silmek istediğinizden emin misiniz?", + "DeleteIndexerMessageText": "'{name}' dizinleyicisini silmek istediğinizden emin misiniz?", "DeleteMetadataProfileMessageText": "Kalite profilini silmek istediğinizden emin misiniz {0}", "DeleteNotification": "Bildirimi Sil", - "DeleteNotificationMessageText": "'{0}' bildirimini silmek istediğinizden emin misiniz?", + "DeleteNotificationMessageText": "'{name}' bildirimini silmek istediğinizden emin misiniz?", "DeleteQualityProfile": "Kalite Profilini Sil", "DeleteQualityProfileMessageText": "'{name}' kalite profilini silmek istediğinizden emin misiniz?", - "DeleteReleaseProfile": "Sürüm Profilini Sil", + "DeleteReleaseProfile": "Yayımlama Profilini Sil", "DeleteReleaseProfileMessageText": "Bu gecikme profilini silmek istediğinizden emin misiniz?", "DeleteRootFolderMessageText": "Dizin oluşturucuyu '{0}' silmek istediğinizden emin misiniz?", "DeleteSelectedTrackFiles": "Seçili Film Dosyalarını Sil", "DeleteSelectedTrackFilesMessageText": "Seçili film dosyalarını silmek istediğinizden emin misiniz?", "DeleteTag": "Etiketi Sil", - "DeleteTagMessageText": "'{0}' etiketini silmek istediğinizden emin misiniz?", + "DeleteTagMessageText": "'{label}' etiketini silmek istediğinizden emin misiniz?", "DestinationPath": "Hedef yol", "DetailedProgressBar": "Ayrıntılı İlerleme Çubuğu", "DetailedProgressBarHelpText": "İlerleme çubuğundaki metni göster", @@ -184,7 +184,7 @@ "Global": "Küresel", "GoToInterp": "{0} adresine gidin", "Grab": "Kapmak", - "GrabRelease": "Bırakma", + "GrabRelease": "Yayın Yakalama", "GrabSelected": "Seçilenleri Kap", "Group": "Grup", "HasPendingChangesNoChanges": "Değişiklikler yok", @@ -208,12 +208,12 @@ "Importing": "İçe aktarılıyor", "IncludeUnknownArtistItemsHelpText": "Kuyrukta film olmayan öğeleri gösterin. Bu, kaldırılan filmleri veya {appName}'ın kategorisindeki herhangi bir şeyi içerebilir", "IncludeUnmonitored": "İzlenmeyenleri Dahil Et", - "Indexer": "Dizin oluşturucu", - "IndexerPriority": "Dizin Oluşturucu Önceliği", - "Indexers": "Dizin oluşturucular", - "IndexerSettings": "Dizin Oluşturucu Ayarları", + "Indexer": "Dizinleyici", + "IndexerPriority": "Dizinleyici Önceliği", + "Indexers": "Dizinleyiciler", + "IndexerSettings": "Dizinleyici Ayarları", "InteractiveSearch": "Etkileşimli Arama", - "Interval": "Aralık", + "Interval": "Periyot", "IsCutoffCutoff": "Ayırmak", "IsCutoffUpgradeUntilThisQualityIsMetOrExceeded": "Bu kalite karşılanana veya aşılana kadar yükseltin", "IsTagUsedCannotBeDeletedWhileInUse": "Kullanımdayken silinemez", @@ -226,12 +226,12 @@ "LocalPath": "Yerel Yol", "LocalPathHelpText": "{appName}'ın uzak yola yerel olarak erişmek için kullanması gereken yol", "LogFiles": "Log dosyaları", - "Logging": "Logging", + "Logging": "Loglama", "LogLevel": "Günlük Düzeyi", "LogLevelvalueTraceTraceLoggingShouldOnlyBeEnabledTemporarily": "İzleme günlük kaydı yalnızca geçici olarak etkinleştirilmelidir", "Logs": "Kütükler", "LongDateFormat": "Uzun Tarih Formatı", - "ManualImport": "Manuel İçe Aktarma", + "ManualImport": "Manuel İçe Aktar", "MarkAsFailed": "Başarısız olarak işaretle", "MarkAsFailedMessageText": "'{0}' başarısız olarak işaretlemek istediğinizden emin misiniz?", "MaximumLimits": "Maksimum Sınırlar", @@ -245,7 +245,7 @@ "MetadataSettings": "Meta Veri Ayarları", "MIA": "MIA", "MinimumAge": "Asgari yaş", - "MinimumAgeHelpText": "Yalnızca Usenet: NZB'lerin alınmadan önceki dakika cinsinden minimum yaşı. Yeni sürümlerin usenet sağlayıcınıza yayılması için zaman tanımak için bunu kullanın.", + "MinimumAgeHelpText": "Yalnızca Usenet: NZB'lerin alınmadan önceki dakika cinsinden minimum yaşı. Yeni yayınların usenet sağlayıcınıza yayılması için zaman tanımak için bunu kullanın.", "MinimumFreeSpace": "Minimum Boş Alan", "MinimumFreeSpaceWhenImportingHelpText": "Bu miktardan daha az kullanılabilir disk alanı bırakacaksa içe aktarmayı önleyin", "MinimumLimits": "Minimum Limitler", @@ -253,8 +253,8 @@ "Mode": "Mod", "Monitored": "İzlendi", "MoreInfo": "Daha fazla bilgi", - "MustContain": "İçermek zorundadır", - "MustNotContain": "İçermemelidir", + "MustContain": "İçermeli", + "MustNotContain": "İçermemeli", "NamingSettings": "Adlandırma Ayarları", "New": "Yeni", "NoBackupsAreAvailable": "Kullanılabilir yedek yok", @@ -267,7 +267,7 @@ "OpenBrowserOnStart": "Başlangıçta tarayıcıyı aç", "Options": "Seçenekler", "Original": "Orijinal", - "PackageVersion": "Paket Sürümü", + "PackageVersion": "Paket Versiyonu", "PageSize": "Sayfa boyutu", "PageSizeHelpText": "Her sayfada gösterilecek öğe sayısı", "Password": "Parola", @@ -276,7 +276,7 @@ "Port": "Liman", "PortNumber": "Port numarası", "PosterSize": "Poster Boyutu", - "PreviewRename": "Ad değiştirmeyi ön izle", + "PreviewRename": "Yeniden Adlandır ve Önizle", "Profiles": "Profiller", "Proper": "Uygun", "PropersAndRepacks": "Propers ve Repacks", @@ -287,13 +287,13 @@ "ProxyPasswordHelpText": "Gerekirse yalnızca bir kullanıcı adı ve şifre girmeniz gerekir. Aksi takdirde boş bırakın.", "ProxyType": "Proxy Türü", "ProxyUsernameHelpText": "Gerekirse yalnızca bir kullanıcı adı ve şifre girmeniz gerekir. Aksi takdirde boş bırakın.", - "PublishedDate": "yayınlanma tarihi", + "PublishedDate": "Yayınlanma Tarihi", "Quality": "Kalite", "QualityDefinitions": "Kalite Tanımları", "QualityProfile": "Kalite Profili", "QualityProfiles": "Kalite Profileri", "QualitySettings": "Kalite Ayarları", - "Queue": "Sıra", + "Queue": "Sırada", "ReadTheWikiForMoreInformation": "Daha fazla bilgi için Wiki'yi okuyun", "Real": "Gerçek", "Reason": "Nedeni", @@ -307,7 +307,7 @@ "RefreshInformationAndScanDisk": "Bilgileri ve tarama diskini yenileyin", "RefreshScan": "Yenile ve Tara", "ReleaseDate": "Yayın tarihleri", - "ReleaseGroup": "Yayın Grubu", + "ReleaseGroup": "Yayımlayan Grup", "ReleaseRejected": "Reddedildi", "ReleaseStatuses": "Yayın Durumu", "ReleaseWillBeProcessedInterp": "İzin işlenecek {0}", @@ -320,7 +320,7 @@ "RemoveFailedDownloadsHelpText": "Başarısız indirmeleri indirme istemcisi geçmişinden kaldırın", "RemoveFromBlocklist": "Kara listeden kaldır", "RemoveFromDownloadClient": "İndirme İstemcisinden Kaldır", - "RemoveFromQueue": "Sıradan kaldır", + "RemoveFromQueue": "Kuyruktan kaldır", "RemoveSelected": "Seçilenleri Kaldır", "RemoveTagExistingTag": "Mevcut etiket", "RemoveTagRemovingTag": "Etiket kaldırılıyor", @@ -345,12 +345,12 @@ "Result": "Sonuç", "Retention": "Saklama", "RetentionHelpText": "Yalnızca Usenet: Sınırsız saklamaya ayarlamak için sıfıra ayarlayın", - "RetryingDownloadOn": "İndirme işlemi {0}, {1} tarihinde yeniden deneniyor", + "RetryingDownloadOn": "{date} tarihinde, {time} itibarıyla indirme işlemi yeniden deneniyor", "RootFolder": "Kök Klasör", "RootFolders": "Kök klasörler", "RSSSync": "RSS Senkronizasyonu", "RSSSyncInterval": "RSS Senkronizasyon Aralığı", - "RssSyncIntervalHelpText": "Dakika cinsinden aralık. Devre dışı bırakmak için sıfıra ayarlayın (bu, tüm otomatik bırakmayı durdurur)", + "RssSyncIntervalHelpText": "Dakika cinsinden periyot. Devre dışı bırakmak için sıfıra ayarlayın (tüm otomatik yayın yakalamayı durduracaktır)", "ShownAboveEachColumnWhenWeekIsTheActiveView": "Aktif görünüm hafta olduğunda her bir sütunun üzerinde gösterilir", "ShowPath": "Yolu Göster", "ShowQualityProfile": "Kalite Profilini Göster", @@ -362,7 +362,7 @@ "ShowSizeOnDisk": "Diskte Boyutu Göster", "ShowUnknownArtistItems": "Bilinmeyen Film Öğelerini Göster", "SSLCertPassword": "SSL Sertifika Parolası", - "SslCertPasswordHelpText": "Pfx dosyası için şifre", + "SslCertPasswordHelpText": "Pfx dosyasının şifresi", "SslCertPasswordHelpTextWarning": "Etkili olması için yeniden başlatma gerektirir", "SSLCertPath": "SSL Sertifika Yolu", "SslCertPathHelpText": "Pfx dosyasının yolu", @@ -371,7 +371,7 @@ "SslPortHelpTextWarning": "Etkili olması için yeniden başlatma gerektirir", "StandardTrackFormat": "Standart Film Formatı", "StartTypingOrSelectAPathBelow": "Yazmaya başlayın veya aşağıdan bir yol seçin", - "StartupDirectory": "Başlangıç dizini", + "StartupDirectory": "Başlangıç Dizini", "Status": "Durum", "Style": "Tarz", "SuccessMyWorkIsDoneNoFilesToRename": "Başarılı! İşim bitti, yeniden adlandırılacak dosya yok.", @@ -401,7 +401,7 @@ "UnableToLoadTags": "Etiketler yüklenemiyor", "Ungroup": "Grubu çöz", "ApplyTags": "Etiketleri Uygula", - "Remove": "Kaldırmak", + "Remove": "Kaldır", "SearchAll": "Tümünü ara", "UiLanguageHelpText": "{appName}'ın UI için kullanacağı dil", "UiLanguageHelpTextWarning": "Tarayıcının Yeniden Yüklenmesi Gerekiyor", @@ -458,7 +458,7 @@ "Replace": "Değiştir", "RestartRequiredHelpTextWarning": "Etkili olması için yeniden başlatma gerektirir", "ShowAdvanced": "Gelişmiş'i Göster", - "SizeOnDisk": "Diskteki ölçü", + "SizeOnDisk": "Diskteki boyut", "SourceTitle": "Kaynak başlığı", "System": "Sistem", "TimeLeft": "Kalan zaman", @@ -470,7 +470,7 @@ "Warn": "Uyar", "Connect": "Bildirimler", "Added": "Eklendi", - "AddIndexer": "Dizin Oluşturucu Ekle", + "AddIndexer": "Dizinleyici Ekle", "AddNew": "Yeni Ekle", "AddQualityProfile": "Kalite Profili Ekle", "AddRemotePathMapping": "Uzak Yol Eşleme Ekleme", @@ -501,7 +501,7 @@ "ErrorRestoringBackup": "Yedeği geri yüklerken hata", "Events": "Etkinlikler", "EventType": "Etkinlik tipi", - "Filters": "Filtre", + "Filters": "Filtreler", "FreeSpace": "Boş alan", "General": "Genel", "Grabbed": "Yakalandı", @@ -521,7 +521,7 @@ "NoTagsHaveBeenAddedYet": "Henüz etiket eklenmedi", "OnlyTorrent": "Sadece Torrent", "OnlyUsenet": "Sadece Usenet", - "Organize": "Düzenlemek", + "Organize": "Düzenle", "OutputPath": "Çıkış yolu", "Peers": "Akranlar", "PreferAndUpgrade": "Tercih Et ve Yükselt", @@ -536,34 +536,34 @@ "Select...": "'Seçin ...", "SelectFolder": "Dosya Seç", "SelectQuality": "Kaliteyi Seçin", - "WouldYouLikeToRestoreBackup": "{0} yedeğini geri yüklemek ister misiniz?", + "WouldYouLikeToRestoreBackup": "'{name}' yedeğini geri yüklemek ister misiniz?", "Apply": "Uygula", - "Backup": "Yedek", + "Backup": "Yedekler", "Details": "Detaylar", "Genres": "Türler", "Info": "Bilgi", - "LastDuration": "lastDuration", + "LastDuration": "Yürütme Süresi", "LastExecution": "Son Yürütme", "LastUsed": "Son kullanılan", "LastWriteTime": "Son Yazma Zamanı", "Progress": "İlerleme", - "Queued": "Sıraya alındı", - "Rating": "Puanlar", + "Queued": "Kuyruğa alındı", + "Rating": "Puan", "Ui": "UI", "AddImportListExclusion": "İçe Aktarma Listesi Hariç Tutmasını Sil", "ImportListExclusions": "İçe Aktarma Listesi Hariç Tutmasını Sil", "DoneEditingGroups": "Grupları Düzenleme Bitti", - "QualitiesHelpText": "Listede daha yüksek nitelikler daha çok tercih edilir. Aynı grup içindeki nitelikler eşittir. Sadece kontrol edilen nitelikler istenir", + "QualitiesHelpText": "Listede üst sıralarda yer alan nitelikler işaretlenmese bile en çok tercih edilendir. Aynı grup içindeki nitelikler eşittir. Yalnızca kontrol edilen nitelikler aranır", "EditGroups": "Grupları Düzenle", "CustomFormatScore": "Özel Biçim Puanı", - "MinimumCustomFormatScore": "Minimum Özel Biçim Puanı", + "MinimumCustomFormatScore": "Minimum Özel Format Puanı", "CloneCustomFormat": "Özel Formatı Klonla", "CopyToClipboard": "Panoya kopyala", "CouldntFindAnyResultsForTerm": "'{0}' için hiçbir sonuç bulunamadı", - "CustomFormat": "Özel Biçimler", + "CustomFormat": "Özel Format", "CustomFormatRequiredHelpText": "Özel biçimin uygulanabilmesi için bu {0} koşulunun eşleşmesi gerekir. Aksi takdirde tek bir {1} eşleşmesi yeterlidir.", "CustomFormatSettings": "Özel Biçim Ayarları", - "CustomFormats": "Özel Biçimler", + "CustomFormats": "Özel Formatlar", "Customformat": "Özel Biçimler", "CutoffFormatScoreHelpText": "Bu özel format puanına ulaşıldığında, {appName} artık film indirmeyecektir", "DeleteCustomFormat": "Özel Formatı Sil", @@ -574,7 +574,7 @@ "ExportCustomFormat": "Özel Formatı Dışa Aktar", "FailedDownloadHandling": "Başarısız İndirme İşlemi", "FailedLoadingSearchResults": "Arama sonuçları yüklenemedi, lütfen tekrar deneyin.", - "Formats": "Biçimler", + "Formats": "Formatlar", "IncludeCustomFormatWhenRenamingHelpText": "{Özel Biçimler} yeniden adlandırma biçimine dahil et", "ItsEasyToAddANewArtistJustStartTypingTheNameOfTheArtistYouWantToAdd": "Yeni bir film eklemek kolaydır, eklemek istediğiniz filmin adını yazmaya başlayın", "MinFormatScoreHelpText": "İndirmeye izin verilen minimum özel biçim puanı", @@ -596,17 +596,17 @@ "DownloadClientStatusCheckAllClientMessage": "Hatalar nedeniyle tüm indirme istemcileri kullanılamıyor", "DownloadClientStatusCheckSingleClientMessage": "Hatalar nedeniyle indirilemeyen istemciler: {0}", "HiddenClickToShow": "Gizli, göstermek için tıklayın", - "AppDataLocationHealthCheckMessage": "Güncellemede AppData'nın silinmesini önlemek için güncelleme mümkün olmayacak", + "AppDataLocationHealthCheckMessage": "Güncelleme sırasında AppData'nın silinmesini önlemek için güncelleme yapılmayacaktır", "ColonReplacement": "Kolon Değiştirme", "ImportListStatusCheckAllClientMessage": "Hatalar nedeniyle tüm listeler kullanılamıyor", "ImportListStatusCheckSingleClientMessage": "Hatalar nedeniyle kullanılamayan listeler: {0}", "ImportMechanismHealthCheckMessage": "Tamamlanan İndirme İşlemini Etkinleştir", "IndexerLongTermStatusCheckSingleClientMessage": "6 saatten uzun süredir yaşanan arızalar nedeniyle dizinleyiciler kullanılamıyor: {0}", "IndexerLongTermStatusCheckAllClientMessage": "6 saatten uzun süren arızalar nedeniyle tüm dizinleyiciler kullanılamıyor", - "IndexerRssHealthCheckNoAvailableIndexers": "Yakın zamanda yapılan dizin oluşturucu hataları nedeniyle, rss özellikli tüm dizinleyiciler geçici olarak kullanılamıyor", - "IndexerRssHealthCheckNoIndexers": "RSS senkronizasyonunun etkin olduğu dizinleyici yok, {appName} yeni sürümleri otomatik olarak almayacak", + "IndexerRssHealthCheckNoAvailableIndexers": "Son indeksleyici hataları nedeniyle tüm rss özellikli indeksleyiciler geçici olarak kullanılamıyor", + "IndexerRssHealthCheckNoIndexers": "RSS senkronizasyonunun etkin olduğu dizinleyici yok, {appName} yeni yayınlar otomatik olarak almayacak", "IndexerSearchCheckNoAutomaticMessage": "Otomatik Arama etkinken indeksleyici yok, {appName} herhangi bir otomatik arama sonucu sağlamayacak", - "IndexerSearchCheckNoAvailableIndexersMessage": "Yakın zamanda yapılan dizin oluşturucu hataları nedeniyle arama özellikli tüm dizin oluşturucular geçici olarak kullanılamıyor", + "IndexerSearchCheckNoAvailableIndexersMessage": "Son indeksleyici hataları nedeniyle arama özellikli indeksleyicilerin tümü geçici olarak kullanılamıyor", "IndexerSearchCheckNoInteractiveMessage": "Etkileşimli Arama etkinken indeksleyici yok, {appName} herhangi bir etkileşimli arama sonucu sağlamayacaktır", "IndexerStatusCheckAllClientMessage": "Hatalar nedeniyle tüm dizinleyiciler kullanılamıyor", "IndexerStatusCheckSingleClientMessage": "Hatalar nedeniyle dizinleyiciler kullanılamıyor: {0}", @@ -622,19 +622,19 @@ "UpdateCheckStartupNotWritableMessage": "'{0}' başlangıç klasörü '{1}' kullanıcısı tarafından yazılamadığından güncelleme yüklenemiyor.", "UpdateCheckStartupTranslocationMessage": "Başlangıç klasörü '{0}' bir Uygulama Yer Değiştirme klasöründe olduğu için güncelleme yüklenemiyor.", "UpdateCheckUINotWritableMessage": "'{0}' UI klasörü '{1}' kullanıcısı tarafından yazılamadığından güncelleme yüklenemiyor.", - "DeleteRemotePathMapping": "Uzak Yol Eşlemeyi Düzenle", + "DeleteRemotePathMapping": "Uzak Yol Eşlemeyi Sil", "DeleteRemotePathMappingMessageText": "Bu uzak yol eşlemesini silmek istediğinizden emin misiniz?", "BlocklistReleaseHelpText": "{appName}'ın bu sürümü otomatik olarak tekrar yakalamasını engeller", "FailedToLoadQueue": "Sıra yüklenemedi", "ApplyTagsHelpTextAdd": "Ekle: Etiketleri mevcut etiket listesine ekleyin", "ApplyTagsHelpTextRemove": "Kaldır: Girilen etiketleri kaldırın", "ApplyTagsHelpTextReplace": "Değiştir: Etiketleri girilen etiketlerle değiştirin (tüm etiketleri kaldırmak için etiket girmeyin)", - "RemoveSelectedItemQueueMessageText": "Sıradan {0} öğeyi {1} kaldırmak istediğinizden emin misiniz?", + "RemoveSelectedItemQueueMessageText": "1 öğeyi kuyruktan kaldırmak istediğinizden emin misiniz?", "RemoveSelectedItemsQueueMessageText": "Sıradan {0} öğeyi {1} kaldırmak istediğinizden emin misiniz?", "SetTags": "Etiketleri Ayarla", "Yes": "Evet", "DeleteSelectedDownloadClients": "İndirme İstemcisini Sil", - "DeleteSelectedIndexers": "Dizin Oluşturucuları Sil", + "DeleteSelectedIndexers": "Dizinleyicileri Sil", "BlocklistReleases": "Kara Liste Sürümü", "DeleteConditionMessageText": "'{0}' etiketini silmek istediğinizden emin misiniz?", "NoEventsFound": "Etkinlik bulunamadı", @@ -678,7 +678,7 @@ "Release": " Yayınlandı", "EditConditionImplementation": "Koşulu Düzenle - {implementationName}", "Overview": "Genel Bakış", - "GrabId": "ID Yakala", + "GrabId": "ID'den Yakala", "AddIndexerImplementation": "Yeni Dizin Ekle - {implementationName}", "DeleteArtistFolderHelpText": "Film klasörünü ve içeriğini silin", "DeleteAutoTagHelpText": "'{name}' etiketini otomatik silmek istediğinizden emin misiniz?", @@ -717,14 +717,14 @@ "PreferredSize": "Tercih Edilen Boyut", "Unlimited": "Sınırsız", "IncludeHealthWarnings": "Sağlık Uyarılarını Dahil Et", - "RemoveQueueItemConfirmation": "Sıradan {0} öğeyi {1} kaldırmak istediğinizden emin misiniz?", + "RemoveQueueItemConfirmation": "'{sourceTitle}' dosyasını kuyruktan kaldırmak istediğinizden emin misiniz?", "AutoRedownloadFailed": "Yeniden İndirme Başarısız", "AddDownloadClientImplementation": "İndirme İstemcisi Ekle - {implementationName}", "AddImportList": "İçe Aktarım Listesi Ekle", - "AddReleaseProfile": "Sürüm Profili Ekle", + "AddReleaseProfile": "Yayın Profili Ekle", "AddImportListImplementation": "İçe Aktarım Listesi Ekle -{implementationName}", "ImportLists": "Listeler", - "EditReleaseProfile": "Sürüm Profilini Düzenle", + "EditReleaseProfile": "Yayımlama Profilini Düzenle", "DefaultCase": "Varsayılan Durum", "FileNameTokens": "Dosya Adı Belirteçleri", "KeyboardShortcuts": "Klavye kısayolları", @@ -737,11 +737,11 @@ "TagsSettingsSummary": "Tüm etiketleri ve nasıl kullanıldıklarını göster. Kullanılmayan etiketler kaldırılabilinir", "UiSettingsSummary": "Takvim, tarih ve renk engelli seçenekler", "ConnectSettingsSummary": "Bildirimler, medya sunucularına/oynatıcılara bağlantılar ve özel komut dosyaları", - "CustomFormatsSettings": "Özel Biçim Ayarları", - "CustomFormatsSettingsSummary": "Özel Biçimler ve Ayarlar", + "CustomFormatsSettings": "Özel Format Ayarları", + "CustomFormatsSettingsSummary": "Özel Formatlar ve Ayarlar", "DownloadClientsSettingsSummary": "İndirme İstemcileri, indirme işlemleri ve uzaktan yol eşlemeleri", "GeneralSettingsSummary": "Port, SSL, kullanıcı adı/şifre, proxy, analitikler ve güncellemeler", - "ImportListsSettingsSummary": "Listeleri İçe Aktar, hariç tutulanları listele", + "ImportListsSettingsSummary": "Başka bir {appName} örneğinden veya Trakt listelerinden içe aktarın ve liste hariç tutma işlemlerini yönetin", "QualitySettingsSummary": "Kalite boyutları ve adlandırma", "ArtistIndexFooterDownloading": "İndiriliyor", "AutomaticSearch": "Otomatik Arama", @@ -783,12 +783,12 @@ "ChownGroup": "Chown Grubu", "ClearBlocklist": "Engellenenler listesini temizle", "ClearBlocklistMessageText": "Engellenenler listesindeki tüm öğeleri temizlemek istediğinizden emin misiniz?", - "ClickToChangeReleaseGroup": "Sürüm grubunu değiştirmek için tıklayın", + "ClickToChangeReleaseGroup": "Yayım grubunu değiştirmek için tıklayın", "Clone": "Klon", "CloneAutoTag": "Otomatik Etiketi Klonla", "CloneCondition": "Klon Durumu", - "ClickToChangeIndexerFlags": "Dizin oluşturucu bayraklarını değiştirmek için tıklayın", - "IndexerFlags": "Dizin Oluşturucu Bayrakları", + "ClickToChangeIndexerFlags": "Dizinleyici bayraklarını değiştirmek için tıklayın", + "IndexerFlags": "Dizinleyici Bayrakları", "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", "PreferredProtocol": "Tercih Edilen Protokol", "ChooseImportMethod": "İçe Aktarma Modunu Seçin", @@ -800,7 +800,7 @@ "Tomorrow": "Yarın", "CountArtistsSelected": "{count} içe aktarma listesi seçildi", "AddToDownloadQueue": "İndirme kuyruğuna ekleyin", - "AddedToDownloadQueue": "İndirme sırasına eklendi", + "AddedToDownloadQueue": "İndirme kuyruğuna eklendi", "BypassIfAboveCustomFormatScore": "Özel Format Koşullarının Üstündeyse Baypas Et", "BypassIfAboveCustomFormatScoreHelpText": "Sürümün puanı, yapılandırılan minimum özel format puanından yüksek olduğunda bypass'ı etkinleştirin", "BypassIfHighestQuality": "En Yüksek Kalitedeyse Atla", @@ -826,11 +826,11 @@ "DeleteCondition": "Koşulu Sil", "DeleteSelectedDownloadClientsMessageText": "Seçilen {count} indirme istemcisini silmek istediğinizden emin misiniz?", "DeleteSelectedImportLists": "İçe Aktarma Listelerini Sil", - "DeleteAutoTag": "Etiketi Otomatik Sil", + "DeleteAutoTag": "Etiketi Otomatik Sil", "CustomFormatsSettingsTriggerInfo": "Bir yayına veya dosyaya, seçilen farklı koşul türlerinden en az biriyle eşleştiğinde Özel Format uygulanacaktır.", "DeleteSelectedImportListsMessageText": "Seçilen {count} içe aktarma listesini silmek istediğinizden emin misiniz?", - "DeleteSelectedIndexersMessageText": "Seçilen {count} dizin oluşturucuyu silmek istediğinizden emin misiniz?", - "IndexerPriorityHelpText": "Dizin Oluşturucu Önceliği (En Yüksek) 1'den (En Düşük) 50'ye kadar. Varsayılan: 25'dir. Eşit olmayan sürümler için eşitlik bozucu olarak sürümler alınırken kullanılan {appName}, RSS Senkronizasyonu ve Arama için etkinleştirilmiş tüm dizin oluşturucuları kullanmaya devam edecek", + "DeleteSelectedIndexersMessageText": "Seçilen {count} dizinleyiciyi silmek istediğinizden emin misiniz?", + "IndexerPriorityHelpText": "Dizinleyici Önceliği (En Yüksek) 1'den (En Düşük) 50'ye kadar. Varsayılan: 25'dir. Eşit olmayan yayınlar için eşitlik bozucu olarak yayınlar alınırken kullanılan {appName}, RSS Senkronizasyonu ve Arama için etkinleştirilmiş tüm dizin oluşturucuları kullanmaya devam edecek", "ConnectionSettingsUrlBaseHelpText": "{connectionName} URL'sine {url} gibi bir önek ekler", "Album": "Albüm", "DownloadClientQbittorrentSettingsContentLayout": "İçerik Düzeni", @@ -845,7 +845,7 @@ "NotificationsKodiSettingsDisplayTimeHelpText": "Bildirimin ne kadar süreyle görüntüleneceği (Saniye cinsinden)", "NotificationsKodiSettingsGuiNotification": "GUI Bildirimi", "NotificationsKodiSettingsUpdateLibraryHelpText": "İçe Aktarma ve Yeniden Adlandırmada kitaplık güncellensin mi?", - "IndexerDownloadClientHelpText": "Bu dizin oluşturucudan yakalamak için hangi indirme istemcisinin kullanılacağını belirtin", + "IndexerDownloadClientHelpText": "Bu dizinleyiciden yakalamak için hangi indirme istemcisinin kullanılacağını belirtin", "Never": "Asla", "HealthMessagesInfoBox": "Satırın sonundaki wiki bağlantısını (kitap simgesi) tıklayarak veya [günlüklerinizi]({link}) kontrol ederek bu durum kontrolü mesajlarının nedeni hakkında daha fazla bilgi bulabilirsiniz. Bu mesajları yorumlamakta zorluk yaşıyorsanız aşağıdaki bağlantılardan destek ekibimize ulaşabilirsiniz.", "Menu": "Menü", @@ -854,13 +854,13 @@ "Implementation": "Uygula", "InstanceName": "Örnek isim", "ListRefreshInterval": "Liste Yenileme Aralığı", - "EditSelectedIndexers": "Seçili Dizin Oluşturucuları Düzenle", - "ManageIndexers": "Dizin Oluşturucuları Yönet", + "EditSelectedIndexers": "Seçili Dizinleyicileri Düzenle", + "ManageIndexers": "Dizinleyicileri Yönet", "NoHistoryBlocklist": "Geçmiş engellenenler listesi yok", "Label": "Etiket", - "IndexerDownloadClientHealthCheckMessage": "Geçersiz indirme istemcilerine sahip dizin oluşturucular: {0}.", + "IndexerDownloadClientHealthCheckMessage": "Geçersiz indirme istemcilerine sahip dizinleyiciler: {0}.", "EnableProfile": "Profili Etkinleştir", - "EnableRssHelpText": "{appName}, RSS Senkronizasyonu aracılığıyla düzenli aralıklarla sürüm değişikliği aradığında kullanacak", + "EnableRssHelpText": "{appName}, RSS Senkronizasyonu aracılığıyla düzenli periyotlarda yayın değişikliği aradığında kullanacak", "IgnoreDownloadHint": "{appName}'in bu indirmeyi daha fazla işlemesini durdurur", "IgnoreDownloads": "İndirilenleri Yoksay", "InstanceNameHelpText": "Sekmedeki örnek adı ve Syslog uygulaması adı için", @@ -880,9 +880,9 @@ "ManageClients": "İstemcileri Yönet", "ManageDownloadClients": "İndirme İstemcilerini Yönet", "InfoUrl": "Bilgi URL'si", - "IndexerSettingsRejectBlocklistedTorrentHashesHelpText": "Bir torrent karma tarafından engellendiyse, RSS/Bazı dizin oluşturucuları arama sırasında düzgün şekilde reddedilmeyebilir; bunun etkinleştirilmesi, torrent yakalandıktan sonra ancak istemciye gönderilmeden önce reddedilmesine olanak tanır.", + "IndexerSettingsRejectBlocklistedTorrentHashesHelpText": "Bir torrent hash tarafından engellenirse, bazı dizinleyiciler için RSS / Arama sırasında düzgün bir şekilde reddedilmeyebilir, bunun etkinleştirilmesi, torrent yakalandıktan sonra, ancak istemciye gönderilmeden önce reddedilmesine izin verecektir.", "EditSelectedImportLists": "Seçilen İçe Aktarma Listelerini Düzenle", - "NoIndexersFound": "Dizin oluşturucu bulunamadı", + "NoIndexersFound": "Dizinleyici bulunamadı", "NotificationsEmbySettingsSendNotificationsHelpText": "MediaBrowser'ın yapılandırılmış sağlayıcılara bildirim göndermesini sağlayın", "NotificationsEmbySettingsUpdateLibraryHelpText": "İçe Aktarma, Yeniden Adlandırma veya Silme sırasında Kitaplık Güncellensin mi?", "IgnoreDownload": "İndirmeyi Yoksay", @@ -892,5 +892,62 @@ "ManageImportLists": "İçe Aktarma Listelerini Yönet", "NotificationsEmbySettingsSendNotifications": "Bildirim Gönder", "NotificationsKodiSettingsCleanLibraryHelpText": "Güncellemeden sonra kitaplığı temizle", - "IndexerSettingsRejectBlocklistedTorrentHashes": "Yakalarken Engellenen Torrent Karmalarını Reddet" + "IndexerSettingsRejectBlocklistedTorrentHashes": "Yakalarken Engellenen Torrent Karmalarını Reddet", + "ThereWasAnErrorLoadingThisItem": "Bu öğe yüklenirken bir hata oluştu", + "NotificationsPlexSettingsAuthenticateWithPlexTv": "Plex.tv ile kimlik doğrulaması yapın", + "NotificationsSettingsUpdateLibrary": "Kitaplığı Güncelle", + "NotificationsPlexSettingsAuthToken": "Kimlik Doğrulama Jetonu", + "NotificationsSettingsUpdateMapPathsFromHelpText": "{appName} yolu, {serviceName} kitaplık yolu konumunu {appName}'dan farklı gördüğünde seri yollarını değiştirmek için kullanılır ('Kütüphaneyi Güncelle' gerektirir)", + "NotificationsSettingsUpdateMapPathsTo": "Harita Yolları", + "NotificationsSettingsUseSslHelpText": "{serviceName} hizmetine HTTP yerine HTTPS üzerinden bağlanın", + "NotificationsSettingsUpdateMapPathsToHelpText": "{serviceName}, kitaplık yolu konumunu {appName}'den farklı gördüğünde seri yollarını değiştirmek için kullanılan {serviceName} yolu ('Kütüphaneyi Güncelle' gerektirir)", + "PasswordConfirmation": "Şifre onayı", + "Rejections": "Reddedilenler", + "ReleaseProfiles": "Yayımlama Profilleri", + "SelectIndexerFlags": "Dizinleyici Bayraklarını Seçin", + "UpdateFiltered": "Filtrelenenleri Güncelle", + "UseSsl": "SSL kullan", + "RemoveCompletedDownloads": "Tamamlanan İndirmeleri Kaldır", + "RemoveDownloadsAlert": "Kaldırma ayarları, yukarıdaki tabloda bireysel İndirme İstemcisi ayarlarına taşınmıştır.", + "ResetTitles": "Başlıkları Sıfırla", + "Period": "Periyot", + "RemoveMultipleFromDownloadClientHint": "İndirilenleri ve dosyaları indirme istemcisinden kaldırır", + "RemoveQueueItemRemovalMethod": "Kaldırma Yöntemi", + "RemoveFromDownloadClientHint": "İndirilenleri ve dosyaları indirme istemcisinden kaldırır", + "ResetQualityDefinitionsMessageText": "Kalite tanımlarını sıfırlamak istediğinizden emin misiniz?", + "ResetQualityDefinitions": "Kalite Tanımlarını Sıfırla", + "RemoveQueueItem": "Kaldır - {sourceTitle}", + "RemoveQueueItemRemovalMethodHelpTextWarning": "'İndirme İstemcisinden Kaldır', indirme işlemini ve dosyaları indirme istemcisinden kaldıracaktır.", + "RemoveQueueItemsRemovalMethodHelpTextWarning": "'İndirme İstemcisinden Kaldır', indirilenleri ve dosyaları indirme istemcisinden kaldıracaktır.", + "Space": "Boşluk", + "Theme": "Tema", + "Underscore": "Vurgula", + "OnApplicationUpdate": "Uygulama Güncellemesinde", + "SizeLimit": "Boyut Limiti", + "OnHealthRestored": "Sağlığın İyileştirilmesi Hakkında", + "RemoveTagsAutomaticallyHelpText": "Koşullar karşılanmazsa otomatik etiketlemeyi kaldırın", + "UpdateAvailable": "Yeni güncelleme mevcut", + "NotificationsTelegramSettingsIncludeAppName": "{appName}'i Başlığa dahil et", + "NotificationsTelegramSettingsIncludeAppNameHelpText": "Farklı uygulamalardan gelen bildirimleri ayırt etmek için isteğe bağlı olarak mesaj başlığının önüne {appName} ekleyin", + "RemotePathMappingCheckImportFailed": "{appName} filmi içe aktaramadı. Ayrıntılar için günlüklerinizi kontrol edin.", + "RemoveSelectedItem": "Seçilen Öğeyi Kaldır", + "ResetDefinitionTitlesHelpText": "Değerlerin yanı sıra tanım başlıklarını da sıfırlayın", + "SetIndexerFlags": "Dizinleyici Bayraklarını Ayarla", + "SkipRedownload": "Yeniden İndirmeyi Atla", + "SupportedAutoTaggingProperties": "{appName}, otomatik etiketleme kuralları için takip özelliklerini destekler", + "ThemeHelpText": "Uygulama Kullanıcı Arayüzü Temasını Değiştirin, 'Otomatik' Teması, Açık veya Koyu modu ayarlamak için İşletim Sistemi Temanızı kullanacaktır. Theme.Park'tan ilham alındı", + "ThereWasAnErrorLoadingThisPage": "Sayfa yüklenirken bir hata oluştu", + "ResetDefinitions": "Tanımları Sıfırla", + "RootFolderPath": "Kök Klasör Yolu", + "RemoveCompleted": "Tamamlananları Kaldır", + "RemoveFailed": "Başarısızları Kaldır", + "RemoveSelectedItems": "Seçili öğeleri kaldır", + "RemoveTagsAutomatically": "Otomatik Etiketlemeyi Kaldır", + "Started": "Başlatıldı", + "RemoveFailedDownloads": "Başarısız İndirmeleri Kaldır", + "RegularExpressionsTutorialLink": "Normal ifadelerle ilgili daha fazla ayrıntıyı [burada](https://www.regular-expressions.info/tutorial.html) bulabilirsiniz.", + "SelectReleaseGroup": "Yayımlama Grubunu Seçin", + "QueueFilterHasNoItems": "Seçilen kuyruk filtresinde hiç öğe yok", + "NotificationsSettingsUpdateMapPathsFrom": "Harita Yolları", + "PreferProtocol": "{preferredProtocol}'u tercih edin" } diff --git a/src/NzbDrone.Core/Localization/Core/uk.json b/src/NzbDrone.Core/Localization/Core/uk.json index 869010fb3..3daf5ac41 100644 --- a/src/NzbDrone.Core/Localization/Core/uk.json +++ b/src/NzbDrone.Core/Localization/Core/uk.json @@ -1,7 +1,7 @@ { "About": "Про нас", "Actions": "Дії", - "AddingTag": "Додавання тегу", + "AddingTag": "Додавання тега", "AddListExclusion": "Додати виняток зі списку", "AgeWhenGrabbed": "Вік (коли схоплено)", "AutoRedownloadFailedHelpText": "Автоматичний пошук і спроба завантажити інший випуск", @@ -541,5 +541,9 @@ "20MinutesTwenty": "20 хвилин: {0}", "45MinutesFourtyFive": "45 хвилин: {0}", "60MinutesSixty": "60 хвилин: {0}", - "AddAlbumWithTitle": "Додати {albumTitle}" + "AddAlbumWithTitle": "Додати {albumTitle}", + "AddNewAlbum": "Додати новий альбом", + "AddNewAlbumSearchForNewAlbum": "Почати пошук нового альбому", + "AddToDownloadQueue": "Додати до черги завантажень", + "AlbumDetails": "Деталі альбому" } From 94bb8a436b88dde3ceef191f7052e7d055d8b47d Mon Sep 17 00:00:00 2001 From: Bogdan Date: Mon, 6 May 2024 21:24:34 +0300 Subject: [PATCH 005/348] Fixed: Parsing long downloading/seeding values from Transmission (cherry picked from commit 8360dd7a7bab1dfb49a40aae382b47e9253d9fd1) --- .../Download/Clients/Transmission/TransmissionTorrent.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/NzbDrone.Core/Download/Clients/Transmission/TransmissionTorrent.cs b/src/NzbDrone.Core/Download/Clients/Transmission/TransmissionTorrent.cs index 70ab8a3b9..9e97b94bc 100644 --- a/src/NzbDrone.Core/Download/Clients/Transmission/TransmissionTorrent.cs +++ b/src/NzbDrone.Core/Download/Clients/Transmission/TransmissionTorrent.cs @@ -11,8 +11,8 @@ namespace NzbDrone.Core.Download.Clients.Transmission public bool IsFinished { get; set; } public long Eta { get; set; } public TransmissionTorrentStatus Status { get; set; } - public int SecondsDownloading { get; set; } - public int SecondsSeeding { get; set; } + public long SecondsDownloading { get; set; } + public long SecondsSeeding { get; set; } public string ErrorString { get; set; } public long DownloadedEver { get; set; } public long UploadedEver { get; set; } From 596a36d45ff8444fbe9dad0a182c154be5f2ea62 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Fri, 10 May 2024 00:50:52 +0300 Subject: [PATCH 006/348] Fixed: Notifications with only On Rename enabled --- src/NzbDrone.Core/Notifications/NotificationDefinition.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/Notifications/NotificationDefinition.cs b/src/NzbDrone.Core/Notifications/NotificationDefinition.cs index f5f4e2f05..5c35fe128 100644 --- a/src/NzbDrone.Core/Notifications/NotificationDefinition.cs +++ b/src/NzbDrone.Core/Notifications/NotificationDefinition.cs @@ -32,6 +32,6 @@ namespace NzbDrone.Core.Notifications public bool SupportsOnTrackRetag { get; set; } public bool SupportsOnApplicationUpdate { get; set; } - public override bool Enable => OnGrab || OnReleaseImport || (OnReleaseImport && OnUpgrade) || OnArtistAdd || OnArtistDelete || OnAlbumDelete || OnHealthIssue || OnHealthRestored || OnDownloadFailure || OnImportFailure || OnTrackRetag || OnApplicationUpdate; + public override bool Enable => OnGrab || OnReleaseImport || (OnReleaseImport && OnUpgrade) || OnRename || OnArtistAdd || OnArtistDelete || OnAlbumDelete || OnHealthIssue || OnHealthRestored || OnDownloadFailure || OnImportFailure || OnTrackRetag || OnApplicationUpdate; } } From 31f342b8ad370cf7ba4f3a07cf80303d7c441c48 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Tue, 7 May 2024 00:21:50 +0300 Subject: [PATCH 007/348] Use number input for seed ratio (cherry picked from commit 1eddf3a152fae04142263c02a3e3b317ff2feeb2) Plus translations Closes #4802 --- src/Lidarr.Http/ClientSchema/SchemaBuilder.cs | 2 +- src/NzbDrone.Core/Indexers/SeedCriteriaSettings.cs | 4 ++-- src/NzbDrone.Core/Localization/Core/en.json | 4 ++++ 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/Lidarr.Http/ClientSchema/SchemaBuilder.cs b/src/Lidarr.Http/ClientSchema/SchemaBuilder.cs index 1ffa7ff8c..7b71a73a7 100644 --- a/src/Lidarr.Http/ClientSchema/SchemaBuilder.cs +++ b/src/Lidarr.Http/ClientSchema/SchemaBuilder.cs @@ -161,7 +161,7 @@ namespace Lidarr.Http.ClientSchema field.Hidden = fieldAttribute.Hidden.ToString().FirstCharToLower(); } - if (fieldAttribute.Type is FieldType.Number && propertyInfo.PropertyType == typeof(double)) + if (fieldAttribute.Type is FieldType.Number && (propertyInfo.PropertyType == typeof(double) || propertyInfo.PropertyType == typeof(double?))) { field.IsFloat = true; } diff --git a/src/NzbDrone.Core/Indexers/SeedCriteriaSettings.cs b/src/NzbDrone.Core/Indexers/SeedCriteriaSettings.cs index 04f7ee040..741de03c4 100644 --- a/src/NzbDrone.Core/Indexers/SeedCriteriaSettings.cs +++ b/src/NzbDrone.Core/Indexers/SeedCriteriaSettings.cs @@ -48,10 +48,10 @@ namespace NzbDrone.Core.Indexers public class SeedCriteriaSettings { - [FieldDefinition(0, Type = FieldType.Textbox, Label = "Seed Ratio", HelpText = "The ratio a torrent should reach before stopping, empty is download client's default. Ratio should be at least 1.0 and follow the indexers rules")] + [FieldDefinition(0, Type = FieldType.Number, Label = "IndexerSettingsSeedRatio", HelpText = "IndexerSettingsSeedRatioHelpText")] public double? SeedRatio { get; set; } - [FieldDefinition(1, Type = FieldType.Textbox, Label = "Seed Time", Unit = "minutes", HelpText = "The time a torrent should be seeded before stopping, empty is download client's default", Advanced = true)] + [FieldDefinition(1, Type = FieldType.Number, Label = "IndexerSettingsSeedTime", Unit = "minutes", HelpText = "IndexerSettingsSeedTimeHelpText", Advanced = true)] public int? SeedTime { get; set; } [FieldDefinition(2, Type = FieldType.Textbox, Label = "Discography Seed Time", Unit = "minutes", HelpText = "The time a torrent should be seeded before stopping, empty is download client's default", Advanced = true)] diff --git a/src/NzbDrone.Core/Localization/Core/en.json b/src/NzbDrone.Core/Localization/Core/en.json index c8d813d70..c645ce654 100644 --- a/src/NzbDrone.Core/Localization/Core/en.json +++ b/src/NzbDrone.Core/Localization/Core/en.json @@ -594,6 +594,10 @@ "IndexerSettings": "Indexer Settings", "IndexerSettingsRejectBlocklistedTorrentHashes": "Reject Blocklisted Torrent Hashes While Grabbing", "IndexerSettingsRejectBlocklistedTorrentHashesHelpText": "If a torrent is blocked by hash it may not properly be rejected during RSS/Search for some indexers, enabling this will allow it to be rejected after the torrent is grabbed, but before it is sent to the client.", + "IndexerSettingsSeedRatio": "Seed Ratio", + "IndexerSettingsSeedRatioHelpText": "The ratio a torrent should reach before stopping, empty uses the download client's default. Ratio should be at least 1.0 and follow the indexers rules", + "IndexerSettingsSeedTime": "Seed Time", + "IndexerSettingsSeedTimeHelpText": "The time a torrent should be seeded before stopping, empty uses the download client's default", "IndexerStatusCheckAllClientMessage": "All indexers are unavailable due to failures", "IndexerStatusCheckSingleClientMessage": "Indexers unavailable due to failures: {0}", "IndexerTagHelpText": "Only use this indexer for artist with at least one matching tag. Leave blank to use with all artists.", From 9da690f807b3476b86cb6b3b7a1d11a8fa243104 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micka=C3=ABl=20Thomas?= Date: Thu, 9 May 2024 03:41:59 +0200 Subject: [PATCH 008/348] New: Support stoppedUP and stoppedDL states from qBittorrent (cherry picked from commit 73a4bdea5247ee87e6bbae95f5325e1f03c88a7f) Closes #4795 --- .../QBittorrentTests/QBittorrentFixture.cs | 120 ++++++++++-------- .../Clients/QBittorrent/QBittorrent.cs | 8 +- 2 files changed, 74 insertions(+), 54 deletions(-) diff --git a/src/NzbDrone.Core.Test/Download/DownloadClientTests/QBittorrentTests/QBittorrentFixture.cs b/src/NzbDrone.Core.Test/Download/DownloadClientTests/QBittorrentTests/QBittorrentFixture.cs index 07f1c664e..8757e713a 100644 --- a/src/NzbDrone.Core.Test/Download/DownloadClientTests/QBittorrentTests/QBittorrentFixture.cs +++ b/src/NzbDrone.Core.Test/Download/DownloadClientTests/QBittorrentTests/QBittorrentFixture.cs @@ -178,8 +178,9 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.QBittorrentTests VerifyWarning(item); } - [Test] - public void paused_item_should_have_required_properties() + [TestCase("pausedDL")] + [TestCase("stoppedDL")] + public void paused_item_should_have_required_properties(string state) { var torrent = new QBittorrentTorrent { @@ -188,7 +189,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.QBittorrentTests Size = 1000, Progress = 0.7, Eta = 8640000, - State = "pausedDL", + State = state, Label = "", SavePath = "" }; @@ -200,6 +201,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.QBittorrentTests } [TestCase("pausedUP")] + [TestCase("stoppedUP")] [TestCase("queuedUP")] [TestCase("uploading")] [TestCase("stalledUP")] @@ -417,8 +419,9 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.QBittorrentTests item.RemainingTime.Should().NotHaveValue(); } - [Test] - public void api_261_should_use_content_path() + [TestCase("pausedUP")] + [TestCase("stoppedUP")] + public void api_261_should_use_content_path(string state) { var torrent = new QBittorrentTorrent { @@ -427,7 +430,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.QBittorrentTests Size = 1000, Progress = 0.7, Eta = 8640000, - State = "pausedUP", + State = state, Label = "", SavePath = @"C:\Torrents".AsOsAgnostic(), ContentPath = @"C:\Torrents\Droned.S01.12".AsOsAgnostic() @@ -655,44 +658,48 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.QBittorrentTests item.CanMoveFiles.Should().BeFalse(); } - [Test] - public void should_not_be_removable_and_should_not_allow_move_files_if_max_ratio_is_not_set() + [TestCase("pausedUP")] + [TestCase("stoppedUP")] + public void should_not_be_removable_and_should_not_allow_move_files_if_max_ratio_is_not_set(string state) { GivenGlobalSeedLimits(-1); - GivenCompletedTorrent("pausedUP", ratio: 1.0f); + GivenCompletedTorrent(state, ratio: 1.0f); var item = Subject.GetItems().Single(); item.CanBeRemoved.Should().BeFalse(); item.CanMoveFiles.Should().BeFalse(); } - [Test] - public void should_be_removable_and_should_allow_move_files_if_max_ratio_reached_and_paused() + [TestCase("pausedUP")] + [TestCase("stoppedUP")] + public void should_be_removable_and_should_allow_move_files_if_max_ratio_reached_and_paused(string state) { GivenGlobalSeedLimits(1.0f); - GivenCompletedTorrent("pausedUP", ratio: 1.0f); + GivenCompletedTorrent(state, ratio: 1.0f); var item = Subject.GetItems().Single(); item.CanBeRemoved.Should().BeTrue(); item.CanMoveFiles.Should().BeTrue(); } - [Test] - public void should_be_removable_and_should_allow_move_files_if_overridden_max_ratio_reached_and_paused() + [TestCase("pausedUP")] + [TestCase("stoppedUP")] + public void should_be_removable_and_should_allow_move_files_if_overridden_max_ratio_reached_and_paused(string state) { GivenGlobalSeedLimits(2.0f); - GivenCompletedTorrent("pausedUP", ratio: 1.0f, ratioLimit: 0.8f); + GivenCompletedTorrent(state, ratio: 1.0f, ratioLimit: 0.8f); var item = Subject.GetItems().Single(); item.CanBeRemoved.Should().BeTrue(); item.CanMoveFiles.Should().BeTrue(); } - [Test] - public void should_not_be_removable_if_overridden_max_ratio_not_reached_and_paused() + [TestCase("pausedUP")] + [TestCase("stoppedUP")] + public void should_not_be_removable_if_overridden_max_ratio_not_reached_and_paused(string state) { GivenGlobalSeedLimits(0.2f); - GivenCompletedTorrent("pausedUP", ratio: 0.5f, ratioLimit: 0.8f); + GivenCompletedTorrent(state, ratio: 0.5f, ratioLimit: 0.8f); var item = Subject.GetItems().Single(); item.CanBeRemoved.Should().BeFalse(); @@ -710,33 +717,36 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.QBittorrentTests item.CanMoveFiles.Should().BeFalse(); } - [Test] - public void should_be_removable_and_should_allow_move_files_if_max_seedingtime_reached_and_paused() + [TestCase("pausedUP")] + [TestCase("stoppedUP")] + public void should_be_removable_and_should_allow_move_files_if_max_seedingtime_reached_and_paused(string state) { GivenGlobalSeedLimits(-1, 20); - GivenCompletedTorrent("pausedUP", ratio: 2.0f, seedingTime: 20); + GivenCompletedTorrent(state, ratio: 2.0f, seedingTime: 20); var item = Subject.GetItems().Single(); item.CanBeRemoved.Should().BeTrue(); item.CanMoveFiles.Should().BeTrue(); } - [Test] - public void should_be_removable_and_should_allow_move_files_if_overridden_max_seedingtime_reached_and_paused() + [TestCase("pausedUP")] + [TestCase("stoppedUP")] + public void should_be_removable_and_should_allow_move_files_if_overridden_max_seedingtime_reached_and_paused(string state) { GivenGlobalSeedLimits(-1, 40); - GivenCompletedTorrent("pausedUP", ratio: 2.0f, seedingTime: 20, seedingTimeLimit: 10); + GivenCompletedTorrent(state, ratio: 2.0f, seedingTime: 20, seedingTimeLimit: 10); var item = Subject.GetItems().Single(); item.CanBeRemoved.Should().BeTrue(); item.CanMoveFiles.Should().BeTrue(); } - [Test] - public void should_not_be_removable_if_overridden_max_seedingtime_not_reached_and_paused() + [TestCase("pausedUP")] + [TestCase("stoppedUP")] + public void should_not_be_removable_if_overridden_max_seedingtime_not_reached_and_paused(string state) { GivenGlobalSeedLimits(-1, 20); - GivenCompletedTorrent("pausedUP", ratio: 2.0f, seedingTime: 30, seedingTimeLimit: 40); + GivenCompletedTorrent(state, ratio: 2.0f, seedingTime: 30, seedingTimeLimit: 40); var item = Subject.GetItems().Single(); item.CanBeRemoved.Should().BeFalse(); @@ -754,66 +764,72 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.QBittorrentTests item.CanMoveFiles.Should().BeFalse(); } - [Test] - public void should_be_removable_and_should_allow_move_files_if_max_inactive_seedingtime_reached_and_paused() + [TestCase("pausedUP")] + [TestCase("stoppedUP")] + public void should_be_removable_and_should_allow_move_files_if_max_inactive_seedingtime_reached_and_paused(string state) { GivenGlobalSeedLimits(-1, maxInactiveSeedingTime: 20); - GivenCompletedTorrent("pausedUP", ratio: 2.0f, lastActivity: DateTimeOffset.UtcNow.Subtract(TimeSpan.FromMinutes(25)).ToUnixTimeSeconds()); + GivenCompletedTorrent(state, ratio: 2.0f, lastActivity: DateTimeOffset.UtcNow.Subtract(TimeSpan.FromMinutes(25)).ToUnixTimeSeconds()); var item = Subject.GetItems().Single(); item.CanBeRemoved.Should().BeTrue(); item.CanMoveFiles.Should().BeTrue(); } - [Test] - public void should_be_removable_and_should_allow_move_files_if_overridden_max_inactive_seedingtime_reached_and_paused() + [TestCase("pausedUP")] + [TestCase("stoppedUP")] + public void should_be_removable_and_should_allow_move_files_if_overridden_max_inactive_seedingtime_reached_and_paused(string state) { GivenGlobalSeedLimits(-1, maxInactiveSeedingTime: 40); - GivenCompletedTorrent("pausedUP", ratio: 2.0f, seedingTime: 20, inactiveSeedingTimeLimit: 10, lastActivity: DateTimeOffset.UtcNow.Subtract(TimeSpan.FromMinutes(15)).ToUnixTimeSeconds()); + GivenCompletedTorrent(state, ratio: 2.0f, seedingTime: 20, inactiveSeedingTimeLimit: 10, lastActivity: DateTimeOffset.UtcNow.Subtract(TimeSpan.FromMinutes(15)).ToUnixTimeSeconds()); var item = Subject.GetItems().Single(); item.CanBeRemoved.Should().BeTrue(); item.CanMoveFiles.Should().BeTrue(); } - [Test] - public void should_not_be_removable_if_overridden_max_inactive_seedingtime_not_reached_and_paused() + [TestCase("pausedUP")] + [TestCase("stoppedUP")] + public void should_not_be_removable_if_overridden_max_inactive_seedingtime_not_reached_and_paused(string state) { GivenGlobalSeedLimits(-1, maxInactiveSeedingTime: 20); - GivenCompletedTorrent("pausedUP", ratio: 2.0f, seedingTime: 30, inactiveSeedingTimeLimit: 40, lastActivity: DateTimeOffset.UtcNow.Subtract(TimeSpan.FromMinutes(30)).ToUnixTimeSeconds()); + GivenCompletedTorrent(state, ratio: 2.0f, seedingTime: 30, inactiveSeedingTimeLimit: 40, lastActivity: DateTimeOffset.UtcNow.Subtract(TimeSpan.FromMinutes(30)).ToUnixTimeSeconds()); var item = Subject.GetItems().Single(); item.CanBeRemoved.Should().BeFalse(); item.CanMoveFiles.Should().BeFalse(); } - [Test] - public void should_be_removable_and_should_allow_move_files_if_max_seedingtime_reached_but_ratio_not_and_paused() + [TestCase("pausedUP")] + [TestCase("stoppedUP")] + public void should_be_removable_and_should_allow_move_files_if_max_seedingtime_reached_but_ratio_not_and_paused(string state) { GivenGlobalSeedLimits(2.0f, 20); - GivenCompletedTorrent("pausedUP", ratio: 1.0f, seedingTime: 30); + GivenCompletedTorrent(state, ratio: 1.0f, seedingTime: 30); var item = Subject.GetItems().Single(); item.CanBeRemoved.Should().BeTrue(); item.CanMoveFiles.Should().BeTrue(); } - [Test] - public void should_be_removable_and_should_allow_move_files_if_max_inactive_seedingtime_reached_but_ratio_not_and_paused() + [TestCase("pausedUP")] + [TestCase("stoppedUP")] + public void should_be_removable_and_should_allow_move_files_if_max_inactive_seedingtime_reached_but_ratio_not_and_paused(string state) { GivenGlobalSeedLimits(2.0f, maxInactiveSeedingTime: 20); - GivenCompletedTorrent("pausedUP", ratio: 1.0f, lastActivity: DateTimeOffset.UtcNow.Subtract(TimeSpan.FromMinutes(25)).ToUnixTimeSeconds()); + GivenCompletedTorrent(state, ratio: 1.0f, lastActivity: DateTimeOffset.UtcNow.Subtract(TimeSpan.FromMinutes(25)).ToUnixTimeSeconds()); var item = Subject.GetItems().Single(); item.CanBeRemoved.Should().BeTrue(); item.CanMoveFiles.Should().BeTrue(); } - [Test] - public void should_not_fetch_details_twice() + [TestCase("pausedUP")] + [TestCase("stoppedUP")] + public void should_not_fetch_details_twice(string state) { GivenGlobalSeedLimits(-1, 30); - GivenCompletedTorrent("pausedUP", ratio: 2.0f, seedingTime: 20); + GivenCompletedTorrent(state, ratio: 2.0f, seedingTime: 20); var item = Subject.GetItems().Single(); item.CanBeRemoved.Should().BeFalse(); @@ -825,8 +841,9 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.QBittorrentTests .Verify(p => p.GetTorrentProperties(It.IsAny(), It.IsAny()), Times.Once()); } - [Test] - public void should_get_category_from_the_category_if_set() + [TestCase("pausedUP")] + [TestCase("stoppedUP")] + public void should_get_category_from_the_category_if_set(string state) { const string category = "music-lidarr"; GivenGlobalSeedLimits(1.0f); @@ -838,7 +855,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.QBittorrentTests Size = 1000, Progress = 1.0, Eta = 8640000, - State = "pausedUP", + State = state, Category = category, SavePath = "", Ratio = 1.0f @@ -850,8 +867,9 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.QBittorrentTests item.Category.Should().Be(category); } - [Test] - public void should_get_category_from_the_label_if_the_category_is_not_available() + [TestCase("pausedUP")] + [TestCase("stoppedUP")] + public void should_get_category_from_the_label_if_the_category_is_not_available(string state) { const string category = "music-lidarr"; GivenGlobalSeedLimits(1.0f); @@ -863,7 +881,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.QBittorrentTests Size = 1000, Progress = 1.0, Eta = 8640000, - State = "pausedUP", + State = state, Label = category, SavePath = "", Ratio = 1.0f diff --git a/src/NzbDrone.Core/Download/Clients/QBittorrent/QBittorrent.cs b/src/NzbDrone.Core/Download/Clients/QBittorrent/QBittorrent.cs index a1b5d9071..7452b3d0a 100644 --- a/src/NzbDrone.Core/Download/Clients/QBittorrent/QBittorrent.cs +++ b/src/NzbDrone.Core/Download/Clients/QBittorrent/QBittorrent.cs @@ -237,7 +237,7 @@ namespace NzbDrone.Core.Download.Clients.QBittorrent // Avoid removing torrents that haven't reached the global max ratio. // Removal also requires the torrent to be paused, in case a higher max ratio was set on the torrent itself (which is not exposed by the api). - item.CanMoveFiles = item.CanBeRemoved = torrent.State == "pausedUP" && HasReachedSeedLimit(torrent, config); + item.CanMoveFiles = item.CanBeRemoved = torrent.State is "pausedUP" or "stoppedUP" && HasReachedSeedLimit(torrent, config); switch (torrent.State) { @@ -246,7 +246,8 @@ namespace NzbDrone.Core.Download.Clients.QBittorrent item.Message = "qBittorrent is reporting an error"; break; - case "pausedDL": // torrent is paused and has NOT finished downloading + case "stoppedDL": // torrent is stopped and has NOT finished downloading + case "pausedDL": // torrent is paused and has NOT finished downloading (qBittorrent < 5) item.Status = DownloadItemStatus.Paused; break; @@ -257,7 +258,8 @@ namespace NzbDrone.Core.Download.Clients.QBittorrent item.Status = DownloadItemStatus.Queued; break; - case "pausedUP": // torrent is paused and has finished downloading + case "pausedUP": // torrent is paused and has finished downloading (qBittorent < 5) + case "stoppedUP": // torrent is stopped and has finished downloading case "uploading": // torrent is being seeded and data is being transferred case "stalledUP": // torrent is being seeded, but no connection were made case "queuedUP": // queuing is enabled and torrent is queued for upload From 9f8c4530cabc761e84d1c6006bd29d7bb8191b2d Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Fri, 3 May 2024 20:53:03 -0700 Subject: [PATCH 009/348] New: Dark theme for login screen (cherry picked from commit cae134ec7b331d1c906343716472f3d043614b2c) Closes #4798 --- frontend/src/App/App.js | 9 +- frontend/src/App/ApplyTheme.js | 50 ---------- frontend/src/App/ApplyTheme.tsx | 37 ++++++++ frontend/src/Styles/Themes/index.js | 2 +- frontend/src/login.html | 93 +++++++++++++++---- frontend/src/typings/UiSettings.ts | 1 + .../Frontend/Mappers/HtmlMapperBase.cs | 2 +- .../Frontend/Mappers/LoginHtmlMapper.cs | 13 +++ 8 files changed, 131 insertions(+), 76 deletions(-) delete mode 100644 frontend/src/App/ApplyTheme.js create mode 100644 frontend/src/App/ApplyTheme.tsx diff --git a/frontend/src/App/App.js b/frontend/src/App/App.js index 3871b14e9..9e8d508ac 100644 --- a/frontend/src/App/App.js +++ b/frontend/src/App/App.js @@ -12,11 +12,10 @@ function App({ store, history }) { - - - - - + + + + diff --git a/frontend/src/App/ApplyTheme.js b/frontend/src/App/ApplyTheme.js deleted file mode 100644 index 7e937e586..000000000 --- a/frontend/src/App/ApplyTheme.js +++ /dev/null @@ -1,50 +0,0 @@ -import PropTypes from 'prop-types'; -import React, { Fragment, useCallback, useEffect } from 'react'; -import { connect } from 'react-redux'; -import { createSelector } from 'reselect'; -import themes from 'Styles/Themes'; - -function createMapStateToProps() { - return createSelector( - (state) => state.settings.ui.item.theme || window.Lidarr.theme, - ( - theme - ) => { - return { - theme - }; - } - ); -} - -function ApplyTheme({ theme, children }) { - // Update the CSS Variables - - const updateCSSVariables = useCallback(() => { - const arrayOfVariableKeys = Object.keys(themes[theme]); - const arrayOfVariableValues = Object.values(themes[theme]); - - // Loop through each array key and set the CSS Variables - arrayOfVariableKeys.forEach((cssVariableKey, index) => { - // Based on our snippet from MDN - document.documentElement.style.setProperty( - `--${cssVariableKey}`, - arrayOfVariableValues[index] - ); - }); - }, [theme]); - - // On Component Mount and Component Update - useEffect(() => { - updateCSSVariables(theme); - }, [updateCSSVariables, theme]); - - return {children}; -} - -ApplyTheme.propTypes = { - theme: PropTypes.string.isRequired, - children: PropTypes.object.isRequired -}; - -export default connect(createMapStateToProps)(ApplyTheme); diff --git a/frontend/src/App/ApplyTheme.tsx b/frontend/src/App/ApplyTheme.tsx new file mode 100644 index 000000000..e04dda8c4 --- /dev/null +++ b/frontend/src/App/ApplyTheme.tsx @@ -0,0 +1,37 @@ +import React, { Fragment, ReactNode, useCallback, useEffect } from 'react'; +import { useSelector } from 'react-redux'; +import { createSelector } from 'reselect'; +import themes from 'Styles/Themes'; +import AppState from './State/AppState'; + +interface ApplyThemeProps { + children: ReactNode; +} + +function createThemeSelector() { + return createSelector( + (state: AppState) => state.settings.ui.item.theme || window.Lidarr.theme, + (theme) => { + return theme; + } + ); +} + +function ApplyTheme({ children }: ApplyThemeProps) { + const theme = useSelector(createThemeSelector()); + + const updateCSSVariables = useCallback(() => { + Object.entries(themes[theme]).forEach(([key, value]) => { + document.documentElement.style.setProperty(`--${key}`, value); + }); + }, [theme]); + + // On Component Mount and Component Update + useEffect(() => { + updateCSSVariables(); + }, [updateCSSVariables, theme]); + + return {children}; +} + +export default ApplyTheme; diff --git a/frontend/src/Styles/Themes/index.js b/frontend/src/Styles/Themes/index.js index d93c5dd8c..4dec39164 100644 --- a/frontend/src/Styles/Themes/index.js +++ b/frontend/src/Styles/Themes/index.js @@ -2,7 +2,7 @@ import * as dark from './dark'; import * as light from './light'; const defaultDark = window.matchMedia('(prefers-color-scheme: dark)').matches; -const auto = defaultDark ? { ...dark } : { ...light }; +const auto = defaultDark ? dark : light; export default { auto, diff --git a/frontend/src/login.html b/frontend/src/login.html index 9474c8544..874a7c426 100644 --- a/frontend/src/login.html +++ b/frontend/src/login.html @@ -57,8 +57,8 @@