jellypod/Jellypod.html
Duncan Tourolle 4679b77d1a
Some checks failed
🏗️ Build Plugin / call (push) Failing after 0s
📝 Create/Update Release Draft & Release Bump PR / call (push) Failing after 0s
🔬 Run CodeQL / call (push) Failing after 0s
🧪 Test Plugin / call (push) Failing after 0s
First POC with podcasts library
2025-12-13 23:57:58 +01:00

282 lines
49 KiB
HTML

<!DOCTYPE html>
<html class="preload layout-desktop" dir="ltr" lang="en-gb" data-theme="dark"><head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8"><style>body {transition: opacity ease-in 0.2s; }
body[unresolved] {opacity: 0; display: block; overflow: hidden; position: relative; }
</style><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no,viewport-fit=cover"><link rel="manifest" href="https://jellyfin.tourolle.paris/web/manifest.json"><meta name="format-detection" content="telephone=no"><meta name="msapplication-tap-highlight" content="no"><meta http-equiv="X-UA-Compatibility" content="IE=Edge"><meta name="apple-mobile-web-app-capable" content="yes"><meta name="mobile-web-app-capable" content="yes"><meta name="application-name" content="Jellyfin"><meta name="robots" content="noindex, nofollow, noarchive"><meta name="referrer" content="no-referrer"><meta id="themeColor" name="theme-color" content="#202020"><link rel="apple-touch-icon" sizes="180x180" href="https://jellyfin.tourolle.paris/web/touchicon.f5bbb798cb2c65908633.png"><link rel="shortcut icon" href="https://jellyfin.tourolle.paris/web/favicon.bc8d51405ec040305a87.ico"><meta name="msapplication-TileImage" content="touchicon144.39209dd2362c0db7c673.png"><meta name="msapplication-TileColor" content="#333333"><title>Jellypod</title><style>.backgroundContainer-transparent:not(.withBackdrop),.transparentDocument{background:0 0!important;background-color:transparent!important}.layout-tv .mouseIdle,.layout-tv .mouseIdle a,.layout-tv .mouseIdle button,.layout-tv .mouseIdle input,.layout-tv .mouseIdle label,.layout-tv .mouseIdle select,.layout-tv .mouseIdle textarea,.screensaver-noScroll.mouseIdle,.screensaver-noScroll.mouseIdle a,.screensaver-noScroll.mouseIdle button,.screensaver-noScroll.mouseIdle input,.screensaver-noScroll.mouseIdle label,.screensaver-noScroll.mouseIdle select,.screensaver-noScroll.mouseIdle textarea,.transparentDocument .mouseIdle,.transparentDocument .mouseIdle a,.transparentDocument .mouseIdle button,.transparentDocument .mouseIdle input,.transparentDocument .mouseIdle label,.transparentDocument .mouseIdle select,.transparentDocument .mouseIdle textarea{cursor:none!important}.preload{background-color:#101010}.hide,.layout-desktop .hide-desktop,.layout-mobile .hide-mobile,.layout-tv .hide-tv,.mouseIdle .hide-mouse-idle,.mouseIdle-tv .hide-mouse-idle-tv{display:none!important}.mainDrawerHandle{position:fixed;top:0;bottom:0;z-index:1;width:.8em;padding-left:env(safe-area-inset-left);caret-color:transparent}[dir=ltr] .mainDrawerHandle{left:0}[dir=rtl] .mainDrawerHandle{left:0}</style><script defer="defer" src="Jellypod_files/runtime.bundle.js"></script><script defer="defer" src="Jellypod_files/node_modules.@jellyfin.sdk.bundle.js"></script><script defer="defer" src="Jellypod_files/node_modules.@mui.material.bundle.js"></script><script defer="defer" src="Jellypod_files/node_modules.@mui.system.bundle.js"></script><script defer="defer" src="Jellypod_files/node_modules.@mui.utils.bundle.js"></script><script defer="defer" src="Jellypod_files/node_modules.@mui.icons-material.bundle.js"></script><script defer="defer" src="Jellypod_files/node_modules.@tanstack.query-core.bundle.js"></script><script defer="defer" src="Jellypod_files/node_modules.date-fns.esm.bundle.js"></script><script defer="defer" src="Jellypod_files/node_modules.lodash-es.bundle.js"></script><script defer="defer" src="Jellypod_files/node_modules.react-transition-group.bundle.js"></script><script defer="defer" src="Jellypod_files/node_modules.core-js.bundle.js"></script><script defer="defer" src="Jellypod_files/node_modules.@popperjs.core.bundle.js"></script><script defer="defer" src="Jellypod_files/node_modules.axios.bundle.js"></script><script defer="defer" src="Jellypod_files/node_modules.react-dom.bundle.js"></script><script defer="defer" src="Jellypod_files/node_modules.jquery.bundle.js"></script><script defer="defer" src="Jellypod_files/node_modules.webcomponents.js.bundle.js"></script><script defer="defer" src="Jellypod_files/node_modules.resize-observer-polyfill.bundle.js"></script><script defer="defer" src="Jellypod_files/node_modules.regenerator-runtime.bundle.js"></script><script defer="defer" src="Jellypod_files/node_modules.jellyfin-apiclient.bundle.js"></script><script defer="defer" src="Jellypod_files/node_modules.intersection-observer.bundle.js"></script><script defer="defer" src="Jellypod_files/node_modules.history.bundle.js"></script><script defer="defer" src="Jellypod_files/node_modules.dompurify.bundle.js"></script><script defer="defer" src="Jellypod_files/node_modules.react-router.bundle.js"></script><script defer="defer" src="Jellypod_files/node_modules.react-router-dom.bundle.js"></script><script defer="defer" src="Jellypod_files/node_modules.@remix-run.router.bundle.js"></script><script defer="defer" src="Jellypod_files/node_modules.abortcontroller-polyfill.bundle.js"></script><script defer="defer" src="Jellypod_files/46967.bundle.js"></script><script defer="defer" src="Jellypod_files/main.jellyfin.bundle.js"></script><script defer="defer" src="Jellypod_files/serviceworker.js"></script><link href="Jellypod_files/46967.03edf3bb7ee048ee10be.css" rel="stylesheet"><link href="Jellypod_files/main.jellyfin.28c121270fe02d9f8014.css" rel="stylesheet"><link rel="stylesheet" type="text/css" href="Jellypod_files/6496.820f6a55d98c6299419b.css"><link rel="stylesheet" type="text/css" href="Jellypod_files/25348.10043daf2671fc8859af.css"><link rel="stylesheet" type="text/css" href="Jellypod_files/73560.1274c92926553359e1c1.css"><link rel="stylesheet" type="text/css" href="Jellypod_files/comicsPlayer-plugin.819b6c930e413c7e0b31.css"><link rel="stylesheet" type="text/css" href="Jellypod_files/bookPlayer-plugin.038efd75cde59c3a0140.css"><link rel="stylesheet" type="text/css" href="Jellypod_files/pdfPlayer-plugin.cd5ed0191dc31caf9eb4.css"><link rel="stylesheet" type="text/css" href="Jellypod_files/14245.f517756c675c2040ffba.css"><link rel="stylesheet" type="text/css" href="Jellypod_files/91737.46d2c499ae1164063e43.css"><style data-emotion="css-global" data-s=""></style><link rel="stylesheet" type="text/css" href="Jellypod_files/32721.bfde69083a6ae513ba97.css"><link rel="stylesheet" type="text/css" href="Jellypod_files/68603.bfde69083a6ae513ba97.css"><link rel="stylesheet" type="text/css" href="Jellypod_files/69881.85d5c8ac3936b68e702e.css"><link rel="stylesheet" type="text/css" href="Jellypod_files/76542.033e6959b8ca2bb863d3.css"><style data-emotion="css" data-s=""></style><link rel="stylesheet" type="text/css" href="Jellypod_files/47472.ead193e1e4096120377c.css"></head><body dir="ltr" class="vc-init dashboardDocument"><div id="reactRoot"><div class="backdropContainer"></div><div class="backgroundContainer"></div><div style="display: none;"><div class="mainDrawer transition touch-menu-la" style="width: 320px; left: -320px;"><div class="mainDrawer-scrollContainer scrollContainer focuscontainer-y scrollY"></div></div><div class="skinHeader focuscontainer-x skinHeader-withBackground skinHeader-blurred headroomDisabled"><div class="flex align-items-center flex-grow headerTop"><div class="headerLeft"><button type="button" is="paper-icon-button-light" class="headerButton headerButtonLeft headerBackButton paper-icon-button-light" title="Back"><span class="material-icons arrow_back" aria-hidden="true"></span></button><button type="button" is="paper-icon-button-light" class="headerButton headerHomeButton barsMenuButton headerButtonLeft paper-icon-button-light" title="Home"><span class="material-icons home" aria-hidden="true"></span></button><button type="button" is="paper-icon-button-light" class="headerButton mainDrawerButton barsMenuButton headerButtonLeft hide paper-icon-button-light" title="Menu"><span class="material-icons menu" aria-hidden="true"></span></button><h3 class="pageTitle" aria-hidden="true">Jellypod</h3></div><div class="headerRight"><button is="paper-icon-button-light" class="headerSyncButton syncButton headerButton headerButtonRight paper-icon-button-light" title="SyncPlay"><span class="material-icons groups" aria-hidden="true"></span></button><span class="headerSelectedPlayer"></span><button is="paper-icon-button-light" class="headerAudioPlayerButton audioPlayerButton headerButton headerButtonRight hide paper-icon-button-light" title="Player"><span class="material-icons music_note" aria-hidden="true"></span></button><button is="paper-icon-button-light" class="headerCastButton castButton headerButton headerButtonRight paper-icon-button-light" title="Cast to Device"><span class="material-icons cast" aria-hidden="true"></span></button><button type="button" is="paper-icon-button-light" class="headerButton headerButtonRight headerSearchButton paper-icon-button-light" title="Search"><span class="material-icons search" aria-hidden="true"></span></button><button is="paper-icon-button-light" class="headerButton headerButtonRight headerUserButton paper-icon-button-light" title="dtourolle"><span class="material-icons person" aria-hidden="true"></span></button><div class="currentTimeText hide"></div></div></div><div class="headerTabs sectionTabs hide"></div></div><div class="mainDrawerHandle"></div></div><div class="MuiBox-root css-k008qs"><header class="MuiPaper-root MuiPaper-elevation MuiPaper-elevation0 MuiAppBar-root MuiAppBar-colorTransparent MuiAppBar-positionFixed mui-fixed css-b5r1ap" style="--Paper-shadow: var(--jf-shadows-0); --Paper-overlay: var(--jf-overlays-0);"><div class="MuiToolbar-root MuiToolbar-gutters MuiToolbar-dense css-11uszk8"><button class="MuiButtonBase-root MuiIconButton-root MuiIconButton-colorInherit MuiIconButton-edgeStart MuiIconButton-sizeLarge css-1qq8wmv" tabindex="0" type="button" aria-label="Back"><svg class="MuiSvgIcon-root MuiSvgIcon-fontSizeMedium css-iguwhy" focusable="false" aria-hidden="true" viewBox="0 0 24 24" data-testid="ArrowBackIcon"><path d="M20 11H7.83l5.59-5.59L12 4l-8 8 8 8 1.41-1.41L7.83 13H20z"></path></svg><span class="MuiTouchRipple-root css-4mb1j7"></span></button><div class="MuiBox-root css-1riowxi"></div><div class="MuiBox-root css-2uchni"><button class="MuiButtonBase-root MuiIconButton-root MuiIconButton-colorInherit MuiIconButton-sizeLarge css-g99rn3" tabindex="0" type="button" aria-label="User Menu" aria-controls="app-user-menu" aria-haspopup="true"><div class="MuiAvatar-root MuiAvatar-circular MuiAvatar-colorDefault css-9yhqgk"><svg class="MuiSvgIcon-root MuiSvgIcon-fontSizeMedium MuiAvatar-fallback css-ya380f" focusable="false" aria-hidden="true" viewBox="0 0 24 24" data-testid="PersonIcon"><path d="M12 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm0 2c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z"></path></svg></div></button></div></div></header><div class="MuiDrawer-root MuiDrawer-anchorLeft MuiDrawer-docked css-wprkhu"><div class="MuiPaper-root MuiPaper-elevation MuiPaper-elevation0 MuiDrawer-paper MuiDrawer-paperAnchorLeft MuiDrawer-paperAnchorDockedLeft css-357a58" style="--Paper-shadow: var(--jf-shadows-0); --Paper-overlay: var(--jf-overlays-0);"><ul class="MuiList-root css-11fhglq"><li class="MuiListItem-root MuiListItem-gutters css-1ohqk82"><a class="MuiButtonBase-root MuiListItemButton-root MuiListItemButton-gutters MuiListItemButton-root MuiListItemButton-gutters css-yknuxp" tabindex="0" href="#/"><div class="MuiListItemIcon-root css-c9a5tz"><img class="MuiBox-root css-1j3tjfb" src="Jellypod_files/icon-transparent.baba78f2a106d9baee83.png"></div><div class="MuiListItemText-root MuiListItemText-multiline css-9ac84v"><h6 class="MuiTypography-root MuiTypography-h6 MuiListItemText-primary css-1y7q0ly">roughina</h6><p class="MuiTypography-root MuiTypography-body2 MuiListItemText-secondary css-xxlzys">10.11.2</p></div><span class="MuiTouchRipple-root css-4mb1j7"></span></a></li></ul><ul class="MuiList-root MuiList-padding MuiList-subheader css-q9gyaw" aria-labelledby="server-subheader"><div class="MuiListSubheader-root MuiListSubheader-gutters MuiListSubheader-sticky css-18qy2xf" id="server-subheader">Server</div><li class="MuiListItem-root MuiListItem-gutters css-1ohqk82"><a class="MuiButtonBase-root MuiListItemButton-root MuiListItemButton-gutters MuiListItemButton-root MuiListItemButton-gutters css-yknuxp" tabindex="0" href="#/dashboard"><div class="MuiListItemIcon-root css-5pks8q"><svg class="MuiSvgIcon-root MuiSvgIcon-fontSizeMedium css-iguwhy" focusable="false" aria-hidden="true" viewBox="0 0 24 24" data-testid="DashboardIcon"><path d="M3 13h8V3H3zm0 8h8v-6H3zm10 0h8V11h-8zm0-18v6h8V3z"></path></svg></div><div class="MuiListItemText-root css-t3p1a1"><span class="MuiTypography-root MuiTypography-body1 MuiListItemText-primary css-pl8nxc">Dashboard</span></div><span class="MuiTouchRipple-root css-4mb1j7"></span></a></li><li class="MuiListItem-root MuiListItem-gutters css-1ohqk82"><a class="MuiButtonBase-root MuiListItemButton-root MuiListItemButton-gutters MuiListItemButton-root MuiListItemButton-gutters css-yknuxp" tabindex="0" href="#/dashboard/settings"><div class="MuiListItemIcon-root css-5pks8q"><svg class="MuiSvgIcon-root MuiSvgIcon-fontSizeMedium css-iguwhy" focusable="false" aria-hidden="true" viewBox="0 0 24 24" data-testid="SettingsIcon"><path d="M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.07-.94l2.03-1.58c.18-.14.23-.41.12-.61l-1.92-3.32c-.12-.22-.37-.29-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54c-.04-.24-.24-.41-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.74 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.07.94l-2.03 1.58c-.18.14-.23.41-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .44-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.47-.12-.61zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6"></path></svg></div><div class="MuiListItemText-root css-t3p1a1"><span class="MuiTypography-root MuiTypography-body1 MuiListItemText-primary css-pl8nxc">General</span></div><span class="MuiTouchRipple-root css-4mb1j7"></span></a></li><a class="MuiButtonBase-root MuiListItemButton-root MuiListItemButton-gutters MuiListItemButton-root MuiListItemButton-gutters css-yknuxp" tabindex="0" href="#/dashboard/branding"><div class="MuiListItemIcon-root css-5pks8q"><svg class="MuiSvgIcon-root MuiSvgIcon-fontSizeMedium css-iguwhy" focusable="false" aria-hidden="true" viewBox="0 0 24 24" data-testid="PaletteIcon"><path d="M12 2C6.49 2 2 6.49 2 12s4.49 10 10 10c1.38 0 2.5-1.12 2.5-2.5 0-.61-.23-1.2-.64-1.67-.08-.1-.13-.21-.13-.33 0-.28.22-.5.5-.5H16c3.31 0 6-2.69 6-6 0-4.96-4.49-9-10-9m5.5 11c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5m-3-4c-.83 0-1.5-.67-1.5-1.5S13.67 6 14.5 6s1.5.67 1.5 1.5S15.33 9 14.5 9M5 11.5c0-.83.67-1.5 1.5-1.5s1.5.67 1.5 1.5S7.33 13 6.5 13 5 12.33 5 11.5m6-4c0 .83-.67 1.5-1.5 1.5S8 8.33 8 7.5 8.67 6 9.5 6s1.5.67 1.5 1.5"></path></svg></div><div class="MuiListItemText-root css-t3p1a1"><span class="MuiTypography-root MuiTypography-body1 MuiListItemText-primary css-pl8nxc">Branding</span></div><span class="MuiTouchRipple-root css-4mb1j7"></span></a><li class="MuiListItem-root MuiListItem-gutters css-1ohqk82"><a class="MuiButtonBase-root MuiListItemButton-root MuiListItemButton-gutters MuiListItemButton-root MuiListItemButton-gutters css-yknuxp" tabindex="0" href="#/dashboard/users"><div class="MuiListItemIcon-root css-5pks8q"><svg class="MuiSvgIcon-root MuiSvgIcon-fontSizeMedium css-iguwhy" focusable="false" aria-hidden="true" viewBox="0 0 24 24" data-testid="PeopleIcon"><path d="M16 11c1.66 0 2.99-1.34 2.99-3S17.66 5 16 5s-3 1.34-3 3 1.34 3 3 3m-8 0c1.66 0 2.99-1.34 2.99-3S9.66 5 8 5 5 6.34 5 8s1.34 3 3 3m0 2c-2.33 0-7 1.17-7 3.5V19h14v-2.5c0-2.33-4.67-3.5-7-3.5m8 0c-.29 0-.62.02-.97.05 1.16.84 1.97 1.97 1.97 3.45V19h6v-2.5c0-2.33-4.67-3.5-7-3.5"></path></svg></div><div class="MuiListItemText-root css-t3p1a1"><span class="MuiTypography-root MuiTypography-body1 MuiListItemText-primary css-pl8nxc">Users</span></div><span class="MuiTouchRipple-root css-4mb1j7"></span></a></li><li class="MuiListItem-root MuiListItem-gutters css-1ohqk82"><div class="MuiButtonBase-root MuiListItemButton-root MuiListItemButton-gutters MuiListItemButton-root MuiListItemButton-gutters css-yknuxp" tabindex="0" role="button"><div class="MuiListItemIcon-root css-5pks8q"><svg class="MuiSvgIcon-root MuiSvgIcon-fontSizeMedium css-iguwhy" focusable="false" aria-hidden="true" viewBox="0 0 24 24" data-testid="LibraryAddIcon"><path d="M4 6H2v14c0 1.1.9 2 2 2h14v-2H4zm16-4H8c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2m-1 9h-4v4h-2v-4H9V9h4V5h2v4h4z"></path></svg></div><div class="MuiListItemText-root css-t3p1a1"><span class="MuiTypography-root MuiTypography-body1 MuiListItemText-primary css-pl8nxc">Libraries</span></div><svg class="MuiSvgIcon-root MuiSvgIcon-fontSizeMedium css-iguwhy" focusable="false" aria-hidden="true" viewBox="0 0 24 24" data-testid="ExpandMoreIcon"><path d="M16.59 8.59 12 13.17 7.41 8.59 6 10l6 6 6-6z"></path></svg><span class="MuiTouchRipple-root css-4mb1j7"></span></div></li><li class="MuiListItem-root MuiListItem-gutters css-1ohqk82"><div class="MuiButtonBase-root MuiListItemButton-root MuiListItemButton-gutters MuiListItemButton-root MuiListItemButton-gutters css-yknuxp" tabindex="0" role="button"><div class="MuiListItemIcon-root css-5pks8q"><svg class="MuiSvgIcon-root MuiSvgIcon-fontSizeMedium css-iguwhy" focusable="false" aria-hidden="true" viewBox="0 0 24 24" data-testid="PlayCircleIcon"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2M9.5 16.5v-9l7 4.5z"></path></svg></div><div class="MuiListItemText-root css-t3p1a1"><span class="MuiTypography-root MuiTypography-body1 MuiListItemText-primary css-pl8nxc">Playback</span></div><svg class="MuiSvgIcon-root MuiSvgIcon-fontSizeMedium css-iguwhy" focusable="false" aria-hidden="true" viewBox="0 0 24 24" data-testid="ExpandMoreIcon"><path d="M16.59 8.59 12 13.17 7.41 8.59 6 10l6 6 6-6z"></path></svg><span class="MuiTouchRipple-root css-4mb1j7"></span></div></li></ul><ul class="MuiList-root MuiList-padding MuiList-subheader css-q9gyaw" aria-labelledby="devices-subheader"><div class="MuiListSubheader-root MuiListSubheader-gutters MuiListSubheader-sticky css-18qy2xf" id="devices-subheader">Devices</div><li class="MuiListItem-root MuiListItem-gutters css-1ohqk82"><a class="MuiButtonBase-root MuiListItemButton-root MuiListItemButton-gutters MuiListItemButton-root MuiListItemButton-gutters css-yknuxp" tabindex="0" href="#/dashboard/devices"><div class="MuiListItemIcon-root css-5pks8q"><svg class="MuiSvgIcon-root MuiSvgIcon-fontSizeMedium css-iguwhy" focusable="false" aria-hidden="true" viewBox="0 0 24 24" data-testid="DevicesIcon"><path d="M4 6h18V4H4c-1.1 0-2 .9-2 2v11H0v3h14v-3H4zm19 2h-6c-.55 0-1 .45-1 1v10c0 .55.45 1 1 1h6c.55 0 1-.45 1-1V9c0-.55-.45-1-1-1m-1 9h-4v-7h4z"></path></svg></div><div class="MuiListItemText-root css-t3p1a1"><span class="MuiTypography-root MuiTypography-body1 MuiListItemText-primary css-pl8nxc">Devices</span></div><span class="MuiTouchRipple-root css-4mb1j7"></span></a></li><li class="MuiListItem-root MuiListItem-gutters css-1ohqk82"><a class="MuiButtonBase-root MuiListItemButton-root MuiListItemButton-gutters MuiListItemButton-root MuiListItemButton-gutters css-yknuxp" tabindex="0" href="#/dashboard/activity"><div class="MuiListItemIcon-root css-5pks8q"><svg class="MuiSvgIcon-root MuiSvgIcon-fontSizeMedium css-iguwhy" focusable="false" aria-hidden="true" viewBox="0 0 24 24" data-testid="AnalyticsIcon"><path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2M9 17H7v-5h2zm4 0h-2v-3h2zm0-5h-2v-2h2zm4 5h-2V7h2z"></path></svg></div><div class="MuiListItemText-root css-t3p1a1"><span class="MuiTypography-root MuiTypography-body1 MuiListItemText-primary css-pl8nxc">Activity</span></div><span class="MuiTouchRipple-root css-4mb1j7"></span></a></li></ul><ul class="MuiList-root MuiList-padding MuiList-subheader css-q9gyaw" aria-labelledby="livetv-subheader"><div class="MuiListSubheader-root MuiListSubheader-gutters MuiListSubheader-sticky css-18qy2xf" id="livetv-subheader">Live TV</div><li class="MuiListItem-root MuiListItem-gutters css-1ohqk82"><a class="MuiButtonBase-root MuiListItemButton-root MuiListItemButton-gutters MuiListItemButton-root MuiListItemButton-gutters css-yknuxp" tabindex="0" href="#/dashboard/livetv"><div class="MuiListItemIcon-root css-5pks8q"><svg class="MuiSvgIcon-root MuiSvgIcon-fontSizeMedium css-iguwhy" focusable="false" aria-hidden="true" viewBox="0 0 24 24" data-testid="LiveTvIcon"><path d="M21 6h-7.59l3.29-3.29L16 2l-4 4-4-4-.71.71L10.59 6H3c-1.1 0-2 .89-2 2v12c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2V8c0-1.11-.9-2-2-2m0 14H3V8h18zM9 10v8l7-4z"></path></svg></div><div class="MuiListItemText-root css-t3p1a1"><span class="MuiTypography-root MuiTypography-body1 MuiListItemText-primary css-pl8nxc">Live TV</span></div><span class="MuiTouchRipple-root css-4mb1j7"></span></a></li><li class="MuiListItem-root MuiListItem-gutters css-1ohqk82"><a class="MuiButtonBase-root MuiListItemButton-root MuiListItemButton-gutters MuiListItemButton-root MuiListItemButton-gutters css-yknuxp" tabindex="0" href="#/dashboard/livetv/recordings"><div class="MuiListItemIcon-root css-5pks8q"><svg class="MuiSvgIcon-root MuiSvgIcon-fontSizeMedium css-iguwhy" focusable="false" aria-hidden="true" viewBox="0 0 24 24" data-testid="DvrIcon"><path d="M21 3H3c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h5v2h8v-2h5c1.1 0 1.99-.9 1.99-2L23 5c0-1.1-.9-2-2-2m0 14H3V5h18zm-2-9H8v2h11zm0 4H8v2h11zM7 8H5v2h2zm0 4H5v2h2z"></path></svg></div><div class="MuiListItemText-root css-t3p1a1"><span class="MuiTypography-root MuiTypography-body1 MuiListItemText-primary css-pl8nxc">DVR</span></div><span class="MuiTouchRipple-root css-4mb1j7"></span></a></li></ul><ul class="MuiList-root MuiList-padding MuiList-subheader css-q9gyaw" aria-labelledby="plugins-subheader"><div class="MuiListSubheader-root MuiListSubheader-gutters MuiListSubheader-sticky css-18qy2xf" id="plugins-subheader">Plugins</div><a class="MuiButtonBase-root MuiListItemButton-root MuiListItemButton-gutters Mui-selected MuiListItemButton-root MuiListItemButton-gutters Mui-selected css-yknuxp" tabindex="0" href="#/dashboard/plugins"><div class="MuiListItemIcon-root css-5pks8q"><svg class="MuiSvgIcon-root MuiSvgIcon-fontSizeMedium css-iguwhy" focusable="false" aria-hidden="true" viewBox="0 0 24 24" data-testid="ExtensionIcon"><path d="M20.5 11H19V7c0-1.1-.9-2-2-2h-4V3.5C13 2.12 11.88 1 10.5 1S8 2.12 8 3.5V5H4c-1.1 0-1.99.9-1.99 2v3.8H3.5c1.49 0 2.7 1.21 2.7 2.7s-1.21 2.7-2.7 2.7H2V20c0 1.1.9 2 2 2h3.8v-1.5c0-1.49 1.21-2.7 2.7-2.7s2.7 1.21 2.7 2.7V22H17c1.1 0 2-.9 2-2v-4h1.5c1.38 0 2.5-1.12 2.5-2.5S21.88 11 20.5 11"></path></svg></div><div class="MuiListItemText-root css-t3p1a1"><span class="MuiTypography-root MuiTypography-body1 MuiListItemText-primary css-pl8nxc">Plugins</span></div><span class="MuiTouchRipple-root css-4mb1j7"></span></a></ul><ul class="MuiList-root MuiList-padding MuiList-subheader css-q9gyaw" aria-labelledby="advanced-subheader"><div class="MuiListSubheader-root MuiListSubheader-gutters MuiListSubheader-sticky css-18qy2xf" id="advanced-subheader">Advanced</div><li class="MuiListItem-root MuiListItem-gutters css-1ohqk82"><a class="MuiButtonBase-root MuiListItemButton-root MuiListItemButton-gutters MuiListItemButton-root MuiListItemButton-gutters css-yknuxp" tabindex="0" href="#/dashboard/networking"><div class="MuiListItemIcon-root css-5pks8q"><svg class="MuiSvgIcon-root MuiSvgIcon-fontSizeMedium css-iguwhy" focusable="false" aria-hidden="true" viewBox="0 0 24 24" data-testid="LanIcon"><path d="M13 22h8v-7h-3v-4h-5V9h3V2H8v7h3v2H6v4H3v7h8v-7H8v-2h8v2h-3z"></path></svg></div><div class="MuiListItemText-root css-t3p1a1"><span class="MuiTypography-root MuiTypography-body1 MuiListItemText-primary css-pl8nxc">Networking</span></div></a></li><li class="MuiListItem-root MuiListItem-gutters css-1ohqk82"><a class="MuiButtonBase-root MuiListItemButton-root MuiListItemButton-gutters MuiListItemButton-root MuiListItemButton-gutters css-yknuxp" tabindex="0" href="#/dashboard/keys"><div class="MuiListItemIcon-root css-5pks8q"><svg class="MuiSvgIcon-root MuiSvgIcon-fontSizeMedium css-iguwhy" focusable="false" aria-hidden="true" viewBox="0 0 24 24" data-testid="VpnKeyIcon"><path d="M12.65 10C11.83 7.67 9.61 6 7 6c-3.31 0-6 2.69-6 6s2.69 6 6 6c2.61 0 4.83-1.67 5.65-4H17v4h4v-4h2v-4zM7 14c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2"></path></svg></div><div class="MuiListItemText-root css-t3p1a1"><span class="MuiTypography-root MuiTypography-body1 MuiListItemText-primary css-pl8nxc">API Keys</span></div></a></li><li class="MuiListItem-root MuiListItem-gutters css-1ohqk82"><a class="MuiButtonBase-root MuiListItemButton-root MuiListItemButton-gutters MuiListItemButton-root MuiListItemButton-gutters css-yknuxp" tabindex="0" href="#/dashboard/backups"><div class="MuiListItemIcon-root css-5pks8q"><svg class="MuiSvgIcon-root MuiSvgIcon-fontSizeMedium css-iguwhy" focusable="false" aria-hidden="true" viewBox="0 0 24 24" data-testid="BackupIcon"><path d="M19.35 10.04C18.67 6.59 15.64 4 12 4 9.11 4 6.6 5.64 5.35 8.04 2.34 8.36 0 10.91 0 14c0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.65-4.96M14 13v4h-4v-4H7l5-5 5 5z"></path></svg></div><div class="MuiListItemText-root css-t3p1a1"><span class="MuiTypography-root MuiTypography-body1 MuiListItemText-primary css-pl8nxc">Backups</span></div></a></li><li class="MuiListItem-root MuiListItem-gutters css-1ohqk82"><a class="MuiButtonBase-root MuiListItemButton-root MuiListItemButton-gutters MuiListItemButton-root MuiListItemButton-gutters css-yknuxp" tabindex="0" href="#/dashboard/logs"><div class="MuiListItemIcon-root css-5pks8q"><svg class="MuiSvgIcon-root MuiSvgIcon-fontSizeMedium css-iguwhy" focusable="false" aria-hidden="true" viewBox="0 0 24 24" data-testid="ArticleIcon"><path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2m-5 14H7v-2h7zm3-4H7v-2h10zm0-4H7V7h10z"></path></svg></div><div class="MuiListItemText-root css-t3p1a1"><span class="MuiTypography-root MuiTypography-body1 MuiListItemText-primary css-pl8nxc">Logs</span></div></a></li><li class="MuiListItem-root MuiListItem-gutters css-1ohqk82"><a class="MuiButtonBase-root MuiListItemButton-root MuiListItemButton-gutters MuiListItemButton-root MuiListItemButton-gutters css-yknuxp" tabindex="0" href="#/dashboard/tasks"><div class="MuiListItemIcon-root css-5pks8q"><svg class="MuiSvgIcon-root MuiSvgIcon-fontSizeMedium css-iguwhy" focusable="false" aria-hidden="true" viewBox="0 0 24 24" data-testid="ScheduleIcon"><path d="M11.99 2C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2M12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8"></path><path d="M12.5 7H11v6l5.25 3.15.75-1.23-4.5-2.67z"></path></svg></div><div class="MuiListItemText-root css-t3p1a1"><span class="MuiTypography-root MuiTypography-body1 MuiListItemText-primary css-pl8nxc">Scheduled Tasks</span></div></a></li></ul></div></div><main class="MuiBox-root css-qcqlej"><div class="mainAnimatedPages skinBody"><div id="JellypodConfigPage" data-role="page" class="page type-interior pluginConfigurationPage mainAnimatedPage" data-require="emby-input,emby-button,emby-select,emby-checkbox">
<div data-role="content">
<div class="content-primary">
<h2 class="sectionTitle">Jellypod Settings</h2>
<div class="info-box">
<strong>Browse Podcasts:</strong> Your subscribed podcasts appear in the <em>Channels</em> section of Jellyfin's main menu.
Use this settings page to add/remove podcast subscriptions and configure download options.
</div>
<form id="JellypodConfigForm">
<!-- Storage Settings -->
<div class="verticalSection">
<h3 class="sectionTitle">Storage</h3>
<div class="inputContainer">
<label class="inputLabel inputLabelUnfocused" for="PodcastStoragePath">
Download Storage Path
</label>
<label class="inputLabel inputLabelUnfocused" for="PodcastStoragePath"></label><input id="PodcastStoragePath" name="PodcastStoragePath" type="text" is="emby-input" class="emby-input" value="/mnt/data/Podcasts">
<div class="fieldDescription">
Path where downloaded episodes are stored. Leave empty for default location.
</div>
</div>
<div class="checkboxContainer checkboxContainer-withDescription">
<label class="emby-checkbox-label">
<input id="CreatePodcastFolders" name="CreatePodcastFolders" type="checkbox" is="emby-checkbox" data-embycheckbox="true" class="emby-checkbox" checked="checked">
<span class="checkboxLabel">Create subfolders for each podcast</span>
<span class="checkboxOutline"><span class="material-icons checkboxIcon checkboxIcon-checked check" aria-hidden="true"></span><span class="material-icons checkboxIcon checkboxIcon-unchecked " aria-hidden="true"></span></span></label>
</div>
</div>
<!-- Update Settings -->
<div class="verticalSection">
<h3 class="sectionTitle">Feed Updates</h3>
<div class="inputContainer">
<label class="inputLabel inputLabelUnfocused" for="UpdateIntervalHours">
Update Interval (hours)
</label>
<label class="inputLabel inputLabelUnfocused" for="UpdateIntervalHours"></label><input id="UpdateIntervalHours" name="UpdateIntervalHours" type="number" is="emby-input" min="1" max="168" class="emby-input" value="6">
<div class="fieldDescription">
How often to check for new episodes (default: 6 hours)
</div>
</div>
</div>
<!-- Download Settings -->
<div class="verticalSection">
<h3 class="sectionTitle">Downloads</h3>
<div class="checkboxContainer checkboxContainer-withDescription">
<label class="emby-checkbox-label">
<input id="GlobalAutoDownloadEnabled" name="GlobalAutoDownloadEnabled" type="checkbox" is="emby-checkbox" data-embycheckbox="true" class="emby-checkbox" checked="checked">
<span class="checkboxLabel">Automatically download new episodes</span>
<span class="checkboxOutline"><span class="material-icons checkboxIcon checkboxIcon-checked check" aria-hidden="true"></span><span class="material-icons checkboxIcon checkboxIcon-unchecked " aria-hidden="true"></span></span></label>
<div class="fieldDescription">
Episodes can always be streamed directly. Enable this to also download them locally.
</div>
</div>
<div class="inputContainer">
<label class="inputLabel inputLabelUnfocused" for="MaxConcurrentDownloads">
Max Concurrent Downloads
</label>
<label class="inputLabel inputLabelUnfocused" for="MaxConcurrentDownloads"></label><input id="MaxConcurrentDownloads" name="MaxConcurrentDownloads" type="number" is="emby-input" min="1" max="5" class="emby-input" value="2">
</div>
<div class="inputContainer">
<label class="inputLabel inputLabelUnfocused" for="MaxEpisodesPerPodcast">
Max Episodes Per Podcast
</label>
<label class="inputLabel inputLabelUnfocused" for="MaxEpisodesPerPodcast"></label><input id="MaxEpisodesPerPodcast" name="MaxEpisodesPerPodcast" type="number" is="emby-input" min="0" class="emby-input" value="50">
<div class="fieldDescription">
Maximum episodes to keep downloaded per podcast (0 = unlimited)
</div>
</div>
</div>
<div>
<button is="emby-button" type="submit" class="raised button-submit block emby-button">
<span>Save Settings</span>
</button>
</div>
</form>
<div class="section-divider"></div>
<!-- Podcast Subscription Management -->
<div class="verticalSection">
<h2 class="sectionTitle">Podcast Subscriptions</h2>
<!-- Add Podcast Form -->
<div class="add-podcast-form">
<div class="inputContainer">
<label class="inputLabel inputLabelUnfocused" for="NewFeedUrl">
RSS Feed URL
</label>
<label class="inputLabel inputLabelUnfocused inputLabel-float" for="NewFeedUrl"></label><input id="NewFeedUrl" type="url" is="emby-input" placeholder="https://example.com/feed.xml" class="emby-input">
</div>
<button is="emby-button" type="button" id="btnAddPodcast" class="raised emby-button">
<span>Subscribe</span>
</button>
</div>
<!-- Podcast List -->
<div id="podcastList">
<div class="empty-state" id="emptyState" style="display: none;">
No podcast subscriptions yet. Add one above, then browse in Channels.
</div>
</div>
</div>
</div>
</div>
<script type="text/javascript">
var JellypodConfig = {
pluginUniqueId: 'c713faf4-4e50-4e87-941a-1200178ed605'
};
function loadConfig() {
Dashboard.showLoadingMsg();
ApiClient.getPluginConfiguration(JellypodConfig.pluginUniqueId).then(function (config) {
document.querySelector('#PodcastStoragePath').value = config.PodcastStoragePath || '';
document.querySelector('#UpdateIntervalHours').value = config.UpdateIntervalHours;
document.querySelector('#GlobalAutoDownloadEnabled').checked = config.GlobalAutoDownloadEnabled;
document.querySelector('#MaxConcurrentDownloads').value = config.MaxConcurrentDownloads;
document.querySelector('#MaxEpisodesPerPodcast').value = config.MaxEpisodesPerPodcast;
document.querySelector('#CreatePodcastFolders').checked = config.CreatePodcastFolders;
Dashboard.hideLoadingMsg();
});
}
function loadPodcasts() {
ApiClient.fetch({
url: ApiClient.getUrl('Jellypod/podcasts'),
type: 'GET'
}).then(function(podcasts) {
renderPodcasts(podcasts);
}).catch(function(err) {
console.error('Failed to load podcasts:', err);
});
}
function renderPodcasts(podcasts) {
var container = document.querySelector('#podcastList');
var emptyState = document.querySelector('#emptyState');
if (!podcasts || podcasts.length === 0) {
emptyState.style.display = 'block';
container.innerHTML = '';
container.appendChild(emptyState);
return;
}
emptyState.style.display = 'none';
var html = podcasts.map(function(podcast) {
var episodeCount = podcast.episodes ? podcast.episodes.length : 0;
var lastUpdated = podcast.lastUpdated ? new Date(podcast.lastUpdated).toLocaleString() : 'Never';
return '<div class="podcast-item" data-id="' + podcast.id + '">' +
'<img class="podcast-image" src="' + (podcast.imageUrl || '') + '" alt="" onerror="this.style.display=\'none\'">' +
'<div class="podcast-info">' +
'<div class="podcast-title">' + escapeHtml(podcast.title) + '</div>' +
'<div class="podcast-meta">' +
episodeCount + ' episodes | Updated: ' + lastUpdated +
'</div>' +
'</div>' +
'<div class="podcast-actions">' +
'<button is="emby-button" type="button" class="emby-button" onclick="refreshPodcast(\'' + podcast.id + '\')" title="Refresh Feed">' +
'<span class="material-icons">refresh</span>' +
'</button>' +
'<button is="emby-button" type="button" class="emby-button" onclick="deletePodcast(\'' + podcast.id + '\')" title="Unsubscribe">' +
'<span class="material-icons">delete</span>' +
'</button>' +
'</div>' +
'</div>';
}).join('');
container.innerHTML = html;
}
function escapeHtml(text) {
var div = document.createElement('div');
div.textContent = text;
return div.innerHTML;
}
function addPodcast() {
var feedUrl = document.querySelector('#NewFeedUrl').value.trim();
if (!feedUrl) {
Dashboard.alert('Please enter a feed URL');
return;
}
Dashboard.showLoadingMsg();
ApiClient.fetch({
url: ApiClient.getUrl('Jellypod/podcasts'),
type: 'POST',
contentType: 'application/json',
data: JSON.stringify({ feedUrl: feedUrl })
}).then(function(podcast) {
document.querySelector('#NewFeedUrl').value = '';
Dashboard.hideLoadingMsg();
loadPodcasts();
Dashboard.alert('Subscribed to: ' + podcast.title + '\n\nBrowse episodes in Channels > Podcasts');
}).catch(function(err) {
Dashboard.hideLoadingMsg();
Dashboard.alert('Failed to subscribe. Please check the URL and try again.');
});
}
window.refreshPodcast = function(id) {
Dashboard.showLoadingMsg();
ApiClient.fetch({
url: ApiClient.getUrl('Jellypod/podcasts/' + id + '/refresh'),
type: 'POST'
}).then(function() {
Dashboard.hideLoadingMsg();
loadPodcasts();
Dashboard.alert('Feed refreshed');
}).catch(function(err) {
Dashboard.hideLoadingMsg();
Dashboard.alert('Failed to refresh feed');
});
};
window.deletePodcast = function(id) {
require(['confirm'], function(confirm) {
confirm({
title: 'Unsubscribe',
text: 'Are you sure you want to unsubscribe from this podcast?',
confirmText: 'Unsubscribe',
cancelText: 'Cancel'
}).then(function() {
Dashboard.showLoadingMsg();
ApiClient.fetch({
url: ApiClient.getUrl('Jellypod/podcasts/' + id + '?deleteFiles=true'),
type: 'DELETE'
}).then(function() {
Dashboard.hideLoadingMsg();
loadPodcasts();
}).catch(function(err) {
Dashboard.hideLoadingMsg();
Dashboard.alert('Failed to unsubscribe');
});
});
});
};
document.querySelector('#JellypodConfigPage').addEventListener('pageshow', function() {
loadConfig();
loadPodcasts();
});
document.querySelector('#JellypodConfigForm').addEventListener('submit', function(e) {
e.preventDefault();
Dashboard.showLoadingMsg();
ApiClient.getPluginConfiguration(JellypodConfig.pluginUniqueId).then(function (config) {
config.PodcastStoragePath = document.querySelector('#PodcastStoragePath').value;
config.UpdateIntervalHours = parseInt(document.querySelector('#UpdateIntervalHours').value, 10);
config.GlobalAutoDownloadEnabled = document.querySelector('#GlobalAutoDownloadEnabled').checked;
config.MaxConcurrentDownloads = parseInt(document.querySelector('#MaxConcurrentDownloads').value, 10);
config.MaxEpisodesPerPodcast = parseInt(document.querySelector('#MaxEpisodesPerPodcast').value, 10);
config.CreatePodcastFolders = document.querySelector('#CreatePodcastFolders').checked;
ApiClient.updatePluginConfiguration(JellypodConfig.pluginUniqueId, config).then(function (result) {
Dashboard.processPluginConfigurationUpdateResult(result);
});
});
return false;
});
document.querySelector('#btnAddPodcast').addEventListener('click', addPodcast);
document.querySelector('#NewFeedUrl').addEventListener('keypress', function(e) {
if (e.key === 'Enter') {
e.preventDefault();
addPodcast();
}
});
</script>
</div></div><div class="skinBody"></div></main></div><link rel="stylesheet" type="text/css" href="Jellypod_files/theme.css"></div><div dir="ltr" class="docspinner mdl-spinner"><div class="mdl-spinner__layer mdl-spinner__layer-1"><div class="mdl-spinner__circle-clipper mdl-spinner__left"><div class="mdl-spinner__circle mdl-spinner__circleLeft"></div></div><div class="mdl-spinner__circle-clipper mdl-spinner__right"><div class="mdl-spinner__circle mdl-spinner__circleRight"></div></div></div><div class="mdl-spinner__layer mdl-spinner__layer-2"><div class="mdl-spinner__circle-clipper mdl-spinner__left"><div class="mdl-spinner__circle mdl-spinner__circleLeft"></div></div><div class="mdl-spinner__circle-clipper mdl-spinner__right"><div class="mdl-spinner__circle mdl-spinner__circleRight"></div></div></div><div class="mdl-spinner__layer mdl-spinner__layer-3"><div class="mdl-spinner__circle-clipper mdl-spinner__left"><div class="mdl-spinner__circle mdl-spinner__circleLeft"></div></div><div class="mdl-spinner__circle-clipper mdl-spinner__right"><div class="mdl-spinner__circle mdl-spinner__circleRight"></div></div></div><div class="mdl-spinner__layer mdl-spinner__layer-4"><div class="mdl-spinner__circle-clipper mdl-spinner__left"><div class="mdl-spinner__circle mdl-spinner__circleLeft"></div></div><div class="mdl-spinner__circle-clipper mdl-spinner__right"><div class="mdl-spinner__circle mdl-spinner__circleRight"></div></div></div></div><div class="appfooter"></div><div class="tmla-mask hide"></div><div role="presentation" id="app-user-menu" class="MuiPopover-root MuiMenu-root MuiModal-root MuiModal-hidden css-85gm69" aria-hidden="true"><div aria-hidden="true" class="MuiBackdrop-root MuiBackdrop-invisible MuiModal-backdrop css-1lbe2ow" style="opacity: 0; visibility: hidden;"></div><div tabindex="-1" data-testid="sentinelStart"></div><div class="MuiPaper-root MuiPaper-elevation MuiPaper-rounded MuiPaper-elevation8 MuiPopover-paper MuiMenu-paper css-18bruhv" style="--Paper-shadow: var(--jf-shadows-8); --Paper-overlay: var(--jf-overlays-8); opacity: 0; transform: scale(0.75, 0.5625); visibility: hidden;" tabindex="-1"><ul class="MuiList-root MuiList-padding MuiMenu-list css-ubifyk" role="menu" tabindex="-1"><a class="MuiButtonBase-root MuiMenuItem-root MuiMenuItem-gutters MuiMenuItem-root MuiMenuItem-gutters css-mbeig7" tabindex="0" role="menuitem" href="#/userprofile?userId=02e0f0699ee0400588aa1fbf2c4df29c"><div class="MuiListItemIcon-root css-5pks8q"><svg class="MuiSvgIcon-root MuiSvgIcon-fontSizeMedium css-iguwhy" focusable="false" aria-hidden="true" viewBox="0 0 24 24" data-testid="AccountCircleIcon"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2m0 4c1.93 0 3.5 1.57 3.5 3.5S13.93 13 12 13s-3.5-1.57-3.5-3.5S10.07 6 12 6m0 14c-2.03 0-4.43-.82-6.14-2.88C7.55 15.8 9.68 15 12 15s4.45.8 6.14 2.12C16.43 19.18 14.03 20 12 20"></path></svg></div><div class="MuiListItemText-root css-t3p1a1"><span class="MuiTypography-root MuiTypography-body1 MuiListItemText-primary css-pl8nxc">Profile</span></div></a><a class="MuiButtonBase-root MuiMenuItem-root MuiMenuItem-gutters MuiMenuItem-root MuiMenuItem-gutters css-mbeig7" tabindex="-1" role="menuitem" href="#/mypreferencesmenu"><div class="MuiListItemIcon-root css-5pks8q"><svg class="MuiSvgIcon-root MuiSvgIcon-fontSizeMedium css-iguwhy" focusable="false" aria-hidden="true" viewBox="0 0 24 24" data-testid="SettingsIcon"><path d="M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.07-.94l2.03-1.58c.18-.14.23-.41.12-.61l-1.92-3.32c-.12-.22-.37-.29-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54c-.04-.24-.24-.41-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.74 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.07.94l-2.03 1.58c-.18.14-.23.41-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .44-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.47-.12-.61zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6"></path></svg></div><div class="MuiListItemText-root css-t3p1a1"><span class="MuiTypography-root MuiTypography-body1 MuiListItemText-primary css-pl8nxc">Settings</span></div></a><hr class="MuiDivider-root MuiDivider-fullWidth css-14093q0"><a class="MuiButtonBase-root MuiMenuItem-root MuiMenuItem-gutters MuiMenuItem-root MuiMenuItem-gutters css-mbeig7" tabindex="-1" role="menuitem" href="#/dashboard"><div class="MuiListItemIcon-root css-5pks8q"><svg class="MuiSvgIcon-root MuiSvgIcon-fontSizeMedium css-iguwhy" focusable="false" aria-hidden="true" viewBox="0 0 24 24" data-testid="DashboardIcon"><path d="M3 13h8V3H3zm0 8h8v-6H3zm10 0h8V11h-8zm0-18v6h8V3z"></path></svg></div><div class="MuiListItemText-root css-t3p1a1"><span class="MuiTypography-root MuiTypography-body1 MuiListItemText-primary css-pl8nxc">Dashboard</span></div></a><a class="MuiButtonBase-root MuiMenuItem-root MuiMenuItem-gutters MuiMenuItem-root MuiMenuItem-gutters css-mbeig7" tabindex="-1" role="menuitem" href="#/metadata"><div class="MuiListItemIcon-root css-5pks8q"><svg class="MuiSvgIcon-root MuiSvgIcon-fontSizeMedium css-iguwhy" focusable="false" aria-hidden="true" viewBox="0 0 24 24" data-testid="EditIcon"><path d="M3 17.25V21h3.75L17.81 9.94l-3.75-3.75zM20.71 7.04c.39-.39.39-1.02 0-1.41l-2.34-2.34a.996.996 0 0 0-1.41 0l-1.83 1.83 3.75 3.75z"></path></svg></div><div class="MuiListItemText-root css-t3p1a1"><span class="MuiTypography-root MuiTypography-body1 MuiListItemText-primary css-pl8nxc">Metadata Manager</span></div></a><hr class="MuiDivider-root MuiDivider-fullWidth css-14093q0"><a class="MuiButtonBase-root MuiMenuItem-root MuiMenuItem-gutters MuiMenuItem-root MuiMenuItem-gutters css-mbeig7" tabindex="-1" role="menuitem" href="#/quickconnect"><div class="MuiListItemIcon-root css-5pks8q"><svg class="MuiSvgIcon-root MuiSvgIcon-fontSizeMedium css-iguwhy" focusable="false" aria-hidden="true" viewBox="0 0 24 24" data-testid="PhonelinkLockIcon"><path d="M19 1H9c-1.1 0-2 .9-2 2v3h2V4h10v16H9v-2H7v3c0 1.1.9 2 2 2h10c1.1 0 2-.9 2-2V3c0-1.1-.9-2-2-2m-8.2 10V9.5C10.8 8.1 9.4 7 8 7S5.2 8.1 5.2 9.5V11c-.6 0-1.2.6-1.2 1.2v3.5c0 .7.6 1.3 1.2 1.3h5.5c.7 0 1.3-.6 1.3-1.2v-3.5c0-.7-.6-1.3-1.2-1.3m-1.3 0h-3V9.5c0-.8.7-1.3 1.5-1.3s1.5.5 1.5 1.3z"></path></svg></div><div class="MuiListItemText-root css-t3p1a1"><span class="MuiTypography-root MuiTypography-body1 MuiListItemText-primary css-pl8nxc">Quick Connect</span></div></a><li class="MuiButtonBase-root MuiMenuItem-root MuiMenuItem-gutters MuiMenuItem-root MuiMenuItem-gutters css-mbeig7" tabindex="-1" role="menuitem"><div class="MuiListItemIcon-root css-5pks8q"><svg class="MuiSvgIcon-root MuiSvgIcon-fontSizeMedium css-iguwhy" focusable="false" aria-hidden="true" viewBox="0 0 24 24" data-testid="LogoutIcon"><path d="m17 7-1.41 1.41L18.17 11H8v2h10.17l-2.58 2.58L17 17l5-5zM4 5h8V3H4c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h8v-2H4z"></path></svg></div><div class="MuiListItemText-root css-t3p1a1"><span class="MuiTypography-root MuiTypography-body1 MuiListItemText-primary css-pl8nxc">Sign Out</span></div></li></ul></div><div tabindex="-1" data-testid="sentinelEnd"></div></div></body></html>