diff --git a/.eslintrc.js b/.eslintrc.js index d3796446db..a3594d87a8 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -7,7 +7,8 @@ module.exports = { 'react', 'promise', 'import', - 'eslint-comments' + 'eslint-comments', + 'sonarjs' ], env: { node: true, @@ -29,7 +30,8 @@ module.exports = { // 'plugin:promise/recommended', 'plugin:import/errors', 'plugin:eslint-comments/recommended', - 'plugin:compat/recommended' + 'plugin:compat/recommended', + 'plugin:sonarjs/recommended' ], rules: { 'array-callback-return': ['error'], @@ -51,6 +53,7 @@ module.exports = { 'no-multiple-empty-lines': ['error', { 'max': 1 }], 'no-restricted-globals': ['error'].concat(restrictedGlobals), 'no-return-await': ['error'], + 'no-sequences': ['error', { 'allowInParentheses': false }], 'no-trailing-spaces': ['error'], '@babel/no-unused-expressions': ['error', { 'allowShortCircuit': true, 'allowTernary': true, 'allowTaggedTemplates': true }], 'no-void': ['error', { 'allowAsStatement': true }], @@ -64,9 +67,23 @@ module.exports = { 'space-before-blocks': ['error'], 'space-infix-ops': 'error', 'yoda': 'error', - 'no-sequences': ['error', { 'allowInParentheses': false }], - 'react/jsx-filename-extension': ['error', { 'extensions': ['.jsx', '.tsx'] }] + 'react/jsx-filename-extension': ['error', { 'extensions': ['.jsx', '.tsx'] }], + + 'sonarjs/cognitive-complexity': ['warn'], + // TODO: Enable the following rules and fix issues + 'sonarjs/max-switch-cases': ['off'], + 'sonarjs/no-collapsible-if': ['off'], + 'sonarjs/no-duplicate-string': ['off'], + 'sonarjs/no-duplicated-branches': ['off'], + 'sonarjs/no-gratuitous-expressions': ['off'], + 'sonarjs/no-identical-functions': ['off'], + 'sonarjs/no-nested-switch': ['off'], + 'sonarjs/no-redundant-jump': ['off'], + 'sonarjs/no-small-switch': ['off'], + 'sonarjs/no-unused-collection': ['off'], + 'sonarjs/prefer-object-literal': ['off'], + 'sonarjs/prefer-single-boolean-return': ['off'] }, settings: { react: { diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index ab870c1af6..20111001c6 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -26,7 +26,7 @@ jobs: run: echo "::set-output name=dir::$(npm config get cache)" - name: Cache node_modules - uses: actions/cache@ac8075791e805656e71b4ba23325ace9e3421120 # tag=v3.0.9 + uses: actions/cache@56461b9eb0f8438fd15c7a9968e3c9ebb18ceff1 # tag=v3.0.10 id: npm-cache with: path: ${{ steps.npm-cache-dir-path.outputs.dir }} @@ -61,7 +61,7 @@ jobs: run: echo "::set-output name=dir::$(npm config get cache)" - name: Cache node_modules - uses: actions/cache@ac8075791e805656e71b4ba23325ace9e3421120 # tag=v3.0.9 + uses: actions/cache@56461b9eb0f8438fd15c7a9968e3c9ebb18ceff1 # tag=v3.0.10 id: npm-cache with: path: ${{ steps.npm-cache-dir-path.outputs.dir }} @@ -99,7 +99,7 @@ jobs: run: echo "::set-output name=dir::$(npm config get cache)" - name: Cache node_modules - uses: actions/cache@ac8075791e805656e71b4ba23325ace9e3421120 # tag=v3.0.9 + uses: actions/cache@56461b9eb0f8438fd15c7a9968e3c9ebb18ceff1 # tag=v3.0.10 id: npm-cache with: path: ${{ steps.npm-cache-dir-path.outputs.dir }} diff --git a/package-lock.json b/package-lock.json index 7620a2f10f..b20ae7206b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,7 +20,7 @@ "blurhash": "2.0.0", "classlist.js": "https://github.com/eligrey/classList.js/archive/1.2.20180112.tar.gz", "classnames": "2.3.2", - "core-js": "3.25.2", + "core-js": "3.25.3", "date-fns": "2.29.3", "dompurify": "2.4.0", "epubjs": "0.3.93", @@ -85,6 +85,7 @@ "eslint-plugin-promise": "6.0.1", "eslint-plugin-react": "7.31.8", "eslint-plugin-react-hooks": "4.6.0", + "eslint-plugin-sonarjs": "0.15.0", "expose-loader": "4.0.0", "html-loader": "4.2.0", "html-webpack-plugin": "5.5.0", @@ -4872,9 +4873,9 @@ } }, "node_modules/core-js": { - "version": "3.25.2", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.25.2.tgz", - "integrity": "sha512-YB4IAT1bjEfxTJ1XYy11hJAKskO+qmhuDBM8/guIfMz4JvdsAQAqvyb97zXX7JgSrfPLG5mRGFWJwJD39ruq2A==", + "version": "3.25.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.25.3.tgz", + "integrity": "sha512-y1hvKXmPHvm5B7w4ln1S4uc9eV/O5+iFExSRUimnvIph11uaizFR8LFMdONN8hG3P2pipUfX4Y/fR8rAEtcHcQ==", "hasInstallScript": true, "funding": { "type": "opencollective", @@ -6416,6 +6417,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/eslint-plugin-sonarjs": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-sonarjs/-/eslint-plugin-sonarjs-0.15.0.tgz", + "integrity": "sha512-LuxHdAe6VqSbi1phsUvNjbmXLuvlobmryQJJNyQYbdubCfz6K8tmgoqNiJPnz0pP2AbYDbtuPm0ajOMgMrC+dQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, "node_modules/eslint-rule-composer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz", @@ -21984,9 +21997,9 @@ } }, "core-js": { - "version": "3.25.2", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.25.2.tgz", - "integrity": "sha512-YB4IAT1bjEfxTJ1XYy11hJAKskO+qmhuDBM8/guIfMz4JvdsAQAqvyb97zXX7JgSrfPLG5mRGFWJwJD39ruq2A==" + "version": "3.25.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.25.3.tgz", + "integrity": "sha512-y1hvKXmPHvm5B7w4ln1S4uc9eV/O5+iFExSRUimnvIph11uaizFR8LFMdONN8hG3P2pipUfX4Y/fR8rAEtcHcQ==" }, "core-js-compat": { "version": "3.25.3", @@ -23343,6 +23356,13 @@ "dev": true, "requires": {} }, + "eslint-plugin-sonarjs": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-sonarjs/-/eslint-plugin-sonarjs-0.15.0.tgz", + "integrity": "sha512-LuxHdAe6VqSbi1phsUvNjbmXLuvlobmryQJJNyQYbdubCfz6K8tmgoqNiJPnz0pP2AbYDbtuPm0ajOMgMrC+dQ==", + "dev": true, + "requires": {} + }, "eslint-rule-composer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz", diff --git a/package.json b/package.json index 939dbe3c70..319aca2c94 100644 --- a/package.json +++ b/package.json @@ -37,6 +37,7 @@ "eslint-plugin-promise": "6.0.1", "eslint-plugin-react": "7.31.8", "eslint-plugin-react-hooks": "4.6.0", + "eslint-plugin-sonarjs": "0.15.0", "expose-loader": "4.0.0", "html-loader": "4.2.0", "html-webpack-plugin": "5.5.0", @@ -75,7 +76,7 @@ "blurhash": "2.0.0", "classlist.js": "https://github.com/eligrey/classList.js/archive/1.2.20180112.tar.gz", "classnames": "2.3.2", - "core-js": "3.25.2", + "core-js": "3.25.3", "date-fns": "2.29.3", "dompurify": "2.4.0", "epubjs": "0.3.93", diff --git a/src/components/apphost.js b/src/components/apphost.js index 49f7d4e796..19b7d5233f 100644 --- a/src/components/apphost.js +++ b/src/components/apphost.js @@ -79,8 +79,7 @@ function generateDeviceId() { keys.push(navigator.userAgent); keys.push(new Date().getTime()); if (window.btoa) { - const result = replaceAll(btoa(keys.join('|')), '=', '1'); - return result; + return replaceAll(btoa(keys.join('|')), '=', '1'); } return new Date().getTime(); diff --git a/src/strings/de.json b/src/strings/de.json index 3c83e4fe56..ef5b19a996 100644 --- a/src/strings/de.json +++ b/src/strings/de.json @@ -1676,5 +1676,8 @@ "MediaInfoElPresentFlag": "DV el verfügbar Marker", "MediaInfoVideoRangeType": "Spektrum", "LabelVideoRangeType": "Spektrum:", - "IgnoreDtsHelp": "Die Deaktivierung dieser Option könnte Probleme beheben, z. B. kein Ton auf Filmen mit getrennten Audio- und Video-Streams." + "IgnoreDtsHelp": "Die Deaktivierung dieser Option könnte Probleme beheben, z. B. kein Ton auf Filmen mit getrennten Audio- und Video-Streams.", + "OptionDateShowAdded": "Datum Serie hinzugefügt", + "OptionDateEpisodeAdded": "Datum Episode hinzugefügt", + "IgnoreDts": "DTS ignorieren (Dekodierungszeitstempel)" } diff --git a/src/strings/hu.json b/src/strings/hu.json index 7b9dd30aff..117494ccf6 100644 --- a/src/strings/hu.json +++ b/src/strings/hu.json @@ -1677,5 +1677,7 @@ "MediaInfoElPresentFlag": "Dolby Vision EL elérhető markerek", "MediaInfoRpuPresentFlag": "Dolby Vision rpu zászló jelen van", "IgnoreDtsHelp": "Ennek az opciónak a letiltása megoldhat bizonyos problémákat, pl. hiányzik a hang a külön hang- és videofolyamokkal rendelkező csatornákon.", - "IgnoreDts": "DTS (dekódolási időbélyeg) figyelmen kívül hagyása" + "IgnoreDts": "DTS (dekódolási időbélyeg) figyelmen kívül hagyása", + "OptionDateShowAdded": "Műsor hozzáadásának dátuma", + "OptionDateEpisodeAdded": "Epizód hozzáadásának dátuma" } diff --git a/src/strings/ko.json b/src/strings/ko.json index 93f0882a5d..6eed649253 100644 --- a/src/strings/ko.json +++ b/src/strings/ko.json @@ -1412,7 +1412,7 @@ "Season": "시즌", "ScanForNewAndUpdatedFiles": "새 파일 및 업데이트 된 파일 검색", "SaveSubtitlesIntoMediaFoldersHelp": "비디오 파일 옆에 자막을 저장하면보다 쉽게 관리 할 수 있습니다.", - "SaveChanges": "변경 사항을 저장하다", + "SaveChanges": "저장", "Restart": "재시작", "ResetPassword": "패스워드 리셋", "ReplaceAllMetadata": "모든 메타데이터 교체", diff --git a/src/strings/nl.json b/src/strings/nl.json index 70d742fbbc..6b1af114fa 100644 --- a/src/strings/nl.json +++ b/src/strings/nl.json @@ -986,7 +986,7 @@ "ShowAdvancedSettings": "Geavanceerde instellingen weergeven", "ShowIndicatorsFor": "Toon indicatoren voor:", "ShowTitle": "Laat de titel zien", - "ShowYear": "Laat het jaar zien", + "ShowYear": "Toon jaar", "Shows": "Series", "Shuffle": "Willekeurig", "SimultaneousConnectionLimitHelp": "Het maximum aantal toegestane gelijktijdige streams. Geef 0 in voor geen limiet.", @@ -1502,7 +1502,7 @@ "MessagePlaybackError": "Er was een error tijdens het afspelen van dit bestand op uw Google Cast.", "MessageChromecastConnectionError": "Uw Google Cast kan niet verbinden met de Jellyfin server. Controleer de verbinding en probeer opnieuw.", "LabelMinAudiobookResumeHelp": "Titels worden als niet afgespeeld beschouwd indien gestopt voor deze tijd.", - "AllowVppTonemappingHelp": "Volledige hardware-gebaseerde tonemapping zonder OpenCL-filter. Werkt momenteel alleen bij het transcoderen van video's met ingesloten HDR10-metadata.", + "AllowVppTonemappingHelp": "Volledige op Intel drivers-gebaseerde tonemapping werkt momenteel alleen op sommige hardware met HDR10 video's. Dit heeft een hogere slagingskans ten opzichte van andere OpenCL implementaties.", "EnableVppTonemapping": "VPP Tone mapping aanzetten", "EnableEnhancedNvdecDecoder": "Verbeterde NVDEC decoder aanzetten", "Framerate": "Beeldsnelheid", @@ -1549,7 +1549,7 @@ "SetUsingLastTracksHelp": "Probeer de ondertiteling/het audiospoor in te stellen op de video die het meest overeenkomt met de laatste video.", "TextSent": "Tekst verzonden.", "Track": "Nummer", - "Controls": "Controles", + "Controls": "Controllers", "LabelEnableGamepad": "Gamepad Inschakelen", "VideoFramerateNotSupported": "De framerate van de video wordt niet ondersteund", "VideoLevelNotSupported": "Het niveau van de video codec wordt niet ondersteund", @@ -1637,15 +1637,46 @@ "VideoBitrateNotSupported": "De video's bitrate is niet ondersteunt", "AudioIsExternal": "De audio stream is extern", "LabelHardwareEncodingOptions": "Hardware codering opties:", - "IntelLowPowerEncHelp": "Low-Power Encoderen kan onnodige CPU-GPU synchronisatie houden. Bij linux moet deze uitgeschakeld zijn als de i915 HuC firmware niet geconfigureerd is.", + "IntelLowPowerEncHelp": "Low-Power Encoderen kan onnodige CPU-GPU synchronisatie houden. Bij Linux moet deze uitgeschakeld zijn als de i915 HuC firmware niet geconfigureerd is.", "EnableIntelLowPowerHevcHwEncoder": "Schakel Intel Low-Power HEVC hardware encoder in", "EnableIntelLowPowerH264HwEncoder": "Schakel Intel Low-Power H.264 hardware encoder in", - "PreferSystemNativeHwDecoder": "Voorkeur OS eigen DXVA of VA-API hardware decoders", + "PreferSystemNativeHwDecoder": "Voorkeur voor OS eigen DXVA of VA-API hardware decoders", "ScreenResolution": "Scherm Resolutie", "RememberSubtitleSelections": "Ondertiteltrack instellen op basis van vorig item", "RememberAudioSelections": "Stel audio spoor in gebaseerd op", "IgnoreDtsHelp": "Deze optie uitschakelen kan problemen oplossen, bijv; missende audio bij kanalen met aparte audio en video streams.", "IgnoreDts": "Negeer DTS (tijdstempel decoderen)", "RememberSubtitleSelectionsHelp": "Probeer de ondertiteltrack in te stellen op de dichtstbijzijnde overeenkomst met de laatste video.", - "RememberAudioSelectionsHelp": "Probeer de audiotrack zo in te stellen dat deze het dichtst bij de laatste video past." + "RememberAudioSelectionsHelp": "Probeer de audiotrack zo in te stellen dat deze het dichtst bij de laatste video past.", + "MediaInfoDvBlSignalCompatibilityId": "ID voor DV bl-signaalcompatibiliteit", + "MediaInfoBlPresentFlag": "DV bl vooraf ingestelde vlag", + "MediaInfoElPresentFlag": "DV el vooraf ingestelde vlag", + "MediaInfoRpuPresentFlag": "DV rpu vooraf ingestelde vlag", + "MediaInfoDvLevel": "DV niveau", + "MediaInfoDvProfile": "DV profiel", + "MediaInfoDvVersionMinor": "DV-versie minor", + "MediaInfoDvVersionMajor": "DV-versie major", + "MediaInfoDoViTitle": "DV-title", + "MediaInfoVideoRangeType": "Type videobereik", + "LabelVideoRangeType": "Type videobereik:", + "VideoRangeTypeNotSupported": "Het bereiktype van de video wordt niet ondersteund", + "LabelVppTonemappingContrastHelp": "Pas contrastversterking toe in VPP tonemapping. De aanbevolen en standaardwaarden zijn 1.2 en 1.", + "LabelVppTonemappingContrast": "VPP Tone mapping contrastversterking:", + "LabelVppTonemappingBrightnessHelp": "Pas helderheidsversterking toe in VPP-tonemapping Zowel de aanbevolen als de standaardwaarden zijn 0.", + "LabelVppTonemappingBrightness": "VPP Tone mapping helderheidsversterking:", + "EnableSplashScreen": "Het opstartscherm inschakelen", + "EnableEnhancedNvdecDecoderHelp": "Experimentele NVDEC implementatie, deze instelling niet inschakelen tenzij u decoderingsfouten tegenkomt.", + "ThemeVideo": "Thema Video", + "ThemeSong": "Themalied", + "Sample": "Voorbeeld", + "Scene": "Scene", + "Interview": "Interview", + "DeletedScene": "Verwijderde scene", + "BehindTheScenes": "Achter de scenes", + "Trailer": "Trailer", + "Clip": "Korte film", + "SelectAll": "Selecteer alles", + "DirectPlayError": "Er is een fout opgetreden tijdens het starten van direct playback", + "OptionDateShowAdded": "Datum Serie Toegevoegd", + "OptionDateEpisodeAdded": "Datum Aflevering Toegevoegd" }