diff --git a/src/renderer/App.jsx b/src/renderer/App.jsx index 3820416..2fd0313 100644 --- a/src/renderer/App.jsx +++ b/src/renderer/App.jsx @@ -54,6 +54,7 @@ import ReactJkMusicPlayer from 'react-jinke-music-player'; import { PlexOauth, IPlexClientDetails } from 'plex-oauth'; import XMLParser from 'react-xml-parser'; import ipaddr from 'ipaddr.js'; +import { contextIsolated } from 'process'; const drawerWidth = 240; @@ -68,21 +69,21 @@ function App() { const [activePage, setActivePage] = useState(0); if (window.matchMedia('(prefers-color-scheme)').media !== 'not all') { - console.log('🎉 Dark mode is supported'); + //console.log('🎉 Dark mode is supported'); } const MediaQuery = window.matchMedia('(prefers-color-scheme: dark)'); let activeTheme; if (MediaQuery.matches) { - console.log('🎉 Dark mode is preferred'); + //console.log('🎉 Dark mode is preferred'); activeTheme = createTheme({ palette: { mode: 'dark', }, }); } else { - console.log('🎉 Light mode is preferred'); + //console.log('🎉 Light mode is preferred'); activeTheme = createTheme({ palette: { mode: 'light', @@ -90,9 +91,6 @@ function App() { }); } - console.log('Theme'); - console.log(activeTheme); - function openInNewTab(url) { var win = window.open(url, '_blank'); win?.focus; @@ -107,30 +105,21 @@ function App() { setClientID(uuid); } - const [plexAuthToken, setPlexAuthToken] = useState( - localStorage.getItem('plex-authToken') + const [plexData, setPlexData] = useState( + localStorage.getItem('plex-database') ); - const [plexUserData, setPlexUserData] = useState( - localStorage.getItem('plex-userData') - ); + // console.log('Theme'); + // console.log(activeTheme); - const [plexServers, setPlexServers] = useState( - localStorage.getItem('plex-servers') - ); + // console.log('Auth Token At Creation:'); + // console.log(plexAuthToken); - const [plexLibraries, setPlexLibraries] = useState( - localStorage.getItem('plex-libraries') - ); + // console.log('Plex User Data At Creation:'); + // console.log(plexUserData); - console.log('Auth Token At Creation:'); - console.log(plexAuthToken); - - console.log('Plex User Data At Creation:'); - console.log(plexUserData); - - console.log('Plex Servers At Creation:'); - console.log(plexServers); + // console.log('Plex Servers At Creation:'); + // console.log(plexServers); let clientInformation = { clientIdentifier: clientId, // This is a unique identifier used to identify your app with Plex. @@ -201,15 +190,16 @@ function App() { console.log(response); console.log(response.status); if (response.status === 200) { - localStorage.setItem('plex-userData', response.data); - localStorage.setItem('plex-authToken', authToken); - setPlexUserData(response.data); - setPlexAuthToken(authToken); - - return true; + let tempData = plexData; + tempData.plexUserData = response.data; + tempData.plexAuthToken = authToken; + setPlexData(tempData); + getPlexServers(); + getPlexLibraries(); + getPlexMusicLibraries(); + savePlexState(); } if (response.status === 401) { - return false; } }) .catch(function (error) { @@ -233,32 +223,61 @@ function App() { } function plexLogout() { - localStorage.setItem('plex-authToken', null); - localStorage.setItem('plex-userData', null); - localStorage.setItem('plex-servers', null); - setPlexAuthToken(null); - setPlexUserData(null); - setPlexServers([]); - } - - function getPlexLibraries() { - plexServers?.map((obj) => { - axios({ - method: 'GET', - url: - 'http://' + - obj.publicAddress + - ':32400/library/sections/?' + - require('qs').stringify({ - 'X-Plex-Token': obj.accessToken, - }), - headers: { accept: 'application/json' }, - }).then((response) => { - console.log(response); - }); + localStorage.setItem('plex-database', null); + setPlexData({ + plexAuthToken: null, + plexUserData: null, + plexServers: null, + plexLibraries: null, + plexMusicLibraries: null, }); } + // function testPlexServer(ipAddress, accessToken) { + // obj?.connections + // ?.filter((ipEntry) => ipEntry?.local === true) + // ?.map((localIP) => { + // console.log(localIP); + // axios({ + // method: 'GET', + // timeout: 100, + // url: + // 'http://' + + // localIP.address + + // ':32400?' + + // require('qs').stringify({ + // 'X-Plex-Token': obj?.accessToken, + // }), + // }) + // .catch(function (error) { + // if (error.response) { + // // The request was made and the server responded with a status code + // // that falls out of the range of 2xx + // console.log(error.response.data); + // console.log(error.response.status); + // console.log(error.response.headers); + // } else if (error.request) { + // // The request was made but no response was received + // // `error.request` is an instance of XMLHttpRequest in the browser and an instance of + // // http.ClientRequest in node.js + // console.log(error.request); + // } else { + // // Something happened in setting up the request that triggered an Error + // console.log('Error', error.message); + // } + // console.log(error.config); + // }) + // .then((response) => { + // console.log(); + // if (response?.status === 200) { + // localArray = [...localArray, localIP]; + // } else { + // return null; + // } + // }); + // }); + // } + function getPlexServers() { axios({ method: 'GET', @@ -276,27 +295,75 @@ function App() { }).then((response) => { console.log('Plex Devices:'); console.log(response); - localStorage.setItem( - 'plex-servers', - response?.data.filter((obj) => - obj.product.includes('Plex Media Server') - ) - ); - setPlexServers( - response?.data.filter((obj) => - obj.product.includes('Plex Media Server') - ) - ); + console.log(); + let tempData = plexData; + tempData.plexServers = response?.data + ?.filter((obj) => obj.product.includes('Plex Media Server')) + ?.map((obj) => { + console.log(obj); + return { + accessToken: obj?.accessToken, + relay: obj?.connections?.filter( + (ipEntry) => ipEntry?.relay === true + ), + local: obj?.connections?.filter( + (ipEntry) => ipEntry?.local === true + ), + }; + }); }); + + setPlexData(tempData); } - useEffect(() => { - if (plexAuthToken !== null) { - getPlexServers(); - } - }, [plexAuthToken]); + function getPlexLibraries() { + let tempData = plexData; + plexData?.plexServers?.map((server) => { + server?.relay?.map((relay) => + axios({ + method: 'GET', + url: + relay.address + + '/library/sections/?' + + require('qs').stringify({ + 'X-Plex-Token': server.accessToken, + }), + headers: { accept: 'application/json' }, + }).then((response) => { + response?.data?.MediaContainer?.Directory?.map((entry) => { + if (tempData.plexServers.some((e) => e.uuid === entry.uuid)) { + } else { + tempData.plexServers = [...tempData.plexServers, entry]; + } + }); + }) + ); + }); + setPlexData(tempData); + } - getPlexLibraries(); + function savePlexState() { + if (plexData === null) { + plexLogin(); + } else { + localStorage.setItem('plex-database', plexData); + console.log('Plex Database:'); + console.log(localStorage.getItem('plex-database')); + } + } + + function getPlexMusicLibraries() { + setPlexMusicLibraries( + plexLibraries?.filter((obj) => obj?.type === 'artist') + ); + } + + if (plexData.authToken !== null) { + console.log(plexData.authToken); + validatePlexAuthToken(plexData.authToken); + } else { + plexLogout(); + } // if (!authToken) { // plexLogin(); @@ -308,19 +375,28 @@ function App() { // getPlexServers(); // } - console.log('Main Body'); + // console.log('Main Body'); - console.log('clientId:'); - console.log(clientId); + // console.log('clientId:'); + // console.log(clientId); - console.log('Plex Auth Token:'); - console.log(plexAuthToken); + // console.log('Plex Auth Token:'); + // console.log(plexAuthToken); - console.log('Plex User Data:'); - console.log(plexUserData); + // console.log('Plex User Data:'); + // console.log(plexUserData); - console.log('Plex Servers:'); - console.log(plexServers); + // console.log('Plex Servers:'); + // console.log(plexServers); + + // console.log('Plex Libraries:'); + // console.log(plexLibraries); + + // console.log('Plex Music Libraries:'); + // console.log(plexMusicLibraries); + + console.log('Plex DataBase'); + console.log(plexData); function isHidden(id) { if (activePage === id) { @@ -367,14 +443,41 @@ function App() { - {['Home', 'Library', 'Playlists', 'Settings'].map((text, index) => ( - - setActivePage(index)}> - {iconindex[text]} - + + setActivePage(0)}> + {iconindex['Home']} + + + + + + setActivePage(1)}> + {iconindex['Library']} + + + + {plexData?.plexMusicLibraries?.map((obj) => ( + + setMusicFilter(obj)}> + {iconindex['Library']} + ))} + + + setActivePage(2)}> + {iconindex['Playlists']} + + + + + + setActivePage(3)}> + {iconindex['Settings']} + + + } @@ -477,8 +580,8 @@ function App() { } title="Plex Account" subheader={ - 'Username: ' + plexUserData?.username - ? plexUserData?.username + 'Username: ' + plexData?.plexUserData?.username + ? plexData?.plexUserData?.username : null } /> @@ -500,7 +603,7 @@ function App() { sx={{ flexGrow: 1 }} component="div" > - Username: {plexUserData?.username} + Username: {plexData?.plexUserData?.username} @@ -508,7 +611,7 @@ function App() { sx={{ flexGrow: 1 }} component="div" > - Email: {plexUserData?.email} + Email: {plexData?.plexUserData?.email} @@ -517,7 +620,10 @@ function App() { component="div" > Account Status:{' '} - {plexUserData?.subscriptionDescription} + { + plexData?.plexUserData + ?.subscriptionDescription + } @@ -526,7 +632,9 @@ function App() { component="div" > Plex Auth Token:{' '} - {plexAuthToken ? plexAuthToken : null} + {plexData?.plexAuthToken + ? plexAuthToken + : null} @@ -567,39 +675,41 @@ function App() { - {plexServers - ? [...plexServers]?.map((row) => ( - - ( + - {row?.name} - - - {row?.publicAddress} - - - {row?.platform} - - - {row?.owned ? 'Yes' : 'No'} - - - {row?.publicAddressMatches - ? 'Local' - : 'Remote'} - - - )) + + {row?.name} + + + {row?.publicAddress} + + + {row?.platform} + + + {row?.owned ? 'Yes' : 'No'} + + + {row?.publicAddressMatches + ? 'Local' + : 'Remote'} + + + ) + ) : null}