Files
NotPlexApp/preload.js

121 lines
4.7 KiB
JavaScript

console.log("Preload script starting...");
try {
const { contextBridge } = require('electron');
const fs = require('fs');
const path = require('path');
console.log("Node modules loaded successfully.");
// Location to store the token (adjust the location as needed)
const tokenFile = path.join(__dirname, 'accessToken.json');
console.log("Token file path:", tokenFile);
function loadToken() {
try {
const data = fs.readFileSync(tokenFile, 'utf8');
const parsed = JSON.parse(data);
console.log("Token loaded:", parsed.token);
return parsed.token;
} catch (error) {
console.warn("loadToken error:", error.message);
return null;
}
}
function saveToken(token) {
try {
fs.writeFileSync(tokenFile, JSON.stringify({ token }), 'utf8');
console.log("Token saved:", token);
} catch (error) {
console.error("saveToken error:", error.message);
}
}
let accessToken = loadToken();
// Updated fetchWithAuth: if JSON returns "Invalid or expired token" then
// dispatch a custom event that the renderer will catch.
function fetchWithAuth(url, options = {}) {
options.headers = options.headers || {};
if (accessToken) {
options.headers['Authorization'] = `Bearer ${accessToken}`;
}
return fetch(url, options)
.then(response => response.json())
.then(data => {
if (data.detail && data.detail === "Invalid or expired token") {
console.error("API reports expired token.");
accessToken = null;
// Dispatch custom event on the window so that the renderer can show the login overlay.
window.dispatchEvent(new CustomEvent("tokenExpired", { detail: data.detail }));
}
return data;
});
}
// Now update getStreamUrl and getEpisodeStreamUrl to use fetchWithAuth.
contextBridge.exposeInMainWorld('api', {
// Movies API calls
getMovies: () => fetchWithAuth('http://bbrunson.com:8495/movies'),
getMovieDetails: (id) => fetchWithAuth(`http://bbrunson.com:8495/movies/${id}`),
getStream: (id) => `http://bbrunson.com:8495/stream/${id}`,
// TV Shows API calls
getShows: () => fetchWithAuth('http://bbrunson.com:8495/shows'),
getShowDetails: (showId) => fetchWithAuth(`http://bbrunson.com:8495/shows/${showId}`),
getShowSeasons: (showId) => fetchWithAuth(`http://bbrunson.com:8495/shows/${showId}/seasons`),
getSeasonEpisodes: (showId, season) =>
fetchWithAuth(`http://bbrunson.com:8495/shows/${showId}/seasons/${season}/episodes`),
getEpisodeStream: (episodeId) => `http://bbrunson.com:8495/stream_episode/${episodeId}`,
getSubtitles: (id) => `http://bbrunson.com:8495/subtitles/${id}`,
// New: In Progress API call
getInProgress: () => fetchWithAuth('http://bbrunson.com:8495/in_progress'),
// New: Get Episode Details API call
getEpisodeDetails: (id) => fetchWithAuth(`http://bbrunson.com:8495/episodes/${id}`),
// New: Use the /episodes/{episode_id}/show endpoint to fetch TV show details for an episode
getShowByEpisode: (episodeId) => fetchWithAuth(`http://bbrunson.com:8495/episodes/${episodeId}/show`),
// Authentication functions
login: (username, password) => {
return fetch('http://bbrunson.com:8495/login', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ username, password })
})
.then(r => r.json())
.then(data => {
if (data.access_token) {
accessToken = data.access_token;
saveToken(accessToken);
}
return data;
});
},
register: (username, password) => {
return fetch('http://bbrunson.com:8495/register', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ username, password })
})
.then(r => r.json());
},
getToken: () => accessToken,
scanForNewFiles: () => fetchWithAuth('http://bbrunson.com:8495/scan', { method: 'POST' }),
getSessionDetails: (sessionId) => fetchWithAuth(`http://bbrunson.com:8495/sessions/${sessionId}`),
// new progress APIs
saveProgress: (mediaType, mediaId, lastPosition) =>
fetchWithAuth(`http://bbrunson.com:8495/save_progress/${mediaType}/${mediaId}`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ last_position: lastPosition })
}),
getProgress: (mediaType, mediaId) =>
fetchWithAuth(`http://bbrunson.com:8495/get_progress/${mediaType}/${mediaId}`)
});
console.log("Preload script finished register API.");
} catch (error) {
console.error('Error in preload.js:', error);
}