1
0
mirror of https://github.com/Radarr/Radarr.git synced 2026-03-06 13:31:28 -05:00

Compare commits

..

18 Commits

Author SHA1 Message Date
Qstick
0bad606f8c CHANGELOG-v4.5.1.7282 2023-05-14 21:01:34 -05:00
Bakerboy448
b70049c3aa CHANGELOG-v4.2.4.6635 2023-05-14 20:34:03 -05:00
bakerboy448
a02cd3b1ba Update announcements.md 2023-05-14 20:34:03 -05:00
bakerboy448
701e16430b Update commentary.md 2023-05-14 20:34:03 -05:00
Bakerboy448
4ffeb82b03 CHANGELOG-v4.2.2.6503-add link to previous changelog 2023-05-14 20:34:02 -05:00
Bakerboy448
3196639e51 CHANGELOG-v4.2.2.6503 2023-05-14 20:34:02 -05:00
bakerboy448
73ce41a912 CHANGELOG-v4.2.1.6478 - add link to previous changelog 2023-05-14 20:34:02 -05:00
bakerboy448
c3bd452bee CHANGELOG-v4.2.1.6478 2023-05-14 20:34:02 -05:00
bakerboy448
55208eeaf0 CHANGELOG-v4.2.0.6438 2023-05-14 20:34:02 -05:00
bakerboy448
cd973818fb CHANGELOG-v4.1.0.6175 2023-05-14 20:34:02 -05:00
bakerboy448
bac4345eed CHANGELOG-v4.1.0.6122 2023-05-14 20:34:02 -05:00
bakerboy448
03391e087b [changelog] various script updates 2023-05-14 20:34:01 -05:00
bakerboy448
9274cc1254 CHANGELOG-v4.1.0.6095 2023-05-14 20:34:01 -05:00
bakerboy448
3adacf7970 CHANGELOG-v4.0.5.5981 2023-05-14 20:34:01 -05:00
bakerboy448
8b117b3f91 [changelog] update commentary for donate of bitcoin 2023-05-14 20:34:01 -05:00
bakerboy448
6f6c5e11a5 [changelog-post] various script updates
- release input for script
- rework announcements for branches
- add master branch info
2023-05-14 20:34:01 -05:00
bakerboy448
b9f466bac2 CHANGELOG-v4.0.5.5977 2023-05-14 20:34:01 -05:00
bakerboy448
305021f13b create [changelog-post] script to generate Release Announcements 2023-05-14 20:34:01 -05:00
966 changed files with 7581 additions and 16723 deletions

View File

@@ -40,18 +40,9 @@ dotnet_naming_style.instance_field_style.capitalization = camel_case
dotnet_naming_style.instance_field_style.required_prefix = _
# Prefer "var" everywhere
csharp_style_var_for_built_in_types = true
csharp_style_var_when_type_is_apparent = true
csharp_style_var_elsewhere = true
# Prefer "out" variables to be declared inline
csharp_style_inlined_variable_declaration = true
# Using directive is unnecessary.
dotnet_diagnostic.IDE0005.severity = error
# Use var instead of explicit type
dotnet_diagnostic.IDE0007.severity = error
# Inline variable declaration
dotnet_diagnostic.IDE0018.severity = error
csharp_style_var_for_built_in_types = true:suggestion
csharp_style_var_when_type_is_apparent = true:suggestion
csharp_style_var_elsewhere = true:suggestion
# Stylecop Rules
dotnet_diagnostic.SA0001.severity = none
@@ -270,7 +261,7 @@ dotnet_diagnostic.CA5397.severity = suggestion
dotnet_diagnostic.SYSLIB0006.severity = none
[*.{js,html,hbs,less,css,ts,tsx}]
[*.{js,html,js,hbs,less,css}]
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true

2
.gitattributes vendored
View File

@@ -3,7 +3,7 @@
# Explicitly set bash scripts to have unix endings
*.sh text eol=lf
distribution/osx/Radarr text eol=lf
macOS/Radarr text eol=lf
# Custom for Visual Studio
*.cs diff=csharp

View File

@@ -76,7 +76,7 @@ body:
- type: checkboxes
attributes:
label: Trace Logs have been provided as applicable. Reports may be closed if the required logs are not provided.
description: Trace logs are generally required for all bug reports and contain `trace`. Info logs are invalid for bug reports and do not contain `debug` nor `trace`
description: Trace logs are generally required for all bug reports
options:
- label: I have read and followed the steps in the wiki link above and provided the required trace logs - the logs contain `trace` - that are relevant and show this issue.
- label: I have followed the steps in the wiki link above and provided the required trace logs that are relevant and show this issue.
required: true

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 331 B

After

Width:  |  Height:  |  Size: 577 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.0 KiB

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 666 B

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 987 B

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

After

Width:  |  Height:  |  Size: 32 KiB

View File

@@ -9,7 +9,7 @@ variables:
testsFolder: './_tests'
yarnCacheFolder: $(Pipeline.Workspace)/.yarn
nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages
majorVersion: '4.7.3'
majorVersion: '4.5.1'
minorVersion: $[counter('minorVersion', 2000)]
radarrVersion: '$(majorVersion).$(minorVersion)'
buildName: '$(Build.SourceBranchName).$(radarrVersion)'
@@ -211,8 +211,8 @@ stages:
displayName: Fetch Frontend
- bash: |
./build.sh --packages --installer
cp distribution/windows/setup/output/Radarr.*win-x64.exe ${BUILD_ARTIFACTSTAGINGDIRECTORY}/Radarr.${BUILDNAME}.windows-core-x64-installer.exe
cp distribution/windows/setup/output/Radarr.*win-x86.exe ${BUILD_ARTIFACTSTAGINGDIRECTORY}/Radarr.${BUILDNAME}.windows-core-x86-installer.exe
cp setup/output/Radarr.*win-x64.exe ${BUILD_ARTIFACTSTAGINGDIRECTORY}/Radarr.${BUILDNAME}.windows-core-x64-installer.exe
cp setup/output/Radarr.*win-x86.exe ${BUILD_ARTIFACTSTAGINGDIRECTORY}/Radarr.${BUILDNAME}.windows-core-x86-installer.exe
displayName: Create Installers
- publish: $(Build.ArtifactStagingDirectory)
artifact: 'WindowsInstaller'
@@ -363,7 +363,7 @@ stages:
- bash: |
echo "Uploading source maps to sentry"
curl -sL https://sentry.io/get-cli/ | bash
RELEASENAME="Radarr@${RADARRVERSION}-${BUILD_SOURCEBRANCHNAME}"
RELEASENAME="${RADARRVERSION}-${BUILD_SOURCEBRANCHNAME}"
sentry-cli releases new --finalize -p radarr -p radarr-ui -p radarr-update "${RELEASENAME}"
sentry-cli releases -p radarr-ui files "${RELEASENAME}" upload-sourcemaps _output/UI/ --rewrite
sentry-cli releases set-commits --auto "${RELEASENAME}"

View File

@@ -21,7 +21,7 @@ UpdateVersionNumber()
echo "Updating Version Info"
sed -i'' -e "s/<AssemblyVersion>[0-9.*]\+<\/AssemblyVersion>/<AssemblyVersion>$RADARRVERSION<\/AssemblyVersion>/g" src/Directory.Build.props
sed -i'' -e "s/<AssemblyConfiguration>[\$()A-Za-z-]\+<\/AssemblyConfiguration>/<AssemblyConfiguration>${BUILD_SOURCEBRANCHNAME}<\/AssemblyConfiguration>/g" src/Directory.Build.props
sed -i'' -e "s/<string>10.0.0.0<\/string>/<string>$RADARRVERSION<\/string>/g" distribution/osx/Radarr.app/Contents/Info.plist
sed -i'' -e "s/<string>10.0.0.0<\/string>/<string>$RADARRVERSION<\/string>/g" macOS/Radarr.app/Contents/Info.plist
fi
}
@@ -184,7 +184,7 @@ PackageMacOSApp()
rm -rf $folder
mkdir -p $folder
cp -r distribution/osx/Radarr.app $folder
cp -r macOS/Radarr.app $folder
mkdir -p $folder/Radarr.app/Contents/MacOS
echo "Copying Binaries"
@@ -246,7 +246,7 @@ BuildInstaller()
local framework="$1"
local runtime="$2"
./_inno/ISCC.exe distribution/windows/setup/radarr.iss "//DFramework=$framework" "//DRuntime=$runtime"
./_inno/ISCC.exe setup/radarr.iss "//DFramework=$framework" "//DRuntime=$runtime"
}
InstallInno()

View File

