Compare commits

..

7 Commits

Author SHA1 Message Date
gauthier-th
ebb36b4c6f fix(proxy): update http proxy to accept bypass list with undici v7
With the update of undici to v7, the bypass list of addresses (no_proxy addresses) was not ignored
anymore.

fix #1454
2025-03-11 22:33:53 +01:00
Ludovic Ortega
077e355c77 feat(helm): upgrade jellyseerr to 2.4.0 (#1438)
Signed-off-by: Ludovic Ortega <ludovic.ortega@adminafk.fr>
2025-03-11 09:33:58 +08:00
fallenbagel
21ab20bba9 revert: reverts csrf-csrf back to csurf (#1442)
* revert: reverts csrf-csrf back to csurf

This reverts csrf-csrf change brought on by `9e3119` in #1393 back to `csurf` that is maintained

* fix: type declarations for csurf
2025-03-11 09:33:40 +08:00
Mihkel
cdfb30ea16 docs: update steps for service installation with NSSM (#1446) 2025-03-11 07:48:43 +08:00
Gauthier
771ecdf781 fix(ui): correct media action icon size (#1444)
This PR fixes an UI issue with inconsistent size for media action icons.

fix #1440
2025-03-11 00:08:49 +01:00
fallenbagel
863b675c77 ci(cypress): always run the upload video files step (#1445) 2025-03-11 07:06:56 +08:00
Gauthier
5b998bef82 fix(users): correct user list for Postgres (#1443)
PostgreSQL requires that the ORDER BY expression must appear in the SELECT list when using DISTINCT.
Since we were using a computed expression in the ORDER BY clause, we need to include it in the
SELECT list as well.

re #1333
2025-03-10 23:59:42 +01:00
8 changed files with 42 additions and 45 deletions

View File

@@ -37,6 +37,7 @@ jobs:
COMMIT_INFO_MESSAGE: ${{github.event.pull_request.title}}
COMMIT_INFO_SHA: ${{github.event.pull_request.head.sha}}
- name: Upload video files
if: always()
uses: actions/upload-artifact@v4
with:
name: cypress-videos

View File

@@ -3,8 +3,8 @@ kubeVersion: ">=1.23.0-0"
name: jellyseerr-chart
description: Jellyseerr helm chart for Kubernetes
type: application
version: 2.1.1
appVersion: "2.3.0"
version: 2.2.0
appVersion: "2.4.0"
maintainers:
- name: Jellyseerr
url: https://github.com/Fallenbagel/jellyseerr

View File

@@ -1,6 +1,6 @@
# jellyseerr-chart
![Version: 2.1.1](https://img.shields.io/badge/Version-2.1.1-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: 2.3.0](https://img.shields.io/badge/AppVersion-2.3.0-informational?style=flat-square)
![Version: 2.2.0](https://img.shields.io/badge/Version-2.2.0-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: 2.4.0](https://img.shields.io/badge/AppVersion-2.4.0-informational?style=flat-square)
Jellyseerr helm chart for Kubernetes

View File

@@ -255,7 +255,8 @@ To run jellyseerr as a service:
1. Download the [Non-Sucking Service Manager](https://nssm.cc/download)
2. Install NSSM:
```powershell
nssm install Jellyseerr "C:\Program Files\nodejs\node.exe" ["C:\jellyseerr\dist\index.js"]
nssm install Jellyseerr "C:\Program Files\nodejs\node.exe" "C:\jellyseerr\dist\index.js"
nssm set Jellyseerr AppDirectory "C:\jellyseerr"
nssm set Jellyseerr AppEnvironmentExtra NODE_ENV=production
```
3. Start the service:

View File

@@ -60,22 +60,24 @@ router.get('/', async (req, res, next) => {
query = query.orderBy('user.updatedAt', 'DESC');
break;
case 'displayname':
query = query.orderBy(
`CASE WHEN (user.username IS NULL OR user.username = '') THEN (
CASE WHEN (user.plexUsername IS NULL OR user.plexUsername = '') THEN (
CASE WHEN (user.jellyfinUsername IS NULL OR user.jellyfinUsername = '') THEN
"user"."email"
ELSE
LOWER(user.jellyfinUsername)
END)
ELSE
LOWER(user.jellyfinUsername)
END)
ELSE
LOWER(user.username)
END`,
'ASC'
);
query = query
.addSelect(
`CASE WHEN (user.username IS NULL OR user.username = '') THEN (
CASE WHEN (user.plexUsername IS NULL OR user.plexUsername = '') THEN (
CASE WHEN (user.jellyfinUsername IS NULL OR user.jellyfinUsername = '') THEN
"user"."email"
ELSE
LOWER(user.jellyfinUsername)
END)
ELSE
LOWER(user.jellyfinUsername)
END)
ELSE
LOWER(user.username)
END`,
'displayname_sort_key'
)
.orderBy('displayname_sort_key', 'ASC');
break;
case 'requests':
query = query

View File

@@ -8,8 +8,9 @@ export default async function createCustomProxyAgent(
) {
const defaultAgent = new Agent({ keepAliveTimeout: 5000 });
const skipUrl = (url: string) => {
const hostname = new URL(url).hostname;
const skipUrl = (url: string | URL) => {
const hostname =
typeof url === 'string' ? new URL(url).hostname : url.hostname;
if (proxySettings.bypassLocalAddresses && isLocalAddress(hostname)) {
return true;
@@ -38,8 +39,7 @@ export default async function createCustomProxyAgent(
dispatch: Dispatcher['dispatch']
): Dispatcher['dispatch'] => {
return (opts, handler) => {
const url = opts.origin?.toString();
return url && skipUrl(url)
return opts.origin && skipUrl(opts.origin)
? defaultAgent.dispatch(opts, handler)
: dispatch(opts, handler);
};
@@ -60,13 +60,10 @@ export default async function createCustomProxyAgent(
':' +
proxySettings.port,
token,
interceptors: {
Client: [noProxyInterceptor],
},
keepAliveTimeout: 5000,
});
setGlobalDispatcher(proxyAgent);
setGlobalDispatcher(proxyAgent.compose(noProxyInterceptor));
} catch (e) {
logger.error('Failed to connect to the proxy: ' + e.message, {
label: 'Proxy',
@@ -95,7 +92,11 @@ export default async function createCustomProxyAgent(
}
function isLocalAddress(hostname: string) {
if (hostname === 'localhost' || hostname === '127.0.0.1') {
if (
hostname === 'localhost' ||
hostname === '127.0.0.1' ||
hostname === '::1'
) {
return true;
}

View File

@@ -590,7 +590,7 @@ const MovieDetails = ({ movie }: MovieDetailsProps) => {
buttonSize={'md'}
onClick={() => setShowBlacklistModal(true)}
>
<EyeSlashIcon className={'h-3'} />
<EyeSlashIcon />
</Button>
</Tooltip>
)}
@@ -608,9 +608,9 @@ const MovieDetails = ({ movie }: MovieDetailsProps) => {
onClick={onClickWatchlistBtn}
>
{isUpdating ? (
<Spinner className="h-3" />
<Spinner />
) : (
<StarIcon className={'h-3 text-amber-300'} />
<StarIcon className={'text-amber-300'} />
)}
</Button>
</Tooltip>
@@ -623,11 +623,7 @@ const MovieDetails = ({ movie }: MovieDetailsProps) => {
buttonSize={'md'}
onClick={onClickDeleteWatchlistBtn}
>
{isUpdating ? (
<Spinner className="h-3" />
) : (
<MinusCircleIcon className={'h-3'} />
)}
{isUpdating ? <Spinner /> : <MinusCircleIcon />}
</Button>
</Tooltip>
)}

View File

@@ -632,7 +632,7 @@ const TvDetails = ({ tv }: TvDetailsProps) => {
buttonSize={'md'}
onClick={() => setShowBlacklistModal(true)}
>
<EyeSlashIcon className={'h-3'} />
<EyeSlashIcon />
</Button>
</Tooltip>
)}
@@ -650,9 +650,9 @@ const TvDetails = ({ tv }: TvDetailsProps) => {
onClick={onClickWatchlistBtn}
>
{isUpdating ? (
<Spinner className="h-3" />
<Spinner />
) : (
<StarIcon className={'h-3 text-amber-300'} />
<StarIcon className={'text-amber-300'} />
)}
</Button>
</Tooltip>
@@ -665,11 +665,7 @@ const TvDetails = ({ tv }: TvDetailsProps) => {
buttonSize={'md'}
onClick={onClickDeleteWatchlistBtn}
>
{isUpdating ? (
<Spinner className="h-3" />
) : (
<MinusCircleIcon className={'h-3'} />
)}
{isUpdating ? <Spinner /> : <MinusCircleIcon />}
</Button>
</Tooltip>
)}