From 29d6464397ccf738f8d2a504a9c4fc82cd878dfa Mon Sep 17 00:00:00 2001 From: CyferShepard Date: Sun, 8 Sep 2024 00:31:13 +0200 Subject: [PATCH] Fix to address #229 Base urls. Alot of hacky code here. hope it doesnt break --- .vscode/launch.json | 58 +++++----- backend/classes/env.js | 4 +- backend/server.js | 74 +++++++++++- backend/ws.js | 25 ++-- index.html | 10 +- src/App.jsx | 2 +- src/index.jsx | 18 +-- src/lib/axios_instance.jsx | 3 +- src/lib/baseurl.jsx | 11 ++ src/lib/config.jsx | 2 +- src/pages/about.jsx | 108 ++++++++---------- src/pages/activity.jsx | 2 +- .../LibrarySelector/SelectionCard.jsx | 5 +- .../components/activity/activity-table.jsx | 5 +- .../components/general/last-watched-card.jsx | 3 +- src/pages/components/general/version-card.jsx | 2 +- src/pages/components/ip-info.jsx | 2 +- src/pages/components/item-info.jsx | 5 +- .../components/item-info/globalStats.jsx | 2 +- .../components/item-info/item-activity.jsx | 4 +- .../components/item-info/item-not-found.jsx | 2 +- .../components/item-info/item-options.jsx | 2 +- src/pages/components/item-info/more-items.jsx | 2 +- .../item-info/more-items/more-items-card.jsx | 5 +- src/pages/components/library-info.jsx | 2 +- .../RecentlyAdded/recently-added-card.jsx | 3 +- src/pages/components/library/last-watched.jsx | 5 +- .../components/library/library-activity.jsx | 2 +- src/pages/components/library/library-card.jsx | 3 +- .../components/library/library-items.jsx | 2 +- .../components/library/library-options.jsx | 2 +- .../components/library/library-stats.jsx | 2 +- .../components/library/recently-added.jsx | 2 +- src/pages/components/libraryOverview.jsx | 2 +- src/pages/components/playbackactivity.jsx | 7 +- .../components/sessions/session-card.jsx | 10 +- src/pages/components/settings/Tasks.jsx | 2 +- src/pages/components/settings/apiKeys.jsx | 2 +- .../components/settings/backup_tables.jsx | 2 +- src/pages/components/settings/backupfiles.jsx | 2 +- src/pages/components/settings/logs.jsx | 2 +- src/pages/components/settings/security.jsx | 2 +- .../components/settings/settingsConfig.jsx | 2 +- .../statCards/most_active_users.jsx | 2 +- .../components/statCards/most_used_client.jsx | 2 +- src/pages/components/statCards/mp_movies.jsx | 2 +- src/pages/components/statCards/mp_music.jsx | 2 +- src/pages/components/statCards/mp_series.jsx | 2 +- .../components/statCards/mv_libraries.jsx | 3 +- src/pages/components/statCards/mv_movies.jsx | 2 +- src/pages/components/statCards/mv_music.jsx | 2 +- src/pages/components/statCards/mv_series.jsx | 2 +- .../statCards/playback_method_stats.jsx | 2 +- .../statistics/daily-play-count.jsx | 3 +- .../statistics/play-stats-by-day.jsx | 2 +- .../statistics/play-stats-by-hour.jsx | 2 +- .../statistics/playbackMethodStats.jsx | 2 +- src/pages/components/user-info.jsx | 5 +- .../components/user-info/globalStats.jsx | 4 +- src/pages/components/user-info/lastplayed.jsx | 3 +- .../components/user-info/user-activity.jsx | 2 +- src/pages/debugTools/session-card.jsx | 7 +- src/pages/libraries.jsx | 2 +- src/pages/library_selector.jsx | 2 +- src/pages/login.jsx | 2 +- src/pages/setup.jsx | 3 +- src/pages/signup.jsx | 2 +- src/pages/users.jsx | 2 +- src/socket.js | 9 +- vite.config.js | 1 + 70 files changed, 279 insertions(+), 207 deletions(-) create mode 100644 src/lib/baseurl.jsx 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 ( -
-

- - - - - : - - - {data.current_version} - - - - - : - - - {data.message} - - - - - - : - - - https://github.com/CyferShepard/Jellystat - - - - -
- ); - - + return ( +
+

+ +

+ + + + + : + + {data.current_version} + + + + : + + {data.message} + + + + + : + + + + {" "} + https://github.com/CyferShepard/Jellystat + + + + + +
+ ); } 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: {