@@ -0,0 +1,100 @@
# New Beta Release
Radarr v4.0.5.5977 has been released on `develop`
A reminder about the `develop` branch
- **develop - Current Develop/Beta - (Beta): This is the testing edge. Released after tested in nightly to ensure no immediate issues. New features and bug fixes released here first. This version will receive updates either weeklyish or bi-weeklyish depending on development.**
# Announcements
- **Due to undocumented and breaking API changes Qbit v4.4.0 is not supported. It is generally recommended to avoid Qbit .0 releases.** Qbit v4.3.9 is the most recent working version. Qbit v4.4.1 may have issues as well.
- **Radarr v4 no longer supports Linux x86 (x32 bit) systems**
- x32 Arm is still supported; armv7 is the minimum required architecture
- Impacted users have been receiving a healthcheck since May 2021 with 3.2.0
- **Radarr v4 no longer builds for mono and mono support has ceased**
- Impacted users have been receiving a healthcheck since May 2021 with 3.2.0
- **Radarr Breaking API Changes**
- Radarr v4 no longer supports the legacy (v0.2) API
- Native ASPCore API Controllers (stricter typing and other small API changes)
- The json you post needs to actually be strictly valid json now
- **FFProbe has replaced MediaInfo**
- Similarly MediaInfo is no longer a required dependency
- [Jackett `/all` is deprecated and no longer supported. The FAQ has warned about this since May 2021.](https://wiki.servarr.com/radarr/faq#jacketts-all-endpoint)
- Radarr is now on .Net6
- New builds for OSX Arm64 and Linux Musl Arm32
- IMDb Ratings
- **Users who do not wish to be on the alpha `nightly` testing branch should take advantage of this parity and switch to `develop`
# Additional Commentary
- Lidarr v1 coming to `develop` as beta soon^(tm)
- [Readarr official beta on `develop` announced](https://www.reddit.com/r/Readarr/comments/sxvj8y/new_beta_release_develop_v0101248/)
- [Radarr Postgres Database Support coming soon (PR#6873)](https://github.com/radarr/radarr/pull/6873)
- [Lidarr Postgres Database Support in development (Draft PR#2625)](https://github.com/Lidarr/Lidarr/pull/2625)
# Releases
## Native
- [GitHub Releases](https://github.com/Radarr/Radarr/releases)
- [Wiki Installation Instructions](https://wiki.servarr.com/radarr/installation)
## Docker
- [hotio/Radarr:testing](https://hotio.dev/containers/radarr)
- [lscr.io/linuxserver/Radarr:develop](https://docs.linuxserver.io/images/docker-radarr)
## NAS Packages
- Synology - Please ask the SynoCommunity to update the base package; however, you can update in-app normally
- QNAP - Please ask the SynoCommunity to update the base package; however, you should be able to update in-app normally
------------
# Release Notes
## v4.0.5.5977 (changes since v4.0.4.5922)
- Update Synology error codes
- Fixed: Remove pre-DB from frontend storage
- Fixed: Removing multiple items from the queue wording
- Fixed: Improve help text for download client Category
- New: Update Cert Validation Help Text [common]
- Fixed: Updated ruTorrent stopped state helptext
- fixed text box not being uniform to others
- New: Add backup size information
- Fix swagger inCinema references
- Fixed: Recycle bin log message
- Fix nzbdrone reference
- additional testcase obfuscation
- Fixed: IPv4 instead of IP4
- Report runtime identifier to sentry
- Update API URL
- Fixed: No longer require first run as admin on windows
- Build installer from build.sh
- Fixed: Enable response compression over https
- Bump to 4.0.5
- Other bug fixes and improvements, see GitHub history

View File

@@ -0,0 +1,107 @@
# New Stable Release
Radarr v4.0.5.5981 has been released on `master`
- **Users who do not wish to be on the alpha `nightly` or beta `develop` testing branches should take advantage of this parity and switch to `master`
A reminder about the `develop` and `nightly` branches
- **develop - Current Develop/Beta - (Beta): This is the testing edge. Released after tested in nightly to ensure no immediate issues. New features and bug fixes released here first. This version will receive updates either weeklyish or bi-weeklyish depending on development.**
- **nightly - Current Nightly/Unstable - (Alpha/Unstable) : The bleeding edge. Released as soon as code is committed and passed all automated tests. Use this branch only if you know what you are doing and are willing to get your hands dirty to recover a failed update. This version is updated immediately.**
# Announcements
- **Due to undocumented and breaking API changes Qbit v4.4.0 is not supported. It is generally recommended to avoid Qbit .0 releases.** Qbit v4.3.9 is the most recent working version. Qbit v4.4.1 may have issues as well.
- **Radarr v4 no longer supports Linux x86 (x32 bit) systems**
- x32 Arm is still supported; armv7 is the minimum required architecture
- Impacted users have been receiving a healthcheck since May 2021 with 3.2.0
- **Radarr v4 no longer builds for mono and mono support has ceased**
- Impacted users have been receiving a healthcheck since May 2021 with 3.2.0
- **Radarr Breaking API Changes**
- Radarr v4 no longer supports the legacy (v0.2) API
- Native ASPCore API Controllers (stricter typing and other small API changes)
- The json you post needs to actually be strictly valid json now
- **FFProbe has replaced MediaInfo**
- Similarly MediaInfo is no longer a required dependency
- [Jackett `/all` is deprecated and no longer supported. The FAQ has warned about this since May 2021.](https://wiki.servarr.com/radarr/faq#jacketts-all-endpoint)
- Radarr is now on .Net6
- New builds for OSX Arm64 and Linux Musl Arm32
- IMDb Ratings
# Additional Commentary
- Lidarr v1 coming to `develop` as beta soon^(tm)
- [Lidarr](https://lidarr.audio/donate), [Prowlarr](https://prowlarr.com/donate), [Radarr](https://radarr.video/donate), [Readarr](https://readarr.com/donate) now accept direct bitcoin donations
- [Readarr official beta on `develop` announced](https://www.reddit.com/r/Readarr/comments/sxvj8y/new_beta_release_develop_v0101248/)
- [Radarr Postgres Database Support coming soon (PR#6873)](https://github.com/radarr/radarr/pull/6873)
- [Lidarr Postgres Database Support in development (Draft PR#2625)](https://github.com/Lidarr/Lidarr/pull/2625)
# Releases
## Native
- [GitHub Releases](https://github.com/Radarr/Radarr/releases)
- [Wiki Installation Instructions](https://wiki.servarr.com/radarr/installation)
## Docker
- [hotio/Radarr:release](https://hotio.dev/containers/radarr)
- [lscr.io/linuxserver/Radarr:latest](https://docs.linuxserver.io/images/docker-radarr)
## NAS Packages
- Synology - Please ask the SynoCommunity to update the base package; however, you can update in-app normally
- QNAP - Please ask the QNAP to update the base package; however, you should be able to update in-app normally
------------
# Release Notes
## v4.0.5.5981 (changes since v4.0.5.5977)
- Other bug fixes and improvements, see GitHub history
## v4.0.5.5977 (changes since v4.0.4.5922)
- Update Synology error codes
- Fixed: Remove pre-DB from frontend storage
- Fixed: Removing multiple items from the queue wording
- Fixed: Improve help text for download client Category
- New: Update Cert Validation Help Text [common]
- Fixed: Updated ruTorrent stopped state helptext
- fixed text box not being uniform to others
- New: Add backup size information
- Fix swagger inCinema references
- Fixed: Recycle bin log message
- Fix nzbdrone reference
- additional testcase obfuscation
- Fixed: IPv4 instead of IP4
- Report runtime identifier to sentry
- Update API URL
- Fixed: No longer require first run as admin on windows
- Build installer from build.sh
- Fixed: Enable response compression over https
- Bump to 4.0.5
- Other bug fixes and improvements, see GitHub history

View File

@@ -0,0 +1,180 @@
# New Beta Release
Radarr v4.1.0.6095 has been released on `develop`
- **Users who do not wish to be on the alpha `nightly` testing branch should take advantage of this parity and switch to `develop`**
- **develop - Current Develop/Beta - (Beta): This is the testing edge. Released after tested in nightly to ensure no immediate issues. New features and bug fixes released here first. This version will receive updates either weeklyish or bi-weeklyish depending on development.**
# Announcements
- **Due to undocumented and breaking API changes Qbit v4.4.0 is not supported. It is generally recommended to avoid Qbit .0 releases.** Qbit v4.3.9 is the most recent working version. Qbit v4.4.1 has issues as well.
- **Radarr v4 no longer supports Linux x86 (x32 bit) systems**
- x32 Arm is still supported; armv7 is the minimum required architecture
- Impacted users have been receiving a healthcheck since May 2021 with 3.2.0
- **Radarr v4 no longer builds for mono and mono support has ceased**
- Impacted users have been receiving a healthcheck since May 2021 with 3.2.0
- **Radarr Breaking API Changes**
- Radarr v4 no longer supports the legacy (v0.2) API
- Native ASPCore API Controllers (stricter typing and other small API changes)
- The json you post needs to actually be strictly valid json now
- **FFProbe has replaced MediaInfo**
- Similarly MediaInfo is no longer a required dependency
- [Jackett `/all` is deprecated and no longer supported. The FAQ has warned about this since May 2021.](https://wiki.servarr.com/radarr/faq#jacketts-all-endpoint)
- Radarr is now on .Net6
- New builds for OSX Arm64 and Linux Musl Arm32
- IMDb Ratings
# Additional Commentary
- Lidarr v1 coming to `develop` as beta soon^(tm)
- [Lidarr](https://lidarr.audio/donate), [Prowlarr](https://prowlarr.com/donate), [Radarr](https://radarr.video/donate), [Readarr](https://readarr.com/donate) now accept direct bitcoin donations
- [Readarr official beta on `develop` announced](https://www.reddit.com/r/Readarr/comments/sxvj8y/new_beta_release_develop_v0101248/)
- [Radarr Postgres Database Support coming soon (PR#6873)](https://github.com/radarr/radarr/pull/6873)
- [Lidarr Postgres Database Support in development (Draft PR#2625)](https://github.com/Lidarr/Lidarr/pull/2625)
# Releases
## Native
- [GitHub Releases](https://github.com/Radarr/Radarr/releases)
- [Wiki Installation Instructions](https://wiki.servarr.com/radarr/installation)
## Docker
- [hotio/Radarr:testing](https://hotio.dev/containers/radarr)
- [lscr.io/linuxserver/Radarr:develop](https://docs.linuxserver.io/images/docker-radarr)
## NAS Packages
- Synology - Please ask the SynoCommunity to update the base package; however, you can update in-app normally
- QNAP - Please ask the QNAP to update the base package; however, you should be able to update in-app normally
------------
# Release Notes
## v4.1.0.6095 (changes since v4.0.5.5981)
- Fixed: Validation when testing indexers, import lists, connections and download clients
- New: Added UDP syslog support
- Add error handling to Notifiarr connect to reduce Sentry hits
- Update multi parser test
- Remove old Multi language workaround
- Add response size to http responses
- Linting fixes for frontend following eslint package upgrade
- FontAwesome 6
- Bump react-text-truncate to 0.18.0
- Bump qs to 6.10.3
- Bump clipboard.js to 2.0.10
- Change react-custom-scrollbars to react-custom-scrollbars-2
- Update frontend babel packages
- Update frontend stylelint packages
- Update frontend eslint packages
- Bump Sentry to 3.15.0
- Bump NLog to 4.7.14
- Bump FluentMigrator to 3.3.2
- Bump dotnet to 6.0.3
- Bump DryIoc to 4.8.8
- Translated using Weblate (Chinese (Simplified)) [skip ci]
- Automated API Docs update
- Allow more startup time for openapi generation
- Bump Swashbuckle to 6.3.0
- Removed non-functional altyear API controller
- Update API docs
- API is v3
- Fix Prowlarr references
- Autogenerated API docs
- Translated using Weblate (Portuguese (Brazil)) [skip ci]
- Translated using Weblate (French) [skip ci]
- New: Language filter on manual search
- Fix HistorySpecification tests
- New: Original Language and Title sort and filter options
- Fixed: Clearing logs not updating UI once complete
- Fixed: On Import notifications for webhooks
- Fixed: Send download client name instead of type for grab events
- New: Add qBittorrent sequential order and first and last piece priority options
- Fixed: Profiles with upgrades disabled incorrectly allowing upgrades in some cases
- New: Add Release group to history for all events
- Bump FFProbe to 5.0
- Fixed: Parsing of quality in DP.WEB releases
- Fixed: Correctly Detect Remux prefixed by Brackets
- Fixed: Treat 720p BR Remux as BluRay
- Fixed: Better Cleansing of Tracker Announce Keys
- New: Dont parse hash as release group
- New: Support for parsing various Anime Groups
- Fixed: Dont Parse HDRip as group
- New: Support for parsing [HDO] as HDO Group
- Fixed: Updater version number logging
- Adjusted the Windows LongPath support check for valid segment lengths
- PWA missing name
- Translated using Weblate (Chinese (Traditional) (zh_TW)) [skip ci]
- SimpleTitleRegex catchup
- Fixed: Assume SABnzbd develop version is 3.0.0 if not specified
- Bump node build version to 16.X LTS
- Bump dotnet to 6.0.2
- Bump version to 4.1.0
- Fixed: Update from version in logs
- Other bug fixes and improvements, see GitHub history

View File

@@ -0,0 +1,68 @@
# New Beta Release
Radarr v4.1.0.6122 has been released on `develop`
- **Users who do not wish to be on the alpha `nightly` testing branch should take advantage of this parity and switch to `develop`**
A reminder about the `develop` and `nightly` branches
- **develop - Current Develop/Beta - (Beta): This is the testing edge. Released after tested in nightly to ensure no immediate issues. New features and bug fixes released here first after nightly. It can be considered semi-stable, but is still beta. This version will receive updates either weekly or biweekly depending on development.**
- **nightly - Current Nightly/Unstable - (Alpha/Unstable) : This is the bleeding edge. It is released as soon as code is committed and passes all automated tests. This build may have not been used by us or other users yet. There is no guarantee that it will even run in some cases. This branch is only recommended for advanced users. Issues and self investigation are expected in this branch. Use this branch only if you know what you are doing and are willing to get your hands dirty to recover a failed update. This version is updated immediately.**
# Announcements
- Radarr Postgres Database Support has landed in `nightly` and will be coming to `develop` _soon_
- Radarr Plex Watchlist Support has landed in `nightly` and will be coming to `develop` _soon_
# Additional Commentary
- Lidarr v1 coming to `develop` as beta soon^(tm)
- [Lidarr](https://lidarr.audio/donate), [Prowlarr](https://prowlarr.com/donate), [Radarr](https://radarr.video/donate), [Readarr](https://readarr.com/donate) now accept direct bitcoin donations
- [Readarr official beta on `develop` announced](https://www.reddit.com/r/Readarr/comments/sxvj8y/new_beta_release_develop_v0101248/)
- [Lidarr Postgres Database Support in development (Draft PR#2625)](https://github.com/Lidarr/Lidarr/pull/2625)
# Releases
## Native
- [GitHub Releases](https://github.com/Radarr/Radarr/releases)
- [Wiki Installation Instructions](https://wiki.servarr.com/radarr/installation)
## Docker
- [hotio/Radarr:testing](https://hotio.dev/containers/radarr)
- [lscr.io/linuxserver/Radarr:develop](https://docs.linuxserver.io/images/docker-radarr)
## NAS Packages
- Synology - Please ask the SynoCommunity to update the base package; however, you can update in-app normally
- QNAP - Please ask the QNAP to update the base package; however, you should be able to update in-app normally
------------
# Release Notes
## v4.1.0.6122 (changes since v4.1.0.6095)
- Fixed: Loading old commands from database
- Fixed: Scrolling in Firefox in small window (requires refresh)
- Don't return early after re-running checks after startup grace period
- Fixed: Delay health check notifications on startup
- New: Schedule refresh and process monitored download tasks at high priority
- Fixed: Use Digital Release in ChangeFileDate if no Physical
- Fixed: Cleanup Temp files after backup creation
- Centralise image choice, update to latest images
- Translated using Weblate (Chinese (Simplified) (zh_CN)) [skip ci]
- Other bug fixes and improvements, see GitHub history

View File

@@ -0,0 +1,198 @@
# New Stable Release
Radarr v4.1.0.6175 has been released on `master`
- **Users who do not wish to be on the alpha `nightly` or beta `develop` testing branches should take advantage of this parity and switch to `master`
A reminder about the `develop` and `nightly` branches
- **develop - Current Develop/Beta - (Beta): This is the testing edge. Released after tested in nightly to ensure no immediate issues. New features and bug fixes released here first after nightly. It can be considered semi-stable, but is still beta. This version will receive updates either weekly or biweekly depending on development.**
- **nightly - Current Nightly/Unstable - (Alpha/Unstable) : This is the bleeding edge. It is released as soon as code is committed and passes all automated tests. This build may have not been used by us or other users yet. There is no guarantee that it will even run in some cases. This branch is only recommended for advanced users. Issues and self investigation are expected in this branch. Use this branch only if you know what you are doing and are willing to get your hands dirty to recover a failed update. This version is updated immediately.**
# Announcements
- Radarr Postgres Database Support has landed in `nightly` and will be coming to `develop` _soon_
- Radarr Plex Watchlist Support has landed in `nightly` and will be coming to `develop` _soon_
- "FFMpeg 5.0.1" fixes issues with FFprobe crashing on macOS
- Radarr improved collections support coming _soon_^(tm)
# Additional Commentary
- Lidarr v1 coming to `develop` as beta soon^(tm)
- [Lidarr](https://lidarr.audio/donate), [Prowlarr](https://prowlarr.com/donate), [Radarr](https://radarr.video/donate), [Readarr](https://readarr.com/donate) now accept direct bitcoin donations
- [Readarr official beta on `develop` announced](https://www.reddit.com/r/Readarr/comments/sxvj8y/new_beta_release_develop_v0101248/)
- [Lidarr Postgres Database Support in development (Draft PR#2625)](https://github.com/Lidarr/Lidarr/pull/2625)
# Releases
## Native
- [GitHub Releases](https://github.com/Radarr/Radarr/releases)
- [Wiki Installation Instructions](https://wiki.servarr.com/radarr/installation)
## Docker
- [hotio/Radarr:release](https://hotio.dev/containers/radarr)
- [lscr.io/linuxserver/Radarr:latest](https://docs.linuxserver.io/images/docker-radarr)
## NAS Packages
- Synology - Please ask the SynoCommunity to update the base package; however, you can update in-app normally
- QNAP - Please ask the QNAP to update the base package; however, you should be able to update in-app normally
------------
# Release Notes
## v4.1.0.6175 (changes since v4.1.0.6122)
- FFMpeg 5.0.1
- Other bug fixes and improvements, see GitHub history
## v4.1.0.6122 (changes since v4.1.0.6095)
- Fixed: Loading old commands from database
- Fixed: Scrolling in Firefox in small window (requires refresh)
- Don't return early after re-running checks after startup grace period
- Fixed: Delay health check notifications on startup
- New: Schedule refresh and process monitored download tasks at high priority
- Fixed: Use Digital Release in ChangeFileDate if no Physical
- Fixed: Cleanup Temp files after backup creation
- Centralise image choice, update to latest images
- Translated using Weblate (Chinese (Simplified) (zh_CN)) [skip ci]
- Other bug fixes and improvements, see GitHub history
## v4.1.0.6095 (changes since v4.0.5.5981)
- Fixed: Validation when testing indexers, import lists, connections and download clients
- New: Added UDP syslog support
- Add error handling to Notifiarr connect to reduce Sentry hits
- Update multi parser test
- Remove old Multi language workaround
- Add response size to http responses
- Linting fixes for frontend following eslint package upgrade
- FontAwesome 6
- Bump react-text-truncate to 0.18.0
- Bump qs to 6.10.3
- Bump clipboard.js to 2.0.10
- Change react-custom-scrollbars to react-custom-scrollbars-2
- Update frontend babel packages
- Update frontend stylelint packages
- Update frontend eslint packages
- Bump Sentry to 3.15.0
- Bump NLog to 4.7.14
- Bump FluentMigrator to 3.3.2
- Bump dotnet to 6.0.3
- Bump DryIoc to 4.8.8
- Translated using Weblate (Chinese (Simplified)) [skip ci]
- Automated API Docs update
- Allow more startup time for openapi generation
- Bump Swashbuckle to 6.3.0
- Removed non-functional altyear API controller
- Update API docs
- API is v3
- Fix Prowlarr references
- Autogenerated API docs
- Translated using Weblate (Portuguese (Brazil)) [skip ci]
- Translated using Weblate (French) [skip ci]
- New: Language filter on manual search
- Fix HistorySpecification tests
- New: Original Language and Title sort and filter options
- Fixed: Clearing logs not updating UI once complete
- Fixed: On Import notifications for webhooks
- Fixed: Send download client name instead of type for grab events
- New: Add qBittorrent sequential order and first and last piece priority options
- Fixed: Profiles with upgrades disabled incorrectly allowing upgrades in some cases
- New: Add Release group to history for all events
- Bump FFProbe to 5.0
- Fixed: Parsing of quality in DP.WEB releases
- Fixed: Correctly Detect Remux prefixed by Brackets
- Fixed: Treat 720p BR Remux as BluRay
- Fixed: Better Cleansing of Tracker Announce Keys
- New: Dont parse hash as release group
- New: Support for parsing various Anime Groups
- Fixed: Dont Parse HDRip as group
- New: Support for parsing [HDO] as HDO Group
- Fixed: Updater version number logging
- Adjusted the Windows LongPath support check for valid segment lengths
- PWA missing name
- Translated using Weblate (Chinese (Traditional) (zh_TW)) [skip ci]
- SimpleTitleRegex catchup
- Fixed: Assume SABnzbd develop version is 3.0.0 if not specified
- Bump node build version to 16.X LTS
- Bump dotnet to 6.0.2
- Bump version to 4.1.0
- Fixed: Update from version in logs
- Other bug fixes and improvements, see GitHub history

View File

@@ -0,0 +1,324 @@
# New Beta Release
Radarr v4.2.0.6438 has been released on `develop`
- **Users who do not wish to be on the alpha `nightly` testing branch should take advantage of this parity and switch to `develop`**
A reminder about the `develop` and `nightly` branches
- **develop - Current Develop/Beta - (Beta): This is the testing edge. Released after tested in nightly to ensure no immediate issues. New features and bug fixes released here first after nightly. It can be considered semi-stable, but is still beta. This version will receive updates either weekly or biweekly depending on development.**
- **nightly - Current Nightly/Unstable - (Alpha/Unstable) : This is the bleeding edge. It is released as soon as code is committed and passes all automated tests. This build may have not been used by us or other users yet. There is no guarantee that it will even run in some cases. This branch is only recommended for advanced users. Issues and self investigation are expected in this branch. Use this branch only if you know what you are doing and are willing to get your hands dirty to recover a failed update. This version is updated immediately.**
# Announcements
- Radarr Postgres Database Support
- Radarr Plex Watchlist Support
- Radarr Collections Support
# Additional Commentary
- [Lidarr v1 released on `master`](https://www.reddit.com/r/Lidarr/comments/v5fdhi/new_stable_release_master_v1022592/)
- [Lidarr](https://lidarr.audio/donate), [Prowlarr](https://prowlarr.com/donate), [Radarr](https://radarr.video/donate), [Readarr](https://readarr.com/donate) now accept direct bitcoin donations
- [Readarr official beta on `develop` announced](https://www.reddit.com/r/Readarr/comments/sxvj8y/new_beta_release_develop_v0101248/)
- Radarr Postgres Database Support in `nightly` and `develop`
- Prowlarr Postgres Database Support in `nightly` and `develop`
- [Lidarr Postgres Database Support in development (Draft PR#2625)](https://github.com/Lidarr/Lidarr/pull/2625)
- \*Arrs Wiki Contributions welcomed and strongly encouraged, simply auth with GitHub on the wiki and update the page
# Releases
## Native
- [GitHub Releases](https://github.com/Radarr/Radarr/releases)
- [Wiki Installation Instructions](https://wiki.servarr.com/radarr/installation)
## Docker
- [hotio/Radarr:testing](https://hotio.dev/containers/radarr)
- [lscr.io/linuxserver/Radarr:develop](https://docs.linuxserver.io/images/docker-radarr)
## NAS Packages
- Synology - Please ask the SynoCommunity to update the base package; however, you can update in-app normally
- QNAP - Please ask the QNAP to update the base package; however, you should be able to update in-app normally
------------
# Release Notes
## v4.2.0.6438 (changes since v4.1.0.6175)
- Fixed: Parse Group ZØNEHD
- New: Parse Group HONE
- New: (Discord) Include Custom Formats & Score On Grab
- Translated using Weblate (Catalan) [skip ci]
- Fixed: User Triggered Auto Searches now ignores monitored status (#7422)
- Fixed: Postgres timezone issues (#7183)
- Speed up and reduce meta calls for Imdb Lists when mapping
- Fixed: ImportListMovies not saved if from a list without TMDBIds
- Match 'HQCAM' as CAM source (#7412)
- Fix RefreshMovieServiceFixture folder service mock
- Fixed: Collections not deleted on Movie Delete
- Fixed: Bulk Collection RootFolder change failure
- New: Collection Folder, Genre, QualityProfile Filters
- Fixed: Trim RootFolderPath on Migration
- Avoid multiple metadata DB calls on list mapping
- Fixed: Prevent excluded movies from being added by collections
- Fixed: Avoid NullRef in MapMovieToTmdbMovie
- Fixed: Notifiarr - Better HTTP Error Handling
- Fix Nullref on Collection delete
- New: (Notifiarr) Custom Formats in OnGrab
- Automated API Docs update
- New: Custom Format Spec Validation
- Fixed: Don't fail on single failure for Discover bulk add
- Remove general yarn restore key to avoid cross OS conflict
- Translated using Weblate (Portuguese (Brazil)) [skip ci]
- Fixed: Don't call for server notifications on event driven check
- Rename MovieImportedEvent to MovieFileImportedEvent
- Fixed: Improved parsing WebDL Releases
- New: adding a link to tmdb in the import combobox movie search results (#7352)
- Fixed: Housekeeper doesn't remove collections that have MovieMeta from lists
- Fixed: Notify on Bulk Adds (Lists, Collections, Imports)
- Updated NLog Version (#7365)
- Translated using Weblate (Portuguese (Brazil)) [skip ci]
- Fixed: Migration 208 fails when collection doesn't have name
- Fixed: Don't call AddMovies if no movies to add from Collection
- New: Default to IMDb Ratings in Kodi Metadata
- Translated using Weblate (Slovak) [skip ci]
- New: Separate Ratings Columns
- Fixed: Add support for more Anime release formats
- Translated using Weblate (Portuguese) [skip ci]
- Automated API Docs update
- New: Bulk Edit Collections Profile, Root, Availability
- Automated API Docs update
- Fixed: Collections Improvements
- Add back Movie Credits and Alt Titles Indexes
- Fixed: Validate if equals or child for startup folder
- New: Notifiarr include Media Info in Download Notifications
- New: Notifiarr moved from webhook to API
- Translated using Weblate (German) [skip ci]
- Use DryIoc for Automoqer, drop Unity dependency
- Additional logging for partial Plex path scan
- Translated using Weblate (Chinese (Simplified) (zh_CN)) [skip ci]
- Fixed: Improved empty root folder failsafe logging (#7341)
- Fixed: Register PostgresOptions when running in utility mode
- Fixed: Clarified genre filtering helptext on Trakt lists
- Fixed: Lithuanian media info parsing
- Translated using Weblate (Portuguese (Brazil)) [skip ci]
- Automated API Docs update
- Fixed: MovieAdded trigger not available in UI
- New: Movie Added Notification
- Cleanup Collections UI Options
- Fixed: Speed up Collections API Endpoint
- New: Add DB Indexes for MovieMetadata
- New: .NET 6.0.5
- Translated using Weblate (Polish) [skip ci]
- Fixed: Remove Collection on last Movie delete
- Fixed: Correctly use loadash in FE Migrations
- Fixed: Partial Revert CF Validation for more robust solution
- Ensure .Mono and .Windows projects have all dependencies in build output
- Fix frontend monitor migration
- Try to fix CF null error for imported movie files
- Tweak monitor migration to avoid overwrites of valid settings
- Fixed: Run Frontend Migration for MonitorType
- New: Improve validation errors for Custom Formats
- Fixed: Don't Import Files with lower CF Score
- Fixed: Parse UHD2BD as BluRay instead of HDTV
- Fixed: Bluray 576p parsing
- New: Release Group Custom Format (#7154)
- Added term "brazilian" to Brazilian Portuguese parsing (#7296)
- Automated API Docs update
- New: Don't default manual import to move
- Fixed: Cutoff Unmet showing items above lowest accepted quality when upgrades are disabled
- New: Collections View
- Translated using Weblate (Portuguese (Brazil)) [skip ci]
- Translated using Weblate (Portuguese (Brazil)) [skip ci]
- New: Parse QxR Group r00t
- Automated API Docs update
- New: Instance name in System/Status API endpoint
- New: Instance name for Page Title
- New: Instance Name used for Syslog
- New: Set Instance Name
- New: Add optional Source Title column to history
- New: Support for new Nyaa RSS Feed format
- Fixed: Don't try to add MovieMeta if mapping fails for list items
- Fixed: Importing file from UNC shared folder without job folder
- Fixed: No restart requirement for Refresh Monitored interval change
- Fixed: Correct User-Agent api logging
- Delete nan.json
- Delete zh_Hans.json
- Translated using Weblate (Chinese (Simplified)) [skip ci]
- Fixed: Wrong translation mapping can be used for file naming and metadata
- Fixed: Translated fields are mapped incorrectly for existing search results
- Fixed: UI hiding search results with duplicate GUIDs
- Fixed: QBittorrent unknown download state: forcedMetaDL
- Fix migration 207 distinct on tmdbid only for list movie insert
- Fix metadata migration
- Automated API Docs update
- Rework Movie Metadata data model
- Temporarily ignore update tests until linux-x86 released
- New: Add linux-x86 builds
- New: Support Plex API Path Scan (Similar to autoscan)
- Fixed: Interactive Search Filter not filtering multiple qualities in the same filter row
- Added padding to search tab to maintain visual consistancy
- Fixed: Update ScheduledTask cache LastStartTime on command execution
- Bump Version to 4.2
- Bump webpack packages
- Remove old DotNetVersion method and dep
- Bump Monotorrent to 2.0.5
- Fixed: Don't die if Plex watchlist guid node is missing or null
- Automated API Docs update
- New: Add support for Plex Watchlist importing (#5707)
- New: Add date picker for custom filter dates
- Make postgres integration tests actually use postgres
- Fixed: Clarify Qbit Content Path Error
- Fixed: Use Movie Original Language for Custom Format Original Language (#6882)
- Fix .editorconfig to disallow `this`
- FFMpeg 5.0.1
- Fixed: Properly handle 119 error code from Synology Download Station
- Translated using Weblate (Hungarian) [skip ci]
- Fixed: FFprobe failing on MacOS and AV1 streams
- add 576 resolution back to simple title regex
- Translated using Weblate (Ukrainian) [skip ci]
- Set up tests on postgres
- Allow configuring postgres with environment variables
- New: Postgres Support
- Other bug fixes and improvements, see GitHub history

View File

@@ -0,0 +1,100 @@
# New Beta Release
Radarr v4.2.1.6478 has been released on `develop`
- **Users who do not wish to be on the alpha `nightly` testing branch should take advantage of this parity and switch to `develop`**
A reminder about the `develop` and `nightly` branches
- **develop - Current Develop/Beta - (Beta): This is the testing edge. Released after tested in nightly to ensure no immediate issues. New features and bug fixes released here first after nightly. It can be considered semi-stable, but is still beta. This version will receive updates either weekly or biweekly depending on development.**
- **nightly - Current Nightly/Unstable - (Alpha/Unstable) : This is the bleeding edge. It is released as soon as code is committed and passes all automated tests. This build may have not been used by us or other users yet. There is no guarantee that it will even run in some cases. This branch is only recommended for advanced users. Issues and self investigation are expected in this branch. Use this branch only if you know what you are doing and are willing to get your hands dirty to recover a failed update. This version is updated immediately.**
# Announcements
- Radarr Postgres Database Support
- Radarr Plex Watchlist Support
- Radarr Collections Support
# Additional Commentary
- [Lidarr v1 released on `master`](https://www.reddit.com/r/Lidarr/comments/v5fdhi/new_stable_release_master_v1022592/)
- [Lidarr](https://lidarr.audio/donate), [Prowlarr](https://prowlarr.com/donate), [Radarr](https://radarr.video/donate), [Readarr](https://readarr.com/donate) now accept direct bitcoin donations
- [Readarr official beta on `develop` announced](https://www.reddit.com/r/Readarr/comments/sxvj8y/new_beta_release_develop_v0101248/)
- Radarr Postgres Database Support in `nightly` and `develop`
- Prowlarr Postgres Database Support in `nightly` and `develop`
- [Lidarr Postgres Database Support in development (Draft PR#2625)](https://github.com/Lidarr/Lidarr/pull/2625)
- \*Arrs Wiki Contributions welcomed and strongly encouraged, simply auth with GitHub on the wiki and update the page
# Releases
## Native
- [GitHub Releases](https://github.com/Radarr/Radarr/releases)
- [Wiki Installation Instructions](https://wiki.servarr.com/radarr/installation)
## Docker
- [hotio/Radarr:testing](https://hotio.dev/containers/radarr)
- [lscr.io/linuxserver/Radarr:develop](https://docs.linuxserver.io/images/docker-radarr)
## NAS Packages
- Synology - Please ask the SynoCommunity to update the base package; however, you can update in-app normally
- QNAP - Please ask the QNAP to update the base package; however, you should be able to update in-app normally
------------
# Release Notes
## v4.2.1.6478 (changes since [v4.2.0.6438](https://www.reddit.com/r/radarr/comments/w3kik4/new_release_develop_v4206438/))
- Translated using Weblate (Spanish) [skip ci]
- Regenerate yarn.lock
- Bump Sentry to 3.20.1
- Bump dotnet to 6.0.8
- Changed: Removed Tigole from ExceptionRelease match as is checked in ExceptionReleaseExact.
- Fixed: Tigole release group not being parsed and matched correctly, requiring manual import.
- Fixed: Configured recycle bin is excluded from import.
- Really fix Original Language in Language CF Specification
- Better Sentry Filtering for AggregateException children
- Run Postgres tests on 20.04
- Fixed: Blank Collection on MovieDetails when no Collection for Movie
- Remove non-functional filters for Trakt Lists
- Fixed: Original CF shouldn't need to be named "Original"
- Fixed NullRef in Skyhook Proxy during List Sync
- Fixed: Remove Notifiarr Environment Option
- Fixed: Trakt list request now uses correct rules for generating slug (#7449)
- Fixed: Allow blank ReleaseGroup and Edition from MovieFile edit
- Fixed: Don't process files that don't have a supported media file extension
- Fixed: Avoid failure if list contains same movie but without tmdbid
- Fixed: Log correct path when moving movies (#7439)
- Fixed: Watch state not preserved on metadata rewrite (#7436)
- Fixed: NullRefException in TorrentRssParser
- Bump Version to 4.2.1
- Other bug fixes and improvements, see GitHub history

View File

@@ -0,0 +1,78 @@
# New Beta Release
Radarr v4.2.2.6503 has been released on `develop`
- **Users who do not wish to be on the alpha `nightly` testing branch should take advantage of this parity and switch to `develop`**
A reminder about the `develop` and `nightly` branches
- **develop - Current Develop/Beta - (Beta): This is the testing edge. Released after tested in nightly to ensure no immediate issues. New features and bug fixes released here first after nightly. It can be considered semi-stable, but is still beta. This version will receive updates either weekly or biweekly depending on development.**
- **nightly - Current Nightly/Unstable - (Alpha/Unstable) : This is the bleeding edge. It is released as soon as code is committed and passes all automated tests. This build may have not been used by us or other users yet. There is no guarantee that it will even run in some cases. This branch is only recommended for advanced users. Issues and self investigation are expected in this branch. Use this branch only if you know what you are doing and are willing to get your hands dirty to recover a failed update. This version is updated immediately.**
# Announcements
- Radarr Postgres Database Support
- Radarr Plex Watchlist Support
- Radarr Collections Support
# Additional Commentary
- [Lidarr v1 released on `master`](https://www.reddit.com/r/Lidarr/comments/v5fdhi/new_stable_release_master_v1022592/)
- [Lidarr](https://lidarr.audio/donate), [Prowlarr](https://prowlarr.com/donate), [Radarr](https://radarr.video/donate), [Readarr](https://readarr.com/donate) now accept direct bitcoin donations
- [Readarr official beta on `develop` announced](https://www.reddit.com/r/Readarr/comments/sxvj8y/new_beta_release_develop_v0101248/)
- Radarr Postgres Database Support in `nightly` and `develop`
- Prowlarr Postgres Database Support in `nightly` and `develop`
- [Lidarr Postgres Database Support in development (Draft PR#2625)](https://github.com/Lidarr/Lidarr/pull/2625)
- \*Arrs Wiki Contributions welcomed and strongly encouraged, simply auth with GitHub on the wiki and update the page
# Releases
## Native
- [GitHub Releases](https://github.com/Radarr/Radarr/releases)
- [Wiki Installation Instructions](https://wiki.servarr.com/radarr/installation)
## Docker
- [hotio/Radarr:testing](https://hotio.dev/containers/radarr)
- [lscr.io/linuxserver/Radarr:develop](https://docs.linuxserver.io/images/docker-radarr)
## NAS Packages
- Synology - Please ask the SynoCommunity to update the base package; however, you can update in-app normally
- QNAP - Please ask the QNAP to update the base package; however, you should be able to update in-app normally
------------
# Release Notes
## v4.2.2.6503 (changes since [v4.2.1.6478](https://www.reddit.com/r/radarr/comments/woe62q/new_release_develop_v4216478/))
- Automated API Docs update
- New: (API) Get Collection by TmdbId
- Added: Ntfy provider for notifications. (#7455)
- Fixed: Postgres secret regex now less greedy
- Fixed: Regex in log cleanser taking 10+ minutes on messages longer than 100k. (#7481)
- New: Add support for Plex Edition tags in naming
- New: Make Plex imdb tags conditional
- Fixed: Correctly map movie by original title on import
- Fixed: UI Error on Collection Filter
- Fixed: Allow 0 Min on Size CustomFormat Condition
- New: Add Slovak Language
- Bump version to 4.2.2
- Other bug fixes and improvements, see GitHub history

View File

@@ -0,0 +1,478 @@
# New Stable Release
Radarr v4.2.4.6635 has been released on `master`
- **Users who do not wish to be on the alpha `nightly` or beta `develop` testing branches should take advantage of this parity and switch to `master`
A reminder about the `develop` and `nightly` branches
- **develop - Current Develop/Beta - (Beta): This is the testing edge. Released after tested in nightly to ensure no immediate issues. New features and bug fixes released here first after nightly. It can be considered semi-stable, but is still beta. This version will receive updates either weekly or biweekly depending on development.**
- **nightly - Current Nightly/Unstable - (Alpha/Unstable) : This is the bleeding edge. It is released as soon as code is committed and passes all automated tests. This build may have not been used by us or other users yet. There is no guarantee that it will even run in some cases. This branch is only recommended for advanced users. Issues and self investigation are expected in this branch. Use this branch only if you know what you are doing and are willing to get your hands dirty to recover a failed update. This version is updated immediately.**
# Announcements
- Radarr Postgres Database Support
- Radarr Plex Watchlist Support
- Radarr Collections Support
- Existing Collection Lists have been migrated
- Some users may experience `Database Malformed` or other migration errors
- This is caused by the database having existing corruption.
- The solution is to follow the instructions noted on the FAQ for a malformed database. <https://wiki.servarr.com/radarr/faq#i-am-getting-an-error-database-disk-image-is-malformed>
- Given this just occurred after an update then if the post-migrated database will not open or cannot be recovered then make a copy of the database from a recent backup and apply the database recovery process to that file then try starting Radarr with the recovered backup file. It should then migrate without issues then.
# Additional Commentary
- Radarr Postgres Database Support in `master`
- Prowlarr Postgres Database Support in `nightly` and `develop`
- [Lidarr Postgres Database Support in development (Draft PR#2625)](https://github.com/Lidarr/Lidarr/pull/2625)
- \*Arrs Wiki Contributions welcomed and strongly encouraged, simply auth with GitHub on the wiki and update the page
# Releases
## Native
- [GitHub Releases](https://github.com/Radarr/Radarr/releases)
- [Wiki Installation Instructions](https://wiki.servarr.com/radarr/installation)
## Docker
- [hotio/Radarr:release](https://hotio.dev/containers/radarr)
- [lscr.io/linuxserver/Radarr:latest](https://docs.linuxserver.io/images/docker-radarr)
## NAS Packages
- Synology - Please ask the SynoCommunity to update the base package; however, you can update in-app normally
- QNAP - Please ask the QNAP to update the base package; however, you should be able to update in-app normally
------------
# Release Notes
## v4.2.4.6635 (changes since v4.1.0.6175)
- Ignore SQLiteException tests on Azure
- Correct SQLiteException Sentry filtering
- Fix TagDetails sql for PG, add test
- Fixed: Add YTS.AG to the exception Release Groups (#7627)
- Fixed: Improve RarBG Error Handling
- fix typo in MovieRepository
- Fixed: Repack Preference Ignored
- Fixed: Ignore Movies with null tags when pulling AllMovieTags
- New: Torrent Seed Ratio no longer advance settings
- Translated using Weblate (Dutch) [skip ci]
- Remove unused package 'react-slick'
- Fixed: Collection Carousel Improvements
- Translated using Weblate (Portuguese (Brazil)) [skip ci]
- Clarify Folder as Root Folder (#7598)
- Fixed: Toolbar Button labels overlap
- Fixed: Series list jump bar click issues
- Fixed: Use translated title for sorttitle in Kodi nfo
- Handle redirects for 308 redirects
- Fixed: Improve Radarr List help text
- Fixed: Improve Quality Profile in-use helptext
- Bump version to 4.2.4
- FileNameBuilderFixture tests should run on Windows
- New: Add Latvian language
- Fixed: Defaults for Trakt Popular List
- Fixed: Strip additional domains out of release prefix
- Fixed: Collections not sorting properly on Index
- Update Bug Report Template
- Update Bug Report Template [skip ci] [common]
- Translated using Weblate (Portuguese (Brazil)) [skip ci]
- Fix: Trace logging postgres cleanse for large json files.
- Update src/NzbDrone.Core/CustomFormats/Specifications/RegexSpecificationBase.cs
- New: (UI) Indicate Custom Formats are Case Insensitive
- Automated API Docs update
- New: Add application URL to host configuration settings
- New: Setting to add Collection to NFO files
- Really fix UI Error on Collection Filter
- New: Preserve language tags when importing subtitle files
- Fixed: Skip extras in 'Extras' subfolder
- New: Import subtitles from sub folders
- Bump version to 4.2.3
- Translated using Weblate (German) [skip ci]
- Automated API Docs update
- New: (API) Get Collection by TmdbId
- Added: Ntfy provider for notifications. (#7455)
- Fixed: Postgres secret regex now less greedy
- Fixed: Regex in log cleanser taking 10+ minutes on messages longer than 100k. (#7481)
- New: Add support for Plex Edition tags in naming
- New: Make Plex imdb tags conditional
- Fixed: Correctly map movie by original title on import
- Fixed: UI Error on Collection Filter
- Fixed: Allow 0 Min on Size CustomFormat Condition
- New: Add Slovak Language
- Bump version to 4.2.2
- Translated using Weblate (Spanish) [skip ci]
- Regenerate yarn.lock
- Bump Sentry to 3.20.1
- Bump dotnet to 6.0.8
- Changed: Removed Tigole from ExceptionRelease match as is checked in ExceptionReleaseExact.
- Fixed: Tigole release group not being parsed and matched correctly, requiring manual import.
- Fixed: Configured recycle bin is excluded from import.
- Really fix Original Language in Language CF Specification
- Better Sentry Filtering for AggregateException children
- Run Postgres tests on 20.04
- Fixed: Blank Collection on MovieDetails when no Collection for Movie
- Remove non-functional filters for Trakt Lists
- Fixed: Original CF shouldn't need to be named "Original"
- Fixed NullRef in Skyhook Proxy during List Sync
- Fixed: Remove Notifiarr Environment Option
- Fixed: Trakt list request now uses correct rules for generating slug (#7449)
- Fixed: Allow blank ReleaseGroup and Edition from MovieFile edit
- Fixed: Don't process files that don't have a supported media file extension
- Fixed: Avoid failure if list contains same movie but without tmdbid
- Fixed: Log correct path when moving movies (#7439)
- Fixed: Watch state not preserved on metadata rewrite (#7436)
- Fixed: NullRefException in TorrentRssParser
- Bump Version to 4.2.1
- Fixed: Parse Group ZØNEHD
- New: Parse Group HONE
- New: (Discord) Include Custom Formats & Score On Grab
- Translated using Weblate (Catalan) [skip ci]
- Fixed: User Triggered Auto Searches now ignores monitored status (#7422)
- Fixed: Postgres timezone issues (#7183)
- Speed up and reduce meta calls for Imdb Lists when mapping
- Fixed: ImportListMovies not saved if from a list without TMDBIds
- Match 'HQCAM' as CAM source (#7412)
- Fix RefreshMovieServiceFixture folder service mock
- Fixed: Collections not deleted on Movie Delete
- Fixed: Bulk Collection RootFolder change failure
- New: Collection Folder, Genre, QualityProfile Filters
- Fixed: Trim RootFolderPath on Migration
- Avoid multiple metadata DB calls on list mapping
- Fixed: Prevent excluded movies from being added by collections
- Fixed: Avoid NullRef in MapMovieToTmdbMovie
- Fixed: Notifiarr - Better HTTP Error Handling
- Fix Nullref on Collection delete
- New: (Notifiarr) Custom Formats in OnGrab
- Automated API Docs update
- New: Custom Format Spec Validation
- Fixed: Don't fail on single failure for Discover bulk add
- Remove general yarn restore key to avoid cross OS conflict
- Translated using Weblate (Portuguese (Brazil)) [skip ci]
- Fixed: Don't call for server notifications on event driven check
- Rename MovieImportedEvent to MovieFileImportedEvent
- Fixed: Improved parsing WebDL Releases
- New: adding a link to tmdb in the import combobox movie search results (#7352)
- Fixed: Housekeeper doesn't remove collections that have MovieMeta from lists
- Fixed: Notify on Bulk Adds (Lists, Collections, Imports)
- Updated NLog Version (#7365)
- Translated using Weblate (Portuguese (Brazil)) [skip ci]
- Fixed: Migration 208 fails when collection doesn't have name
- Fixed: Don't call AddMovies if no movies to add from Collection
- New: Default to IMDb Ratings in Kodi Metadata
- Translated using Weblate (Slovak) [skip ci]
- New: Separate Ratings Columns
- Fixed: Add support for more Anime release formats
- Translated using Weblate (Portuguese) [skip ci]
- Automated API Docs update
- New: Bulk Edit Collections Profile, Root, Availability
- Automated API Docs update
- Fixed: Collections Improvements
- Add back Movie Credits and Alt Titles Indexes
- Fixed: Validate if equals or child for startup folder
- New: Notifiarr include Media Info in Download Notifications
- New: Notifiarr moved from webhook to API
- Translated using Weblate (German) [skip ci]
- Use DryIoc for Automoqer, drop Unity dependency
- Additional logging for partial Plex path scan
- Translated using Weblate (Chinese (Simplified) (zh_CN)) [skip ci]
- Fixed: Improved empty root folder failsafe logging (#7341)
- Fixed: Register PostgresOptions when running in utility mode
- Fixed: Clarified genre filtering helptext on Trakt lists
- Fixed: Lithuanian media info parsing
- Translated using Weblate (Portuguese (Brazil)) [skip ci]
- Automated API Docs update
- Fixed: MovieAdded trigger not available in UI
- New: Movie Added Notification
- Cleanup Collections UI Options
- Fixed: Speed up Collections API Endpoint
- New: Add DB Indexes for MovieMetadata
- New: .NET 6.0.5
- Translated using Weblate (Polish) [skip ci]
- Fixed: Remove Collection on last Movie delete
- Fixed: Correctly use loadash in FE Migrations
- Fixed: Partial Revert CF Validation for more robust solution
- Ensure .Mono and .Windows projects have all dependencies in build output
- Fix frontend monitor migration
- Try to fix CF null error for imported movie files
- Tweak monitor migration to avoid overwrites of valid settings
- Fixed: Run Frontend Migration for MonitorType
- New: Improve validation errors for Custom Formats
- Fixed: Don't Import Files with lower CF Score
- Fixed: Parse UHD2BD as BluRay instead of HDTV
- Fixed: Bluray 576p parsing
- New: Release Group Custom Format (#7154)
- Added term "brazilian" to Brazilian Portuguese parsing (#7296)
- Automated API Docs update
- New: Don't default manual import to move
- Fixed: Cutoff Unmet showing items above lowest accepted quality when upgrades are disabled
- New: Collections View
- Translated using Weblate (Portuguese (Brazil)) [skip ci]
- Translated using Weblate (Portuguese (Brazil)) [skip ci]
- New: Parse QxR Group r00t
- Automated API Docs update
- New: Instance name in System/Status API endpoint
- New: Instance name for Page Title
- New: Instance Name used for Syslog
- New: Set Instance Name
- New: Add optional Source Title column to history
- New: Support for new Nyaa RSS Feed format
- Fixed: Don't try to add MovieMeta if mapping fails for list items
- Fixed: Importing file from UNC shared folder without job folder
- Fixed: No restart requirement for Refresh Monitored interval change
- Fixed: Correct User-Agent api logging
- Delete nan.json
- Delete zh_Hans.json
- Translated using Weblate (Chinese (Simplified)) [skip ci]
- Fixed: Wrong translation mapping can be used for file naming and metadata
- Fixed: Translated fields are mapped incorrectly for existing search results
- Fixed: UI hiding search results with duplicate GUIDs
- Fixed: QBittorrent unknown download state: forcedMetaDL
- Fix migration 207 distinct on tmdbid only for list movie insert
- Fix metadata migration
- Automated API Docs update
- Rework Movie Metadata data model
- Temporarily ignore update tests until linux-x86 released
- New: Add linux-x86 builds
- New: Support Plex API Path Scan (Similar to autoscan)
- Fixed: Interactive Search Filter not filtering multiple qualities in the same filter row
- Added padding to search tab to maintain visual consistancy
- Fixed: Update ScheduledTask cache LastStartTime on command execution
- Bump Version to 4.2
- Bump webpack packages
- Remove old DotNetVersion method and dep
- Bump Monotorrent to 2.0.5
- Fixed: Don't die if Plex watchlist guid node is missing or null
- Automated API Docs update
- New: Add support for Plex Watchlist importing (#5707)
- New: Add date picker for custom filter dates
- Make postgres integration tests actually use postgres
- Fixed: Clarify Qbit Content Path Error
- Fixed: Use Movie Original Language for Custom Format Original Language (#6882)
- Fix .editorconfig to disallow `this`
- FFMpeg 5.0.1
- Fixed: Properly handle 119 error code from Synology Download Station
- Translated using Weblate (Hungarian) [skip ci]
- Fixed: FFprobe failing on MacOS and AV1 streams
- add 576 resolution back to simple title regex
- Translated using Weblate (Ukrainian) [skip ci]
- Set up tests on postgres
- Allow configuring postgres with environment variables
- New: Postgres Support
- Other bug fixes and improvements, see GitHub history

View File

@@ -0,0 +1,305 @@
# New Beta Release
Radarr v4.5.1.7282 has been released on `develop`
- **Users who do not wish to be on the alpha `nightly` testing branch should take advantage of this parity and switch to `develop`**
A reminder about the `develop` and `nightly` branches
- **develop - Current Develop/Beta - (Beta): This is the testing edge. Released after tested in nightly to ensure no immediate issues. New features and bug fixes released here first after nightly. It can be considered semi-stable, but is still beta. This version will receive updates either weekly or biweekly depending on development.**
- **nightly - Current Nightly/Unstable - (Alpha/Unstable) : This is the bleeding edge. It is released as soon as code is committed and passes all automated tests. This build may have not been used by us or other users yet. There is no guarantee that it will even run in some cases. This branch is only recommended for advanced users. Issues and self investigation are expected in this branch. Use this branch only if you know what you are doing and are willing to get your hands dirty to recover a failed update. This version is updated immediately.**
# Announcements
- Radarr Plex Watchlist Improvements
- Parsing Improvements
# Additional Commentary
# Releases
## Native
- [GitHub Releases](https://github.com/Radarr/Radarr/releases)
- [Wiki Installation Instructions](https://wiki.servarr.com/radarr/installation)
## Docker
- [hotio/Radarr:testing](https://hotio.dev/containers/radarr)
- [lscr.io/linuxserver/Radarr:develop](https://docs.linuxserver.io/images/docker-radarr)
## NAS Packages
- Synology - Please ask the SynoCommunity to update the base package; however, you can update in-app normally
- QNAP - Please ask the QNAP to update the base package; however, you should be able to update in-app normally
------------
# Release Notes
## v4.5.1.7282 (changes since v4.5.0.7106)
- Add back min availability to bulk movie edit
- Clean up variable name case
- Fix Radarr import syncing not matching any root folders.
- Fix MovieFileLanguageConnector to use MovieLanguage
- Update UI dependencies
- Add `inset` to stylelintrc
- Remove unused babel plugins and fix build with profiling
- Update all relevant dev tool deps
- Delete various old config files
- Use `await using` in LocalizationService
- Fixed: Provider health checks persist after add until next scheduled check
- Translated using Weblate (Portuguese (Brazil)) [skip ci]
- New: Log additional information when processing completed torrents from rTorrent
- Fix function name and use out var for try get in DownloadClientProvider
- Add Pull Request Labeler
- API key improvements
- Translated using Weblate (Chinese (Simplified) (zh_CN)) [skip ci]
- Automated API Docs update
- New: Notifications when Manual Interaction is required for importing
- New: On Health Restored notification
- Why rename many files when few file do trick
- GracePeriod not Graceperiod
- Sort translations alphabetically
- Move vscode settings to the frontend folder
- Fixed IsValidPath usages
- New: Improve path validation when handling paths from different OSes
- Log invalid config file exceptions
- Add VSCode extension recommendations
- Fixed: Ensure indexer errors are handled before processing response
- Align environment variable setting in ProcessProvider with upstream
- New: Only add version header for API requests
- Fixed: RootFolderPath not set for Movies from API
- Fixed: Index UI crash for movies without files
- New: Add token authentication for ntfy.sh notifications
- Fixed: Matching of custom formats during movie file import
- Revert argument exception swallowing for Plex library update
- New: Improved Plex library updating
- New: Add release info to webhook/custom script import events
- New: Don't import movies that don't match grab history
- Use string interpolation for Newznab request generation
- Virtualize movie select for manual import with react-window
- Convert Manual Import to Typescript
- New: Log content for invalid torrent files
- Translated using Weblate (Portuguese (Brazil)) [skip ci]
- Add `tmdbid` to capabilities check in Newznab/Torznab
- Remove requirement for imdbtitle and imdbyear in Newznab and Torznab
- Remove duplicate check in RemotePathMappingCheck
- Fixed: Movie Status in Table View
- Automated API Docs update
- New: Add result to commands to report commands that did not complete successfully
- Translated using Weblate (French) [skip ci]
- add trace log checkbox to bug report [common]
- Migrate to FluentValidation 9
- Fix downloading releases without an indexer
- Build download requests from indexer implementation
- bump `lock threads` github action to latest [skip ci]
- Fixed some aria violations
- Fixed: Search Button Display on Movie Index
- Fixed: Unable to search individual movies from Movie Index
- Fixed: Upgrades blocked: UpgradeSpecification error
- Fixed: Cannot Toggle Show Search on Movie Index
- New: Filter Sonarr synchronization based on Root Folders
- New: Add Original Language as Filter Option in Discover View
- New: Handle multi title release names split by slash
- Translated using Weblate (Chinese (Simplified) (zh_CN)) [skip ci]
- Fixed: Don't import Custom Format downgrades
- Fixed: Enable parsing of repacks with revision
- Fixed: Don't clean Kodi library if video is playing and Always Update is disabled
- Revert "Build download requests from indexer implementation"
- Fixed: Movie count incorrect in Movie Editor
- Fixed: Missing Translates
- Simplify DatabaseType logic
- Fixed: (Database) Improve Version detection
- Fixed: Importing from Manual Import ignoring Analyze video files
- Extract useSelectState from SelectContext
- Avoid queue failures due to unknown release language processing
- Fix default value variable name for ImportListExclusion
- New: Closing Move Movie modal without selecting will cancel save
- Use augmented languages for queue items
- New: Use languages from Torznab/Newznab attributes if given
- New: Use TmdbId from parsing for mapping
- Cleanup ParsingService
- Fixed: Pushed releases should be stored as pushed release
- New: Don't block imports when release was matched by ID if they were grabbed via interactive search
- Fixed: Queue not showing items with conflicting titles
- New: Include Movie Match Type in grab event details
- Fixed: Automatic import of releases when file is not matched to movie
- Fixed: Don't automatically import if release title doesn't match movie title
- Fixed: Throw to manual import if multiple movies found during title mapping
- Build download requests from indexer implementation
- New: Updated button and calendar outline colors for dark theme
- Fix loading eslintrc
- New: Remember add import list exclusion when removing movie
- Fixed: Movies table not resizing properly when window size changed
- Fixed: Movie select not working correctly after stopping/starting or changing sort order
- Improved UI error messages (stack trace and version)
- New: Increase clickable area of movie select in poster/overview
- Remove unused ReactDOM import
- Fixed: File browser
- Remove movie editor code
- New: Mass Editor is now part of movie list
- Added movie index selection
- Fixed: Restoring scroll position when going back/forward to series list
- Refactor Movie index to use react-window
- Add CSS Typings
- Add Prettier to format TypeScript files
- Add typescript
- New: Parsing of more German WEBDL releases
- Fixed: Parse 720p Remux as 720p BluRay
- QualityParser - Simplify new expression (IDE0090)
- Misc HealthCheck Cleanup and Sonarr Alignment
- Bump Swashbuckle to 6.5.0
- Fixed: Ensure first history item when marked as failed is the selected item
- Fixed: Edit Quality Profile not opening
- Refactor LanguageParser.ParseLanguageTags() to return List<> instead of IEnumerable. Clean up calls to ParseLanguageTags().
- Include extra tags from existing subtitles when renaming.
- Translated using Weblate (French) [skip ci]
- Use BuildInfo.AppName for RARBG appId instead of hardcoded value
- New: Updated Rarbg request limits
- New: Report health error if Recycling Bin folder is not writable
- Update core-js and use defaults for browserlist
- Update webpack and webpack-cli
- Use minified jquery
- Remove unused gulpFile
- Fix typo in calendarBackgroundColor CSS variable
- Fix QualityParser Tests
- Fixed: Parse DVD with 576p Resolution as DVD
- Auto-reply for Log Label [common]
- Bump version to 4.5.1
- Other bug fixes and improvements, see GitHub history

View File

@@ -0,0 +1,2 @@
- Radarr Plex Watchlist Improvements
- Parsing Improvements

View File

@@ -0,0 +1,6 @@
- **Users who do not wish to be on the alpha `nightly` testing branch should take advantage of this parity and switch to `develop`**
A reminder about the `develop` and `nightly` branches
- **develop - Current Develop/Beta - (Beta): This is the testing edge. Released after tested in nightly to ensure no immediate issues. New features and bug fixes released here first after nightly. It can be considered semi-stable, but is still beta. This version will receive updates either weekly or biweekly depending on development.**
- **nightly - Current Nightly/Unstable - (Alpha/Unstable) : This is the bleeding edge. It is released as soon as code is committed and passes all automated tests. This build may have not been used by us or other users yet. There is no guarantee that it will even run in some cases. This branch is only recommended for advanced users. Issues and self investigation are expected in this branch. Use this branch only if you know what you are doing and are willing to get your hands dirty to recover a failed update. This version is updated immediately.**

View File

@@ -0,0 +1,6 @@
- **Users who do not wish to be on the alpha `nightly` or beta `develop` testing branches should take advantage of this parity and switch to `master`
A reminder about the `develop` and `nightly` branches
- **develop - Current Develop/Beta - (Beta): This is the testing edge. Released after tested in nightly to ensure no immediate issues. New features and bug fixes released here first after nightly. It can be considered semi-stable, but is still beta. This version will receive updates either weekly or biweekly depending on development.**
- **nightly - Current Nightly/Unstable - (Alpha/Unstable) : This is the bleeding edge. It is released as soon as code is committed and passes all automated tests. This build may have not been used by us or other users yet. There is no guarantee that it will even run in some cases. This branch is only recommended for advanced users. Issues and self investigation are expected in this branch. Use this branch only if you know what you are doing and are willing to get your hands dirty to recover a failed update. This version is updated immediately.**

View File

5
debian/changelog vendored Normal file
View File

@@ -0,0 +1,5 @@
nzbdrone {version} {branch}; urgency=low
* Automatic Release.
-- NzbDrone <contact@nzbdrone.com> Mon, 26 Aug 2013 00:00:00 -0700

1
debian/compat vendored Normal file
View File

@@ -0,0 +1 @@
8

12
debian/control vendored Normal file
View File

@@ -0,0 +1,12 @@
Section: web
Priority: optional
Maintainer: Sonarr <contact@nzbdrone.com>
Source: nzbdrone
Homepage: https://sonarr.tv
Vcs-Git: git@github.com:Sonarr/Sonarr.git
Vcs-Browser: https://github.com/Sonarr/Sonarr
Package: nzbdrone
Architecture: all
Depends: libmono-cil-dev (>= 3.2), sqlite3 (>= 3.7), mediainfo (>= 0.7.52)
Description: Sonarr is an internet PVR

24
debian/copyright vendored Executable file
View File

@@ -0,0 +1,24 @@
Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
Upstream-Name: nzbdrone
Source: https://github.com/Sonarr/Sonarr
Files: *
Copyright: 2010-2016 Sonarr <hello@sonarr.tv>
License: GPL-3.0+
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
.
This package is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
.
On Debian systems, the complete text of the GNU General
Public License version 3 can be found in "/usr/share/common-licenses/GPL-3".

1
debian/install vendored Executable file
View File

@@ -0,0 +1 @@
nzbdrone_bin/* opt/NzbDrone

13
debian/rules vendored Normal file
View File

@@ -0,0 +1,13 @@
#!/usr/bin/make -f
# -*- makefile -*-
# Sample debian/rules that uses debhelper.
# This file was originally written by Joey Hess and Craig Small.
# As a special exception, when this file is copied by dh-make into a
# dh-make output file, you may use that output file without restriction.
# This special exception was added by Craig Small in version 0.37 of dh-make.
# Uncomment this to turn on verbose mode.
#export DH_VERBOSE=1
%:
dh $@

View File

@@ -36,7 +36,7 @@ module.exports = (env) => {
},
entry: {
index: 'index.ts'
index: 'index.js'
},
resolve: {
@@ -66,23 +66,23 @@ module.exports = (env) => {
output: {
path: distFolder,
publicPath: '/',
filename: '[name]-[contenthash].js',
filename: '[name].js',
sourceMapFilename: '[file].map'
},
optimization: {
moduleIds: 'deterministic',
chunkIds: isProduction ? 'deterministic' : 'named'
chunkIds: 'named',
splitChunks: {
chunks: 'initial',
name: 'vendors'
}
},
performance: {
hints: false
},
experiments: {
topLevelAwait: true
},
plugins: [
new webpack.DefinePlugin({
__DEV__: !isProduction,
@@ -90,15 +90,13 @@ module.exports = (env) => {
}),
new MiniCssExtractPlugin({
filename: 'Content/styles.css',
chunkFilename: 'Content/[id]-[chunkhash].css'
filename: 'Content/styles.css'
}),
new HtmlWebpackPlugin({
template: 'frontend/src/index.ejs',
filename: 'index.html',
publicPath: '/',
inject: false
publicPath: '/'
}),
new FileManagerPlugin({
@@ -235,7 +233,6 @@ module.exports = (env) => {
{
loader: 'url-loader',
options: {
limit: 10240,
mimetype: 'application/font-woff',
emitFile: false,
name: 'Content/Fonts/[name].[ext]'

View File

@@ -1,6 +1,5 @@
import PropTypes from 'prop-types';
import React, { Component } from 'react';
import Alert from 'Components/Alert';
import LoadingIndicator from 'Components/Loading/LoadingIndicator';
import ConfirmModal from 'Components/Modal/ConfirmModal';
import PageContent from 'Components/Page/PageContent';
@@ -157,16 +156,16 @@ class Blocklist extends Component {
{
!isFetching && !!error &&
<Alert kind={kinds.DANGER}>
<div>
{translate('UnableToLoadBlocklist')}
</Alert>
</div>
}
{
isPopulated && !error && !items.length &&
<Alert kind={kinds.INFO}>
{translate('NoHistoryBlocklist')}
</Alert>
<div>
{translate('NoHistory')}
</div>
}
{
@@ -210,7 +209,7 @@ class Blocklist extends Component {
isOpen={isConfirmRemoveModalOpen}
kind={kinds.DANGER}
title={translate('RemoveSelected')}
message={translate('RemoveSelectedItemBlocklistMessageText')}
message={translate('AreYouSureYouWantToRemoveTheSelectedItemsFromBlocklist')}
confirmLabel={translate('RemoveSelected')}
onConfirm={this.onRemoveSelectedConfirmed}
onCancel={this.onConfirmRemoveModalClose}

View File

@@ -1,6 +1,5 @@
import PropTypes from 'prop-types';
import React, { Component } from 'react';
import Alert from 'Components/Alert';
import LoadingIndicator from 'Components/Loading/LoadingIndicator';
import FilterMenu from 'Components/Menu/FilterMenu';
import PageContent from 'Components/Page/PageContent';
@@ -12,7 +11,7 @@ import Table from 'Components/Table/Table';
import TableBody from 'Components/Table/TableBody';
import TableOptionsModalWrapper from 'Components/Table/TableOptions/TableOptionsModalWrapper';
import TablePager from 'Components/Table/TablePager';
import { align, icons, kinds } from 'Helpers/Props';
import { align, icons } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
import HistoryRowConnector from './HistoryRowConnector';
@@ -84,9 +83,9 @@ class History extends Component {
{
!isFetchingAny && hasError &&
<Alert kind={kinds.DANGER}>
<div>
{translate('UnableToLoadHistory')}
</Alert>
</div>
}
{
@@ -94,9 +93,9 @@ class History extends Component {
// wait for the episodes to populate because they are never coming.
isPopulated && !hasError && !items.length &&
<Alert kind={kinds.INFO}>
<div>
{translate('NoHistory')}
</Alert>
</div>
}
{

View File

@@ -4,8 +4,7 @@ import IconButton from 'Components/Link/IconButton';
import RelativeDateCellConnector from 'Components/Table/Cells/RelativeDateCellConnector';
import TableRowCell from 'Components/Table/Cells/TableRowCell';
import TableRow from 'Components/Table/TableRow';
import Tooltip from 'Components/Tooltip/Tooltip';
import { icons, tooltipPositions } from 'Helpers/Props';
import { icons } from 'Helpers/Props';
import MovieFormats from 'Movie/MovieFormats';
import MovieLanguage from 'Movie/MovieLanguage';
import MovieQuality from 'Movie/MovieQuality';
@@ -177,14 +176,7 @@ class HistoryRow extends Component {
key={name}
className={styles.customFormatScore}
>
<Tooltip
anchor={formatCustomFormatScore(
customFormatScore,
customFormats.length
)}
tooltip={<MovieFormats formats={customFormats} />}
position={tooltipPositions.BOTTOM}
/>
{formatCustomFormatScore(customFormatScore)}
</TableRowCell>
);
}
@@ -265,8 +257,4 @@ HistoryRow.propTypes = {
onMarkAsFailedPress: PropTypes.func.isRequired
};
HistoryRow.defaultProps = {
customFormats: []
};
export default HistoryRow;

View File

@@ -1,7 +1,6 @@
import _ from 'lodash';
import PropTypes from 'prop-types';
import React, { Component } from 'react';
import Alert from 'Components/Alert';
import LoadingIndicator from 'Components/Loading/LoadingIndicator';
import PageContent from 'Components/Page/PageContent';
import PageContentBody from 'Components/Page/PageContentBody';
@@ -13,7 +12,7 @@ import Table from 'Components/Table/Table';
import TableBody from 'Components/Table/TableBody';
import TableOptionsModalWrapper from 'Components/Table/TableOptions/TableOptionsModalWrapper';
import TablePager from 'Components/Table/TablePager';
import { align, icons, kinds } from 'Helpers/Props';
import { align, icons } from 'Helpers/Props';
import getRemovedItems from 'Utilities/Object/getRemovedItems';
import hasDifferentItems from 'Utilities/Object/hasDifferentItems';
import translate from 'Utilities/String/translate';
@@ -232,17 +231,17 @@ class Queue extends Component {
{
!isRefreshing && hasError ?
<Alert kind={kinds.DANGER}>
<div>
{translate('FailedToLoadQueue')}
</Alert> :
</div> :
null
}
{
isAllPopulated && !hasError && !items.length ?
<Alert kind={kinds.INFO}>
<div>
{translate('QueueIsEmpty')}
</Alert> :
</div> :
null
}

View File

@@ -16,12 +16,6 @@
width: 150px;
}
.customFormatScore {
composes: cell from '~Components/Table/Cells/TableRowCell.css';
width: 55px;
}
.actions {
composes: cell from '~Components/Table/Cells/TableRowCell.css';

View File

@@ -2,7 +2,6 @@
// Please do not change this file!
interface CssExports {
'actions': string;
'customFormatScore': string;
'progress': string;
'protocol': string;
'quality': string;

View File

@@ -8,15 +8,13 @@ import ProgressBar from 'Components/ProgressBar';
import TableRowCell from 'Components/Table/Cells/TableRowCell';
import TableSelectCell from 'Components/Table/Cells/TableSelectCell';
import TableRow from 'Components/Table/TableRow';
import Tooltip from 'Components/Tooltip/Tooltip';
import { icons, kinds, tooltipPositions } from 'Helpers/Props';
import { icons, kinds } from 'Helpers/Props';
import InteractiveImportModal from 'InteractiveImport/InteractiveImportModal';
import MovieFormats from 'Movie/MovieFormats';
import MovieLanguage from 'Movie/MovieLanguage';
import MovieQuality from 'Movie/MovieQuality';
import MovieTitleLink from 'Movie/MovieTitleLink';
import formatBytes from 'Utilities/Number/formatBytes';
import formatCustomFormatScore from 'Utilities/Number/formatCustomFormatScore';
import translate from 'Utilities/String/translate';
import QueueStatusCell from './QueueStatusCell';
import RemoveQueueItemModal from './RemoveQueueItemModal';
@@ -44,14 +42,14 @@ class QueueRow extends Component {
this.setState({ isRemoveQueueItemModalOpen: true });
};
onRemoveQueueItemModalConfirmed = (blocklist, skipRedownload) => {
onRemoveQueueItemModalConfirmed = (blocklist) => {
const {
onRemoveQueueItemPress,
onQueueRowModalOpenOrClose
} = this.props;
onQueueRowModalOpenOrClose(false);
onRemoveQueueItemPress(blocklist, skipRedownload);
onRemoveQueueItemPress(blocklist);
this.setState({ isRemoveQueueItemModalOpen: false });
};
@@ -90,7 +88,6 @@ class QueueRow extends Component {
movie,
quality,
customFormats,
customFormatScore,
languages,
protocol,
indexer,
@@ -204,24 +201,6 @@ class QueueRow extends Component {
);
}
if (name === 'customFormatScore') {
return (
<TableRowCell
key={name}
className={styles.customFormatScore}
>
<Tooltip
anchor={formatCustomFormatScore(
customFormatScore,
customFormats.length
)}
tooltip={<MovieFormats formats={customFormats} />}
position={tooltipPositions.BOTTOM}
/>
</TableRowCell>
);
}
if (name === 'protocol') {
return (
<TableRowCell key={name}>
@@ -386,7 +365,6 @@ QueueRow.propTypes = {
movie: PropTypes.object,
quality: PropTypes.object.isRequired,
customFormats: PropTypes.arrayOf(PropTypes.object),
customFormatScore: PropTypes.number.isRequired,
languages: PropTypes.arrayOf(PropTypes.object).isRequired,
protocol: PropTypes.string.isRequired,
indexer: PropTypes.string,
@@ -412,7 +390,6 @@ QueueRow.propTypes = {
};
QueueRow.defaultProps = {
customFormats: [],
isGrabbing: false,
isRemoving: false
};

View File

@@ -22,8 +22,7 @@ class RemoveQueueItemModal extends Component {
this.state = {
remove: true,
blocklist: false,
skipRedownload: false
blocklist: false
};
}
@@ -33,8 +32,7 @@ class RemoveQueueItemModal extends Component {
resetState = function() {
this.setState({
remove: true,
blocklist: false,
skipRedownload: false
blocklist: false
});
};
@@ -49,10 +47,6 @@ class RemoveQueueItemModal extends Component {
this.setState({ blocklist: value });
};
onSkipRedownloadChange = ({ value }) => {
this.setState({ skipRedownload: value });
};
onRemoveConfirmed = () => {
const state = this.state;
@@ -76,7 +70,7 @@ class RemoveQueueItemModal extends Component {
isPending
} = this.props;
const { remove, blocklist, skipRedownload } = this.state;
const { remove, blocklist } = this.state;
return (
<Modal
@@ -124,20 +118,6 @@ class RemoveQueueItemModal extends Component {
/>
</FormGroup>
{
blocklist ?
<FormGroup>
<FormLabel>{translate('SkipRedownload')}</FormLabel>
<FormInputGroup
type={inputTypes.CHECK}
name="skipRedownload"
value={skipRedownload}
helpText={translate('SkipRedownloadHelpText')}
onChange={this.onSkipRedownloadChange}
/>
</FormGroup> :
null
}
</ModalBody>
<ModalFooter>

View File

@@ -23,8 +23,7 @@ class RemoveQueueItemsModal extends Component {
this.state = {
remove: true,
blocklist: false,
skipRedownload: false
blocklist: false
};
}
@@ -34,8 +33,7 @@ class RemoveQueueItemsModal extends Component {
resetState = function() {
this.setState({
remove: true,
blocklist: false,
skipRedownload: false
blocklist: false
});
};
@@ -50,10 +48,6 @@ class RemoveQueueItemsModal extends Component {
this.setState({ blocklist: value });
};
onSkipRedownloadChange = ({ value }) => {
this.setState({ skipRedownload: value });
};
onRemoveConfirmed = () => {
const state = this.state;
@@ -77,7 +71,7 @@ class RemoveQueueItemsModal extends Component {
allPending
} = this.props;
const { remove, blocklist, skipRedownload } = this.state;
const { remove, blocklist } = this.state;
return (
<Modal
@@ -94,7 +88,7 @@ class RemoveQueueItemsModal extends Component {
<ModalBody>
<div className={styles.message}>
{selectedCount > 1 ? translate('RemoveSelectedItemsQueueMessageText', selectedCount) : translate('RemoveSelectedItemQueueMessageText')}
{selectedCount > 1 ? translate('AreYouSureYouWantToRemoveSelectedItemsFromQueue', selectedCount) : translate('AreYouSureYouWantToRemoveSelectedItemFromQueue')}
</div>
{
@@ -128,20 +122,6 @@ class RemoveQueueItemsModal extends Component {
/>
</FormGroup>
{
blocklist ?
<FormGroup>
<FormLabel>{translate('SkipRedownload')}</FormLabel>
<FormInputGroup
type={inputTypes.CHECK}
name="skipRedownload"
value={skipRedownload}
helpText={translate('SkipRedownloadHelpText')}
onChange={this.onSkipRedownloadChange}
/>
</FormGroup> :
null
}
</ModalBody>
<ModalFooter>
@@ -153,7 +133,7 @@ class RemoveQueueItemsModal extends Component {
kind={kinds.DANGER}
onPress={this.onRemoveConfirmed}
>
{translate('Remove')}
Remove
</Button>
</ModalFooter>
</ModalContent>

View File

@@ -1,11 +1,9 @@
import { reduce } from 'lodash';
import PropTypes from 'prop-types';
import React, { Component } from 'react';
import Alert from 'Components/Alert';
import LoadingIndicator from 'Components/Loading/LoadingIndicator';
import PageContent from 'Components/Page/PageContent';
import PageContentBody from 'Components/Page/PageContentBody';
import { kinds } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
import selectAll from 'Utilities/Table/selectAll';
import toggleSelected from 'Utilities/Table/toggleSelected';
@@ -107,9 +105,9 @@ class ImportMovie extends Component {
{
!rootFoldersFetching && !!rootFoldersError ?
<Alert kind={kinds.DANGER}>
<div>
{translate('UnableToLoadRootFolders')}
</Alert> :
</div> :
null
}
@@ -118,9 +116,9 @@ class ImportMovie extends Component {
!rootFoldersFetching &&
rootFoldersPopulated &&
!unmappedFolders.length ?
<Alert kind={kinds.INFO}>
<div>
{translate('AllMoviesInPathHaveBeenImported', [path])}
</Alert> :
</div> :
null
}

View File

@@ -18,23 +18,17 @@ import styles from './ImportMovieSelectFolder.css';
const rootFolderColumns = [
{
name: 'path',
get label() {
return translate('Path');
},
label: translate('Path'),
isVisible: true
},
{
name: 'freeSpace',
get label() {
return translate('FreeSpace');
},
label: translate('FreeSpace'),
isVisible: true
},
{
name: 'unmappedFolders',
get label() {
return translate('UnmappedFolders');
},
label: translate('UnmappedFolders'),
isVisible: true
},
{
@@ -98,9 +92,9 @@ class ImportMovieSelectFolder extends Component {
{
!isFetching && error ?
<Alert kind={kinds.DANGER}>
<div>
{translate('UnableToLoadRootFolders')}
</Alert> :
</div> :
null
}

View File

@@ -13,7 +13,7 @@ import Switch from 'Components/Router/Switch';
import DiscoverMovieConnector from 'DiscoverMovie/DiscoverMovieConnector';
import MovieDetailsPageConnector from 'Movie/Details/MovieDetailsPageConnector';
import MovieIndex from 'Movie/Index/MovieIndex';
import CustomFormatSettingsPage from 'Settings/CustomFormats/CustomFormatSettingsPage';
import CustomFormatSettingsConnector from 'Settings/CustomFormats/CustomFormatSettingsConnector';
import DownloadClientSettingsConnector from 'Settings/DownloadClients/DownloadClientSettingsConnector';
import GeneralSettingsConnector from 'Settings/General/GeneralSettingsConnector';
import ImportListSettingsConnector from 'Settings/ImportLists/ImportListSettingsConnector';
@@ -148,7 +148,7 @@ function AppRoutes(props) {
<Route
path="/settings/customformats"
component={CustomFormatSettingsPage}
component={CustomFormatSettingsConnector}
/>
<Route

View File

@@ -1,7 +1,6 @@
import InteractiveImportAppState from 'App/State/InteractiveImportAppState';
import MovieFilesAppState from './MovieFilesAppState';
import MoviesAppState, { MovieIndexAppState } from './MoviesAppState';
import ParseAppState from './ParseAppState';
import QueueAppState from './QueueAppState';
import SettingsAppState from './SettingsAppState';
import TagsAppState from './TagsAppState';
@@ -42,7 +41,6 @@ interface AppState {
movieFiles: MovieFilesAppState;
interactiveImport: InteractiveImportAppState;
movieIndex: MovieIndexAppState;
parse: ParseAppState;
settings: SettingsAppState;
movies: MoviesAppState;
tags: TagsAppState;

View File

@@ -1,34 +0,0 @@
import ModelBase from 'App/ModelBase';
import { AppSectionItemState } from 'App/State/AppSectionState';
import Language from 'Language/Language';
import Movie from 'Movie/Movie';
import { QualityModel } from 'Quality/Quality';
import CustomFormat from 'typings/CustomFormat';
export interface ParsedMovieInfo {
releaseTitle: string;
originalTitle: string;
movieTitle: string;
movieTitles: string[];
year: number;
quality: QualityModel;
languages: Language[];
releaseHash: string;
releaseGroup?: string;
edition?: string;
tmdbId?: number;
imdbId?: string;
}
export interface ParseModel extends ModelBase {
title: string;
parsedMovieInfo: ParsedMovieInfo;
movie?: Movie;
languages?: Language[];
customFormats?: CustomFormat[];
customFormatScore?: number;
}
type ParseAppState = AppSectionItemState<ParseModel>;
export default ParseAppState;

View File

@@ -1,33 +1,14 @@
import AppSectionState, {
AppSectionDeleteState,
AppSectionSaveState,
AppSectionSchemaState,
} from 'App/State/AppSectionState';
import Language from 'Language/Language';
import DownloadClient from 'typings/DownloadClient';
import ImportList from 'typings/ImportList';
import Indexer from 'typings/Indexer';
import Notification from 'typings/Notification';
import QualityProfile from 'typings/QualityProfile';
import { UiSettings } from 'typings/UiSettings';
export interface DownloadClientAppState
extends AppSectionState<DownloadClient>,
AppSectionDeleteState,
AppSectionSaveState {}
export interface ImportListAppState
extends AppSectionState<ImportList>,
AppSectionDeleteState,
AppSectionSaveState {}
export interface IndexerAppState
extends AppSectionState<Indexer>,
AppSectionDeleteState,
AppSectionSaveState {}
export interface NotificationAppState
extends AppSectionState<Notification>,
AppSectionDeleteState {}
export interface QualityProfilesAppState
@@ -39,9 +20,6 @@ export type UiSettingsAppState = AppSectionState<UiSettings>;
interface SettingsAppState {
downloadClients: DownloadClientAppState;
importLists: ImportListAppState;
indexers: IndexerAppState;
notifications: NotificationAppState;
language: LanguageSettingsAppState;
uiSettings: UiSettingsAppState;
qualityProfiles: QualityProfilesAppState;

View File

@@ -1,8 +1,6 @@
import PropTypes from 'prop-types';
import React, { Component } from 'react';
import Alert from 'Components/Alert';
import LoadingIndicator from 'Components/Loading/LoadingIndicator';
import { kinds } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
import AgendaConnector from './Agenda/AgendaConnector';
import * as calendarViews from './calendarViews';
@@ -33,9 +31,9 @@ class Calendar extends Component {
{
!isFetching && !!error &&
<Alert kind={kinds.DANGER}>
<div>
{translate('UnableToLoadTheCalendar')}
</Alert>
</div>
}
{

View File

@@ -28,7 +28,7 @@ function createMapStateToProps() {
qualityProfileId: collection.qualityProfileId,
minimumAvailability: collection.minimumAvailability,
searchForMovie: collection.searchOnAdd,
tags: collection.tags || []
tags: []
};
const {

View File

@@ -1,7 +1,6 @@
import _ from 'lodash';
import PropTypes from 'prop-types';
import React, { Component } from 'react';
import Alert from 'Components/Alert';
import LoadingIndicator from 'Components/Loading/LoadingIndicator';
import PageContent from 'Components/Page/PageContent';
import PageContentBody from 'Components/Page/PageContentBody';
@@ -10,7 +9,7 @@ import PageToolbar from 'Components/Page/Toolbar/PageToolbar';
import PageToolbarButton from 'Components/Page/Toolbar/PageToolbarButton';
import PageToolbarSection from 'Components/Page/Toolbar/PageToolbarSection';
import PageToolbarSeparator from 'Components/Page/Toolbar/PageToolbarSeparator';
import { align, icons, kinds, sortDirections } from 'Helpers/Props';
import { align, icons, sortDirections } from 'Helpers/Props';
import styles from 'Movie/Index/MovieIndex.css';
import hasDifferentItemsOrOrder from 'Utilities/Object/hasDifferentItemsOrOrder';
import translate from 'Utilities/String/translate';
@@ -314,9 +313,9 @@ class Collection extends Component {
{
!isFetching && !!error &&
<Alert kind={kinds.DANGER}>
<div>
{translate('UnableToLoadCollections')}
</Alert>
</div>
}
{

View File

@@ -2,12 +2,17 @@ import PropTypes from 'prop-types';
import React, { Component } from 'react';
import { connect } from 'react-redux';
import { createSelector } from 'reselect';
import createAllMoviesSelector from 'Store/Selectors/createAllMoviesSelector';
import createCollectionSelector from 'Store/Selectors/createCollectionSelector';
function createMapStateToProps() {
return createSelector(
createCollectionSelector(),
(collection) => {
createAllMoviesSelector(),
(
collection,
allMovies
) => {
// If a movie is deleted this selector may fire before the parent
// selecors, which will result in an undefined movie, if that happens
// we want to return early here and again in the render function to avoid
@@ -17,11 +22,21 @@ function createMapStateToProps() {
return {};
}
const allGenres = collection.movies.flatMap((movie) => movie.genres);
let allGenres = [];
let libraryMovies = 0;
collection.movies.forEach((movie) => {
allGenres = allGenres.concat(movie.genres);
if (allMovies.find((libraryMovie) => libraryMovie.tmdbId === movie.tmdbId)) {
libraryMovies++;
}
});
return {
...collection,
genres: Array.from(new Set(allGenres)).slice(0, 3)
genres: Array.from(new Set(allGenres)).slice(0, 3),
missingMovies: collection.movies.length - libraryMovies
};
}
);

View File

@@ -50,7 +50,6 @@ class EditCollectionModalContent extends Component {
minimumAvailability,
// Id,
rootFolderPath,
tags,
searchOnAdd
} = item;
@@ -127,17 +126,6 @@ class EditCollectionModalContent extends Component {
/>
</FormGroup>
<FormGroup>
<FormLabel>{translate('Tags')}</FormLabel>
<FormInputGroup
type={inputTypes.TAG}
name="tags"
onChange={onInputChange}
{...tags}
/>
</FormGroup>
<FormGroup>
<FormLabel>{translate('SearchOnAdd')}</FormLabel>

View File

@@ -42,7 +42,6 @@ function createMapStateToProps() {
qualityProfileId: collection.qualityProfileId,
minimumAvailability: collection.minimumAvailability,
rootFolderPath: collection.rootFolderPath,
tags: collection.tags,
searchOnAdd: collection.searchOnAdd
};

View File

@@ -28,14 +28,6 @@ function CollectionSortMenu(props) {
>
{translate('Title')}
</SortMenuItem>
<SortMenuItem
name="missingMovies"
sortKey={sortKey}
sortDirection={sortDirection}
onPress={onSortSelect}
>
{translate('Missing')}
</SortMenuItem>
</MenuContent>
</SortMenu>
);

View File

@@ -102,7 +102,7 @@ $hoverScale: 1.05;
position: relative;
display: block;
background-color: var(--black);
background-color: var(--defaultColor);
}
.monitorToggleButton {

View File

@@ -258,7 +258,7 @@ CollectionOverviews.propTypes = {
sortKey: PropTypes.string,
overviewOptions: PropTypes.object.isRequired,
jumpToCharacter: PropTypes.string,
scrollTop: PropTypes.number,
scrollTop: PropTypes.number.isRequired,
scroller: PropTypes.instanceOf(Element).isRequired,
showRelativeDates: PropTypes.bool.isRequired,
shortDateFormat: PropTypes.string.isRequired,

View File

@@ -14,24 +14,9 @@ import { inputTypes } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
const posterSizeOptions = [
{
key: 'small',
get value() {
return translate('Small');
}
},
{
key: 'medium',
get value() {
return translate('Medium');
}
},
{
key: 'large',
get value() {
return translate('Large');
}
}
{ key: 'small', value: translate('Small') },
{ key: 'medium', value: translate('Medium') },
{ key: 'large', value: translate('Large') }
];
class CollectionOverviewOptionsModalContent extends Component {

View File

@@ -20,16 +20,12 @@ import styles from './FileBrowserModalContent.css';
const columns = [
{
name: 'type',
get label() {
return translate('Type');
},
label: translate('Type'),
isVisible: true
},
{
name: 'name',
get label() {
return translate('Name');
},
label: translate('Name'),
isVisible: true
}
];

View File

@@ -10,42 +10,12 @@ import { NAME } from './FilterBuilderRowValue';
import styles from './DateFilterBuilderRowValue.css';
const timeOptions = [
{
key: 'seconds',
get value() {
return translate('Seconds');
}
},
{
key: 'minutes',
get value() {
return translate('Minutes');
}
},
{
key: 'hours',
get value() {
return translate('Hours');
}
},
{
key: 'days',
get value() {
return translate('Days');
}
},
{
key: 'weeks',
get value() {
return translate('Weeks');
}
},
{
key: 'months',
get value() {
return translate('Months');
}
}
{ key: 'seconds', value: translate('Seconds') },
{ key: 'minutes', value: translate('Minutes') },
{ key: 'hours', value: translate('Hours') },
{ key: 'days', value: translate('Days') },
{ key: 'weeks', value: translate('Weeks') },
{ key: 'months', value: translate('Months') }
];
function isInFilter(filterType) {

View File

@@ -210,13 +210,11 @@ class FilterBuilderRow extends Component {
const selectedFilterBuilderProp = this.selectedFilterBuilderProp;
const keyOptions = filterBuilderProps.map((availablePropFilter) => {
const { name, label } = availablePropFilter;
return {
key: name,
value: typeof label === 'function' ? label() : label
key: availablePropFilter.name,
value: availablePropFilter.label
};
}).sort((a, b) => a.value.localeCompare(b.value));
});
const ValueComponent = getRowValueConnector(selectedFilterBuilderProp);

View File

@@ -3,24 +3,9 @@ import translate from 'Utilities/String/translate';
import FilterBuilderRowValue from './FilterBuilderRowValue';
const protocols = [
{
id: 'announced',
get name() {
return translate('Announced');
}
},
{
id: 'inCinemas',
get name() {
return translate('InCinemas');
}
},
{
id: 'released',
get name() {
return translate('Released');
}
}
{ id: 'announced', name: translate('Announced') },
{ id: 'inCinemas', name: translate('InCinemas') },
{ id: 'released', name: translate('Released') }
];
function MinimumAvailabilityFilterBuilderRowValue(props) {

View File

@@ -4,30 +4,10 @@ import FilterBuilderRowValue from './FilterBuilderRowValue';
const protocols = [
{ id: 'tba', name: 'TBA' },
{
id: 'announced',
get name() {
return translate('Announced');
}
},
{
id: 'inCinemas',
get name() {
return translate('InCinemas');
}
},
{
id: 'released',
get name() {
return translate('Released');
}
},
{
id: 'deleted',
get name() {
return translate('Deleted');
}
}
{ id: 'announced', name: translate('Announced') },
{ id: 'inCinemas', name: translate('InCinemas') },
{ id: 'released', name: translate('Released') },
{ id: 'deleted', name: translate('Deleted') }
];
function ReleaseStatusFilterBuilderRowValue(props) {

View File

@@ -4,24 +4,9 @@ import translate from 'Utilities/String/translate';
import EnhancedSelectInput from './EnhancedSelectInput';
const availabilityOptions = [
{
key: 'announced',
get value() {
return translate('Announced');
}
},
{
key: 'inCinemas',
get value() {
return translate('InCinemas');
}
},
{
key: 'released',
get value() {
return translate('Released');
}
}
{ key: 'announced', value: translate('Announced') },
{ key: 'inCinemas', value: translate('InCinemas') },
{ key: 'released', value: translate('Released') }
];
function AvailabilitySelectInput(props) {
@@ -35,7 +20,7 @@ function AvailabilitySelectInput(props) {
if (includeNoChange) {
values.unshift({
key: 'noChange',
value: translate('NoChange'),
value: 'No Change',
disabled: true
});
}

View File

@@ -580,7 +580,7 @@ EnhancedSelectInput.propTypes = {
className: PropTypes.string,
disabledClassName: PropTypes.string,
name: PropTypes.string.isRequired,
value: PropTypes.oneOfType([PropTypes.string, PropTypes.number, PropTypes.arrayOf(PropTypes.string), PropTypes.arrayOf(PropTypes.number)]).isRequired,
value: PropTypes.oneOfType([PropTypes.string, PropTypes.number, PropTypes.arrayOf(PropTypes.number)]).isRequired,
values: PropTypes.arrayOf(PropTypes.object).isRequired,
isDisabled: PropTypes.bool.isRequired,
isFetching: PropTypes.bool.isRequired,

View File

@@ -265,8 +265,6 @@ FormInputGroup.propTypes = {
values: PropTypes.arrayOf(PropTypes.any),
type: PropTypes.string.isRequired,
kind: PropTypes.oneOf(kinds.all),
min: PropTypes.number,
max: PropTypes.number,
unit: PropTypes.string,
buttons: PropTypes.oneOfType([PropTypes.node, PropTypes.arrayOf(PropTypes.node)]),
helpText: PropTypes.string,

View File

@@ -1,7 +1,6 @@
import PropTypes from 'prop-types';
import React from 'react';
import monitorOptions from 'Utilities/Movie/monitorOptions';
import translate from 'Utilities/String/translate';
import SelectInput from './SelectInput';
function MovieMonitoredSelectInput(props) {
@@ -15,7 +14,7 @@ function MovieMonitoredSelectInput(props) {
if (includeNoChange) {
values.unshift({
key: 'noChange',
value: translate('NoChange'),
value: 'No Change',
disabled: true
});
}

View File

@@ -10,7 +10,7 @@ function parseValue(props, value) {
} = props;
if (value == null || value === '') {
return null;
return min;
}
let newValue = isFloat ? parseFloat(value) : parseInt(value);

View File

@@ -35,8 +35,6 @@ function getType({ type, selectOptionsProviderAction }) {
return inputTypes.TEXT;
case 'oAuth':
return inputTypes.OAUTH;
case 'rootFolder':
return inputTypes.ROOT_FOLDER_SELECT;
default:
return inputTypes.TEXT;
}
@@ -65,7 +63,6 @@ function ProviderFieldFormGroup(props) {
name,
label,
helpText,
helpTextWarning,
helpLink,
placeholder,
value,
@@ -99,7 +96,6 @@ function ProviderFieldFormGroup(props) {
name={name}
label={label}
helpText={helpText}
helpTextWarning={helpTextWarning}
helpLink={helpLink}
placeholder={placeholder}
value={value}
@@ -126,7 +122,6 @@ ProviderFieldFormGroup.propTypes = {
name: PropTypes.string.isRequired,
label: PropTypes.string.isRequired,
helpText: PropTypes.string,
helpTextWarning: PropTypes.string,
helpLink: PropTypes.string,
placeholder: PropTypes.string,
value: PropTypes.any,

View File

@@ -5,7 +5,6 @@ import { connect } from 'react-redux';
import { createSelector } from 'reselect';
import createSortedSectionSelector from 'Store/Selectors/createSortedSectionSelector';
import sortByName from 'Utilities/Array/sortByName';
import translate from 'Utilities/String/translate';
import EnhancedSelectInput from './EnhancedSelectInput';
function createMapStateToProps() {
@@ -25,7 +24,7 @@ function createMapStateToProps() {
if (includeNoChange) {
values.unshift({
key: 'noChange',
value: translate('NoChange'),
value: 'No Change',
disabled: includeNoChangeDisabled
});
}
@@ -70,7 +69,7 @@ class QualityProfileSelectInputConnector extends Component {
// Listeners
onChange = ({ name, value }) => {
this.props.onChange({ name, value: value === 'noChange' ? value : parseInt(value) });
this.props.onChange({ name, value: parseInt(value) });
};
//

View File

@@ -3,7 +3,6 @@ import React, { Component } from 'react';
import { connect } from 'react-redux';
import { createSelector } from 'reselect';
import { addRootFolder } from 'Store/Actions/rootFolderActions';
import translate from 'Utilities/String/translate';
import RootFolderSelectInput from './RootFolderSelectInput';
const ADD_NEW_KEY = 'addNew';
@@ -28,7 +27,7 @@ function createMapStateToProps() {
if (includeNoChange) {
values.unshift({
key: 'noChange',
value: translate('NoChange'),
value: 'No Change',
isDisabled: includeNoChangeDisabled,
isMissing: false
});

View File

@@ -61,7 +61,7 @@ class SelectInput extends Component {
value={key}
{...otherOptionProps}
>
{typeof optionValue === 'function' ? optionValue() : optionValue}
{optionValue}
</option>
);
})
@@ -75,7 +75,7 @@ SelectInput.propTypes = {
className: PropTypes.string,
disabledClassName: PropTypes.string,
name: PropTypes.string.isRequired,
value: PropTypes.oneOfType([PropTypes.string, PropTypes.number, PropTypes.func]).isRequired,
value: PropTypes.oneOfType([PropTypes.string, PropTypes.number]).isRequired,
values: PropTypes.arrayOf(PropTypes.object).isRequired,
isDisabled: PropTypes.bool,
hasError: PropTypes.bool,

View File

@@ -75,18 +75,6 @@ class TagInput extends Component {
//
// Listeners
onTagEdit = ({ value, ...otherProps }) => {
const currentValue = this.state.value;
if (currentValue && this.props.onTagReplace) {
this.props.onTagReplace(otherProps, { name: currentValue });
} else {
this.props.onTagDelete(otherProps);
}
this.setState({ value });
};
onInputContainerPress = () => {
this._autosuggestRef.input.focus();
};
@@ -200,7 +188,6 @@ class TagInput extends Component {
const {
tags,
kind,
canEdit,
tagComponent,
onTagDelete
} = this.props;
@@ -212,10 +199,8 @@ class TagInput extends Component {
kind={kind}
inputProps={inputProps}
isFocused={this.state.isFocused}
canEdit={canEdit}
tagComponent={tagComponent}
onTagDelete={onTagDelete}
onTagEdit={this.onTagEdit}
onInputContainerPress={this.onInputContainerPress}
/>
);
@@ -238,7 +223,7 @@ class TagInput extends Component {
<AutoSuggestInput
{...otherProps}
forwardedRef={this._setAutosuggestRef}
className={className}
className={styles.internalInput}
inputContainerClassName={classNames(
inputContainerClassName,
isFocused && styles.isFocused
@@ -273,13 +258,11 @@ TagInput.propTypes = {
placeholder: PropTypes.string.isRequired,
delimiters: PropTypes.arrayOf(PropTypes.string).isRequired,
minQueryLength: PropTypes.number.isRequired,
canEdit: PropTypes.bool,
hasError: PropTypes.bool,
hasWarning: PropTypes.bool,
tagComponent: PropTypes.elementType.isRequired,
onTagAdd: PropTypes.func.isRequired,
onTagDelete: PropTypes.func.isRequired,
onTagReplace: PropTypes.func
onTagDelete: PropTypes.func.isRequired
};
TagInput.defaultProps = {
@@ -290,7 +273,6 @@ TagInput.defaultProps = {
placeholder: '',
delimiters: ['Tab', 'Enter', ' ', ','],
minQueryLength: 1,
canEdit: false,
tagComponent: TagInputTag
};

View File

@@ -138,7 +138,6 @@ class TagInputConnector extends Component {
<TagInput
onTagAdd={this.onTagAdd}
onTagDelete={this.onTagDelete}
onTagReplace={this.onTagReplace}
{...this.props}
/>
);

View File

@@ -28,10 +28,8 @@ class TagInputInput extends Component {
tags,
inputProps,
kind,
canEdit,
tagComponent: TagComponent,
onTagDelete,
onTagEdit
onTagDelete
} = this.props;
return (
@@ -48,10 +46,8 @@ class TagInputInput extends Component {
index={index}
tag={tag}
kind={kind}
canEdit={canEdit}
isLastTag={index === tags.length - 1}
onDelete={onTagDelete}
onEdit={onTagEdit}
/>
);
})
@@ -70,10 +66,8 @@ TagInputInput.propTypes = {
inputProps: PropTypes.object.isRequired,
kind: PropTypes.oneOf(kinds.all).isRequired,
isFocused: PropTypes.bool.isRequired,
canEdit: PropTypes.bool.isRequired,
tagComponent: PropTypes.elementType.isRequired,
onTagDelete: PropTypes.func.isRequired,
onTagEdit: PropTypes.func.isRequired,
onInputContainerPress: PropTypes.func.isRequired
};

View File

@@ -1,40 +1,5 @@
.tag {
display: flex;
justify-content: center;
flex-direction: column;
max-width: 100%;
composes: link from '~Components/Link/Link.css';
height: 31px;
}
.link {
composes: link from '~Components/Link/Link.css';
max-width: 100%;
line-height: 1px;
}
.linkWithEdit {
composes: link from '~Components/Link/Link.css';
max-width: calc(100% - 9px - 4px - 2px);
line-height: 1px;
}
.editContainer {
display: inline-block;
margin-left: 4px;
padding-left: 2px;
border-left: 1px solid #eee;
}
.editButton {
composes: button from '~Components/Link/IconButton.css';
width: 9px;
}
.label {
composes: label from '~Components/Label.css';
max-width: 100%;
}

View File

@@ -1,11 +1,6 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'editButton': string;
'editContainer': string;
'label': string;
'link': string;
'linkWithEdit': string;
'tag': string;
}
export const cssExports: CssExports;

View File

@@ -1,9 +1,8 @@
import PropTypes from 'prop-types';
import React, { Component } from 'react';
import Label from 'Components/Label';
import IconButton from 'Components/Link/IconButton';
import Link from 'Components/Link/Link';
import { icons, kinds } from 'Helpers/Props';
import { kinds } from 'Helpers/Props';
import tagShape from 'Helpers/Props/Shapes/tagShape';
import styles from './TagInputTag.css';
@@ -25,61 +24,24 @@ class TagInputTag extends Component {
});
};
onEdit = () => {
const {
index,
tag,
onEdit
} = this.props;
onEdit({
index,
id: tag.id,
value: tag.name
});
};
//
// Render
render() {
const {
tag,
kind,
canEdit
kind
} = this.props;
return (
<div
<Link
className={styles.tag}
tabIndex={-1}
onPress={this.onDelete}
>
<Label
className={styles.label}
kind={kind}
>
<Link
className={canEdit ? styles.linkWithEdit : styles.link}
tabIndex={-1}
onPress={this.onDelete}
>
{tag.name}
</Link>
{
canEdit ?
<div className={styles.editContainer}>
<IconButton
className={styles.editButton}
name={icons.EDIT}
size={9}
onPress={this.onEdit}
/>
</div> :
null
}
<Label kind={kind}>
{tag.name}
</Label>
</div>
</Link>
);
}
}
@@ -88,9 +50,7 @@ TagInputTag.propTypes = {
index: PropTypes.number.isRequired,
tag: PropTypes.shape(tagShape),
kind: PropTypes.oneOf(kinds.all).isRequired,
canEdit: PropTypes.bool.isRequired,
onDelete: PropTypes.func.isRequired,
onEdit: PropTypes.func.isRequired
onDelete: PropTypes.func.isRequired
};
export default TagInputTag;

View File

@@ -71,20 +71,6 @@ class TextTagInputConnector extends Component {
});
};
onTagReplace = (tagToReplace, newTag) => {
const {
name,
valueArray,
onChange
} = this.props;
const newValue = [...valueArray];
newValue.splice(tagToReplace.index, 1);
newValue.push(newTag.name.trim());
onChange({ name, value: newValue });
};
//
// Render
@@ -94,7 +80,6 @@ class TextTagInputConnector extends Component {
tagList={[]}
onTagAdd={this.onTagAdd}
onTagDelete={this.onTagDelete}
onTagReplace={this.onTagReplace}
{...this.props}
/>
);

View File

@@ -41,7 +41,7 @@ class Icon extends PureComponent {
return (
<span
className={containerClassName}
title={typeof title === 'function' ? title() : title}
title={title}
>
{icon}
</span>
@@ -58,7 +58,7 @@ Icon.propTypes = {
name: PropTypes.object.isRequired,
kind: PropTypes.string.isRequired,
size: PropTypes.number.isRequired,
title: PropTypes.oneOfType([PropTypes.string, PropTypes.func]),
title: PropTypes.string,
isSpinning: PropTypes.bool.isRequired,
fixedWidth: PropTypes.bool.isRequired
};

View File

@@ -13,7 +13,7 @@ const messages = [
'Loading humorous message... Please Wait',
'I could\'ve been faster in Python',
'Don\'t forget to rewind your movies',
'Congratulations! You are the 1000th visitor.',
'Congratulations! you are the 1000th visitor.',
'HELP! I\'m being held hostage and forced to write these stupid lines!',
'RE-calibrating the internet...',
'I\'ll be here all week',

View File

@@ -33,7 +33,7 @@ class FilterMenuContent extends Component {
selectedFilterKey={selectedFilterKey}
onPress={onFilterSelect}
>
{typeof filter.label === 'function' ? filter.label() : filter.label}
{filter.label}
</FilterMenuItem>
);
})

View File

@@ -7,7 +7,6 @@ function ErrorPage(props) {
const {
version,
isLocalStorageSupported,
translationsError,
moviesError,
customFiltersError,
tagsError,
@@ -21,8 +20,6 @@ function ErrorPage(props) {
if (!isLocalStorageSupported) {
errorMessage = 'Local Storage is not supported or disabled. A plugin or private browsing may have disabled it.';
} else if (translationsError) {
errorMessage = getErrorMessage(translationsError, 'Failed to load translations from API');
} else if (moviesError) {
errorMessage = getErrorMessage(moviesError, 'Failed to load movie from API');
} else if (customFiltersError) {
@@ -55,7 +52,6 @@ function ErrorPage(props) {
ErrorPage.propTypes = {
version: PropTypes.string.isRequired,
isLocalStorageSupported: PropTypes.bool.isRequired,
translationsError: PropTypes.object,
moviesError: PropTypes.object,
customFiltersError: PropTypes.object,
tagsError: PropTypes.object,

View File

@@ -19,8 +19,6 @@ function createCleanMovieSelector() {
year,
images,
alternateTitles = [],
tmdbId,
imdbId,
tags = []
} = movie;
@@ -31,8 +29,6 @@ function createCleanMovieSelector() {
year,
images,
alternateTitles,
tmdbId,
imdbId,
firstCharacter: title.charAt(0).toLowerCase(),
tags: tags.reduce((acc, id) => {
const matchingTag = allTags.find((tag) => tag.id === id);

View File

@@ -12,8 +12,6 @@ function MovieSearchResult(props) {
year,
images,
alternateTitles,
tmdbId,
imdbId,
tags
} = props;
@@ -49,22 +47,6 @@ function MovieSearchResult(props) {
null
}
{
match.key === 'tmdbId' && tmdbId ?
<div className={styles.alternateTitle}>
TmdbId: {tmdbId}
</div> :
null
}
{
match.key === 'imdbId' && imdbId ?
<div className={styles.alternateTitle}>
ImdbId: {imdbId}
</div> :
null
}
{
tag ?
<div className={styles.tagContainer}>
@@ -87,8 +69,6 @@ MovieSearchResult.propTypes = {
year: PropTypes.number.isRequired,
images: PropTypes.arrayOf(PropTypes.object).isRequired,
alternateTitles: PropTypes.arrayOf(PropTypes.object).isRequired,
tmdbId: PropTypes.number,
imdbId: PropTypes.string,
tags: PropTypes.arrayOf(PropTypes.object).isRequired,
match: PropTypes.object.isRequired
};

View File

@@ -9,8 +9,6 @@ const fuseOptions = {
keys: [
'title',
'alternateTitles.title',
'tmdbId',
'imdbId',
'tags.label'
]
};

View File

@@ -3,7 +3,7 @@ import React, { Component } from 'react';
import { connect } from 'react-redux';
import { withRouter } from 'react-router-dom';
import { createSelector } from 'reselect';
import { fetchTranslations, saveDimensions, setIsSidebarVisible } from 'Store/Actions/appActions';
import { saveDimensions, setIsSidebarVisible } from 'Store/Actions/appActions';
import { fetchCustomFilters } from 'Store/Actions/customFilterActions';
import { fetchMovies } from 'Store/Actions/movieActions';
import { fetchMovieCollections } from 'Store/Actions/movieCollectionActions';
@@ -53,7 +53,6 @@ const selectIsPopulated = createSelector(
(state) => state.settings.importLists.isPopulated,
(state) => state.system.status.isPopulated,
(state) => state.movieCollections.isPopulated,
(state) => state.app.translations.isPopulated,
(
customFiltersIsPopulated,
tagsIsPopulated,
@@ -63,8 +62,7 @@ const selectIsPopulated = createSelector(
indexerFlagsIsPopulated,
importListsIsPopulated,
systemStatusIsPopulated,
movieCollectionsIsPopulated,
translationsIsPopulated
movieCollectionsIsPopulated
) => {
return (
customFiltersIsPopulated &&
@@ -75,8 +73,7 @@ const selectIsPopulated = createSelector(
indexerFlagsIsPopulated &&
importListsIsPopulated &&
systemStatusIsPopulated &&
movieCollectionsIsPopulated &&
translationsIsPopulated
movieCollectionsIsPopulated
);
}
);
@@ -91,7 +88,6 @@ const selectErrors = createSelector(
(state) => state.settings.importLists.error,
(state) => state.system.status.error,
(state) => state.movieCollections.error,
(state) => state.app.translations.error,
(
customFiltersError,
tagsError,
@@ -101,8 +97,7 @@ const selectErrors = createSelector(
indexerFlagsError,
importListsError,
systemStatusError,
movieCollectionsError,
translationsError
movieCollectionsError
) => {
const hasError = !!(
customFiltersError ||
@@ -113,8 +108,7 @@ const selectErrors = createSelector(
indexerFlagsError ||
importListsError ||
systemStatusError ||
movieCollectionsError ||
translationsError
movieCollectionsError
);
return {
@@ -127,8 +121,7 @@ const selectErrors = createSelector(
indexerFlagsError,
importListsError,
systemStatusError,
movieCollectionsError,
translationsError
movieCollectionsError
};
}
);
@@ -190,9 +183,6 @@ function createMapDispatchToProps(dispatch, props) {
dispatchFetchStatus() {
dispatch(fetchStatus());
},
dispatchFetchTranslations() {
dispatch(fetchTranslations());
},
onResize(dimensions) {
dispatch(saveDimensions(dimensions));
},
@@ -227,7 +217,6 @@ class PageConnector extends Component {
this.props.dispatchFetchImportLists();
this.props.dispatchFetchUISettings();
this.props.dispatchFetchStatus();
this.props.dispatchFetchTranslations();
}
}
@@ -254,7 +243,6 @@ class PageConnector extends Component {
dispatchFetchImportLists,
dispatchFetchUISettings,
dispatchFetchStatus,
dispatchFetchTranslations,
...otherProps
} = this.props;
@@ -296,7 +284,6 @@ PageConnector.propTypes = {
dispatchFetchImportLists: PropTypes.func.isRequired,
dispatchFetchUISettings: PropTypes.func.isRequired,
dispatchFetchStatus: PropTypes.func.isRequired,
dispatchFetchTranslations: PropTypes.func.isRequired,
onSidebarVisibleChange: PropTypes.func.isRequired
};

View File

@@ -5,8 +5,8 @@ import { isLocked } from 'Utilities/scrollLock';
import styles from './PageContentBody.css';
interface PageContentBodyProps {
className?: string;
innerClassName?: string;
className: string;
innerClassName: string;
children: ReactNode;
initialScrollTop?: number;
onScroll?: (payload: OnScroll) => void;

View File

@@ -1,8 +1,6 @@
import PropTypes from 'prop-types';
import React from 'react';
import Alert from 'Components/Alert';
import LoadingIndicator from 'Components/Loading/LoadingIndicator';
import { kinds } from 'Helpers/Props';
function PageSectionContent(props) {
const {
@@ -19,7 +17,7 @@ function PageSectionContent(props) {
);
} else if (!isFetching && !!error) {
return (
<Alert kind={kinds.DANGER}>{errorMessage}</Alert>
<div>{errorMessage}</div>
);
} else if (isPopulated && !error) {
return (

View File

@@ -21,34 +21,24 @@ const SIDEBAR_WIDTH = parseInt(dimensions.sidebarWidth);
const links = [
{
iconName: icons.MOVIE_CONTINUING,
get title() {
return translate('Movies');
},
title: translate('Movies'),
to: '/',
alias: '/movies',
children: [
{
get title() {
return translate('AddNew');
},
title: translate('AddNew'),
to: '/add/new'
},
{
get title() {
return translate('ImportLibrary');
},
title: translate('ImportLibrary'),
to: '/add/import'
},
{
get title() {
return translate('Collections');
},
title: translate('Collections'),
to: '/collections'
},
{
get title() {
return translate('Discover');
},
title: translate('Discover'),
to: '/add/discover'
}
]
@@ -56,36 +46,26 @@ const links = [
{
iconName: icons.CALENDAR,
get title() {
return translate('Calendar');
},
title: translate('Calendar'),
to: '/calendar'
},
{
iconName: icons.ACTIVITY,
get title() {
return translate('Activity');
},
title: translate('Activity'),
to: '/activity/queue',
children: [
{
get title() {
return translate('Queue');
},
title: translate('Queue'),
to: '/activity/queue',
statusComponent: QueueStatusConnector
},
{
get title() {
return translate('History');
},
title: translate('History'),
to: '/activity/history'
},
{
get title() {
return translate('Blocklist');
},
title: translate('Blocklist'),
to: '/activity/blocklist'
}
]
@@ -93,81 +73,55 @@ const links = [
{
iconName: icons.SETTINGS,
get title() {
return translate('Settings');
},
title: translate('Settings'),
to: '/settings',
children: [
{
get title() {
return translate('MediaManagement');
},
title: translate('MediaManagement'),
to: '/settings/mediamanagement'
},
{
get title() {
return translate('Profiles');
},
title: translate('Profiles'),
to: '/settings/profiles'
},
{
get title() {
return translate('Quality');
},
title: translate('Quality'),
to: '/settings/quality'
},
{
get title() {
return translate('CustomFormats');
},
title: translate('CustomFormats'),
to: '/settings/customformats'
},
{
get title() {
return translate('Indexers');
},
title: translate('Indexers'),
to: '/settings/indexers'
},
{
get title() {
return translate('DownloadClients');
},
title: translate('DownloadClients'),
to: '/settings/downloadclients'
},
{
get title() {
return translate('Lists');
},
title: translate('Lists'),
to: '/settings/importlists'
},
{
get title() {
return translate('Connect');
},
title: translate('Connect'),
to: '/settings/connect'
},
{
get title() {
return translate('Metadata');
},
title: translate('Metadata'),
to: '/settings/metadata'
},
{
get title() {
return translate('Tags');
},
title: translate('Tags'),
to: '/settings/tags'
},
{
get title() {
return translate('General');
},
title: translate('General'),
to: '/settings/general'
},
{
get title() {
return translate('UI');
},
title: translate('UI'),
to: '/settings/ui'
}
]
@@ -175,46 +129,32 @@ const links = [
{
iconName: icons.SYSTEM,
get title() {
return translate('System');
},
title: translate('System'),
to: '/system/status',
children: [
{
get title() {
return translate('Status');
},
title: translate('Status'),
to: '/system/status',
statusComponent: HealthStatusConnector
},
{
get title() {
return translate('Tasks');
},
title: translate('Tasks'),
to: '/system/tasks'
},
{
get title() {
return translate('Backup');
},
title: translate('Backup'),
to: '/system/backup'
},
{
get title() {
return translate('Updates');
},
title: translate('Updates'),
to: '/system/updates'
},
{
get title() {
return translate('Events');
},
title: translate('Events'),
to: '/system/events'
},
{
get title() {
return translate('LogFiles');
},
title: translate('LogFiles'),
to: '/system/logs/files'
}
]

View File

@@ -16,46 +16,6 @@
box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
color: var(--white);
transition: width 0.6s ease;
&.default {
background-color: var(--darkGray);
}
&.primary {
background-color: var(--primaryColor);
}
&.danger {
background-color: var(--dangerColor);
&:global(.colorImpaired) {
background: repeating-linear-gradient(90deg, color(#f05050 shade(5%)), color(#f05050 shade(5%)) 5px, color(#f05050 shade(15%)) 5px, color(#f05050 shade(15%)) 10px);
}
}
&.success {
background-color: var(--successColor);
}
&.purple {
background-color: var(--purple);
}
&.warning {
background-color: var(--warningColor);
&:global(.colorImpaired) {
background: repeating-linear-gradient(45deg, #ffa500, #ffa500 5px, color(#ffa500 tint(15%)) 5px, color(#ffa500 tint(15%)) 10px);
}
}
&.info {
background-color: var(--infoColor);
}
&.queue {
background-color: var(--queueColor);
}
}
.frontTextContainer {
@@ -85,6 +45,42 @@
cursor: default;
}
.primary {
background-color: var(--primaryColor);
}
.danger {
background-color: var(--dangerColor);
&:global(.colorImpaired) {
background: repeating-linear-gradient(90deg, color(#f05050 shade(5%)), color(#f05050 shade(5%)) 5px, color(#f05050 shade(15%)) 5px, color(#f05050 shade(15%)) 10px);
}
}
.success {
background-color: var(--successColor);
}
.purple {
background-color: var(--purple);
}
.warning {
background-color: var(--warningColor);
&:global(.colorImpaired) {
background: repeating-linear-gradient(45deg, #ffa500, #ffa500 5px, color(#ffa500 tint(15%)) 5px, color(#ffa500 tint(15%)) 10px);
}
}
.info {
background-color: var(--infoColor);
}
.queue {
background-color: var(--queueColor);
}
.small {
height: $progressBarSmallHeight;

View File

@@ -5,7 +5,6 @@ interface CssExports {
'backTextContainer': string;
'container': string;
'danger': string;
'default': string;
'frontText': string;
'frontTextContainer': string;
'info': string;

View File

@@ -38,7 +38,7 @@ function ProgressBar(props) {
{
showText && width ?
<div
className={classNames(styles.backTextContainer, styles[kind])}
className={styles.backTextContainer}
style={{ width: actualWidth }}
>
<div className={styles.backText}>
@@ -67,7 +67,7 @@ function ProgressBar(props) {
{
showText ?
<div
className={classNames(styles.frontTextContainer, styles[kind])}
className={styles.frontTextContainer}
style={{ width: progressPercent }}
>
<div

View File

@@ -1,10 +1,8 @@
import React from 'react';
type PropertyFunction<T> = () => T;
interface Column {
name: string;
label: string | PropertyFunction<string> | React.ReactNode;
label: string | React.ReactNode;
columnLabel?: string;
isSortable?: boolean;
isVisible: boolean;

View File

@@ -107,7 +107,7 @@ function Table(props) {
{...getTableHeaderCellProps(otherProps)}
{...column}
>
{typeof column.label === 'function' ? column.label() : column.label}
{column.label}
</TableHeaderCell>
);
})

View File

@@ -30,7 +30,6 @@ class TableHeaderCell extends Component {
const {
className,
name,
label,
columnLabel,
isSortable,
isVisible,
@@ -54,8 +53,7 @@ class TableHeaderCell extends Component {
{...otherProps}
component="th"
className={className}
label={typeof label === 'function' ? label() : label}
title={typeof columnLabel === 'function' ? columnLabel() : columnLabel}
title={columnLabel}
onPress={this.onPress}
>
{children}
@@ -79,8 +77,7 @@ class TableHeaderCell extends Component {
TableHeaderCell.propTypes = {
className: PropTypes.string,
name: PropTypes.string.isRequired,
label: PropTypes.oneOfType([PropTypes.string, PropTypes.func, PropTypes.node]),
columnLabel: PropTypes.oneOfType([PropTypes.string, PropTypes.func]),
columnLabel: PropTypes.string,
isSortable: PropTypes.bool,
isVisible: PropTypes.bool,
isModifiable: PropTypes.bool,

Some files were not shown because too many files have changed in this diff Show More