mirror of
https://github.com/Readarr/Readarr.git
synced 2026-03-09 15:00:14 -04:00
Compare commits
14 Commits
v0.4.16.27
...
develop
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0b79d3000d | ||
|
|
0f3e716044 | ||
|
|
f53c4dc017 | ||
|
|
f48eac7e36 | ||
|
|
7cc02f95af | ||
|
|
1f92bf6679 | ||
|
|
a8d4aa6770 | ||
|
|
7661b5bc87 | ||
|
|
200ef600cd | ||
|
|
ad6228983b | ||
|
|
582ec9f7ce | ||
|
|
525e855038 | ||
|
|
7a629ed044 | ||
|
|
7f501322dd |
20
README.md
20
README.md
@@ -1,3 +1,23 @@
|
||||
# Announcement: Retirement of Readarr
|
||||
|
||||
We would like to announce that the [Readarr project](<https://github.com/Readarr/Readarr>) has been retired. This difficult decision was made due to a combination of factors: the project's metadata has become unusable, we no longer have the time to remake or repair it, and the community effort to transition to using Open Library as the source has stalled without much progress.
|
||||
|
||||
Third-party metadata mirrors exist, but as we're not involved with them at all, we cannot provide support for them. Use of them is entirely at your own risk. The most popular mirror appears to be [rreading-glasses](<https://github.com/blampe/rreading-glasses>).
|
||||
|
||||
Without anyone to take over Readarr development, we expect it to wither away, so we still encourage you to seek alternatives to Readarr.
|
||||
|
||||
## Key Points:
|
||||
- **Effective Immediately**: The retirement takes effect immediately. Please stay tuned for any possible further communications.
|
||||
- **Support Window**: We will provide support during a brief transition period to help with troubleshooting non metadata related issues.
|
||||
- **Alternative Solutions**: Users are encouraged to explore and adopt any other possible solutions as alternatives to Readarr.
|
||||
- **Opportunities for Revival**: We are open to someone taking over and revitalizing the project. If you are interested, please get in touch.
|
||||
- **Gratitude**: We extend our deepest gratitude to all the contributors and community members who supported Readarr over the years.
|
||||
|
||||
Thank you for being part of the Readarr journey. For any inquiries or assistance during this transition, please contact our team.
|
||||
|
||||
Sincerely,
|
||||
The Servarr Team
|
||||
|
||||
# Readarr
|
||||
|
||||
[](https://dev.azure.com/Readarr/Readarr/_build/latest?definitionId=1&branchName=develop)
|
||||
|
||||
@@ -9,7 +9,7 @@ variables:
|
||||
testsFolder: './_tests'
|
||||
yarnCacheFolder: $(Pipeline.Workspace)/.yarn
|
||||
nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages
|
||||
majorVersion: '0.4.16'
|
||||
majorVersion: '0.4.19'
|
||||
minorVersion: $[counter('minorVersion', 1)]
|
||||
readarrVersion: '$(majorVersion).$(minorVersion)'
|
||||
buildName: '$(Build.SourceBranchName).$(readarrVersion)'
|
||||
|
||||
@@ -40,15 +40,16 @@ namespace NzbDrone.Automation.Test
|
||||
var service = ChromeDriverService.CreateDefaultService();
|
||||
|
||||
// Timeout as windows automation tests seem to take alot longer to get going
|
||||
driver = new ChromeDriver(service, options, new TimeSpan(0, 3, 0));
|
||||
driver = new ChromeDriver(service, options, TimeSpan.FromMinutes(3));
|
||||
|
||||
driver.Manage().Window.Size = new System.Drawing.Size(1920, 1080);
|
||||
driver.Manage().Window.FullScreen();
|
||||
|
||||
_runner = new NzbDroneRunner(LogManager.GetCurrentClassLogger(), null);
|
||||
_runner.KillAll();
|
||||
_runner.Start(true);
|
||||
|
||||
driver.Url = "http://localhost:8787";
|
||||
driver.Navigate().GoToUrl("http://localhost:8787");
|
||||
|
||||
var page = new PageBase(driver);
|
||||
page.WaitForNoSpinner();
|
||||
@@ -68,7 +69,7 @@ namespace NzbDrone.Automation.Test
|
||||
{
|
||||
try
|
||||
{
|
||||
var image = ((ITakesScreenshot)driver).GetScreenshot();
|
||||
var image = (driver as ITakesScreenshot).GetScreenshot();
|
||||
image.SaveAsFile($"./{name}_test_screenshot.png", ScreenshotImageFormat.Png);
|
||||
}
|
||||
catch (Exception ex)
|
||||
|
||||
@@ -1,19 +1,17 @@
|
||||
using System;
|
||||
using System.Threading;
|
||||
using OpenQA.Selenium;
|
||||
using OpenQA.Selenium.Remote;
|
||||
using OpenQA.Selenium.Support.UI;
|
||||
|
||||
namespace NzbDrone.Automation.Test.PageModel
|
||||
{
|
||||
public class PageBase
|
||||
{
|
||||
private readonly RemoteWebDriver _driver;
|
||||
private readonly IWebDriver _driver;
|
||||
|
||||
public PageBase(RemoteWebDriver driver)
|
||||
public PageBase(IWebDriver driver)
|
||||
{
|
||||
_driver = driver;
|
||||
driver.Manage().Window.Maximize();
|
||||
}
|
||||
|
||||
public IWebElement FindByClass(string className, int timeout = 5)
|
||||
|
||||
@@ -17,7 +17,7 @@ namespace NzbDrone.Common.Reflection
|
||||
|
||||
public static List<Type> ImplementationsOf<T>(this Assembly assembly)
|
||||
{
|
||||
return assembly.GetTypes().Where(c => typeof(T).IsAssignableFrom(c)).ToList();
|
||||
return assembly.GetExportedTypes().Where(c => typeof(T).IsAssignableFrom(c)).ToList();
|
||||
}
|
||||
|
||||
public static bool IsSimpleType(this Type type)
|
||||
@@ -68,7 +68,7 @@ namespace NzbDrone.Common.Reflection
|
||||
|
||||
public static Type FindTypeByName(this Assembly assembly, string name)
|
||||
{
|
||||
return assembly.GetTypes().SingleOrDefault(c => c.Name.Equals(name, StringComparison.InvariantCultureIgnoreCase));
|
||||
return assembly.GetExportedTypes().SingleOrDefault(c => c.Name.Equals(name, StringComparison.InvariantCultureIgnoreCase));
|
||||
}
|
||||
|
||||
public static bool HasAttribute<TAttribute>(this Type type)
|
||||
|
||||
@@ -13,7 +13,7 @@ using NzbDrone.Core.Test.Framework;
|
||||
namespace NzbDrone.Core.Test.MetadataSource.Goodreads
|
||||
{
|
||||
[TestFixture]
|
||||
[Ignore("Waiting for metadata to be back again", Until = "2025-05-15 00:00:00Z")]
|
||||
[Ignore("Waiting for metadata to be back again", Until = "2026-01-15 00:00:00Z")]
|
||||
public class BookInfoProxyFixture : CoreTest<BookInfoProxy>
|
||||
{
|
||||
private MetadataProfile _metadataProfile;
|
||||
|
||||
@@ -15,7 +15,7 @@ using NzbDrone.Test.Common;
|
||||
namespace NzbDrone.Core.Test.MetadataSource.Goodreads
|
||||
{
|
||||
[TestFixture]
|
||||
[Ignore("Waiting for metadata to be back again", Until = "2025-05-15 00:00:00Z")]
|
||||
[Ignore("Waiting for metadata to be back again", Until = "2026-01-15 00:00:00Z")]
|
||||
public class BookInfoProxySearchFixture : CoreTest<BookInfoProxy>
|
||||
{
|
||||
[SetUp]
|
||||
|
||||
@@ -222,7 +222,7 @@ namespace NzbDrone.Core.Books
|
||||
|
||||
protected override void DeleteEntity(Author local, bool deleteFiles)
|
||||
{
|
||||
_authorService.DeleteAuthor(local.Id, true);
|
||||
_authorService.DeleteAuthor(local.Id, deleteFiles);
|
||||
}
|
||||
|
||||
protected override List<Book> GetRemoteChildren(Author local, Author remote)
|
||||
|
||||
@@ -239,7 +239,7 @@ namespace NzbDrone.Core.Books
|
||||
|
||||
protected override void DeleteEntity(Book local, bool deleteFiles)
|
||||
{
|
||||
_bookService.DeleteBook(local.Id, true);
|
||||
_bookService.DeleteBook(local.Id, deleteFiles);
|
||||
}
|
||||
|
||||
protected override List<Edition> GetRemoteChildren(Book local, Book remote)
|
||||
|
||||
@@ -126,7 +126,7 @@ namespace NzbDrone.Core.Books
|
||||
if (ShouldDelete(local))
|
||||
{
|
||||
_logger.Warn($"{typeof(TEntity).Name} {local} not found in metadata and is being deleted");
|
||||
DeleteEntity(local, true);
|
||||
DeleteEntity(local, false);
|
||||
return false;
|
||||
}
|
||||
else
|
||||
|
||||
@@ -40,6 +40,7 @@ namespace NzbDrone.Core.Datastore
|
||||
Environment.SetEnvironmentVariable("No_Expand", "true");
|
||||
Environment.SetEnvironmentVariable("No_SQLiteXmlConfigFile", "true");
|
||||
Environment.SetEnvironmentVariable("No_PreLoadSQLite", "true");
|
||||
Environment.SetEnvironmentVariable("No_SQLiteFunctions", "true");
|
||||
}
|
||||
|
||||
public DbFactory(IMigrationController migrationController,
|
||||
|
||||
@@ -237,7 +237,7 @@
|
||||
"PosterSize": "Tamaño de póster",
|
||||
"PreviewRename": "Previsualizar renombrado",
|
||||
"Profiles": "Perfiles",
|
||||
"Proper": "Proper",
|
||||
"Proper": "Correcto",
|
||||
"PropersAndRepacks": "Propers y Repacks",
|
||||
"Protocol": "Protocolo",
|
||||
"ProtocolHelpText": "Elige qué protocolo(s) usar y cuál se prefiere cuando se elige entre lanzamientos equivalentes",
|
||||
@@ -564,7 +564,7 @@
|
||||
"Label": "Etiqueta",
|
||||
"MissingFromDisk": "Readarr no pudo encontrar el archivo en el disco, por lo que el archivo fue desvinculado del libro en la base de datos",
|
||||
"RemotePathMappingCheckDownloadPermissions": "Readarr puede ver pero no acceder al libro descargado {0}. Probablemente sea un error de permisos.",
|
||||
"RemotePathMappingCheckFolderPermissions": "Readarr puede ver pero no acceder al directorio de descarga {0}. Probablemente sea un error de permisos.",
|
||||
"RemotePathMappingCheckFolderPermissions": "Readarr puede ver pero no acceder al directorio de descarga {1}. Probablemente sea un error de permisos.",
|
||||
"RemotePathMappingCheckFilesGenericPermissions": "El cliente de descarga {0} informó de la existencia de archivos en {1} pero Readarr no puede ver este directorio. Puede que tengas que ajustar los permisos de la carpeta.",
|
||||
"RemotePathMappingCheckGenericPermissions": "El cliente de descarga {0} coloca las descargas en {1} pero Readarr no puede ver este directorio. Puede que tengas que ajustar los permisos de la carpeta.",
|
||||
"RemotePathMappingCheckImportFailed": "Readarr falló al importar un libro. Comprueba tus registros para más detalles.",
|
||||
@@ -855,13 +855,13 @@
|
||||
"NotificationsSettingsUseSslHelpText": "Conectar a {serviceName} sobre HTTPS en vez de HTTP",
|
||||
"Rejections": "Rechazados",
|
||||
"SelectIndexerFlags": "Seleccionar indicadores del indexador",
|
||||
"RecycleBinUnableToWriteHealthCheck": "No se pudo escribir en la carpeta configurada de la papelera de reciclaje: {path}. Asegúrate de que esta ruta existe y es modificable por el usuario que ejecuta {appName}",
|
||||
"RecycleBinUnableToWriteHealthCheck": "No se pudo escribir en la carpeta configurada de la papelera de reciclaje: {0}. Asegúrate de que esta ruta existe y es modificable por el usuario que ejecuta Readarr",
|
||||
"SearchForAllMissingBooks": "Buscar todos los episodios perdidos",
|
||||
"IndexerIdHelpText": "Especifica a qué indexador se aplica el perfil",
|
||||
"ProfilesSettingsSummary": "Perfiles de calidad, de retraso de idioma y de lanzamiento",
|
||||
"DataExistingBooks": "Monitoriza libros que no tienen archivos o que no se han lanzado aún",
|
||||
"MonitoredAuthorIsMonitored": "El artista no está vigilado",
|
||||
"RemotePathMappingsInfo": "Los mapeos de ruta remota son muy raramente solicitados, si {appName} y tu cliente de descarga están en el mismo sistema es mejor coincidir sus rutas. Para más información consulta la [wiki]({wikiLink}).",
|
||||
"RemotePathMappingsInfo": "Los mapeos de ruta remota son muy raramente requeridos, si {app} y tu cliente de descarga están en el mismo sistema es mejor coincidir sus rutas. Para más información consulta la [wiki]({wikiLink}).",
|
||||
"ShowBannersHelpText": "Muestra carteles en lugar de nombres",
|
||||
"DefaultTagsHelpText": "Etiquetas predeterminadas de Readarr para los autores detectados en esta carpeta",
|
||||
"UseSSL": "Usar SSL",
|
||||
|
||||
@@ -1119,6 +1119,8 @@
|
||||
"IgnoreDeletedBooks": "Ohita poistetut kirjat",
|
||||
"LastSearched": "Edellinen haku",
|
||||
"Unknown": "Tuntematon",
|
||||
"AddNewAuthorRootFolderHelpText": "\"{folder}\" -alikansio luodaan automaattisesti.",
|
||||
"AddRootFolder": "Lisää juurikansio"
|
||||
"AddNewAuthorRootFolderHelpText": "Alikansio \"{folder}\" luodaan automaattisesti.",
|
||||
"AddRootFolder": "Lisää juurikansio",
|
||||
"AddNewBook": "Lisää uusi kirja",
|
||||
"AddNewAuthor": "Lisää uusi kirjailija"
|
||||
}
|
||||
|
||||
@@ -725,7 +725,7 @@
|
||||
"AppUpdated": "{appName} Aggiornato",
|
||||
"AllResultsAreHiddenByTheAppliedFilter": "Tutti i risultati sono nascosti dal filtro applicato",
|
||||
"AutoRedownloadFailed": "Download fallito",
|
||||
"AddListExclusion": "Aggiungi elenco esclusioni",
|
||||
"AddListExclusion": "Aggiungi lista esclusioni",
|
||||
"Location": "Posizione",
|
||||
"ListsSettingsSummary": "Liste",
|
||||
"RecentChanges": "Cambiamenti Recenti",
|
||||
@@ -915,5 +915,7 @@
|
||||
"AutoRedownloadFailedFromInteractiveSearchHelpText": "Cerca automaticamente e tenta di scaricare una versione diversa quando il rilascio non riuscito è stato acquisito dalla ricerca interattiva",
|
||||
"Unknown": "Sconosciuto",
|
||||
"AddNewAuthorRootFolderHelpText": "La sottocartella '{0}' verrà creata automaticamente",
|
||||
"AddRootFolder": "Aggiungi Cartella Radice"
|
||||
"AddRootFolder": "Aggiungi Cartella Radice",
|
||||
"AddNewBook": "Aggiungi nuovo libro",
|
||||
"AddNewAuthor": "Aggiungi nuovo autore"
|
||||
}
|
||||
|
||||
@@ -4,8 +4,8 @@
|
||||
"AlternateTitles": "대체 제목",
|
||||
"Analytics": "해석학",
|
||||
"DownloadPropersAndRepacksHelpTexts1": "Propers / Repacks로 자동 업그레이드할지 여부",
|
||||
"20MinutesTwenty": "120 분 : {0}",
|
||||
"45MinutesFourtyFive": "60 분 : {0}",
|
||||
"20MinutesTwenty": "20분 : {0}",
|
||||
"45MinutesFourtyFive": "45분 : {0}",
|
||||
"ChownGroupHelpText": "그룹 이름 또는 gid. 원격 파일 시스템에 gid를 사용하십시오.",
|
||||
"DeleteReleaseProfile": "지연 프로필 삭제",
|
||||
"DeleteIndexer": "인덱서 삭제",
|
||||
|
||||
@@ -208,5 +208,6 @@
|
||||
"RequiredPlaceHolder": "Legg til ny begrensning",
|
||||
"UnableToAddANewRemotePathMappingPleaseTryAgain": "Kunne ikke legge til ny ekstern stimapping, vennligst prøv igjen.",
|
||||
"AddNewAuthorRootFolderHelpText": "Undermappa \"{folder}\" vil bli automatisk laget",
|
||||
"AddRootFolder": "Legg til rotmappe"
|
||||
"AddRootFolder": "Legg til rotmappe",
|
||||
"History": "Historikk"
|
||||
}
|
||||
|
||||
@@ -50,22 +50,22 @@
|
||||
"ChangeHasNotBeenSavedYet": "Wijziging is nog niet opgeslagen",
|
||||
"ChmodFolder": "chmod Map",
|
||||
"ChmodFolderHelpText": "Octaal, toegepast tijdens importeren/hernoemen op media mappen en bestanden (zonder uitvoeringsbits)",
|
||||
"ChmodFolderHelpTextWarning": "Dit werkt alleen als de gebruiker die {appName} draait de eigenaar is van het bestand. Het is beter om zeker te zijn dat de downloader de juiste rechten zet.",
|
||||
"ChownGroupHelpText": "Groep naam of gid. Gebruik gid voor externe bestandssystemen.",
|
||||
"ChownGroupHelpTextWarning": "Dit werkt alleen als de gebruiker die {appName} draait de eigenaar is van het bestand. Het is beter om zeker te zijn dat de downloader dezelfde groep gebruikt als {appName}.",
|
||||
"ChmodFolderHelpTextWarning": "Dit werkt alleen als de gebruiker die {appName} uitvoert de eigenaar is van het bestand. Het is beter om ervoor te zorgen dat de downloadclient de juiste rechten instelt.",
|
||||
"ChownGroupHelpText": "Groepsnaam of gid. Gebruik gid voor externe bestandssystemen.",
|
||||
"ChownGroupHelpTextWarning": "Dit werkt alleen als de gebruiker die {appName} uitvoert de eigenaar is van het bestand. Het is beter om ervoor te zorgen dat de downloadclient dezelfde groep gebruikt als {appName}.",
|
||||
"Clear": "Wis",
|
||||
"ClickToChangeQuality": "Klik om kwaliteit te wijzigen",
|
||||
"ClientPriority": "Client Prioriteit",
|
||||
"CloneIndexer": "Dupliceer Indexeerder",
|
||||
"CloneProfile": "Dupliceer Profiel",
|
||||
"Close": "Sluit",
|
||||
"ClientPriority": "Prioriteit Client",
|
||||
"CloneIndexer": "Indexeerder Dupliceren",
|
||||
"CloneProfile": "Profiel Dupliceren",
|
||||
"Close": "Sluiten",
|
||||
"Columns": "Kolommen",
|
||||
"CompletedDownloadHandling": "Voltooide Download Afhandeling",
|
||||
"ConnectSettings": "Connecties Instellingen",
|
||||
"Connections": "Connecties",
|
||||
"CopyUsingHardlinksHelpText": "Gebruik hardlinks bij het kopiëren van torrent bestanden die nog actief zijn",
|
||||
"CopyUsingHardlinksHelpTextWarning": "Sporadisch kan bestandsvergrendeling het hernoemen van in gebruik zijnde bestanden blokkeren. Als noodoplossing kunt u de hernoem functie van {appName} gebruiken na het opheffen van de bestandsvergrendeling.",
|
||||
"CreateEmptyAuthorFoldersHelpText": "Film mappen aanmaken voor ontbrekende films tijdens schijfscan",
|
||||
"CompletedDownloadHandling": "Afhandeling Voltooide Downloads",
|
||||
"ConnectSettings": "Instellingen Verbindingen",
|
||||
"Connections": "Verbindingen",
|
||||
"CopyUsingHardlinksHelpText": "Hardlinks staan {appName} toe om torrents te importeren die nog actief zijn zonder extra opslag in beslag te nemen of het volledige bestand te kopiëren. Hardlinks werken alleen maar als de bron en de bestemming zich op hetzelfde opslagvolume bevinden",
|
||||
"CopyUsingHardlinksHelpTextWarning": "Sporadisch kan bestandsvergrendeling het hernoemen van bestanden blokkeren die geseed worden. Als tijdelijke oplossing kan u seeden uitzetten en de hernoemfunctie van {appName} gebruiken.",
|
||||
"CreateEmptyAuthorFoldersHelpText": "Ontbrekende auteursmappen aanmaken tijdens schijfscan",
|
||||
"CreateGroup": "Groep aanmaken",
|
||||
"CutoffHelpText": "Wanneer deze kwaliteit is behaald, zal {appName} niet langer films downloaden",
|
||||
"CutoffUnmet": "Onbereikte Drempel",
|
||||
@@ -104,7 +104,7 @@
|
||||
"DetailedProgressBarHelpText": "Toon tekst op voortgangsbalk",
|
||||
"DiskSpace": "Schijfruimte",
|
||||
"Docker": "Docker",
|
||||
"DownloadClient": "Downloader",
|
||||
"DownloadClient": "Downloadclient",
|
||||
"DownloadClientSettings": "Downloader Instellingen",
|
||||
"DownloadClients": "Downloaders",
|
||||
"DownloadFailedCheckDownloadClientForMoreDetails": "Download mislukt: controleer de downloader voor meer details",
|
||||
@@ -435,7 +435,7 @@
|
||||
"ProxyPasswordHelpText": "Je moet alleen een gebruikersnaam en wachtwoord ingeven als dit vereist is, laat ze anders leeg.",
|
||||
"SslCertPathHelpTextWarning": "Herstarten vereist om in werking te treden",
|
||||
"UnableToLoadMetadataProfiles": "Vertragingsprofielen kunnen niet worden geladen",
|
||||
"DownloadClientCheckDownloadingToRoot": "Downloadclient {0} plaatst downloads in de hoofdmap {1}. U mag niet naar een hoofdmap downloaden.",
|
||||
"DownloadClientCheckDownloadingToRoot": "Downloadclient {0} plaatst downloads in de hoofdmap {1}. Het wordt afgeraden om naar een hoofdmap downloaden.",
|
||||
"MaintenanceRelease": "Onderhoudsuitgave",
|
||||
"Actions": "Acties",
|
||||
"Tomorrow": "Morgen",
|
||||
@@ -493,7 +493,7 @@
|
||||
"MissingFromDisk": "{appName} kon het bestand niet vinden op de schijf dus werd het verwijderd",
|
||||
"Disabled": "Uitgeschakeld",
|
||||
"IndexerPriorityHelpText": "Indexeerder Prioriteit van 1 (Hoogste) tot 50 (Laagste). Standaard: 25.",
|
||||
"ConnectSettingsSummary": "Notificaties, connecties met media servers/spelers en scripts",
|
||||
"ConnectSettingsSummary": "Meldingen, verbindingen met mediaservers/spelers en scripts",
|
||||
"DownloadClientCheckNoneAvailableMessage": "Er is geen downloader beschikbaar",
|
||||
"DownloadClientCheckUnableToCommunicateMessage": "Niet in staat om te communiceren met {0}.",
|
||||
"IndexersSettingsSummary": "Indexeerders en uitgave restricties",
|
||||
@@ -559,7 +559,7 @@
|
||||
"OnBookFileDeleteHelpText": "Op filmbestand verwijderen",
|
||||
"UpdateCheckStartupTranslocationMessage": "Kan de update niet installeren omdat de map '{0}' zich in een 'App Translocation' map bevindt.",
|
||||
"WriteTagsNo": "Nooit",
|
||||
"Connect": "Connecties",
|
||||
"Connect": "Verbindingen",
|
||||
"General": "Algemeen",
|
||||
"Lists": "Lijsten",
|
||||
"ProxyCheckBadRequestMessage": "Testen van proxy is mislukt. Statuscode: {0}",
|
||||
@@ -568,7 +568,7 @@
|
||||
"TimeLeft": "Resterende Tijd",
|
||||
"UpdateCheckStartupNotWritableMessage": "Kan de update niet installeren omdat de map '{0}' niet schrijfbaar is voor de gebruiker '{1}'.",
|
||||
"CouldntFindAnyResultsForTerm": "Kon geen resultaten vinden voor '{0}'",
|
||||
"CreateEmptyAuthorFolders": "Lege film mappen aanmaken",
|
||||
"CreateEmptyAuthorFolders": "Lege auteursmappen aanmaken",
|
||||
"FileWasDeletedByViaUI": "File werd verwijderd via de UI",
|
||||
"RestartRequiredHelpTextWarning": "Herstarten vereist om in werking te treden",
|
||||
"AddList": "Lijst Toevoegen",
|
||||
@@ -588,16 +588,16 @@
|
||||
"ApplicationUrlHelpText": "De externe URL van deze applicatie inclusief http(s)://,Port en URL base",
|
||||
"ImportListExclusions": "Verwijder van Uitzonderingenlijst",
|
||||
"MetadataProfile": "Metadata profiel toevoegen",
|
||||
"ChooseImportMethod": "Kies Importmodus",
|
||||
"ClickToChangeReleaseGroup": "Klik om de releasegroep te wijzigen",
|
||||
"ChooseImportMethod": "Kies Importmethode",
|
||||
"ClickToChangeReleaseGroup": "Klik om de uitgavegroep te wijzigen",
|
||||
"HardlinkCopyFiles": "Hardlink/Kopieer Bestanden",
|
||||
"OnApplicationUpdate": "Bij applicatie update",
|
||||
"MoveFiles": "Verplaats Bestanden",
|
||||
"OnApplicationUpdateHelpText": "Bij applicatie update",
|
||||
"BypassIfHighestQuality": "Omzeilen indien de hoogste kwaliteit",
|
||||
"CustomFormatScore": "Eigen Formaat Score",
|
||||
"CustomFormatScore": "Aangepaste Formaatscore",
|
||||
"MinimumCustomFormatScore": "Minimum Eigen Formaat Score",
|
||||
"Conditions": "Condities",
|
||||
"Conditions": "Voorwaarden",
|
||||
"DeleteCustomFormat": "Verwijder Eigen Formaat",
|
||||
"DeleteCustomFormatMessageText": "Bent u zeker dat u de indexeerder '{0}' wilt verwijderen?",
|
||||
"DeleteFormatMessageText": "Weet je zeker dat je formaat tag {0} wilt verwijderen?",
|
||||
@@ -607,12 +607,12 @@
|
||||
"NegateHelpText": "Indien aangevinkt, zal het eigen formaat niet worden toegepast indien deze {0} conditie overeenstemt.",
|
||||
"UnableToLoadCustomFormats": "Eigen formaten kunnen niet worden geladen",
|
||||
"UpgradesAllowed": "Upgrades toegestaan",
|
||||
"CloneCustomFormat": "Dupliceer Eigen Formaat",
|
||||
"CopyToClipboard": "Kopieer naar Klembord",
|
||||
"CustomFormat": "Eigen Formaat",
|
||||
"CustomFormatSettings": "Eigen Formaten Instellingen",
|
||||
"CustomFormats": "Eigen Formaten",
|
||||
"CutoffFormatScoreHelpText": "Wanneer deze eigen formaat score is behaald, zal {appName} niet langer films downloaden",
|
||||
"CloneCustomFormat": "Aangepast Formaat Dupliceren",
|
||||
"CopyToClipboard": "Kopiëren naar klembord",
|
||||
"CustomFormat": "Aangepast Formaat",
|
||||
"CustomFormatSettings": "Aangepaste Formaatinstellingen",
|
||||
"CustomFormats": "Aangepaste Formaten",
|
||||
"CutoffFormatScoreHelpText": "Wanneer deze aangepaste formaatscore is behaald, zal {appName} niet langer boeken downloaden",
|
||||
"IncludeCustomFormatWhenRenamingHelpText": "Voeg toe aan het {Eigen Formaten} hernoemingsformaat",
|
||||
"ImportListMissingRoot": "Ontbrekende hoofdmap voor importlijst(en): {0}",
|
||||
"ImportListMultipleMissingRoots": "Er ontbreken meerdere hoofdmappen voor importlijsten: {0}",
|
||||
@@ -635,7 +635,7 @@
|
||||
"ResetTitles": "Reset titels",
|
||||
"ApplyTagsHelpTextHowToApplyIndexers": "Hoe tags toepassen op de geselecteerde indexeerders",
|
||||
"AutomaticAdd": "Automatisch Toevoegen",
|
||||
"CloneCondition": "Kloon Conditie",
|
||||
"CloneCondition": "Voorwaarde dupliceren",
|
||||
"ApplyTagsHelpTextHowToApplyImportLists": "Hoe tags toepassen op de geselecteerde import lijsten",
|
||||
"ApplyChanges": "Pas Wijzigingen Toe",
|
||||
"ApplyTagsHelpTextAdd": "Toevoegen: Voeg de tags toe aan de bestaande tag lijst",
|
||||
@@ -662,7 +662,7 @@
|
||||
"No": "Nee",
|
||||
"NoChange": "Geen Wijziging",
|
||||
"ApplyTagsHelpTextHowToApplyAuthors": "Hoe tags toe te passen op de geselecteerd films",
|
||||
"CountDownloadClientsSelected": "{count} download client(s) geselecteerd",
|
||||
"CountDownloadClientsSelected": "{selectedCount} downloadclient(s) geselecteerd",
|
||||
"DeleteConditionMessageText": "Bent u zeker dat u de lijst '{name}' wilt verwijderen?",
|
||||
"FreeSpace": "Vrije Ruimte",
|
||||
"ImportLists": "importlijst",
|
||||
@@ -685,7 +685,7 @@
|
||||
"RemoveSelectedItem": "Verwijder geselecteerde item",
|
||||
"DeleteSelectedIndexers": "Verwijder Indexeerder",
|
||||
"ExistingTag": "Bestaande tag",
|
||||
"ConnectionLost": "Verbinding Onderbroken",
|
||||
"ConnectionLost": "Verbinding Verbroken",
|
||||
"LastDuration": "Laatste Looptijd",
|
||||
"Medium": "Gemiddeld",
|
||||
"NoEventsFound": "Geen gebeurtenissen gevonden",
|
||||
@@ -694,7 +694,7 @@
|
||||
"EnableRssHelpText": "Wordt gebruikt wanneer {appName} periodiek zoekt naar uitgaven via RSS synchronisatie",
|
||||
"Location": "Locatie",
|
||||
"RecentChanges": "Recente wijzigingen",
|
||||
"CustomFilter": "Aangepaste Filters",
|
||||
"CustomFilter": "Aangepaste Filter",
|
||||
"ErrorLoadingContent": "Er ging iets fout bij het laden van dit item",
|
||||
"SourceTitle": "Bron Titel",
|
||||
"FailedLoadingSearchResults": "Fout bij laden van zoek resultaten, probeer het opnieuw.",
|
||||
@@ -740,20 +740,20 @@
|
||||
"DisabledForLocalAddresses": "Uitgeschakeld voor lokale adressen",
|
||||
"Enabled": "Ingeschakeld",
|
||||
"ApiKey": "API-sleutel",
|
||||
"ClickToChangeIndexerFlags": "Klik om indexeringsvlaggen te wijzigen",
|
||||
"ClickToChangeIndexerFlags": "Klik om indexeerdersvlaggen te wijzigen",
|
||||
"CustomFormatsSpecificationFlag": "Vlag",
|
||||
"CustomFormatsSpecificationRegularExpression": "Reguliere expressie",
|
||||
"BlocklistOnlyHint": "Blokkeer lijst zonder te zoeken naar een vervanger",
|
||||
"BlocklistAndSearch": "Blokkeerlijst en zoeken",
|
||||
"BlocklistAndSearchHint": "Een vervanger zoeken na het blokkeren",
|
||||
"BlocklistAndSearchMultipleHint": "Zoekopdrachten voor vervangers starten na het blokkeren van de lijst",
|
||||
"CustomFormatsSettingsTriggerInfo": "Een Aangepast Formaat wordt toegepast op een uitgave of bestand als het overeenkomt met ten minste één van de verschillende condities die zijn gekozen.",
|
||||
"ConnectionSettingsUrlBaseHelpText": "Voegt een voorvoegsel toe aan de {connectionName} url, zoals {url}",
|
||||
"CustomFormatsSettingsTriggerInfo": "Een aangepast formaat wordt toegepast op een uitgave of bestand wanneer het overeenkomt met ten minste één van elk van de verschillende voorwaarden die zijn gekozen.",
|
||||
"ConnectionSettingsUrlBaseHelpText": "Voegt een voorvoegsel toe aan de {connectionName} URL, zoals {url}",
|
||||
"BlocklistMultipleOnlyHint": "Blocklist zonder te zoeken naar vervangers",
|
||||
"BlocklistOnly": "Alleen bloklijst",
|
||||
"ChangeCategoryHint": "Verandert download naar de 'Post-Import Categorie' van Downloadclient",
|
||||
"Clone": "Kloon",
|
||||
"CustomFormatsSpecificationRegularExpressionHelpText": "Aangepaste opmaak RegEx is hoofdletterongevoelig",
|
||||
"Clone": "Dupliceren",
|
||||
"CustomFormatsSpecificationRegularExpressionHelpText": "RegEx van aangepaste formaten is hoofdletterongevoelig",
|
||||
"ChangeCategoryMultipleHint": "Wijzigt downloads naar de 'Post-Import Categorie' van Downloadclient",
|
||||
"BypassIfAboveCustomFormatScore": "Omzeilen indien boven aangepaste opmaak score",
|
||||
"BypassIfAboveCustomFormatScoreHelpText": "Schakel omleiding in als de release een score heeft die hoger is dan de geconfigureerde minimale aangepaste formaatscore",
|
||||
@@ -769,5 +769,17 @@
|
||||
"CurrentlyInstalled": "Momenteel Geïnstalleerd",
|
||||
"ExternalUpdater": "{appName} is geconfigureerd om een extern update mechanisme te gebruiken",
|
||||
"AddNewAuthorRootFolderHelpText": "'{0}' submap zal automatisch worden aangemaakt",
|
||||
"AddRootFolder": "Voeg hoofdmap toe"
|
||||
"AddRootFolder": "Voeg hoofdmap toe",
|
||||
"CollapseMultipleBooks": "Meerdere Boeken Samenvouwen",
|
||||
"Country": "Land",
|
||||
"CollapseMultipleBooksHelpText": "Meerdere boeken die op dezelfde dag worden uitgegeven samenvouwen",
|
||||
"ConvertToFormat": "Converteren Naar Formaat",
|
||||
"ContinuingMoreBooksAreExpected": "Er worden meer boeken verwacht",
|
||||
"CountAuthorsSelected": "{selectedCount} auteur(s) geselecteerd",
|
||||
"ContinuingNoAdditionalBooksAreExpected": "Er worden geen nieuwe boeken verwacht",
|
||||
"CountImportListsSelected": "{selectedCount} importeerlijst(en) geselecteerd",
|
||||
"CountIndexersSelected": "{selectedCount} indexeerder(s) geselecteerd",
|
||||
"Continuing": "Doorgaan",
|
||||
"ContinuingAllBooksDownloaded": "Doorgaan (Alle boeken gedownload)",
|
||||
"StatusEndedContinuing": "Doorgaan"
|
||||
}
|
||||
|
||||
@@ -965,5 +965,7 @@
|
||||
"Script": "Script",
|
||||
"UpdateAppDirectlyLoadError": "Não foi possível atualizar o {appName} diretamente,",
|
||||
"AddNewAuthorRootFolderHelpText": "A subpasta \"{0}\" será criada automaticamente",
|
||||
"AddRootFolder": "Adicionar pasta raiz"
|
||||
"AddRootFolder": "Adicionar pasta raiz",
|
||||
"ThereWasAnErrorLoadingThisItem": "Houve um erro ao carregar este item",
|
||||
"ThereWasAnErrorLoadingThisPage": "Houve um erro ao carregar esta página"
|
||||
}
|
||||
|
||||
@@ -202,5 +202,7 @@
|
||||
"AptUpdater": "Použiť apt pre inštaláciu aktualizácie",
|
||||
"BuiltIn": "Vstavaný",
|
||||
"AddRootFolder": "Pridať koreňový priečinok",
|
||||
"AddNewAuthorRootFolderHelpText": "'{folder}' podpriečinok sa vytvorí automaticky"
|
||||
"AddNewAuthorRootFolderHelpText": "'{folder}' podpriečinok sa vytvorí automaticky",
|
||||
"IgnoredPlaceHolder": "Pridať nové obmedzenie",
|
||||
"RequiredPlaceHolder": "Pridať nové obmedzenie"
|
||||
}
|
||||
|
||||
@@ -853,5 +853,12 @@
|
||||
"PreviouslyInstalled": "Раніше встановлений",
|
||||
"SetIndexerFlags": "Встановити прапорці індексатора",
|
||||
"AddRootFolder": "Додати корневий каталог",
|
||||
"AddNewAuthorRootFolderHelpText": "Вкладена папка \"{0}\" буде створена автоматично"
|
||||
"AddNewAuthorRootFolderHelpText": "Вкладена папка \"{0}\" буде створена автоматично",
|
||||
"WriteBookTagsHelpTextWarning": "Вибір \"Усі файли\" змінить існуючі файли під час їх імпорту.",
|
||||
"ForeignId": "Зовнішній ідентифікатор",
|
||||
"AudioFileMetadata": "Записувати метадані до аудіофайлів",
|
||||
"OnDownloadFailureHelpText": "При помилці завантаження",
|
||||
"WriteAudioTags": "Тегувати аудіофайли метаданими",
|
||||
"SearchForNewItems": "Пошук нових елементів",
|
||||
"WriteAudioTagsScrub": "Очистити існуючі теги"
|
||||
}
|
||||
|
||||
@@ -2,5 +2,6 @@
|
||||
"Analytics": "分析",
|
||||
"About": "关于",
|
||||
"Username": "用户名",
|
||||
"Activity": "111"
|
||||
"Activity": "111",
|
||||
"Actions": "Actions"
|
||||
}
|
||||
|
||||
@@ -30,13 +30,11 @@ namespace NzbDrone.Core.MediaCover
|
||||
private string _url;
|
||||
public string Url
|
||||
{
|
||||
get
|
||||
{
|
||||
return _url;
|
||||
}
|
||||
get => _url;
|
||||
set
|
||||
{
|
||||
_url = value;
|
||||
|
||||
if (Extension.IsNullOrWhiteSpace())
|
||||
{
|
||||
Extension = Path.GetExtension(value);
|
||||
@@ -46,6 +44,7 @@ namespace NzbDrone.Core.MediaCover
|
||||
|
||||
public MediaCoverTypes CoverType { get; set; }
|
||||
public string Extension { get; private set; }
|
||||
public string RemoteUrl { get; set; }
|
||||
|
||||
public MediaCover()
|
||||
{
|
||||
|
||||
@@ -90,7 +90,8 @@ namespace NzbDrone.Core.MediaCover
|
||||
// Author isn't in Readarr yet, map via a proxy to circument referrer issues
|
||||
foreach (var mediaCover in covers)
|
||||
{
|
||||
mediaCover.Url = _mediaCoverProxy.RegisterUrl(mediaCover.Url);
|
||||
mediaCover.RemoteUrl = mediaCover.Url;
|
||||
mediaCover.Url = _mediaCoverProxy.RegisterUrl(mediaCover.RemoteUrl);
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -104,6 +105,8 @@ namespace NzbDrone.Core.MediaCover
|
||||
|
||||
var filePath = GetCoverPath(entityId, coverEntity, mediaCover.CoverType, mediaCover.Extension, null);
|
||||
|
||||
mediaCover.RemoteUrl = mediaCover.Url;
|
||||
|
||||
if (coverEntity == MediaCoverEntity.Book)
|
||||
{
|
||||
mediaCover.Url = _configFileProvider.UrlBase + @"/MediaCover/Books/" + entityId + "/" + mediaCover.CoverType.ToString().ToLower() + GetExtension(mediaCover.CoverType, mediaCover.Extension);
|
||||
|
||||
@@ -103,8 +103,8 @@ namespace NzbDrone.Core.MetadataSource.BookInfo
|
||||
}
|
||||
catch (BookInfoException e)
|
||||
{
|
||||
_logger.Warn(e, "Unexpected error getting author info");
|
||||
throw new AuthorNotFoundException(foreignAuthorId);
|
||||
_logger.Warn(e, "Unexpected error getting author info: {foreignAuthorId}", foreignAuthorId);
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -126,8 +126,8 @@ namespace NzbDrone.Core.MetadataSource.BookInfo
|
||||
}
|
||||
catch (BookInfoException e)
|
||||
{
|
||||
_logger.Warn(e, "Unexpected error getting book info");
|
||||
throw new BookNotFoundException(foreignBookId);
|
||||
_logger.Warn(e, "Unexpected error getting book info: {foreignBookId}", foreignBookId);
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -430,7 +430,7 @@ namespace NzbDrone.Core.MetadataSource.BookInfo
|
||||
{
|
||||
var author = PollAuthor(newId);
|
||||
|
||||
book = author.Books.Value.Where(b => b.Editions.Value.Any(e => e.ForeignEditionId == id.ToString())).FirstOrDefault();
|
||||
book = author.Books.Value.FirstOrDefault(b => b.Editions.Value.Any(e => e.ForeignEditionId == id.ToString()));
|
||||
authors = new List<AuthorMetadata> { author.Metadata.Value };
|
||||
}
|
||||
else if (type == "work")
|
||||
|
||||
@@ -7,7 +7,7 @@ using Readarr.Api.V1.Author;
|
||||
namespace NzbDrone.Integration.Test.ApiTests
|
||||
{
|
||||
[TestFixture]
|
||||
[Ignore("Waiting for metadata to be back again", Until = "2025-05-15 00:00:00Z")]
|
||||
[Ignore("Waiting for metadata to be back again", Until = "2026-01-15 00:00:00Z")]
|
||||
public class AuthorEditorFixture : IntegrationTest
|
||||
{
|
||||
private void GivenExistingAuthor()
|
||||
|
||||
@@ -7,7 +7,7 @@ using NUnit.Framework;
|
||||
namespace NzbDrone.Integration.Test.ApiTests
|
||||
{
|
||||
[TestFixture]
|
||||
[Ignore("Waiting for metadata to be back again", Until = "2025-05-15 00:00:00Z")]
|
||||
[Ignore("Waiting for metadata to be back again", Until = "2026-01-15 00:00:00Z")]
|
||||
public class AuthorFixture : IntegrationTest
|
||||
{
|
||||
[Test]
|
||||
|
||||
@@ -4,7 +4,7 @@ using NUnit.Framework;
|
||||
namespace NzbDrone.Integration.Test.ApiTests
|
||||
{
|
||||
[TestFixture]
|
||||
[Ignore("Waiting for metadata to be back again", Until = "2025-05-15 00:00:00Z")]
|
||||
[Ignore("Waiting for metadata to be back again", Until = "2026-01-15 00:00:00Z")]
|
||||
public class AuthorLookupFixture : IntegrationTest
|
||||
{
|
||||
[TestCase("Robert Harris", "Robert Harris")]
|
||||
|
||||
@@ -6,7 +6,7 @@ using Readarr.Api.V1.Blocklist;
|
||||
namespace NzbDrone.Integration.Test.ApiTests
|
||||
{
|
||||
[TestFixture]
|
||||
[Ignore("Waiting for metadata to be back again", Until = "2025-05-15 00:00:00Z")]
|
||||
[Ignore("Waiting for metadata to be back again", Until = "2026-01-15 00:00:00Z")]
|
||||
public class BlocklistFixture : IntegrationTest
|
||||
{
|
||||
private AuthorResource _author;
|
||||
|
||||
@@ -9,7 +9,7 @@ using Readarr.Api.V1.Books;
|
||||
namespace NzbDrone.Integration.Test.ApiTests
|
||||
{
|
||||
[TestFixture]
|
||||
[Ignore("Waiting for metadata to be back again", Until = "2025-05-15 00:00:00Z")]
|
||||
[Ignore("Waiting for metadata to be back again", Until = "2026-01-15 00:00:00Z")]
|
||||
public class CalendarFixture : IntegrationTest
|
||||
{
|
||||
public ClientBase<BookResource> Calendar;
|
||||
|
||||
@@ -8,7 +8,7 @@ using Readarr.Api.V1.RootFolders;
|
||||
namespace NzbDrone.Integration.Test.ApiTests.WantedTests
|
||||
{
|
||||
[TestFixture]
|
||||
[Ignore("Waiting for metadata to be back again", Until = "2025-05-15 00:00:00Z")]
|
||||
[Ignore("Waiting for metadata to be back again", Until = "2026-01-15 00:00:00Z")]
|
||||
public class CutoffUnmetFixture : IntegrationTest
|
||||
{
|
||||
[SetUp]
|
||||
|
||||
@@ -7,7 +7,7 @@ using Readarr.Api.V1.RootFolders;
|
||||
namespace NzbDrone.Integration.Test.ApiTests.WantedTests
|
||||
{
|
||||
[TestFixture]
|
||||
[Ignore("Waiting for metadata to be back again", Until = "2025-05-15 00:00:00Z")]
|
||||
[Ignore("Waiting for metadata to be back again", Until = "2026-01-15 00:00:00Z")]
|
||||
public class MissingFixture : IntegrationTest
|
||||
{
|
||||
[SetUp]
|
||||
|
||||
@@ -37,11 +37,11 @@ namespace Readarr.Api.V1.Author
|
||||
|
||||
_coverMapper.ConvertToLocalUrls(resource.Id, MediaCoverEntity.Author, resource.Images);
|
||||
|
||||
var poster = currentAuthor.Metadata.Value.Images.FirstOrDefault(c => c.CoverType == MediaCoverTypes.Poster);
|
||||
var poster = resource.Images.FirstOrDefault(c => c.CoverType == MediaCoverTypes.Poster);
|
||||
|
||||
if (poster != null)
|
||||
{
|
||||
resource.RemotePoster = poster.Url;
|
||||
resource.RemotePoster = poster.RemoteUrl;
|
||||
}
|
||||
|
||||
resource.Folder = _fileNameBuilder.GetAuthorFolder(currentAuthor);
|
||||
|
||||
@@ -34,11 +34,11 @@ namespace Readarr.Api.V1.Books
|
||||
|
||||
_coverMapper.ConvertToLocalUrls(resource.Id, MediaCoverEntity.Book, resource.Images);
|
||||
|
||||
var cover = currentBook.Editions.Value.Single(x => x.Monitored).Images.FirstOrDefault(c => c.CoverType == MediaCoverTypes.Cover);
|
||||
var cover = resource.Images.FirstOrDefault(c => c.CoverType == MediaCoverTypes.Cover);
|
||||
|
||||
if (cover != null)
|
||||
{
|
||||
resource.RemoteCover = cover.Url;
|
||||
resource.RemoteCover = cover.RemoteUrl;
|
||||
}
|
||||
|
||||
yield return resource;
|
||||
|
||||
@@ -47,11 +47,11 @@ namespace Readarr.Api.V1.Search
|
||||
|
||||
_coverMapper.ConvertToLocalUrls(resource.Author.Id, MediaCoverEntity.Author, resource.Author.Images);
|
||||
|
||||
var poster = author.Metadata.Value.Images.FirstOrDefault(c => c.CoverType == MediaCoverTypes.Poster);
|
||||
var poster = resource.Author.Images.FirstOrDefault(c => c.CoverType == MediaCoverTypes.Poster);
|
||||
|
||||
if (poster != null)
|
||||
{
|
||||
resource.Author.RemotePoster = poster.Url;
|
||||
resource.Author.RemotePoster = poster.RemoteUrl;
|
||||
}
|
||||
|
||||
resource.Author.Folder = _fileNameBuilder.GetAuthorFolder(author);
|
||||
@@ -66,11 +66,11 @@ namespace Readarr.Api.V1.Search
|
||||
|
||||
_coverMapper.ConvertToLocalUrls(resource.Book.Id, MediaCoverEntity.Book, resource.Book.Images);
|
||||
|
||||
var cover = book.Editions.Value.Single(x => x.Monitored).Images.FirstOrDefault(c => c.CoverType == MediaCoverTypes.Cover);
|
||||
var cover = resource.Book.Images.FirstOrDefault(c => c.CoverType == MediaCoverTypes.Cover);
|
||||
|
||||
if (cover != null)
|
||||
{
|
||||
resource.Book.RemoteCover = cover.Url;
|
||||
resource.Book.RemoteCover = cover.RemoteUrl;
|
||||
}
|
||||
|
||||
resource.Book.Author.Folder = _fileNameBuilder.GetAuthorFolder(book.Author);
|
||||
|
||||
@@ -11370,6 +11370,10 @@
|
||||
"type": "string",
|
||||
"nullable": true,
|
||||
"readOnly": true
|
||||
},
|
||||
"remoteUrl": {
|
||||
"type": "string",
|
||||
"nullable": true
|
||||
}
|
||||
},
|
||||
"additionalProperties": false
|
||||
|
||||
Reference in New Issue
Block a user