diff --git a/.vscode/launch.json b/.vscode/launch.json
index b2b655f..46b5368 100644
--- a/.vscode/launch.json
+++ b/.vscode/launch.json
@@ -1,27 +1,33 @@
{
- "version": "0.2.0",
- "configurations": [
- {
- "type": "chrome",
- "request": "launch",
- "name": "Launch Chrome against localhost",
- "url": "http://10.0.0.20:3000",
- "webRoot": "${workspaceFolder}"
- },
- {
- "type": "node-terminal",
- "name": "Run Script: start",
- "request": "launch",
- "command": "npm run start",
- "cwd": "${workspaceFolder}"
- }
- ,
- {
- "type": "node-terminal",
- "name": "Run Script: start-server",
- "request": "launch",
- "command": "npm run start-server",
- "cwd": "${workspaceFolder}"
- }
- ]
-}
\ No newline at end of file
+ "version": "0.2.0",
+ "configurations": [
+ {
+ "type": "chrome",
+ "request": "launch",
+ "name": "Launch Chrome against localhost",
+ "url": "http://10.0.0.20:3000",
+ "webRoot": "${workspaceFolder}"
+ },
+ {
+ "type": "node-terminal",
+ "name": "Run Script: start",
+ "request": "launch",
+ "command": "npm run start",
+ "cwd": "${workspaceFolder}"
+ },
+ {
+ "type": "node-terminal",
+ "name": "Run Script: start client",
+ "request": "launch",
+ "command": "npm run start-client",
+ "cwd": "${workspaceFolder}"
+ },
+ {
+ "type": "node-terminal",
+ "name": "Run Script: start-server",
+ "request": "launch",
+ "command": "npm run start-server",
+ "cwd": "${workspaceFolder}"
+ }
+ ]
+}
diff --git a/backend/classes/env.js b/backend/classes/env.js
index 6491b6d..afb76e7 100644
--- a/backend/classes/env.js
+++ b/backend/classes/env.js
@@ -2,9 +2,11 @@ const fs = require("fs");
const path = require("path");
async function writeEnvVariables() {
+ //Define sensitive variables that should not be exposed
+ const excludedVariables = ["JS_GEOLITE_LICENSE_KEY", "JS_USER", "JS_PASSWORD"];
// Fetch environment variables that start with JS_
const envVariables = Object.keys(process.env).reduce((acc, key) => {
- if (key.startsWith("JS_")) {
+ if (key.startsWith("JS_") && !excludedVariables.includes(key)) {
acc[key] = process.env[key];
}
return acc;
diff --git a/backend/server.js b/backend/server.js
index d78fbc3..6cab97d 100644
--- a/backend/server.js
+++ b/backend/server.js
@@ -1,6 +1,7 @@
// core
require("dotenv").config();
const http = require("http");
+const fs = require("fs");
const path = require("path");
const express = require("express");
const compression = require("compression");
@@ -36,9 +37,20 @@ const writeEnvVariables = require("./classes/env");
const app = express();
const db = knex(knexConfig.development);
+const ensureSlashes = (url) => {
+ if (!url.startsWith("/")) {
+ url = "/" + url;
+ }
+ if (url.endsWith("/")) {
+ url = url.slice(0, -1);
+ }
+ return url;
+};
+
const PORT = 3000;
const LISTEN_IP = "0.0.0.0";
const JWT_SECRET = process.env.JWT_SECRET;
+const BASE_NAME = process.env.JS_BASE_URL ? ensureSlashes(process.env.JS_BASE_URL) : "";
if (JWT_SECRET === undefined) {
console.log("JWT Secret cannot be undefined");
@@ -68,8 +80,60 @@ function typeInferenceMiddleware(req, res, next) {
app.use(typeInferenceMiddleware);
+const findFile = (dir, fileName) => {
+ const files = fs.readdirSync(dir);
+ for (const file of files) {
+ const fullPath = path.join(dir, file);
+ const stat = fs.statSync(fullPath);
+ if (stat.isDirectory()) {
+ const result = findFile(fullPath, fileName);
+ if (result) {
+ return result;
+ }
+ } else if (file === fileName) {
+ return fullPath;
+ }
+ }
+ return null;
+};
+
+const root = path.join(__dirname, "..", "dist");
+
+//hacky middleware to handle basename changes for UI
+
+app.use((req, res, next) => {
+ // Ignore requests containing 'socket.io'
+ if (req.url.includes("socket.io")) {
+ return next();
+ }
+
+ const fileRegex = /\/([^\/]+\.(css|ico|js|json|png))$/;
+ const match = req.url.match(fileRegex);
+ if (match) {
+ // Extract the file name
+ const fileName = match[1];
+
+ //Exclude translation.json from this hack as it messes up the translations by returning the first file regardless of language chosen
+ if (fileName != "translation.json") {
+ // Find the file
+ const filePath = findFile(root, fileName);
+ if (filePath) {
+ return res.sendFile(filePath);
+ } else {
+ return res.status(404).send("File not found");
+ }
+ }
+ }
+
+ if (BASE_NAME && req.url.startsWith(BASE_NAME) && req.url !== BASE_NAME) {
+ req.url = req.url.slice(BASE_NAME.length);
+ // console.log("URL: " + req.url);
+ }
+ next();
+});
+
// initiate routes
-app.use("/auth", authRouter, () => {
+app.use(`/auth`, authRouter, () => {
/* #swagger.tags = ['Auth'] */
}); // mount the API router at /auth
app.use("/proxy", proxyRouter, () => {
@@ -99,9 +163,11 @@ app.use("/swagger", swaggerUi.serve, swaggerUi.setup(swaggerDocument));
// for deployment of static page
writeEnvVariables().then(() => {
- const root = path.join(__dirname, "..", "dist");
app.use(express.static(root));
- app.get("*", (req, res) => {
+ app.get("*", (req, res, next) => {
+ if (req.url.includes("socket.io")) {
+ return next();
+ }
res.sendFile(path.join(__dirname, "..", "dist", "index.html"));
});
});
@@ -163,7 +229,7 @@ try {
db.migrate.latest().then(() => {
const server = http.createServer(app);
- setupWebSocketServer(server);
+ setupWebSocketServer(server, BASE_NAME);
server.listen(PORT, LISTEN_IP, async () => {
console.log(`[JELLYSTAT] Server listening on http://127.0.0.1:${PORT}`);
ActivityMonitor.ActivityMonitor(1000);
diff --git a/backend/ws.js b/backend/ws.js
index c5a9f61..e10b747 100644
--- a/backend/ws.js
+++ b/backend/ws.js
@@ -1,27 +1,30 @@
// ws.js
-const socketIO = require('socket.io');
+const socketIO = require("socket.io");
let io; // Store the socket.io server instance
-const setupWebSocketServer = (server) => {
- io = socketIO(server);
+const setupWebSocketServer = (server, namespacePath) => {
+ io = socketIO(server, { path: namespacePath + "/socket.io" }); // Create the socket.io server
- io.on('connection', (socket) => {
- // console.log('Client connected');
-
- socket.on('message', (message) => {
- // console.log(`Received: ${message}`);
+ io.on("connection", (socket) => {
+ console.log("Client connected to namespace:", namespacePath);
+ socket.on("message", (message) => {
+ console.log(`Received: ${message}`);
});
});
};
const sendToAllClients = (message) => {
- io.emit('message', message);
+ if (io) {
+ io.emit("message", message);
+ }
};
-const sendUpdate = (tag,message) => {
- io.emit(tag, message);
+const sendUpdate = (tag, message) => {
+ if (io) {
+ io.emit(tag, message);
+ }
};
module.exports = { setupWebSocketServer, sendToAllClients, sendUpdate };
diff --git a/index.html b/index.html
index c78025c..948e3aa 100644
--- a/index.html
+++ b/index.html
@@ -2,23 +2,23 @@
-
+
-
-
+
+
-
+
diff --git a/src/App.jsx b/src/App.jsx
index 7629374..3b803b9 100644
--- a/src/App.jsx
+++ b/src/App.jsx
@@ -2,7 +2,7 @@
import "./App.css";
import React, { useState, useEffect } from "react";
import { Routes, Route } from "react-router-dom";
-import axios from "axios";
+import axios from "./lib/axios_instance";
import socket from "./socket";
import { ToastContainer, toast } from "react-toastify";
diff --git a/src/index.jsx b/src/index.jsx
index 9d52dc1..fb6fda5 100644
--- a/src/index.jsx
+++ b/src/index.jsx
@@ -13,20 +13,7 @@ import LanguageDetector from "i18next-browser-languagedetector";
import { initReactI18next } from "react-i18next";
import Loading from "./pages/components/general/loading.jsx";
-import routes from "./routes.jsx";
-
-const baseUrl = window.env.JS_BASE_URL ?? import.meta.env.JS_BASE_URL ?? "/";
-let validBaseUrls = [...new Set([baseUrl, ...routes.map((route) => "/" + route.path.split("/")[1])])];
-if (baseUrl != "/") {
- validBaseUrls = validBaseUrls.filter((url) => url != "/");
-}
-const locationBase = "/" + window.location.pathname.split("/")[1];
-console.log("Base URL: ", baseUrl);
-console.log("Valid Base URLs: ", validBaseUrls);
-
-if (!validBaseUrls.includes(locationBase)) {
- window.location.assign(baseUrl);
-}
+import baseUrl from "./lib/baseurl.jsx";
i18n
.use(Backend)
@@ -35,6 +22,9 @@ i18n
.init({
fallbackLng: "en-UK",
debug: false,
+ backend: {
+ loadPath: `${baseUrl}/locales/{{lng}}/{{ns}}.json`,
+ },
detection: {
order: ["cookie", "localStorage", "sessionStorage", "navigator", "htmlTag", "querystring", "path", "subdomain"],
cache: ["cookie"],
diff --git a/src/lib/axios_instance.jsx b/src/lib/axios_instance.jsx
index 87a9afc..e27c7e2 100644
--- a/src/lib/axios_instance.jsx
+++ b/src/lib/axios_instance.jsx
@@ -1,5 +1,6 @@
import Axios from "axios";
+import baseUrl from "./baseurl";
-const axios = Axios.create();
+const axios = Axios.create({ baseURL: baseUrl });
export default axios;
diff --git a/src/lib/baseurl.jsx b/src/lib/baseurl.jsx
new file mode 100644
index 0000000..e7212eb
--- /dev/null
+++ b/src/lib/baseurl.jsx
@@ -0,0 +1,11 @@
+const ensureSlashes = (url) => {
+ if (!url.startsWith("/")) {
+ url = "/" + url;
+ }
+ if (url.endsWith("/")) {
+ url = url.slice(0, -1);
+ }
+ return url;
+};
+const baseUrl = window.env?.JS_BASE_URL ? ensureSlashes(window.env?.JS_BASE_URL) : "";
+export default baseUrl;
diff --git a/src/lib/config.jsx b/src/lib/config.jsx
index 75abb98..454a873 100644
--- a/src/lib/config.jsx
+++ b/src/lib/config.jsx
@@ -1,4 +1,4 @@
-import axios from "axios";
+import axios from "../lib/axios_instance";
class Config {
async fetchConfig() {
diff --git a/src/pages/about.jsx b/src/pages/about.jsx
index dc02c3c..8a0e8cf 100644
--- a/src/pages/about.jsx
+++ b/src/pages/about.jsx
@@ -1,31 +1,28 @@
import { useState, useEffect } from "react";
-import axios from "axios";
-import Row from 'react-bootstrap/Row';
-import Col from 'react-bootstrap/Col';
+import axios from "../lib/axios_instance";
+import Row from "react-bootstrap/Row";
+import Col from "react-bootstrap/Col";
import Loading from "./components/general/loading";
-
import "./css/about.css";
import { Card } from "react-bootstrap";
import { Trans } from "react-i18next";
export default function SettingsAbout() {
-
- const token = localStorage.getItem('token');
+ const token = localStorage.getItem("token");
const [data, setData] = useState();
useEffect(() => {
-
const fetchVersion = () => {
if (token) {
const url = `/api/CheckForUpdates`;
axios
- .get(url, {
- headers: {
- Authorization: `Bearer ${token}`,
- "Content-Type": "application/json",
- },
- })
+ .get(url, {
+ headers: {
+ Authorization: `Bearer ${token}`,
+ "Content-Type": "application/json",
+ },
+ })
.then((data) => {
setData(data.data);
})
@@ -35,56 +32,51 @@ export default function SettingsAbout() {
}
};
- if(!data)
- {
- fetchVersion();
+ if (!data) {
+ fetchVersion();
}
const intervalId = setInterval(fetchVersion, 60000 * 5);
return () => clearInterval(intervalId);
- }, [data,token]);
-
+ }, [data, token]);
- if(!data)
- {
- return ;
+ if (!data) {
+ return ;
}
-
- return (
-
- );
-
-
+ return (
+
+ );
}
diff --git a/src/pages/activity.jsx b/src/pages/activity.jsx
index dbcd286..3a574f9 100644
--- a/src/pages/activity.jsx
+++ b/src/pages/activity.jsx
@@ -1,6 +1,6 @@
import { useState, useEffect } from "react";
-import axios from "axios";
+import axios from "../lib/axios_instance";
import "./css/activity.css";
import Config from "../lib/config";
diff --git a/src/pages/components/LibrarySelector/SelectionCard.jsx b/src/pages/components/LibrarySelector/SelectionCard.jsx
index 1e9f301..5af0798 100644
--- a/src/pages/components/LibrarySelector/SelectionCard.jsx
+++ b/src/pages/components/LibrarySelector/SelectionCard.jsx
@@ -1,5 +1,5 @@
import {useState} from "react";
-import axios from "axios";
+import axios from "../../../lib/axios_instance";
import "../../css/library/library-card.css";
import { Form ,Card,Row,Col } from 'react-bootstrap';
@@ -9,6 +9,7 @@ import FilmLineIcon from "remixicon-react/FilmLineIcon";
import FileMusicLineIcon from "remixicon-react/FileMusicLineIcon";
import CheckboxMultipleBlankLineIcon from "remixicon-react/CheckboxMultipleBlankLineIcon";
import { Trans } from "react-i18next";
+import baseUrl from "../../../lib/baseurl";
function SelectionCard(props) {
const [imageLoaded, setImageLoaded] = useState(true);
@@ -54,7 +55,7 @@ function SelectionCard(props) {
setImageLoaded(false)}
/>
:
diff --git a/src/pages/components/activity/activity-table.jsx b/src/pages/components/activity/activity-table.jsx
index 6fb03a2..634fcfa 100644
--- a/src/pages/components/activity/activity-table.jsx
+++ b/src/pages/components/activity/activity-table.jsx
@@ -1,6 +1,6 @@
/* eslint-disable react/prop-types */
import React, { useEffect, useMemo } from "react";
-import axios from "axios";
+import axios from "../../../lib/axios_instance";
import { enUS } from "@mui/material/locale";
import { AdapterDayjs } from "@mui/x-date-pickers/AdapterDayjs";
@@ -155,8 +155,7 @@ export default function ActivityTable(props) {
row = row.original;
if (
isRemoteSession(row.RemoteEndPoint) &&
- (window.env.JS_GEOLITE_ACCOUNT_ID ?? import.meta.env.JS_GEOLITE_ACCOUNT_ID) &&
- (window.env.JS_GEOLITE_LICENSE_KEY ?? import.meta.env.JS_GEOLITE_LICENSE_KEY)
+ (window.env.JS_GEOLITE_ACCOUNT_ID ?? import.meta.env.JS_GEOLITE_ACCOUNT_ID)
) {
return (
showIPDataModal(row.RemoteEndPoint)}>
diff --git a/src/pages/components/general/last-watched-card.jsx b/src/pages/components/general/last-watched-card.jsx
index 27a535c..9aaed34 100644
--- a/src/pages/components/general/last-watched-card.jsx
+++ b/src/pages/components/general/last-watched-card.jsx
@@ -6,6 +6,7 @@ import ArchiveDrawerFillIcon from "remixicon-react/ArchiveDrawerFillIcon";
import "../../css/lastplayed.css";
import { Trans } from "react-i18next";
import i18next from "i18next";
+import baseUrl from "../../../lib/baseurl";
function formatTime(time) {
const units = {
@@ -42,7 +43,7 @@ function LastWatchedCard(props) {
) : null}
{!props.data.archived ? (
setLoaded(true)}
style={loaded ? { display: "block" } : { display: "none" }}
diff --git a/src/pages/components/general/version-card.jsx b/src/pages/components/general/version-card.jsx
index 2e1ad71..7b45f14 100644
--- a/src/pages/components/general/version-card.jsx
+++ b/src/pages/components/general/version-card.jsx
@@ -1,5 +1,5 @@
import { useState, useEffect } from "react";
-import axios from "axios";
+import axios from "../../../lib/axios_instance";
import Row from 'react-bootstrap/Row';
import Col from 'react-bootstrap/Col';
diff --git a/src/pages/components/ip-info.jsx b/src/pages/components/ip-info.jsx
index b8729e7..05f0654 100644
--- a/src/pages/components/ip-info.jsx
+++ b/src/pages/components/ip-info.jsx
@@ -8,7 +8,7 @@ import TableCell from "@mui/material/TableCell";
import TableContainer from "@mui/material/TableContainer";
import TableHead from "@mui/material/TableHead";
import TableRow from "@mui/material/TableRow";
-import axios from "axios";
+import axios from "../../lib/axios_instance";
import { Trans } from "react-i18next";
export default function IpInfoModal(props) {
diff --git a/src/pages/components/item-info.jsx b/src/pages/components/item-info.jsx
index 517e5b9..70bacec 100644
--- a/src/pages/components/item-info.jsx
+++ b/src/pages/components/item-info.jsx
@@ -1,6 +1,6 @@
/* eslint-disable react/prop-types */
import { useState, useEffect } from "react";
-import axios from "axios";
+import axios from "../../lib/axios_instance";
import { useParams } from "react-router-dom";
import { Link } from "react-router-dom";
import { Blurhash } from "react-blurhash";
@@ -26,6 +26,7 @@ import TvLineIcon from "remixicon-react/TvLineIcon";
import FilmLineIcon from "remixicon-react/FilmLineIcon";
import FileMusicLineIcon from "remixicon-react/FileMusicLineIcon";
import CheckboxMultipleBlankLineIcon from "remixicon-react/CheckboxMultipleBlankLineIcon";
+import baseUrl from "../../lib/baseurl";
function ItemInfo() {
const { Id } = useParams();
@@ -207,7 +208,7 @@ function ItemInfo() {
) : (
setLoaded(true)}
style={loaded ? { display: "block" } : { display: "none" }}
@@ -96,7 +97,7 @@ function MoreItemCards(props) {
)
) : (
setImageLoaded(false)}
/>
:
diff --git a/src/pages/components/library/library-items.jsx b/src/pages/components/library/library-items.jsx
index 88b594d..2a30119 100644
--- a/src/pages/components/library/library-items.jsx
+++ b/src/pages/components/library/library-items.jsx
@@ -1,5 +1,5 @@
import { useState, useEffect } from "react";
-import axios from "axios";
+import axios from "../../../lib/axios_instance";
import { FormControl, FormSelect, Button } from "react-bootstrap";
import SortAscIcon from "remixicon-react/SortAscIcon";
import SortDescIcon from "remixicon-react/SortDescIcon";
diff --git a/src/pages/components/library/library-options.jsx b/src/pages/components/library/library-options.jsx
index 08389f9..84a776d 100644
--- a/src/pages/components/library/library-options.jsx
+++ b/src/pages/components/library/library-options.jsx
@@ -1,4 +1,4 @@
-import axios from "axios";
+import axios from "../../../lib/axios_instance";
import i18next from "i18next";
import { useState } from "react";
import { Container, Row, Col, Modal } from "react-bootstrap";
diff --git a/src/pages/components/library/library-stats.jsx b/src/pages/components/library/library-stats.jsx
index 400f958..7b73be6 100644
--- a/src/pages/components/library/library-stats.jsx
+++ b/src/pages/components/library/library-stats.jsx
@@ -1,5 +1,5 @@
import { useState, useEffect } from "react";
-import axios from "axios";
+import axios from "../../../lib/axios_instance";
import "../../css/globalstats.css";
import WatchTimeStats from "./globalstats/watchtimestats";
diff --git a/src/pages/components/library/recently-added.jsx b/src/pages/components/library/recently-added.jsx
index 9d650ba..aaecf85 100644
--- a/src/pages/components/library/recently-added.jsx
+++ b/src/pages/components/library/recently-added.jsx
@@ -1,5 +1,5 @@
import { useState, useEffect } from "react";
-import axios from "axios";
+import axios from "../../../lib/axios_instance";
import RecentlyAddedCard from "./RecentlyAdded/recently-added-card";
diff --git a/src/pages/components/libraryOverview.jsx b/src/pages/components/libraryOverview.jsx
index 1262a6e..4a37f62 100644
--- a/src/pages/components/libraryOverview.jsx
+++ b/src/pages/components/libraryOverview.jsx
@@ -1,6 +1,6 @@
import "../css/libraryOverview.css";
import { useState, useEffect } from "react";
-import axios from "axios";
+import axios from "../../lib/axios_instance";
import Loading from "./general/loading";
import LibraryStatComponent from "./libraryStatCard/library-stat-component";
diff --git a/src/pages/components/playbackactivity.jsx b/src/pages/components/playbackactivity.jsx
index 4f2781b..4240c90 100644
--- a/src/pages/components/playbackactivity.jsx
+++ b/src/pages/components/playbackactivity.jsx
@@ -1,8 +1,5 @@
-import React, { useState, useEffect } from "react";
-import axios from "axios";
-// import Config from "../lib/config";
-
-// import AccountCircleFillIcon from "remixicon-react/AccountCircleFillIcon";
+import { useState, useEffect } from "react";
+import axios from "../../lib/axios_instance";
import "../css/users/users.css";
diff --git a/src/pages/components/sessions/session-card.jsx b/src/pages/components/sessions/session-card.jsx
index 69eb483..3158f76 100644
--- a/src/pages/components/sessions/session-card.jsx
+++ b/src/pages/components/sessions/session-card.jsx
@@ -14,6 +14,7 @@ import { clientData } from "../../../lib/devices";
import Tooltip from "@mui/material/Tooltip";
import IpInfoModal from "../ip-info";
import { Trans } from "react-i18next";
+import baseUrl from "../../../lib/baseurl";
function ticksToTimeString(ticks) {
// Convert ticks to seconds
@@ -112,7 +113,7 @@ function SessionCard(props) {
: "stat-card-image rounded-0 rounded-start"
}
src={
- "/proxy/Items/Images/Primary?id=" +
+ baseUrl+"/proxy/Items/Images/Primary?id=" +
(props.data.session.NowPlayingItem.SeriesId
? props.data.session.NowPlayingItem.SeriesId
: props.data.session.NowPlayingItem.Id) +
@@ -164,8 +165,7 @@ function SessionCard(props) {
{isRemoteSession(props.data.session.RemoteEndPoint) &&
- (window.env.JS_GEOLITE_ACCOUNT_ID ?? import.meta.env.JS_GEOLITE_ACCOUNT_ID) &&
- (window.env.JS_GEOLITE_LICENSE_KEY ?? import.meta.env.JS_GEOLITE_LICENSE_KEY) ? (
+ (window.env.JS_GEOLITE_ACCOUNT_ID ?? import.meta.env.JS_GEOLITE_ACCOUNT_ID) ? (
showIPDataModal(props.data.session.RemoteEndPoint)}
@@ -185,7 +185,7 @@ function SessionCard(props) {
) : (
diff --git a/src/pages/components/settings/Tasks.jsx b/src/pages/components/settings/Tasks.jsx
index f7b0f6c..a266464 100644
--- a/src/pages/components/settings/Tasks.jsx
+++ b/src/pages/components/settings/Tasks.jsx
@@ -1,5 +1,5 @@
import { useState } from "react";
-import axios from "axios";
+import axios from "../../../lib/axios_instance";
import Button from "react-bootstrap/Button";
import Table from "@mui/material/Table";
diff --git a/src/pages/components/settings/apiKeys.jsx b/src/pages/components/settings/apiKeys.jsx
index a64735b..a71c5a8 100644
--- a/src/pages/components/settings/apiKeys.jsx
+++ b/src/pages/components/settings/apiKeys.jsx
@@ -1,5 +1,5 @@
import React, { useState,useEffect } from "react";
-import axios from "axios";
+import axios from "../../../lib/axios_instance";
import {Form, Row, Col,ButtonGroup, Button } from 'react-bootstrap';
import Table from '@mui/material/Table';
diff --git a/src/pages/components/settings/backup_tables.jsx b/src/pages/components/settings/backup_tables.jsx
index 69173d8..81a66a5 100644
--- a/src/pages/components/settings/backup_tables.jsx
+++ b/src/pages/components/settings/backup_tables.jsx
@@ -1,5 +1,5 @@
import { useState, useEffect } from "react";
-import axios from "axios";
+import axios from "../../../lib/axios_instance";
import "../../css/settings/backups.css";
import { Trans } from "react-i18next";
diff --git a/src/pages/components/settings/backupfiles.jsx b/src/pages/components/settings/backupfiles.jsx
index e057a2e..a109afe 100644
--- a/src/pages/components/settings/backupfiles.jsx
+++ b/src/pages/components/settings/backupfiles.jsx
@@ -1,5 +1,5 @@
import React, { useState, useEffect } from "react";
-import axios from "axios";
+import axios from "../../../lib/axios_instance";
import { Form, DropdownButton, Dropdown, ButtonGroup, Button } from "react-bootstrap";
import Table from "@mui/material/Table";
diff --git a/src/pages/components/settings/logs.jsx b/src/pages/components/settings/logs.jsx
index 0c63709..17707df 100644
--- a/src/pages/components/settings/logs.jsx
+++ b/src/pages/components/settings/logs.jsx
@@ -1,5 +1,5 @@
import React, { useEffect } from "react";
-import axios from "axios";
+import axios from "../../../lib/axios_instance";
import {ButtonGroup, Button } from 'react-bootstrap';
import Table from '@mui/material/Table';
diff --git a/src/pages/components/settings/security.jsx b/src/pages/components/settings/security.jsx
index c4379c8..d8765e4 100644
--- a/src/pages/components/settings/security.jsx
+++ b/src/pages/components/settings/security.jsx
@@ -1,5 +1,5 @@
import { useState, useEffect } from "react";
-import axios from "axios";
+import axios from "../../../lib/axios_instance";
import Form from "react-bootstrap/Form";
import Row from "react-bootstrap/Row";
import Col from "react-bootstrap/Col";
diff --git a/src/pages/components/settings/settingsConfig.jsx b/src/pages/components/settings/settingsConfig.jsx
index c74e2d9..80680a7 100644
--- a/src/pages/components/settings/settingsConfig.jsx
+++ b/src/pages/components/settings/settingsConfig.jsx
@@ -1,5 +1,5 @@
import { useState, useEffect } from "react";
-import axios from "axios";
+import axios from "../../../lib/axios_instance";
import Config from "../../../lib/config";
import Loading from "../general/loading";
import Form from "react-bootstrap/Form";
diff --git a/src/pages/components/statCards/most_active_users.jsx b/src/pages/components/statCards/most_active_users.jsx
index b2604aa..0daa80f 100644
--- a/src/pages/components/statCards/most_active_users.jsx
+++ b/src/pages/components/statCards/most_active_users.jsx
@@ -1,5 +1,5 @@
import { useState, useEffect } from "react";
-import axios from "axios";
+import axios from "../../../lib/axios_instance";
import Config from "../../../lib/config";
import ItemStatComponent from "./ItemStatComponent";
diff --git a/src/pages/components/statCards/most_used_client.jsx b/src/pages/components/statCards/most_used_client.jsx
index bc592f7..9ba74af 100644
--- a/src/pages/components/statCards/most_used_client.jsx
+++ b/src/pages/components/statCards/most_used_client.jsx
@@ -1,5 +1,5 @@
import { useState, useEffect } from "react";
-import axios from "axios";
+import axios from "../../../lib/axios_instance";
import ItemStatComponent from "./ItemStatComponent";
diff --git a/src/pages/components/statCards/mp_movies.jsx b/src/pages/components/statCards/mp_movies.jsx
index 6e3fed0..1da09ea 100644
--- a/src/pages/components/statCards/mp_movies.jsx
+++ b/src/pages/components/statCards/mp_movies.jsx
@@ -1,5 +1,5 @@
import { useState, useEffect } from "react";
-import axios from "axios";
+import axios from "../../../lib/axios_instance";
import Config from "../../../lib/config";
diff --git a/src/pages/components/statCards/mp_music.jsx b/src/pages/components/statCards/mp_music.jsx
index d5cb413..d7fd589 100644
--- a/src/pages/components/statCards/mp_music.jsx
+++ b/src/pages/components/statCards/mp_music.jsx
@@ -1,6 +1,6 @@
import { useState, useEffect } from "react";
-import axios from "axios";
+import axios from "../../../lib/axios_instance";
import Config from "../../../lib/config";
import ItemStatComponent from "./ItemStatComponent";
diff --git a/src/pages/components/statCards/mp_series.jsx b/src/pages/components/statCards/mp_series.jsx
index ff2345b..ca00833 100644
--- a/src/pages/components/statCards/mp_series.jsx
+++ b/src/pages/components/statCards/mp_series.jsx
@@ -1,5 +1,5 @@
import { useState, useEffect } from "react";
-import axios from "axios";
+import axios from "../../../lib/axios_instance";
import Config from "../../../lib/config";
import ItemStatComponent from "./ItemStatComponent";
import { Trans } from "react-i18next";
diff --git a/src/pages/components/statCards/mv_libraries.jsx b/src/pages/components/statCards/mv_libraries.jsx
index 0c6ee6b..fc63789 100644
--- a/src/pages/components/statCards/mv_libraries.jsx
+++ b/src/pages/components/statCards/mv_libraries.jsx
@@ -1,6 +1,5 @@
import { useState, useEffect } from "react";
-import axios from "axios";
-
+import axios from "../../../lib/axios_instance";
import ItemStatComponent from "./ItemStatComponent";
diff --git a/src/pages/components/statCards/mv_movies.jsx b/src/pages/components/statCards/mv_movies.jsx
index dc4f5dd..ddb3e8a 100644
--- a/src/pages/components/statCards/mv_movies.jsx
+++ b/src/pages/components/statCards/mv_movies.jsx
@@ -1,5 +1,5 @@
import { useState, useEffect } from "react";
-import axios from "axios";
+import axios from "../../../lib/axios_instance";
import Config from "../../../lib/config";
diff --git a/src/pages/components/statCards/mv_music.jsx b/src/pages/components/statCards/mv_music.jsx
index 2d99e4d..8033818 100644
--- a/src/pages/components/statCards/mv_music.jsx
+++ b/src/pages/components/statCards/mv_music.jsx
@@ -1,5 +1,5 @@
import { useState, useEffect } from "react";
-import axios from "axios";
+import axios from "../../../lib/axios_instance";
import Config from "../../../lib/config";
import ItemStatComponent from "./ItemStatComponent";
import { Trans } from "react-i18next";
diff --git a/src/pages/components/statCards/mv_series.jsx b/src/pages/components/statCards/mv_series.jsx
index 649a63a..6a426f2 100644
--- a/src/pages/components/statCards/mv_series.jsx
+++ b/src/pages/components/statCards/mv_series.jsx
@@ -1,5 +1,5 @@
import { useState, useEffect } from "react";
-import axios from "axios";
+import axios from "../../../lib/axios_instance";
import Config from "../../../lib/config";
diff --git a/src/pages/components/statCards/playback_method_stats.jsx b/src/pages/components/statCards/playback_method_stats.jsx
index 485443a..94c021c 100644
--- a/src/pages/components/statCards/playback_method_stats.jsx
+++ b/src/pages/components/statCards/playback_method_stats.jsx
@@ -1,5 +1,5 @@
import { useState, useEffect } from "react";
-import axios from "axios";
+import axios from "../../../lib/axios_instance";
import Config from "../../../lib/config";
import ItemStatComponent from "./ItemStatComponent";
diff --git a/src/pages/components/statistics/daily-play-count.jsx b/src/pages/components/statistics/daily-play-count.jsx
index e1204af..d4ea99e 100644
--- a/src/pages/components/statistics/daily-play-count.jsx
+++ b/src/pages/components/statistics/daily-play-count.jsx
@@ -1,6 +1,5 @@
import { useState, useEffect } from "react";
-import axios from "axios";
-
+import axios from "../../../lib/axios_instance";
import Chart from "./chart";
import "../../css/stats.css";
diff --git a/src/pages/components/statistics/play-stats-by-day.jsx b/src/pages/components/statistics/play-stats-by-day.jsx
index 3efebb6..8380060 100644
--- a/src/pages/components/statistics/play-stats-by-day.jsx
+++ b/src/pages/components/statistics/play-stats-by-day.jsx
@@ -1,5 +1,5 @@
import { useState, useEffect } from "react";
-import axios from "axios";
+import axios from "../../../lib/axios_instance";
import Chart from "./chart";
import "../../css/stats.css";
diff --git a/src/pages/components/statistics/play-stats-by-hour.jsx b/src/pages/components/statistics/play-stats-by-hour.jsx
index 2945794..b80b922 100644
--- a/src/pages/components/statistics/play-stats-by-hour.jsx
+++ b/src/pages/components/statistics/play-stats-by-hour.jsx
@@ -1,5 +1,5 @@
import { useState, useEffect } from "react";
-import axios from "axios";
+import axios from "../../../lib/axios_instance";
import Chart from "./chart";
import "../../css/stats.css";
import { Trans } from "react-i18next";
diff --git a/src/pages/components/statistics/playbackMethodStats.jsx b/src/pages/components/statistics/playbackMethodStats.jsx
index e7b9a91..63046be 100644
--- a/src/pages/components/statistics/playbackMethodStats.jsx
+++ b/src/pages/components/statistics/playbackMethodStats.jsx
@@ -1,5 +1,5 @@
import { useState, useEffect } from "react";
-import axios from "axios";
+import axios from "../../../lib/axios_instance";
import "../../css/stats.css";
import { Trans } from "react-i18next";
diff --git a/src/pages/components/user-info.jsx b/src/pages/components/user-info.jsx
index 87c0f62..5010407 100644
--- a/src/pages/components/user-info.jsx
+++ b/src/pages/components/user-info.jsx
@@ -1,6 +1,6 @@
import { useParams } from "react-router-dom";
import { useState, useEffect } from "react";
-import axios from "axios";
+import axios from "../../lib/axios_instance";
import AccountCircleFillIcon from "remixicon-react/AccountCircleFillIcon";
import Config from "../../lib/config";
import { Tabs, Tab, Button, ButtonGroup } from "react-bootstrap";
@@ -10,6 +10,7 @@ import LastPlayed from "./user-info/lastplayed";
import UserActivity from "./user-info/user-activity";
import "../css/users/user-details.css";
import { Trans } from "react-i18next";
+import baseUrl from "../../lib/baseurl";
function UserInfo() {
const { UserId } = useParams();
@@ -76,7 +77,7 @@ function UserInfo() {
) : (
diff --git a/src/pages/components/user-info/globalStats.jsx b/src/pages/components/user-info/globalStats.jsx
index 1ffd727..ff65d96 100644
--- a/src/pages/components/user-info/globalStats.jsx
+++ b/src/pages/components/user-info/globalStats.jsx
@@ -1,5 +1,5 @@
-import React, { useState, useEffect } from "react";
-import axios from "axios";
+import { useState, useEffect } from "react";
+import axios from "../../../lib/axios_instance";
import "../../css/globalstats.css";
import WatchTimeStats from "./globalstats/watchtimestats";
diff --git a/src/pages/components/user-info/lastplayed.jsx b/src/pages/components/user-info/lastplayed.jsx
index ed6cc3a..0c4d553 100644
--- a/src/pages/components/user-info/lastplayed.jsx
+++ b/src/pages/components/user-info/lastplayed.jsx
@@ -1,6 +1,5 @@
import { useState, useEffect } from "react";
-import axios from "axios";
-
+import axios from "../../../lib/axios_instance";
import LastWatchedCard from "../general/last-watched-card";
import ErrorBoundary from "../general/ErrorBoundary";
diff --git a/src/pages/components/user-info/user-activity.jsx b/src/pages/components/user-info/user-activity.jsx
index 0252e3e..0e4750a 100644
--- a/src/pages/components/user-info/user-activity.jsx
+++ b/src/pages/components/user-info/user-activity.jsx
@@ -1,5 +1,5 @@
import { useState, useEffect } from "react";
-import axios from "axios";
+import axios from "../../../lib/axios_instance";
import ActivityTable from "../activity/activity-table";
import { Trans } from "react-i18next";
import { Button, FormControl, FormSelect, Modal } from "react-bootstrap";
diff --git a/src/pages/debugTools/session-card.jsx b/src/pages/debugTools/session-card.jsx
index 1986676..2ec97fd 100644
--- a/src/pages/debugTools/session-card.jsx
+++ b/src/pages/debugTools/session-card.jsx
@@ -14,6 +14,7 @@ import { clientData } from "../../lib/devices";
import Tooltip from "@mui/material/Tooltip";
import IpInfoModal from "../components/ip-info";
import "./sessionCard.css";
+import baseUrl from "../../lib/baseurl";
function ticksToTimeString(ticks) {
// Convert ticks to seconds
@@ -117,7 +118,7 @@ function SessionCard(props) {
: "stat-card-image rounded-0 rounded-start"
}
src={
- "/proxy/Items/Images/Primary?id=" +
+ baseUrl+"/proxy/Items/Images/Primary?id=" +
(props.data.session.NowPlayingItem.SeriesId
? props.data.session.NowPlayingItem.SeriesId
: props.data.session.NowPlayingItem.Id) +
@@ -183,7 +184,7 @@ function SessionCard(props) {
) : (
diff --git a/src/pages/libraries.jsx b/src/pages/libraries.jsx
index 62a4790..819de7c 100644
--- a/src/pages/libraries.jsx
+++ b/src/pages/libraries.jsx
@@ -1,5 +1,5 @@
import { useState, useEffect } from "react";
-import axios from "axios";
+import axios from "../lib/axios_instance";
import Config from "../lib/config";
import "./css/library/libraries.css";
diff --git a/src/pages/library_selector.jsx b/src/pages/library_selector.jsx
index 3475424..6d5f276 100644
--- a/src/pages/library_selector.jsx
+++ b/src/pages/library_selector.jsx
@@ -1,5 +1,5 @@
import { useState, useEffect } from "react";
-import axios from "axios";
+import axios from "../lib/axios_instance";
import Config from "../lib/config";
import "./css/library/libraries.css";
diff --git a/src/pages/login.jsx b/src/pages/login.jsx
index 30ed3cd..be205ae 100644
--- a/src/pages/login.jsx
+++ b/src/pages/login.jsx
@@ -1,5 +1,5 @@
import { useState, useEffect } from "react";
-import axios from "axios";
+import axios from "../lib/axios_instance";
import Config from "../lib/config";
import CryptoJS from "crypto-js";
import "./css/setup.css";
diff --git a/src/pages/setup.jsx b/src/pages/setup.jsx
index 05f7116..363a7e1 100644
--- a/src/pages/setup.jsx
+++ b/src/pages/setup.jsx
@@ -1,5 +1,5 @@
import { useState, useEffect } from "react";
-import axios from "axios";
+import axios from "../lib/axios_instance";
import Config from "../lib/config";
import Form from "react-bootstrap/Form";
import Button from "react-bootstrap/Button";
@@ -12,7 +12,6 @@ import logo_dark from "./images/icon-b-512.png";
import "./css/setup.css";
import i18next from "i18next";
import { Trans } from "react-i18next";
-const token = localStorage.getItem("token");
function Setup() {
const [config, setConfig] = useState(null);
diff --git a/src/pages/signup.jsx b/src/pages/signup.jsx
index fc8aac4..79db15c 100644
--- a/src/pages/signup.jsx
+++ b/src/pages/signup.jsx
@@ -1,6 +1,6 @@
import { useState, useEffect } from "react";
-import axios from "axios";
+import axios from "../lib/axios_instance";
import Config from "../lib/config";
import CryptoJS from "crypto-js";
import "./css/setup.css";
diff --git a/src/pages/users.jsx b/src/pages/users.jsx
index aa70062..ba17183 100644
--- a/src/pages/users.jsx
+++ b/src/pages/users.jsx
@@ -1,5 +1,5 @@
import React, { useState, useEffect } from "react";
-import axios from "axios";
+import axios from "../lib/axios_instance";
import Config from "../lib/config";
import { Link } from "react-router-dom";
import AccountCircleFillIcon from "remixicon-react/AccountCircleFillIcon";
diff --git a/src/socket.js b/src/socket.js
index 11c4fcb..5402bbd 100644
--- a/src/socket.js
+++ b/src/socket.js
@@ -1,5 +1,8 @@
-import { io } from 'socket.io-client';
+import { io } from "socket.io-client";
+import baseUrl from "./lib/baseurl";
-const socket = io();
+const socket = io({
+ path: baseUrl + "/socket.io/",
+});
-export default socket;
\ No newline at end of file
+export default socket;
diff --git a/vite.config.js b/vite.config.js
index 6cdaf0c..682d355 100644
--- a/vite.config.js
+++ b/vite.config.js
@@ -4,6 +4,7 @@ import react from "@vitejs/plugin-react-swc";
// https://vitejs.dev/config/
export default defineConfig({
envPrefix: "JS_",
+ base: "",
optimizeDeps: {
include: ["react", "react-dom", "react-router-dom", "axios", "react-toastify"],
esbuildOptions: {