{
  "2.0.0-alpha.100": {
    "date": "20180108",
    "title": "First Public Alpha",
    "new": "Everything is new",
    "fixed": "API Calls in settings page being to fast for refresh|Sign-up form submit issue in Wizard",
    "notes": "This is alpha - expect bugs|Please report bugs in GitHub issues page"
  },
  "2.0.0-alpha.110": {
    "date": "20180109",
    "title": "Small Addition",
    "new": "3 Options for appearance|Upgrade module completed",
    "fixed": "More API lag times",
    "notes": "This is alpha - expect bugs|Please report bugs in GitHub issues page"
  },
  "2.0.0-alpha.115": {
    "date": "20180109",
    "title": "Updater Fix",
    "new": "New Updater Progress Bar",
    "fixed": "Lag Times on updater|Added longer timeouts",
    "notes": "This is alpha - expect bugs|Please report bugs in GitHub issues page"
  },
  "2.0.0-alpha.120": {
    "date": "2018-01-10 20:00:00",
    "title": "Color Picker Testing",
    "new": "",
    "fixed": "Attempt to fix color picker",
    "notes": "This is alpha - expect bugs|Please report bugs in GitHub issues page"
  },
  "2.0.0-alpha.125": {
    "date": "2018-01-10 23:00",
    "title": "Image Manager",
    "new": "Added Image Manager",
    "fixed": "Color Selector|Wizard Preloader",
    "notes": "This is alpha - expect bugs|Please report bugs in GitHub issues page"
  },
  "2.0.0-alpha.130": {
    "date": "2018-01-10 23:00",
    "title": "Plugin Framework",
    "new": "Plugin Framework nearly complete|Added Mail Plugin",
    "fixed": "",
    "notes": "This is alpha - expect bugs|Please report bugs in GitHub issues page"
  },
  "2.0.0-alpha.200": {
    "date": "2018-02-04 21:00",
    "title": "Homepage Work Started",
    "new": "Plex Streams on homepage|Plex Recent Added on homepage|Emby Streams on homepage|Emby Recent Added on homepage|SabNZBd on homepage",
    "fixed": "Multiple things for performance",
    "notes": "This is alpha - expect bugs|Please report bugs in GitHub issues page"
  },
  "2.0.0-alpha.250": {
    "date": "2018-02-05 21:00",
    "title": "NZBGet Homepage",
    "new": "NZBGet on homepage - please check for bugs",
    "fixed": "",
    "notes": "This is alpha - expect bugs|Please report bugs in GitHub issues page"
  },
  "2.0.0-alpha.800": {
    "date": "2018-04-20 19:25",
    "title": "Update so heavy - is it Stoned?",
    "new": "Homepage Items - see below:|Downloader: Deluge - Transmission - Qbit|Calendar: Sonarr - Radarr - CouchPotato - Sickrage/Beard/Medusa|Ombi requests and approvals|Custom HTML (2 blocks)|Custom CSS|Plex Invites|Mail Templates",
    "fixed": "Lots of minor little things",
    "notes": "Beta coming soon"
  },
  "2.0.0-alpha.815": {
    "date": "2018-04-24 21:36",
    "title": "Bug Fixes",
    "new": "",
    "fixed": "Plex Now Playing bug not showing items|Invite menu not loaded on initial load",
    "notes": "Beta coming soon"
  },
  "2.0.0-beta.100": {
    "date": "2018-05-04 19:00",
    "title": "First Beta Release",
    "new": "SpeedTest|Email templates",
    "fixed": "",
    "notes": "RC coming soon"
  },
  "2.0.0-beta.200": {
    "date": "2018-05-17 18:00",
    "title": "Second Beta Release",
    "new": "Homepage Test Button on some modules|Smaller Nav bar|Recent Item Limits|Nav buttons on sliders|Settings save revamped|Ombi user import on register|Test iFrame buttons|Ombi auth for requesting|Favicon support|Ping Support|New Alert Styles|New Lockout Timeout system",
    "fixed": "Calendar Alt Title|Deluge Hide/Seed|More DDNS workarounds|Homepage auth issues|Deluge no results|PHPMailer plugin fixes|Wizard auto login",
    "notes": "Calendar has Today Button now"
  },
  "2.0.0-beta.500": {
    "date": "2018-08-31 23:59",
    "title": "A Bunch of things since last real release",
    "new": "Chat System - Powered by Pusher|Keyboard Shortcuts|Fullscreen button|Icon and Image selector for tabs|Multiple Tautulli SSO|Pagination to search|Redirect added to error page|Auth Debug toggle|Custom CSS and JS for themes|Theme Marketplace|Plugin Marketplace|Calendar Sorting|Email user from user mgmt|Tab sort for unsorted|Cache image size option",
    "fixed": "Deluge Test Button|PHP5.6 Error|Sonarr local cert|Plex Invite error codes|Email center fixes #891|Fixed log out issues|Fixed Cookie issues - Use any domain you want now",
    "notes": "Lots of small fixes"
  },
  "2.0.0-beta.600": {
    "date": "2018-09-02 02:00",
    "title": "2FA - Finally",
    "new": "Google 2FA - More services to come",
    "fixed": "Small Chat dupe bug",
    "notes": "More small fixes"
  },
  "2.0.0-beta.800": {
    "date": "2018-10-25 22:40",
    "title": "Closer to v2.0",
    "new": "rTorrent HP Support|Plex OAuth|Tautulli SSO using Plex OAuth|Import Plex Users|Combined Downloaders on HP|Account Area Active Token Section|Alphanumberic tab icons|Debug Area WIP|Remember me length setting|Disable ping sound",
    "fixed": "NZBGet file size bug|Password Save bug|Auth issue if DB has wrong permissions|Ombi TV show issue|Scrollbars on FF|Token revoke on logout|BTC address|Homepage and Settings tab type non-change fix|Tab settings not reset (#942)|SSO code position (#946)|Gravatar email change fix (#951)",
    "notes": "Added plex token to db for plex users|Added SSL option to chat|Added Bazzrr logo|Disable username and email change if 2FA enabled|Misc UI changes"
  },
  "2.0.0-beta.950": {
    "date": "2019-01-23 22:40",
    "title": "The one before v2.0",
    "new": "Ombi SSO with Plex Token|Default TV Request options for Ombi|Token Section in user settings|Local URL connection if on LAN|Added preload Tab options|Added downloader count to combined downloader|Added option to disable Strict Plex Friend",
    "fixed": "Fixed Emby Connect|Disable lock function for oAuth users (#973)|Better error handling for the *arrs|make settings open first tab if not active already (#901)|make sure db ends with .db (#971)|Fix deluge hide seeding etc (#867)|fix downloaders showing blank if no permissions (#977)|Plex login button css (#985)|Add tab help (#987)|Fix close buttons (#883)|close buttons on popups fixed (#996)|fix clipboard with value with filename containing space (#994)|Move machine ID check outside of foreach (#1014)|Fixed language error if not langpack is installed for that lang (#1028)|undefined index on sickrage (#1038)|Fix iframe focus not shifting back (#1042)",
    "notes": "Added more debug information|Reworked the way languages are loaded|Updated Language strings|Revamped Splash page"
  },
  "2.0.0-beta.960": {
    "date": "2019-01-27 00:20",
    "title": "Some fixes before v2.0",
    "new": "Update page includes links to GH issues|Cleaner Login|Default to Plex Auth if enabled on login screen",
    "fixed": "Fix Plex oAuth remains enabled when switching back to Organizr DB only (#1046)|Fix Ombi if no TV Requests again|2FA box includes login button now",
    "notes": "Hoping for a smooth release of 2.0 this coming week"
  },
  "2.0.0-beta.980": {
    "date": "2019-02-22 15:30",
    "title": "Little things here and there",
    "new": "Added news section to settings page|Add new pathsWritable function for multiple paths|Added global variable for main path and api path|Added update check for folder permissions|Added login with plex email and plex username for oauth|Added option for Ombi Homepage pulls Ombi Username instead of alias (#1052)|Added error catching on json parse for ajax calls|Add Pi-Hole image (#1060)|Added DB Path to folder check|Disable update and download if using docker container|Added Close Tab to Alt + Click|Disable branch change for docker users",
    "fixed": "Fix update button on message not working if not on settings page (#1050)|Fix js reload button on new tab creation|Finally fix ombi limit to user|Fix tab edit/create when using same tab name already in use (#1066)|Embi local API requires exact case for username (#1061)|Fix edit tab name if exists",
    "notes": "Remove constant welcome message - Added welcome message only on login|Clean up org errors a little bit"
  },
  "2.0.0-beta.990": {
    "date": "2019-02-28 21:20",
    "title": "Yes, this is the last beta",
    "new": "Ability to update if using Docker|More Calendar info|Feature to disable/restrict debug area (#1080)|Added DB Schema to debug|Added docker commit info to see if new update is out",
    "fixed": "rTorrent different endpoints (#1072)|Changing username breaks Tautulli SSO autologin for guest users (#1017)|Issue with menu CSS (#1075)|Unsorted Tab Placement option reverses sort for all tabs (#1037)|Work on LDAP, Should work with AD, OpenLDAP, FreeIPA (#1074)|Plex share invite placeholder (#1000)",
    "notes": "Beta? What? No More?"
  },
  "2.0.0": {
    "date": "2019-03-01 16:30",
    "title": "Finally Version 2.0",
    "new": "",
    "fixed": "",
    "notes": "Please report bugs in GitHub issues page"
  },
  "2.0.20": {
    "date": "2019-03-04 23:00",
    "title": "Security Fixes",
    "new": "",
    "fixed": "Security issue around CRFS and file upload and delete (#1086)|Clicking on iCal Calendar Item Locks Up GUI (#1092)|Custom js and css ace boxes not encoding correctly|Possibility for co-admin to become admin|Branch being disabled",
    "notes": "Please report bugs in GitHub issues page"
  },
  "2.0.32": {
    "date": "2019-03-05 19:50",
    "title": "Auto-Reload and Auto-Close",
    "new": "Auto Close and Auto reload feature (#1071)",
    "fixed": "Undefined index dbLocation (#1093)|Disable show update to new version if on docker|Ombi sso only works with full email as user id (#1047)|Clear ajax calls if homepage is closed|Hardcoded news and sponsors branch",
    "notes": "Please report bugs in GitHub issues page"
  },
  "2.0.49": {
    "date": "2019-03-08 19:00",
    "title": "Plex Recent is back",
    "new": "Requests now show type of request on hover",
    "fixed": "Plex homepage items don't redirect to Plex when the tab name has special characters (#1096)|Work around for Plex recentlyAdded api call (#1069)|FormKey issues|Calendar misc text issue",
    "notes": "Updated language translations|Please report bugs in GitHub issues page"
  },
  "2.0.70": {
    "date": "2019-03-15 23:40",
    "title": "Weekly Update",
    "new": "Radarr 4k Image|SRI Hash for External JS (#1055)|Limit for Ombi items (#1107)|CTRL + SHIFT on splash page to not close it after click",
    "fixed": "Fix for bootstrap screen width bug @leram84|Ombi on homepage causes site to hang (#1107)|Fix SSO if user is LDAP user|Auto reload on internal tabs|Request button border-radius",
    "notes": "Updated language translations|Please report bugs in GitHub issues page"
  },
  "2.0.180": {
    "date": "2019-05-03 18:00",
    "title": "Long Overdue Update",
    "new": "Emby Invites|HealthChecks.io to homepage|Added ability to have more than one api token for healthchecks.io|Updated SweetAlert to new version|Option to define local IP override|LDAP login test|iFrame sandbox options|Refreshes to plex and emby recent|OPNsense to Default Icon Library (#1131)|Added refresh to calendar|Added refresh to Streams|Added keybinding for next and previous tabs|Toggle to turn of organizr debug errors|Added method to login with API|Add header to auth line for current user - used for Grafana SSO|Shortcut to edit homepage item on tab page|Allow custom URL for selfhosted version of healthchecks (#1161)",
    "fixed": "Ombi SSO error (#1117)|Changed Windows update method|Multiple CSS fixes|Invite select2 box code|V2 emby unexpected token (#1121)|Fix Menu overlapping (#1122)|Calendar does not show recurring events (#1104)|Fix big log files (#990)|Ignore js error for downloader (#1133)|Make all urls without scheme http (#1133)|Mobile login form autocapitalises and auto-corrects (#1138)|Undefined index: description (#1154)|http and https check (#1154)|Tab Url choose image text/image is misaligned (#1146)|invite settings box|Misaligned trashcan icon in Tab Editor menu (#1147)",
    "notes": "Updated language translations|Added more default tab images|Please report bugs in GitHub issues page"
  },
  "2.0.225": {
    "date": "2019-05-31 21:20",
    "title": "Small Things and Language Updates",
    "new": "Support for custom GA Tracking code|Manual update checker",
    "fixed": "Download file function|2FA if using Password Manager|Calendar Localization|Emby local Auth|Sonarr JSON issue|Typos",
    "notes": "Disabled Emby Connect due to Emby|Made Debug error false by default|Updated language translations|Added more default tab images|Please report bugs in GitHub issues page"
  },
  "2.0.235": {
    "date": "2019-06-07 19:30",
    "title": "Small Weekly Update",
    "new": "Plex Admin and Strict info to debug area",
    "fixed": "Radarr image problem if Radarr Auth is on|Plex login for admin using username and pass for SSO|Powershell update script|Login screen for oAuth only as backend",
    "notes": "Please report bugs in GitHub issues page|Updated language translations|Added more default tab images"
  },
  "2.0.270": {
    "date": "2019-06-29 00:35",
    "title": "Small Weekly Update",
    "new": "Login lockout feature|JDownloader HP Support - rix|Coupon indicator on sponsor section|Sponsor API call|Custom Pages API endpoint|Theme analytics|SVG added to whitelist",
    "fixed": "Homepage Loading Sections Displaying for Disabled Items (#1204)|Healthchecks tag issue|Updated Evo logo|Updated Netdata logo|Updated Nextcloud logo|CSS fix for alt headers on HP|HP Downloader counter on MS Edge|Cache image button on recent items",
    "notes": "Please report bugs in GitHub issues page|Updated language translations"
  },
  "2.0.307": {
    "date": "2019-08-31 16:40",
    "title": "Sorry for late update",
    "new": "Added Auth Proxy - Accept X-Forwarded-User (#1215)|Ombi default sort option|JDownloader Actions|Set of wallpapers for login page (#1214)|Logging to help with email debug|HTTP codes to API|IPInfo in settings logs|Plex oauth update - thanks swifty|Disable Google Authenticator for Local Access (#1232)",
    "fixed": "Upgraded Simplebar|Homepage downloader variable being overwritten|Timeout on Docker update|Radarr Calendar Image URL",
    "notes": "Please report bugs in GitHub issues page|Updated language translations"
  },
  "2.0.320": {
    "date": "2019-10-11 16:25",
    "title": "Super small update",
    "new": "Unifi Homepage Item|Login and Top Bar Logo (#1029)|Add 5 minute buffer to plex thumbs",
    "fixed": "Quick and dirty fix for Google iCal Not working (#1233)|Forgot to add License back (#1247)|Fix context menu disabled on lock screen (#1243)|Dropdown arrows on Tab Groups not animating (#1239)|Fix Unifi cookie to be loaded on first api call|Cannot re-order new tabs from bottom upwards in Settings after adding many (#1175)",
    "notes": "Add a class and data-tab-name to sidenav groups (#1249)|Please report bugs in GitHub issues page|Updated language translations"
  },
  "2.0.325": {
    "date": "2019-10-18 20:20",
    "title": "Fix Unifi Homepage",
    "new": "",
    "fixed": "Plugin Files not loading css files|Remove unifiCookie from unif homepage check",
    "notes": "Please report bugs in GitHub issues page|Updated language translations"
  },
  "2.0.362": {
    "date": "2020-01-13 20:15",
    "title": "Long awaited release - Sorry!",
    "new": "Added Jellyfin support - uses same HP Modal as Emby|Added new tab images for Fritzbox, Kodi, OpenHAB and Calibre-Web|Added nginx auth_request dynamic endpoints to allow permission management on organizr front end|Add email header for Auth Proxy use (#1298)|Add another Variable to PR (#1298)|Update local function to take force variable|Added rtorrent bypass cert check",
    "fixed": "qBittorrent Workaround for v2 API (#1287)|Dependency check fails incorrectly on PHP 7.4 (#1288)|Fix depreciated item on PHP 7.4 (#1288)|7.4 work on array check|XSS Vulnerability (#1291)|Cleaner XSS Vulnerability (#1291)|Closing tabs open up top tab (#1266)|more clean up on unifi homepage item|fix typ-os|Add homepage-element-title class to left-aligned homepage element names|Fix plex show on homepage",
    "notes": "Please report bugs in GitHub issues page|Updated language translations"
  },
  "2.0.370": {
    "date": "2020-02-21 14:55",
    "title": "YouTube Homepage Fix",
    "new": "Added option to forward to local instance if detected",
    "fixed": "Fix for YouTube daily query quota is too low (#1297)",
    "notes": "Please report bugs in GitHub issues page|Updated language translations"
  },
  "2.0.390": {
    "date": "2020-03-06 20:50",
    "title": "",
    "new": "Remove tab has after logout|Added ChangeLog Link (#1292)|server auth redirect for traefik (#1240)|Edit wording for rutorrent urls|add ssl options to fopen on getCert function",
    "fixed": "Fixed Radarr V2 and V3 image issue|Workaround for Organizr become unresponsive after opening Tab Editor tab (#1319)|How to Reset the \"Color and Themes\" Section? (#1085)|Attempt to fix rutorrent issues with seedboxes|Attempt to fix 2.0.370 update not working (#1316)",
    "notes": "Framework changes below|Updated PHP Mailer|Updated JWT|Updated pusher|Updated LDAP|Updated guzzle|removed TLD Extract|Please report bugs in GitHub issues page|Updated language translations"
  },
  "2.0.408": {
    "date": "2020-03-27 20:35",
    "title": "Small Update",
    "new": "Reworked Ombi Homepage ajax loading screen - faster now|added validate token api endpoint|sidebar rtl for tabs|added org token check and logout if not valid|Add IDs to all downloader Homepage item? (#1213)|Add toggle for login image|increase jdownloader timeout",
    "fixed": "Fix Sidebar doesn't load tabs on iPhone running iOS 13.4+ (#1328)|Attempt to fix api call for image fetch for some users|check if HTTP_X_FORWARDED_SERVER is set|rtorrent/Nzbget API homepage modules and special character in password (#1309)|fix for nzbget connection|2FA login breaks with LastPass Chrome extension (#997)Ombi homepage item \"Item limit\" setting does not change the number of items displayed on the homepage (#1324)",
    "notes": "Updated Dibi|Please report bugs in GitHub issues page|Updated language translations"
  },
  "2.0.570": {
    "date": "2020-05-01 19:15",
    "title": "Quarantine Update",
    "new": "Weather Homepage Item|Pi-Hole Homepage Item|Tautulli Homepage Item|Monitorr Homepage Item|Netdata Homepage Item|SpeedTest Homepage Item|HealthChecks Plugin|Bandwidth info to Now Playing|Config files can now contain arrays|Scrape API endpoint|New API Docs WIP located at /api/docs",
    "fixed": "iOS icon issue|Language Bug|Cache Image timing|fix hardcoded plugins directory for root (#1341)|Ombi Posters|Plex Timeouts|Indent cleanup|Homepage Item shortcut in Tab Editor broken (#1368)|Empty login form submitting|Sanitize username going into log (#1359)|Ombi Div for tv items|edit sttabs for reflect more than just settings tabs|Emby HomePage Add-in - Item Details URL Needs updating (#1290)|Fix JQuery error on settings save (#1356)",
    "notes": "Added note about Samesite issues|New Radarr Logo|Please report bugs in GitHub issues page"
  },
  "2.0.631": {
    "date": "2020-06-19 19:15",
    "title": "Whoa - sorry for the wait",
    "new": "Added css bottom-close-splash",
    "fixed": "Netadata fixes|Docker update fixes|Tautulli Fixes|Hardcode fixes for days beyond one year|Typos|NZBHydra tab image|fix stray / in index.php and js/functions.php (#1408)|LDAP with STARTTLS support (#1411)",
    "notes": "Please report bugs in GitHub issues page"
  },
  "2.0.633": {
    "date": "2020-06-20 02:01",
    "title": "Small Bugfix",
    "new": "",
    "fixed": "Fix heredoc error on php versions under 7.3",
    "notes": "Please report bugs in GitHub issues page"
  },
  "2.0.650": {
    "date": "2020-07-03 20:55",
    "title": "Weekly Updates",
    "new": "Added Jellyfin Auth function to log into Organizr|Re-Enable EmbyConnect backend option|Option to disable logout/login button on sidebar",
    "fixed": "Plex oAuth login enabled after switching to a different backend (#1416)|losing access to settings (#1418)|Youtube Error catch and added another API Key(#1419)|Update coookie function to include path|Update Tautulli cookie to include path|News.json fixes|homepage sort issue on right side|add uuid on wizard path",
    "notes": "Please report bugs in GitHub issues page"
  },
  "2.0.740": {
    "date": "2020-08-07 17:05",
    "title": "Update before Breaking Changes",
    "new": "added sonarr queue to homepage|added radarr queue to homepage|Add octoprint homepage item|Added LDAP user email on account creation (#1244)|Emby and Jellyfin import users|New Tab Images for Requestrr - xBackBone|add asyncValue option to api calls|jellyfin text css class|Added limit to rTorrent|added some js files to fix Minify Organizr's JavaScript files (#1149)|add dev and demo globals|added tv and movie lookup for ombi before submit - might take a while…|added serializeObject js function",
    "fixed": "Added toggle for jellyfin on emby settings|Unable to rearrange tabs on iPad (#1333)|redid function for homepageOrder - no longer need to add key to array|Monitorr links open in tab if Org URL|Monitorr sorting|encrypt and decrypt functions|json header check|add Lidarr to calendar check|fix jellyfin hp refresh on click|disable tvdbid lookup on js part|edit login form to use serializeObject|edited api v1 login endpoint function",
    "notes": "API V2 is coming with breaking changes - please check news items|Updated Language Items|Updated frameworks|Please report bugs in GitHub issues page"
  },
  "2.1.0": {
    "date": "2020-10-27 16:20",
    "title": "Organizr API v2 included - PLEASE READ NOTES BEFORE CONTINUING",
    "new": "API v2 endpoints - Please make sure to update nginx auth_request location block if being used|Update Organizr alert errors|Redid Debug area|Jellyfin homepage item|SOCKS support for sonarr - radarr - lidarr|Redid plex token and machine methods|Redid user management area|Jackett homepage item|redid homepage items settings pages",
    "fixed": "Lots of little misc fixes",
    "notes": "CHECK MIGRATION LINK IN NEWS SECTION!!!!!!!|API v2 is here|If using built-in updater in Organizr and not on Windows - it will fail on cleaning up install - reloading should fix|If using Docker - Please switch to organizr/organizr|Remove any plugins that were downloaded from marketplace prior to upgrade|Please join our discord if you have any issues|Please report bugs in GitHub issues page"
  },
  "2.1.60": {
    "date": "2020-11-06 19:40",
    "title": "Make sure to read about 2.1.0 before updating",
    "new": "Radarr Unmonitored/Cinema Toggles|update class for arrs to check version of api",
    "fixed": "Fix User list error (#1487)|fix Weather Homepage Item Not Showing (#1498)|update healthchecks plugin to reflect cert temp change|fix chat plugin|Add IncludeItemTypes to emby recent items - fixes issue with having newly added tv channels|fix menu bug|user mgmt goto last page instead of first on error|iCal not showing up if solo enabled|Healthchecks cert failing|Weather css|OC backer with no image",
    "notes": "Added new tab icons|Added new languages and updated existing ones|Please join our discord if you have any issues|Please report bugs in GitHub issues page"
  },
  "2.1.74": {
    "date": "2020-11-13 18:00",
    "title": "Weekly update",
    "new": "Add group to auth header",
    "fixed": "fix Traefik Redirection adds an . at ending (#1484)|fix issue with special character in password rutorrent module (#1511)|Unifi homepage item image|Radarr Test button|Sonarr Test button|Lidarr Test button|Arrs homepage items|rtorrent array fix|Healthchecks plugin",
    "notes": "Add Turkish language|Please join our discord if you have any issues|Please report bugs in GitHub issues page"
  },
  "2.1.83": {
    "date": "2020-11-20 20:00",
    "title": "Weekly update",
    "new": "Update check on load instead of settings",
    "fixed": "add clarification to checkRoute error message|Increase jackett timeout to 120 seconds|add language elements to more areas|rework calendar filter|fix checkroute if has subdir|fix dependency check",
    "notes": "Please join our discord if you have any issues|Please report bugs in GitHub issues page"
  },
  "2.1.120": {
    "date": "2020-12-11 20:00",
    "title": "Weekly update-ish",
    "new": "Option to disable certain plex libraries on now playing (#1534)|Toggle to use friendly name in stats|jellyFin SSO|PHP8 support|add 2fa to plex token form|loading animation to homepage item loading|allow admin to make other admins",
    "fixed": "fix Blue Light theme News background (#1538)|fix empty socks (#1520)|getServerPath function|tab saving on order change if nothing updated (#1530)|fix tab sort order saving with lots of tabs (#1175)|non admin from changing password|password reset|allow homepage item api lookup lowercase|change unsorted icon on new installs|unifi and ubnt image changes|missing ssoJellyfin var",
    "notes": "New tab images|Please join our discord if you have any issues|Please report bugs in GitHub issues page"
  },
  "2.1.165": {
    "date": "2021-01-22 17:45",
    "title": "Weekly update-ish",
    "new": "Overseerr SSO|/help/smtp to api to help users without SMTP accounts|option to disable recover password and change text or html (#1245)|Allow Middle-click to open in new tab (#1474)|Option for keeping Categories expanded by default (#1550)|link and option for new feature request site to replace feathub|Tab Images for Overseerr - Cardigann|increase windows and docker update timeout",
    "fixed": "plex errors not coming up on failed user creation (#1456)|plex invite (#1456)|Emby HomePage Add-in - Item Details URL Needs updating (#1290)|Tautulli timeout issue|Reflect homepage refresh for Monitorr (#1554)|update timeout for jdownloader (#1510)|update timeout of SSO function|change out organizr logo for nav bar and add more logos|Unable to use same tab image on multiple tab adds without selecting different image first (#1369)|Issue with using wrong combo of username/email/password for SSO|UniFi Homepage Item Title|function variables|error message to phpmailer test button|padding on some homepage items|Traefik return with redirect",
    "notes": "We are now using FeatureUpvote - icon located on bottom side bar|Updated languages|Please join our discord if you have any issues|Please report bugs in GitHub issues page"
  },
  "2.1.183": {
    "date": "2021-01-29 23:40",
    "title": "Weekly update",
    "new": "Trakt to homepage items|blackberry themes icon selector|option to dismiss important messages|help button and about section to sonarr|updated frameworks for phpmailer - slim - pusher - adldap2 - slimpr|Change layout for backers",
    "fixed": "Content wrapper causing obstructed view of tab content (#1567)|disable recover password|height for select2 boxes",
    "notes": "We are now using FeatureUpvote - icon located on bottom side bar|Please join our discord if you have any issues|Please report bugs in GitHub issues page"
  },
  "2.1.184": {
    "date": "2021-02-01 20:10",
    "title": "HOTFIX",
    "new": "",
    "fixed": "Missing variable",
    "notes": "This is a quick hotfix"
  },
  "2.1.195": {
    "date": "2021-02-12 20:00",
    "title": "Weekly Update",
    "new": "ignore cert to transmission (#1177)|ignore cert to qbit (#1177)|no tabs api function|log functions",
    "fixed": "Jellyfin SSO fails behind reverse proxy (#1585)|Unable to use \"@\" in username during initial account setup (#1584)|Re-add JWT claims removed from token (#1577)|heart on dependency|refresh to add new user|organizr-area css",
    "notes": "remove spinner css classes"
  },
  "2.1.235": {
    "date": "2021-02-26 19:30",
    "title": "Weekly Update - kinda",
    "new": "Bookmark plugin - leet1994|Added option to use blackhole download for Jackett homepage component (#1600)|Petio and Bookstack Images|Prometheus icon|arrive framework js|icon and image select to categories|consolidate binding of new image and new icon for all events|add new div for activeInfo being ready|settings changes to plugins array - now includes settings - bind - api path|change pluginFiles function to include option to include settings js file|update pluginFiles function",
    "fixed": "Fix username in overseerr SSO logs (#1599)|Update /token/validate API endpoint (#1597)|Update Overseerr Plex auth endpoint|update all plugin js files|update bookmark php file for new template|new 2 bookmark endpoints for setup|update bookmark.png|update bookmark plugin to include setup function|visual changes to bookmark settings panel",
    "notes": "remove preload spinner on reload"
  },
  "2.1.241": {
    "date": "2021-03-05 19:45",
    "title": "Weekly Update",
    "new": "Github backers now included in about page",
    "fixed": "plugin files error|sab test button|update bookmark class for input|obligatory url for api",
    "notes": ""
  },
  "2.1.306": {
    "date": "2021-04-30 19:45",
    "title": "It has been awhile",
    "new": "petio SSO|sabnzbd socks component|nzbget socks component|exclude to search and recent plex items (#1540)|komga image (#1590)|change homepage settings to individual settingsArray|preview to bookmark tab|traefik domain override|new radarr 4k icon (#1629)|Ignore splash page if organizr accessed alongside tab hash (#1627)|code to remove jellyfin localStorage item after logout (#1609)|replace_first function|new api endpoint for multiple instances|note about socks multiple api endpoint",
    "fixed": "socks fixes (#1520)|socks case insensitive on string pos (#1520)|make message clear on socks info box|rewrite socks route endpoint function to be only one wildcard endpoint|NZBGet socks fixes|revamp dependencies page|fix Monitorr image paths not working (#1612)|Jellyfin API for SSO (#1609)|increase socks timeout|allow correct group to view bookmarks (#1632)|modal width on small screens|Transmission Connection Failure when using special characters in password|EOF Line change|Petio SSO fallback|backers css to smaller avatar|add param to settingsArray to only include homepage info and not settings|add missing class on close tab|height view|clean request header fo non breakable space|allow empty password for deluge|missing lang span on ombi request",
    "notes": "updated guzzle framework|RSScrawler renamed to FeedCrawler"
  },
  "2.1.308": {
    "date": "2021-05-03 04:10",
    "title": "PHP MINIMUM VERSION CHANGE",
    "new": "",
    "fixed": "",
    "notes": "This version and version 2.1.306 need minimum php version 7.3.0"
  },
  "2.1.333": {
    "date": "2021-05-27 21:30",
    "title": "Small fixes and a Tau update",
    "new": "tautulli socks|X-Forwarded-For to SSO functions|allow clipboard|new sanbox options to iframe|unify socks function and list|note about cron url for healthchecks api",
    "fixed": "options array for requests|sabnzbd auth for socks|Transmission home page module hangs on PHP 8 (#1648)|Ombi Search Box Error (#1651)|Redirects on healthchecks plugin|panel-blue css|Tautulli cmd change",
    "notes": "update rmccue\\requests framework|update guzzlehttp/psr7|add if stmt to stale workflow to ignore issues that have bypass-activity"
  },
  "2.1.400": {
    "date": "2021-06-25 21:40",
    "title": "Code changes to plugins",
    "new": "Updated UI on update page|Refactored the way plugins are stored so it is cleaner|Updated healthChecks plugin|option to Auto-collapse categories (FR#41)|option to disable auto expand of navbar FR#97|language-box css class|add extras to unifi homepage call|warning to sso functions|healthchecks import to plugin|toggle for 401 and 403 bypass for healthchecks plugin",
    "fixed": "SSO failing due to timeout error white getting tokens (#1665)|force Radarr to use v3 endpoint now (#1663)|plex error not catching|update downloader refresh times to be independent|update requestOptions function|updated scrollbars again|change to edit homepage modal|set correct tab type after re-adding the homepage (#1671)",
    "notes": ""
  },
  "2.1.426": {
    "date": "2021-07-09 19:20",
    "title": "Some new features",
    "new": "global blacklist user feature|option to define which settings page tab will open by default|sonarr to use new input method for token and url|icon for Prowlarr|email for Auth Proxy|start time and url validation for selfhosted url|new auth URL scheme",
    "fixed": "selfhosted healtcheck import issue|validate data on unused API endpoint|authRegister bug requiring 2 logins|help message for blacklist|catch all for single item parse on options|LDAP showing in backend|weather homepage|checking of commit",
    "notes": "update HC Plugin to only use Full Access Token|closeAllMessages function to update call"
  },
  "2.1.446": {
    "date": "2021-08-13 19:20",
    "title": "Some new features",
    "new": "setResponse function|get config item to api|icons for TheLounge and Docsify services|small ui change to version section|change the way theme is set to fix loading ms issue",
    "fixed": "Redirect uri that was encoded (#1690)|IP info on settings page|Ombi Missing Image for TVShow Posters that do not come with Full URL|only check for blacklisted ip if not blank|error handling of messages on startup",
    "notes": "upgrade phpmailer/phpmailer to 6.5.0"
  },
  "2.1.472": {
    "date": "2021-08-20 19:10",
    "title": "Weekly Update",
    "new": "Pass variables through with URLs (FR#18)|qbittorent socks (FR#22)|framework for copy json button to homepage items|debug json to all homepage items|updated ui - change settings ui from horizontal to vertical|ui for Save homepage settings modal|make tautulli custom names dynamic|only update tautulli custom names config item if it doesn't match|prevent organizrHash from being displayed via API",
    "fixed": "splashscreen scroll (#1692)|jellyin open tab (#1633)|test iframe|sonarr input box|plex invite with deleted library|catch error from socks api|clear ajax on reload|loop load config on load",
    "notes": "update Adldap2/Adldap2"
  },
  "2.1.476": {
    "date": "2021-08-20 21:40",
    "title": "Weekly Update - Patch",
    "new": "",
    "fixed": "Local URL being set as regual URL|Line spacing|updated Overseerr logo",
    "notes": "See update notes for version 2.1.472"
  },
  "2.1.496": {
    "date": "2021-08-27 21:40",
    "title": "Weekly Update - New Feature",
    "new": "Self Signed SSL Cert option to all homepage items (#1177)|shortcut function for menu clicking - WIP",
    "fixed": "move google js to load only when config value setup (#1699)|tooltips to homepage settings ui buttons|First IPA typo to Free IPA|typo and sort LDAP options|now playing spacing",
    "notes": ""
  },
  "2.1.525": {
    "date": "2021-08-29 21:40",
    "title": "Added more Custom HTML homepage items (DEV BRANCH)",
    "new": "",
    "fixed": "",
    "notes": ""
  },
  "2.1.655": {
    "date": "2021-09-17 17:20",
    "title": "Has it been that long?",
    "new": "overseerr homepage item (FR#84)|Added More custom homepage items (FR#21)|uTorrent Homepage Item|new move framework for sorting tabs - handle bar on left side|multi select on tab sort|eps number to plex recent added (FR#90)|check diskspace to org|journal mode options to org|show html instead of plain text on Die commands|backup before update|token/me endpoint|dropdown in settings page for mobile only|docs to plex and healthchecks|notice to settings options|update debug area for sso modules|image selector to group editor|/organizr/page api endpoint|new error page located at api/v2/organizr/error|timer to close homepage item after save|covert local IP Range to IP Listing with multiple values|sonarr docs|get config items from api",
    "fixed": "unifi homepage item (#1592)|emby not being lowercase on login check|remove toggle class for side nav|api error for deluge|api error for emby|Clarify if config.php not setup or db permission error|netdata errors|timeout on updating|rework invalid token|rtorrent typo|option value if not set|tautulli use new url input box|readd username to token (#1577)|old issue with ombi import|start date and end date if not set",
    "notes": "Updated translation files|New Translation Strings|updated dibi to v4"
  },
  "2.1.705": {
    "date": "2021-09-28 21:10",
    "title": "More goodies",
    "new": "Option to completely hide left navbar (FR#92)|Radarr-Sonarr Season and Episode information on Mobile (FR#100)|Option to disable Org 2FA for Plex Auth login (FR#103)|added reset color button to custom colors|add more elements to custom colors|change tautulli token field to multiple field|add search to config item endpoint|enable fallback for overseerr|add option to turn off easter eggs|add transition for requested item|make logo on login screen a function|Support for homescreen icon|check if org has permissions to check disk space|add check to overseerr limit and offset|@causefx\nupdate plex token grabber to oauth|add toggle for 4k for overseerr",
    "fixed": "Overseerr Default Filter Issue (#1717)|other overseerr issues|overseerr placement of api calls|ombi test button (#1436)|alertDefined for news|update message on config api|invites plugin",
    "notes": "Rename JWT username claim to name|Other misc small fixes"
  },
  "2.1.710": {
    "date": "2021-09-29 15:00",
    "title": "Tiny fix and new option",
    "new": "add collapseSideMenuOnClick to org",
    "fixed": "header on non org page|check if tab name is taken|more custom element fixes|date on version",
    "notes": ""
  },
  "2.1.730": {
    "date": "2021-10-03 23:30",
    "title": "Weekly Update",
    "new": "new plex library plugin in marketplace|add check for minimum version needed for plugins|combine pre-code-editor and code-editor settings options|edit code-editor to include everything for settingsOption|add shareid to plex users|add orgAlertTransparent class|switch custom HTML to new code-editor method|add calendar demo data|add sonarr radarr and lidarr demo data|add plex demo data for plex streams and metadata",
    "fixed": "fix default service for overseerr",
    "notes": "plex-library-include to options|swal css edits"
  },
  "2.1.860": {
    "date": "2021-10-14 19:20",
    "title": "DEV - Preparing for next release",
    "new": "3rd Party Plugin Marketplace",
    "fixed": "",
    "notes": ""
  },
  "2.1.1020": {
    "date": "2021-10-15 18:17",
    "title": "Lots of changes",
    "new": "added ability for non-admin users to use invites|added allowClear to settings array for select2|added bcremer/line-reader framework|added buildFilterDropdown function|added buildPluginsSettings function for ajax calls|added check around log dropdown|added check for backup folder to see if all files are zip files|added checkForPluginUpdate setting to marketplace settings|added checkForPluginUpdate to default config file|added checkPluginUpdates function to functions js file|added check to see if installedPlugins is empty string|added chooseInstance function to Organizr|added clearTimeout function to start of log settings page|added color option to settingsOption function|added dataTable classes|added default config items [logLevel,maxLogFiles,logLiveUpdateRefresh,logPageSize]|added dependency monolog/monolog for php-json-logger|added dependency ramsey/uuid for php-json-logger|added externalPluginMarketplaceRepos to default config file|added file hash to custom select js file|added filter and page options to default ajax log url|added filter option to log url|added framework for php-json-logger|added function for logger to bypass not being setup yet|added function getPluginFilesFromRepo to get listing of plugin files needed to be downloaded|added function sandboxOptions for options|added function tempLogIfNeeded to be able to set a temp log filename if log is not ready|added getMarketplaceJSONFromRepo function to look for json file in github repo|added getPluginsGithubCombined function to combine organizr and 3rd party marketplaces|added getPluginsMarketplace function to return all data needed for marketplace|added getPluginStatus function to return correct wording for status|added human_readable values to both warn and error|added includeDatabaseQueriesInDebug to default config file|added invitedby column to invites plugin table|added INVITES-dbVersion to invite plugin default config file|added jsFriendlyJSONStringify js function|added komga sso (FR#24)|added komga to sso debug area|added loadPluginMarketplace function for ajax calls|added log-filter-dropdown css class|added log filter to log page|added logger.class.php|added logLevels options|added maximum number of invites setting|added missing params from default config|added new css classes [no-mouse,log-label]|added new function addColumnToDatabase for easy database manipulation|added new logger system which combines login logs and organizr logs|added new plugins/enabled and plugins/disabled api endpoints|added new plugins/marketplace api endpoint|added option to view all logs at once|added organizr page settings_plugins_settings|added pageSize, offset and filter to log api call|added passwordaltcopy option to settingsOptions function|added plugin settings to allow entering 3rd party marketplaces|added qualifyRequest to Komga sso function|added qualifyRequest to Tautulli sso function|added reload variable to editHomepageItem function|added reset button to homepage settings modal|added setCurrentUser to ssoCheck function to allow us to grab users group_id to use with qualifyRequest|added setGroupOptionsVariable to settingsOption|added ssoKomgaAuth to default config options|added ssoKomgaAuth to Komga options|added sso logging|added ssoTautulliAuth to default config options|added ssoTautulliAuth to Tatulli options|added the ability to share the invites plugin with non-admins|added tmp folder for log when logger is not setup|added toggleLogFilter function|added toggle option for includeDatabaseQueriesInDebug|added updateInstalledPlugins function to easily manipulate plugin status|added updateUrlParameter function|added upgradeInstalledPluginsConfigItem function for update|added validate variable to setCurrentUser function for use with sso auth|added _pluginUpgradeCheck to invites plugin|added _pluginUpgradeToVersion to invites plugin|added __construct function to invites plugin|Every time I saved it was adding \"No longer exists - id\" for each of the libraries, as it was checking for if the library exists in Plex rather than if it doesn't :)|missing composer files from bcremer/line-reader framework being added",
    "fixed": "added in a temp fix for select2 clearing|clean up select2 options fix|fix disk free not using raw field on disk check|fixed all log filter not showing the newest logs|fixed log json issue|fix feature request domain and path|Fix invites check for libraries which no longer exist|Fix Misc stats after #1731|fix typo on the word hyphen|Minor fix to utorrent token function",
    "notes": "Allow excluding libraries from Tautulli homepage item|Allow excluding libraries in tautulli homepageitem|change default log channel if logger is not setup|change default log level if logger is not setup|change default logLevel to INFO|changed old logger function to use logger variable again|changed over logger for user logging in|changed plugin settings tab module to have independent api calls|change error page over to new logger|change installedPlugins to array by default|change logger on settings page|change log icon when using live update|change settings page over to new logger|convert plex homepage logger to new logger system|convert sabnzbd homepage logger to new logger system|convert tautulli homepage logger to new logger system|correct @return and @param on logger class file|Create library list function|dev version 2.1.860|edited default log file if logger is not setup|edited getPlugins function to use new global plugin scheme|edited test button to include help text|ignore abort message on clearing ajax call|migrated getCustomizeAppearance settings to new settingsOption function|migrated getSettingsMain settings to new settingsOption function|migrated getSettingsSSO settings to new settingsOption function|minor updates to invites|missing comma from css selector|moved updateDB and upgradeCheck from organizr.class.php to upgrade-functions.php|move token creation logs to token creation function|Only allow admins to delete requests|Ready to set limits on request quantity|removed data-placeholder from select2 option|remove debug from db queries except critical|remove debug message|removed password-alt from theme setting and moved it to selectionCssClass|remove line breaks|remove old js code for code-editors as it is now dynamic|remove setFileName from logger class if log is not ready|remove writeLoginLog function|renamed css class selector from select2-selection__choice__display to select2-selection__choice__display|reworked installPlugin function to accommodate new marketplaces|reworked removePlugin function to accommodate new marketplaces|reworked setupLogger function to use new OrganizrLogger class|set logger to return null if not setup|set username if not set|spacing commit|take out numeric check on chooseInstance|temporarily bring back errors into nginx logs|update .gitignore with new log format|updated both removePlugin and installPlugin function to reflect marketplace changes|updated dataTables from 1.10.10 to 1.11.3|Update debug error for correct function key|updated getPlugins function to accommodate the new api endpoints|updated global plugin array by removing extra square bracket on plugins [SpeedTest,PHP Mailer,HealthChecks,Chat,Bookmark]|updated invites plugin to 1.1.0|updated low disk space warning to included threshold|updated settings page to accommodate new plugin settings|Updated the following languages: [Chinese] [French] [German] [Portuguese]|update invites plugin to reflect the changes with the removal of extra bracket|use function random_ascii_string on select2 items"
  },
  "2.1.1030": {
    "date": "2021-10-17 23:45",
    "title": "Logger Fix",
    "new": "added loggerExt class|added logging css|added peppeocchi/php-cron-scheduler framework|added testCronFrequency function",
    "fixed": "update logger to fix error (#1737)",
    "notes": "changed log type when viewing setting page|new class checks params and adjusts if needed"
  },
  "2.1.1110": {
    "date": "2021-10-29 20:32",
    "title": "Please Delete All Log files - New Cron Features",
    "new": "added /test/cron api endpoint|added api.json to gitignore|added apiResponseFormatter function to help with responses to logs|added Auto-update Organizr to cron jobs (FR#104)|added button type for notice on healthchecks plugin|added change directory to linux-update.sh|added clickSettingsTab function|added correct field for username in logs bringing back trace_id [PLEASE DELETE ALL OLD LOGS]|added createCronFile function|added createCronFile to track if cron setup|added cron-file case option to settingsOption function|added cron.php to include in plugin files|added Cron.txt to gitignore file|added cron notice on healthchecks plugin|added Cron settings to main settings page|added cron setting to settingsOption function|added cron to healthChecks plugin|added cron type on buildFormItem function|added default config item for autoUpdateCronEnabled|added default config item for autoUpdateCronSchedule|added Exception catch to cron file|added formatFilesFromGithub function|added getBranchFromGithub function|added getFilesFromGithub function|added getUpdateMechanism function|added hasDB check on cron file|added infinite time limit on dockerUpdate function|added install type check to dockerUpdate, windowsUpdate and linuxUpdate functions|added isLocalOrServer function|added linux-update.sh script file|added linuxUpdate function|added loading circle on plugin marketplace|added missing break on hide-seeding option|added more logging to cron jobs|added new case option plugin-marketplace for shortcut function|added new cron feature to organizr - plugins are able to use it as well|added on success to internalClipboard|added php and js checkCronFile function|added serverIP function|added set user as Organizr API on cron job|added spinner to log-details button|added test/cron api endpoint|added test cron button function logic|added trace_id to /log api endpoint|added trace_id to getLog function|added trace_id to readLog function|added update/linux api endpoint|added update api endpoint|added warning logs to plugin marketplace|edited getPluginFilesFromRepo function to use new functions added",
    "fixed": "fixed logger using wrong function warn-\u003Ewarning|fixed sonarr season count issue with new API version|fix linux update api script call|fix marketplace less than version bug|fix path for plugin marketplace",
    "notes": "change binding function for log-details|changed cron job to use instead of function variable|changed formatLogDetails to reflect new trace_id change|changed getLog message to reflect either trace_id or log|changed notice title on healthchecks plugin|changed page include for plugins to include all page.php files|changed sonarr api controller to use v3 api endpoint by default now|changed userIP function to return 127.0.0.1 if no ip found|change path on linux-update.sh from testing path to correct path|cleaned up linux-update.sh|edited pluginFileListFormat function to ignore directories|last change to api.json as it should be ignored by gitignore file|moved cron error to db if function|renamed getUpdateMechanism function to  updateOrganizr|renamed occurrences of frequency to schedule|temporary testing out linux and mac update script - will clean up|Updated the following languages: [French]"
  },
  "2.1.1140": {
    "date": "2021-11-12 22:36",
    "title": "Small Update - Auth_Request caching",
    "new": "added check for HTTP_HOST variable - set blank if not set|added debug logging to auth function|added ext-searchbox.js file for ace editor|added githubAccessToken to plugin marektplace to access private repos|added LDAP_OPT_X_TLS_REQUIRE_CERT =\u003E LDAP_OPT_X_TLS_ALLOW option for ldap|added loading html to settings page loading function|added organizr_user_uuid cookie for auth caching|added pageSize to radarr and sonarr queue|added refreshDeviceUUID function|added setDeviceUUID function|added socks debug output for api socks response|added verbose to failed cron jobs",
    "fixed": "fixed error logging on cron file using wrong function|fixed issue with socks api not forwarding content type if set|fixed Organizr sending invalid API query to Sonarr caused by non-conversion of boolean (#1750)|fixed radarr queue combining issue|fixed sonarr queue title issue|fixed type error not being set",
    "notes": "moved plex bandwidth tooltip to bottom|set auth function to return 401 if organizr is not setup or an error has occurred|spacing on organizr class file|Updated the following languages: [Polish] [Russian]|Update links in read me"
  },
  "2.1.1500": {
    "date": "2022-01-26 19:25",
    "title": "New year - new update",
    "new": "added \"href\" and \"icon\" to lidarr.php|added \"href\" and \"icon\" to radarr.php|added bg-bookmark as well|added bg-bookmarks to organizr.css|added check for url to see if null as well as null string value|added chooseConfigFile for the process of moving the config file|added config items update to info log|added css to marketplace logo if logo is broken|added data/config to gitignore|added debug logger message to authProxy range check|added direct Sonarr/Radarr/Lidarr button link to calendar modal|added folder to buildFormItem function|added folder to settingsOption function|added in check to see if url is organizr type to bypass url format|added log-settings to shortcut function|added logLocation and dbLocation to updateConfigItems function to cleanDirectory|added logLocation to logFunctions trait file|added logLocation to log settings|added log settings button to log viewer|added m-b-0 class to tab and category table|added m-t-0 class to loading settings well|added makeDir to normal-functions.php file|added makeDir to setOrganizrLog function|added more checks for https protocol on proxies|Added more time zone conversions|added new data folder to gitignore file|added new logo-purple image|added organizr-auth api endpoint|added placeholder to added new tab page|added test/folder api endpoint|added testFolder function|added upgradeDataToFolder to upgrade script|added url check to tab urls|Adding \"href\" and \"icon\" to sonarr.php|Adding buildPVRLink, updating buildCalendarMetadata()|Adding time zone conversions|Adding Western European Timezone|re-added livetv to plex resolve item|Updated calendarStandardizeTimezone to address (#1772)",
    "fixed": "fixed ace text areas can only save if a character is entered, not when deleted (#1759)|fixed Cannot access offset of type string on string (#1769)|fixed Form Submission Broken on some browsers (#1767)|fixed import user api error|fixed media search to check if overseerr is setup as well|fixed pagination to request results modal|fixed plex oauth title broken if plex (#1766)|Fixed Proxy-Auth by updating checkForOrganizrOAuth function (#1771)|Fixed Proxy-Auth not allowing email only (#1771)|fixed url check if url was empty|fix new radarr rating in api|fix URL on login page not consistent (#1757)",
    "notes": "bookmarks plugin default refresh set to 1 hour|bookmarks plugin selectable as a homepage item|Changed order of bookmark plugin|Changed over more old logging items to new logger|Corrected case('JST') to end with : versus ; and my copy and pasted case statements|For buildCalendarMetadata()|Hooks into buildCalendarMetadata|Hooks into Sonarr.php, Radarr.php, and Lidarr.php|organizr now stores most user data in root data folder|remove bg-bookmark from organizr.css|removed index.html files for custom routes and custom pages|Updated calendarStandardizeTimezone()|updated install wizard to reflect new data folder|updated the path for custom cert to data folder|updated the path for custom pages to data folder|updated the path for custom plugins to data folder|updated the path for favicon to data folder|updated the path for userTabs to data folder|update gitignore file|Updating calendarStandardizeTimezone|V2 develop"
  },
  "2.1.1680": {
    "date": "2022-03-04 20:52",
    "title": "Hey there stranger!",
    "new": "added \"href\" and \"icon\" to lidarr.php|added \"href\" and \"icon\" to radarr.php|added /api/v2/test/folder to docs|added api routes for donate homepage item|added autoClose to showHTML function|added bg-bookmark as well|added bg-bookmarks to organizr.css|added check for url to see if null as well as null string value|added chooseConfigFile for the process of moving the config file|added config items update to info log|added coupon for seedboxes.cc|added css to marketplace logo if logo is broken|added data/config to gitignore|added debug logger message to authProxy range check|added decode param to apiData function|added direct Sonarr/Radarr/Lidarr button link to calendar modal|added DonateHomepageItem to organizr class|added email address for current user to donation homepage item|added folder to buildFormItem function|added folder to settingsOption function|added homepageDonateShowUserHistory to donate homepage item|added homepage donation default config values|added icon for http://OliveTin.app|added in check to see if url is organizr type to bypass url format|added komga fallback user (FR#143)|added komgaFallbackUser and komgaFallbackPassword to default config file|added log-settings to shortcut function|added logLocation and dbLocation to updateConfigItems function to cleanDirectory|added logLocation to logFunctions trait file|added logLocation to log settings|added log settings button to log viewer|added m-b-0 class to tab and category table|added m-t-0 class to loading settings well|added makeDir to normal-functions.php file|added makeDir to setOrganizrLog function|added migration of old cache folder to data folder|added more checks for https protocol on proxies|Added more time zone conversions|added new data folder to gitignore file|added new logo-purple image|added option for sponsors to include dark mode logo|added organizr-auth api endpoint|added placeholder to added new tab page|added Seedboxes.cc as a sponsor|added seedboxes.cc to github README.md|added simshaun/recurr framework|added Stripe donation homepage item|added test/folder api endpoint|added testFolder function|added upgradeDataToFolder to upgrade script|added url check to tab urls|added version 2.1.1400 to upgrade check|Adding \"href\" and \"icon\" to sonarr.php|Adding \"Target URL\" under Homepage Item \u003E Calendar Settings|Adding buildPVRLink, updating buildCalendarMetadata()|Adding calendarframetarget to settingsOption. Adding new function getIframeTabs.|Adding default config settings|Adding default delugeHideStatus|Adding delugeHideStatus setting|Adding hidestatus|Adding lidarrCalendarLink. Updating formatLidarrCalendar logic to use new setting by default.|Adding lidarrFrameTarget. Adding frame.|Adding new calendarlinkurl type and updated makeOptionsFromValues for setting primary URL used when clicking on calendar|Adding radarrCalendarLink. Updating formatRadarrCalendar logic to use new setting by default.|Adding radarrFrameTarget. Adding frame.|Adding sonarrCalendarLink. Updating formatSonarrCalendar logic to use new setting by default.|Adding sonarrFrameTarget. Adding frame.|Adding switch to turn on/off icon. Reorganized new settings.|Adding time zone conversions|Adding tracker_status support to Deluge homepage item|Adding v.tracker_status to buildDownloaderItem|Adding Western European Timezone|re-added livetv to plex resolve item|Updated calendarStandardizeTimezone to address (#1772)",
    "fixed": "attempt to fix proxy auth using email instead of username when present|Expanding calendar link to target existing tab + on/off switch + series name conversion fixes|Fix: Forgot to update makeOptionsFromValues declaration with new parameters|fixed ace text areas can only save if a character is entered, not when deleted (#1759)|fixed Cannot access offset of type string on string (#1769)|fixed empty library stats from Tautulli (#1799)|fixed Form Submission Broken on some browsers (#1767)|fixed ical issues (#1792) (#1725)|fixed ical issue with irregular timezone in dtstart field (#1797)|fixed import user api error|fixed media search to check if overseerr is setup as well|fixed missing brackets on sonarr and radarr PR commit|fixed mobile cut off view|fixed pagination to request results modal|fixed plex oauth title broken if plex (#1766)|fixed plex stream error if API was incorrect|Fixed Proxy-Auth by updating checkForOrganizrOAuth function (#1771)|Fixed Proxy-Auth not allowing email only (#1771)|fixed Tautulli Homepage Error - Unable to get list of libraries (#1798)|fixed type on rtorrent homepage item|fixed url check if url was empty|fixed yearly ical issue (#1792)|Fix for series names with &, i.e. Law & Order|fix new radarr rating in api|fix URL on login page not consistent (#1757)|Removing period from preg_replace to fix issues with vs. in Joe Vs. Carol.",
    "notes": "bookmarks plugin default refresh set to 1 hour|bookmarks plugin selectable as a homepage item|Changed order of bookmark plugin|Changed over more old logging items to new logger|Corrected case('JST') to end with : versus ; and my copy and pasted case statements|Create lidarr.php|For buildCalendarMetadata()|Hooks into buildCalendarMetadata|Hooks into Sonarr.php, Radarr.php, and Lidarr.php|moved cache folder to new data folder|organizr now stores most user data in root data folder|remove bg-bookmark from organizr.css|removed index.html files for custom routes and custom pages|removed json_decode from socks|removed old plugin images cache folder|removed unused parameter for tautulli|remove index.html from gitignore|Removing unnecessary fallback values with default.php update|renamed launch to status and vice versa in organizr class|return logger on setLoggerChannel function|spacing|update adldap2 to current version|Updated buildPVRLink to render blank if blank href passed|Updated buildYoutubeLink and buildCalendarMetadata to respect new show icon setting. Default: true.|Updated calendarStandardizeTimezone()|Update default.php|Update deluge.php|updated install wizard to reflect new data folder|Updated the following languages: [Catalan] [Chinese] [Dutch] [German] [Polish] [Spanish] [Swedish]|updated the path for custom cert to data folder|updated the path for custom pages to data folder|updated the path for custom plugins to data folder|updated the path for favicon to data folder|updated the path for userTabs to data folder|Update functions.js|update gitignore file|Update lidarr.php|Update option-functions.php|Update radarr.php|Update sonarr.php|Updating calendarStandardizeTimezone|Updating tabActions and buildPVRLink to support new frame targetting logic."
  },
  "2.1.1690": {
    "date": "2022-03-06 01:02",
    "title": "Donate hompage item hotfix",
    "new": "added another api endpoint for donation to response from GET api/v2/homepage/donate/{amount}|added back missing test php files from certain frameworks",
    "fixed": "fixed donate homepage item missing php file",
    "notes": "remove test*.php from gitignore"
  },
  "2.1.1750": {
    "date": "2022-03-25 19:32",
    "title": "Added mysqli support",
    "new": "added Active Plex Streams show user information without IP toggle (FR#147)|added api endpoint /themes|added api endpoint test/database|added api endpoint themes/marketplace|added date to create invite function|added defaultTables function|added defaultThemeInformation function|added destroy owl carousel to recent homepage item|added driver, dbHost, dbUsername, dbPassword, externalThemeMarketplaceRepos and checkForThemeUpdate to default config|added formatDatabaseDriver function|added getAllThemes function|added getAllThemesInformation function|added getDefaultTablesFormatted function|added getOrganizrThemes function|added getUserThemes function|added hasConfig function|added hasDatabase function|added ignore torrent label to rTorrent|added includeTrailing to qualifyURL function|added js functions  loadThemeMarketplace getRepoUsernameAndRepoName buildThemeSettings|added mysqli database support|added new unifi output to test format|added page settings_customize_settings|added removeDbExtension function|added replaceStringInDatabase function|added short range to debug message or authProxy logins|added testDatabaseConnection function|added theme marketplace 3rd party ability|added userThemeInformation function|added validateTheme function",
    "fixed": "fixed api response if no backups were created|fixed cache image size to not include float|fixed folder not writable check for wizard|fixed image manager|fixed objDiff function that had typo|fixed rTorrent showing leech on download item (#1785)|fixed suggested directory path for clipboard|fixed user plugins js/css not being added|fixed wizard not showing mysqli when selected",
    "notes": "moved duplicated code for rTorrent URL to rTorrentURL function|removed old api docs|removed old config file after migration|update api doc json|update createNewDB function|updated backup function to use new data folder|updated connectDB function|updated connectOtherDB function|updated default wizard values for not used fields|updated getPlugins function to be more inclusive|updated setTheme function for new theme format|Updated the following languages: [Chinese] [Dutch] [Italian]|updated themeChanger and changeTheme for new theme format|updated time format to reflect new database format|updated updateDB to reflect having mysqli support|updated value of null to 0 for tab options|updated wizard to show new mysqli option|update plugin queries to reflect new database options"
  },
  "2.1.1760": {
    "date": "2022-03-26 16:21",
    "title": "Theme Marketplace Hotfix",
    "new": "",
    "fixed": "fixed theme marketplace downloading of themes with spaces",
    "notes": ""
  },
  "2.1.1790": {
    "date": "2022-04-08 16:22",
    "title": "Weekly Update",
    "new": "added a check to see if theme in user theme folder is actually installed|added custom authProxy logout url (#1771)|added default config values authProxyOverrideLogout and authProxyLogoutURL|added menuExtras to tabInformation|added setAPIErrorResponse to api response|added setErrorResponse to organizr class|added test connection to jackett (#1800)",
    "fixed": "added formatPingHost function to fix incorrectly saved ping URLs|fixed chat plugin not closing with close tab button (#1816)|fixed checking of tab name if changing casing only|fixed chinese tradition not being set (#1813)|fixed issue with catchall for ical timezones (#1772)|fixed overseerr limit variable being incorrect|fixed ping URLs that were incorrect|fixed tautulli connection tester|fix preloading issue with new tabActions",
    "notes": "changed getHomepageMediaImage slightly to use default image if error|changed js-switch to default size medium|changed overseerr from a foreach call to request_multiple method|changed tabActions to use tab id instead of tab name|comment out prettyprint for errors for now|removed semver from sonarr/radarr/lidarr class|renamed tabActions for plugins to switchToPlugin|replace organizr user object if token set with token object for sso|restored old getSystemStatus method from sonarr/radarr/lidarr class|switched value of name to id for getIframeTabs function|update api.json file|updated prettyPrint function to include red error|Updated the following languages: [Russian]"
  },
  "2.1.1800": {
    "date": "2022-04-09 03:53",
    "title": "Hotfix Update",
    "new": "",
    "fixed": "fixed issue where if no default tab was set nothing would load|fixed sso bug that didnt pass user object correctly",
    "notes": "replace old setAPIResponse on some items to setResponse"
  },
  "2.1.1810": {
    "date": "2022-04-10 03:19",
    "title": "Small Update",
    "new": "added id to logging for tab actions",
    "fixed": "",
    "notes": "sanitized username for logging functions"
  },
  "2.1.1830": {
    "date": "2022-04-12 23:35",
    "title": "Fixed Default Tab Loader",
    "new": "added check to see if username was blank before strtolower function called|added function printWarningsAndErrors for dev purposes|added php error message names to error handler|added sanitize tab name on added and edit|added sanitize to tabs, categories, users and bookmarks|added sanitize to uploaded image names|added sanitizeUserString and sanitizeEmail functions",
    "fixed": "fixed loading tab if no default is selected",
    "notes": "changed error_handler for organizr class to setAPIErrorResponse|changed the api response of warning and errors to admin and co-admin only|removed svg files from approved image lists|replaced FILTER_SANITIZE_STRING as it was being deprecated in php 8.1|tweak organizr error handler|updated cron file to include user plugins for advance cron jobs|updated dibi/dibi to 4.2.6"
  },
  "2.1.1840": {
    "date": "2022-04-15 20:42",
    "title": "Weekly Update",
    "new": "",
    "fixed": "fix defaultTab if organizrLogin hash is still set|fixed plugin container not hiding if clicking other plugin|fixed private repo for plugins|fix user plugin not loading default config file",
    "notes": "renamed php error to organizr error"
  },
  "2.1.1880": {
    "date": "2022-04-27 15:13",
    "title": "Plugin Fix",
    "new": "added function getRandomMediaImage to changing media images|added new sponsor|added only wide images \u003E 1200 to getRandomMediaImage function|added useRandomMediaImage for changing media image on login",
    "fixed": "fixed plugins not being migrated over|fixed isEncrypted function to work with any style of password (#1826)|fixed issue allowing non images to be uploaded|fixed Using Certain Characters for the Organizr Title breaks Plex oAuth (#1824)",
    "notes": "changed getRandomMediaImage from array to string|change width from 1200 to getCacheImageSize|consolidated auth endpoints|tweak randomize result for getRandomMediaImage|updated root api routes to include optional slash"
  },
  "2.1.1890": {
    "date": "2022-04-28 05:41",
    "title": "Version number fix",
    "new": "",
    "fixed": "Version number not updating",
    "notes": ""
  },
  "2.1.2200": {
    "date": "2022-05-18 15:11",
    "title": "Develop Release",
    "new": "",
    "fixed": "",
    "notes": "Moved changed items to release 2.1.2320"
  },
  "2.1.2320": {
    "date": "2022-05-27 18:47",
    "title": "Weekly Update",
    "new": "added 10 second timeout to tautulli homepage settings|added addGroupIdMinToDatabase and addAddToAdminToDatabase to upgrade functions|added alias function log|added api endpoint reset update feature|added auto backup cron|added backup db to 2.1.2000|added block ui to wizard submission|added boolean variable loggerSetup|added check for has db on error handler|added checkIfColumnExists dropColumnFromDatabase functions|added check on checkForOrganizrOAuth function for db|added configToken and validationConstraints function for new version of JWT|added config values for sendLogsToSlack, slackLogLevel, slackLogWebhook, slackLogWebHookChannel|added config values to organizr settings options for SlackWebhookHandler|added debug logging to OAuth pre-checks|added existing headers to oauth debug output|added function addDatabaseToPaths|added function getBackupsToDelete|added functions isXML and testAndFormatString|added getLogLevelClass function|added GROUP MAX and GROUP MIN to tab settings headers|added group_id_min and add_to_admin to tabs database table|added group_id_min and add_to_admin to tab settings|added icons|Added Kavita icon.|added keepBackupsCountCron|added local check to token validation|added logging to upgradeToVersion function|added master password support to Komga (#1838)|added matchUserIP to security settings for tokens|added new handling for checking plex servers owned to catch error if not successful|added qualifyLength function to test against user inputted strings|added setChannel and setUsername functions to Logger|added slack-logs test connection to api and settings|added slack/discord webhook support for logs|added slackLogLevel config item|added slack logs to api docs|added SlackWebhookHandlerBuilder to PhpJsonLogger|added SlackWebhookHandler to MonologCreator|added SlackWebhookHandler to OrganizrLogger class|added sqlite db to backup check|added tabGroupSelectMin - tabGroupSelectMax - addToAdminSwitch to tab settings ajax calls|added toggle for matchUserAgents|added tooltip to image manager|added type to buildTabGroupSelect function|added UA to logger when mismatch|added updateInProgress.txt file for checking update status|added useragent and connect_timeout to request options function|An instance of Radarr or Sonarr is added to Organizr. Since the communication between Organizr and these services should preferably be done through a non-public channel, addresses like: http://radarr:7878 or http://sonarr:8989 are entered in the \"Multiple URLs\" fields. These URLs are then used to generate the links that lead from the calendar to the respective service. But if Oganizr is reachable from the public internet and is also used through it, the generated URLs do not work. With the new form type it is then possible to enter a self chosen public address.|Introduction of a new form type \"select-input\" using input and datalist elements which should allow to specify any custom value in addition to the available options. Unfortunately the styling options for datalist elements are almost non-existent.",
    "fixed": "fix default tab load if first tab has group|fixed formatting on debug area for object|fixed getTautulliFriendlyNames if error occurs|fixed icon term on select|fixed if webserver does not have access to plugin folder|fixed issue loading next tab if hash was still OrganizrLogin|fixed key missing from plugin css file|fixed sort issue with tabs caused by update|fixed stripos of getImagesSelect function|fixed tab name for groups in settings page|fixed time display issues with tokens|fix more lengths of user inputs|fix tautulli homepage errors if not connected",
    "notes": "changed config items log to reflect only changed keys|changed cron logger to new log function|changed group_id_min from 0 to 1|changed js and css for plugin files to use plugin version instead of organizr version|changed logging for backup|changed matchUserIP to default false|Change the type of the calendarlinkurl option to \"select-input\". This is to cover the following case:|Display only php errors in organizr logs - full errors still in webserver logs|edit console error log for  functions loadPluginMarketplace and loadThemeMarketplace|enabled non-docker linux update script|Instead of returning an empty array when the counts of urlList and tokenList arent equal the code is checking now if theres is an entry in the tokenList for every url from urlList. That makes it possible that there could be a least one working pair of url & token which leads to a working calendar.|limit bookmark name and category to char 50|minimum php 7.4 needed now|missing semi-colon|modify csvhomepageurltoken and  introduce new formtype|moved the majority of old log entries to new logger|removed browser from api and token view page|removed function writeLog|removed left over console log from loadCustomJava|removed old column group_id_min|removed powered by from all email templates|removed variable organizrLog and organizrLoginLog|renamed function getBackupsToDelete to deleteBackupsLimit|renamed Group Min and Group Max to Group From and Group To|renamed group_id_min to group_id_max|renamed variable log to logFile|reordered organizr constructor|Reverted group_id_min back to 0 from 1|reworked getallheaders to return only lowercase array|sanitize tab image and group image|temp return logger|tweaked convertIPToRange function|tweaked error handler to log errors as well|tweaked getAllUserTokens function to have option to not return browser field|tweaked refresh list return|tweaked showHTML function|tweaked validateToken function to match token browser with db token browser for extra security|updated createToken and jwtParse function to reflect new version of JWT|updated JWT to 4.1.5|updated komga logger items to new logger|updated uuid framework for uuid (#1835)|update help tip for matchUserIP|update message and messageSingle functions|update news|update weather refresh|version 2.1.2000|wrapped group_id_max around column check|wrapped user variable around function checkForOrganizrOAuth"
  },
  "2.1.2330": {
    "date": "2022-06-10 22:13",
    "title": "Weekly Update",
    "new": "added check for updates on organizr class",
    "fixed": "fix fatal error on mariadb installs",
    "notes": "update api docs|Updated the following languages: [Catalan] [Chinese] [German] [Italian]"
  },
  "2.1.2370": {
    "date": "2022-09-30 17:17",
    "title": "Long Lost Update",
    "new": "added button to open current Organizr tab in new browser tab|added context to mailer error|added custom backup location FR#160|added Duplicati tab icon|added new device emails to login|added new functions getSSOList getSSOEnabledCount getSSOTimeout|added new timeouts for sso item based of sso items enabled|added shuckStop plugin|added zwavejs image|change to address to bcc",
    "fixed": "add blackhole downloads and fix order|fix cert issue on trakt oauth (#1872)|fixed anchor in url (#1858)|fixed Jackett is freezing in UI on API 500 Error (#1869)|fix order|fix tautulli api parse error (#1860)",
    "notes": "Adguard Home|adguard home|Better Kavita.png so the icon is now the same size as other tabs|change relative path to use root path|change syling to adguard|Issue 1866 - Open in new browser tab|pihole refresh -\u003E adguard refresh|prowlarr|Prowlarr homepage|prowlarr homepage item|remove blackhole option|remove unneeded cases|remove unneeded text change|sometimes chmod sees double|update api.json|update api.json to reflect shucks plugin|updated gitignore to included shucktop plugin|Updated the following languages: [Catalan] [Dutch] [Polish]|Update Kavita.png|update linux script to check and set permissions"
  },
  "2.1.2380": {
    "date": "2022-12-29 20:13",
    "title": "PHP8 error temp fix",
    "new": "added debug info to exception for email test",
    "fixed": "fixed tab names not encoding correctly (#1885)|fix github backer issue|fix userDefinedIdReplacementLink if string is blank",
    "notes": "only errors logged|random commit for json file to test|random pest test class"
  },
  "2.1.2400": {
    "date": "2023-01-03 22:57",
    "title": "Tab Fix and update PiHole HP Item",
    "new": "added piholeToken to config items",
    "fixed": "fixed issue if pihole could not connect|Fixed issue with tabs not loading in settings|fix issue with Tab names after F5 reload (#1885)|Fix Latest Pi-Hole breaks stats if password enabled (#1896)|fix toggle header for adguard",
    "notes": "Implement JDownloader Homepage Basic Auth #1830|Update adguard.php|updated pihole hp item to reflect auth change to new pihole version|updated pihole test connection to reflect auth changes"
  },
  "2.1.2420": {
    "date": "2023-01-25 20:04",
    "title": "Weekly Update",
    "new": "added arabic to lang|added username to emby connect user creation",
    "fixed": "fixed ICal Not really Working (#1909)|fixed issue if backup folder was inside data folder (#1891)",
    "notes": "bypass 2fa if auth proxy active (#1910)|Updated the following languages: [Romanian]|update emby connect auth to reflect email|update linux script to check script location only (#1899)|workaround for non-time entries on ical"
  },
  "2.1.2430": {
    "date": "2023-02-10 21:50",
    "title": "Weekly Update",
    "new": "added check for gitlock file on docker update|added check for response to Overseerr test|Added check for response to the testConnectionOverseerr method",
    "fixed": "Fix JDownloader API authentification|fix Overseerr homepage item does not read the username properly (#1915)|Truly Fix JDownloader API authentification",
    "notes": "or MyJD-API \u003E= 1.0.4|Requires FeedCrawler \u003E= 16.0.4|Updated the following languages: [Arabic (Saudi Arabia)]|update shebang for portability (#1899) (#1908) (#1906) (#1881)"
  },
  "2.1.2460": {
    "date": "2023-11-21 19:44",
    "title": "Long Lost Update",
    "new": "added autobrr tab image|added base config|added check for file upload to see if upload was successful before mime check|added check on sonarr if url is not set (#1943)|added config item disableHomepageModals|added extension checks for mbstring and fileinfo|added function revokeTokensByUserId|added js to render homepage item|added kuma data route|added latency to monitors|added Navidrome logo|added settings page for kuma|Added setting to toggle compact mode|added socksDebug and maxSocksDebugSize config values|added TODO comment|added toggle for displaying latency|Added uptime kuma homepage item",
    "fixed": "fixed A removed user can still use organizr until they logout (#1925)|fix homepage item name to remove space|set limit to log debugger for socks output - fixes Radarr etc",
    "notes": "cleanup image error|formatting|Move autobrr image to correct dir|move parsing logic into a class|pop latency in the monitors array|turn off the update available notification (#1938)|updated socks to reflect big requests|update kuma function to get and parse prometheus metrics"
  },
  "2.1.2490": {
    "date": "2024-04-12 20:41",
    "title": "Weekly Update",
    "new": "Added iframe allow options|Added images for: pigallery, whisparr, stash, tachidesk sorayomi and romm|Adding Korean Support.|Korean language added in 'V2 develop'",
    "fixed": "fix bookmarks opening in self|fix icon issue on firefox|Several bugs have been fixed. Several new translations have been added.|[PHP 8.4] Fix: Curl `CURLOPT_BINARYTRANSFER` deprecated",
    "notes": "Create ko[Korean].json|Update es[Spanish].json|Update ko[Korean].json|Update ru[Russian].json|Updating UniFi logo"
  },
  "2.1.3180": {
    "date": "2025-09-18 00:17",
    "title": "Weekly Update",
    "new": "- added 'jellystat' source handling to metadata popup JavaScript switch statement|- added 'metadata' permission in jellystatHomepagePermissions|- added .bg-jellystat CSS class with JellyStat blue color (#00a4dc)|- added /api/v2/test/jellystat endpoint to connectionTester.php routes|- added /api/v2/test/userWatchStats endpoint to connectionTester.php routes|- Added /homepage/jellystat route in homepage.php that calls getJellyStatData()|- added /homepage/userWatchStats API route|- Added /homepage/userWatchStatsTest API route|- Added alias formatDurationSeconds for HomepageUserWatchStats::formatDuration|- added API endpoint for userWatchStats data retrieval|- Added automatic domain mapping from media.glassnetworks.net to jellystat.glassnetworks.net|- Added backdrop-filter blur effect for sleek appearance|- Added better year extraction from title patterns for both movies and TV shows|- Added case 'jellystat' to metadata-get click handler switch statement|- Added check for empty DatePlayed results to trigger fallback|- Added clickable metadata popups for movie and TV show posters|- Added click event handler for '.jellystat-metadata-trigger' class|- added comprehensive console debugging to track stats availability|- added comprehensive default configuration keys following EmbyLiveTVTracker pattern|- added comprehensive default configuration settings for User Watch Stats plugin|- added comprehensive JellyStat plugin supporting both Emby and Jellyfin|- added comprehensive logging to track API calls and responses|- added comprehensive userWatchStats plugin for Plex/Emby/Jellyfin|- added configurable count setting for number of items to show|- Added console logging for debugging|- Added console logging for movie processing including poster_path, id, and server_id|- Added custom transparent scrollbars that match the theme design|- added data-changed='false' attribute to select inputs in buildFormItem function|- added debugging for TV show ID selection|- added debugging to metadata API route|- added dedicated URL and API token fields for each media server type|- Added export button to logs page UI with download icon and tooltip|- Added exportLogs() function in functions.js that fetches logs from API endpoint /api/v2/log/0|- Added extensive debugging in getPosterUrl function to track URL generation|- added fallback logic to avoid episode IDs that cause composite posters|- Added fallback to DateCreated sorting when DatePlayed fails|- added fallback to simple date-played sorting when activity logs unavailable|- added fetchAllJellyStatHistory() method to paginate through all history records|- Added generateMediaServerLink() to create proper media server URLs|- added GET /api/v2/homepage/userWatchStatsSimple route|- Added getEmbyPlaybackHistory() to get play statistics from activity log|- added getJellyStatMetadata() method following Organizr's standard metadata API pattern|- Added getMediaServerTabName() and shouldOpenMediaServerTab() helpers|- added getPosterUrl() helper function for poster URL generation|- added getUserWatchStatsSimple() API endpoint for data retrieval|- Added helper function getUserWatchStatsConnectionFields() for dynamic field rendering|- added helper functions for duration formatting and content type icons|- Added hidden metadata divs and modal triggers for each poster|- added homepage order entry for User Watch Stats plugin (position 46)|- added homepageOrderUserWatchStats method to Organizr class|- added homepageOrderUserWatchStatsSimple() function for UI rendering|- added HomepageUserWatchStatsSimple trait to main Organizr class|- added HomepageUserWatchStats trait to organizr.class.php|- added homepageUserWatchStatsURL and homepageUserWatchStatsToken to not_empty permissions|- added hover overlay with title and year that appears on mouseover|- Added HTTP response failure handling|- Added HTTP status codes and response snippets to logs|- Added internal URL and poster settings missing from default configuration|- Added JavaScript file to test poster URL generation functionality|  - added jellyStatApikey to required 'not_empty' checks in permissions|- added logging to show sample history records|- added logging to show which approach works|- added media type filtering (All, Movies, TV Episodes, TV Series)|- Added missing closing brace for else block in fallback JellyStat proxy URLs section|- Added more comprehensive error detection for API responses|- Added optional Internal JellyStat URL setting for server-side API calls|- added Organizr logging to getJellyStatMetadata function|- added play count badges and fallback placeholders|- added play count increment logging|- Added POST /homepage/jellystat/metadata endpoint following the same pattern as other media server metadata routes|- added processJellyStatHistory method to extract most watched content from history data|- Added proper data attributes to poster elements for popup triggers|- Added proper date range filtering based on configured Statistics Period (days)|- added proper error handling and final fallback to recent items|- Added proper error handling for invalid API keys|- added proper error handling with set -euo pipefail|- Added proper error handling with try-catch blocks|- Added proper spacing and vertical alignment for inline-block layout|- added required fields (nowPlayingImageURL, address, tabName, openTab) for metadata popup compatibility|- added results counter showing filtered item count|- added sanitizeId() JavaScript function to handle problematic IDs|- added server overview with summary boxes showing total libraries, items, episodes, and watch time|- added smooth opacity transitions and scale effects on hover|- Added smooth transitions and modern glass effect to play count badges|- Added support for up to 3 lines of title text with proper line clamping|- added table/card view toggle for better visual presentation|- added toggle settings for movies, TV shows, and music poster displays|- added userWatchStats.png icon for the homepage plugin|- Added UserWatchStatsTestHomepageItem trait to main Organizr class|- Additional configuration updates for User Watch Stats plugin|- Function exports all logs (filter=NONE, pageSize=1000, offset=0) as CSV with columns: Date, Severity, Function, Message, IP Address, User|- The route calls the getJellyStatMetadata() method that was previously added to the JellyStat plugin|- This was the proven working method before the fetchJellyStatMostViewedByType method was added|- Updated metadata structure to use media server URL for 'address' field|added additional functions for user stats|added API route for userWatchStatsSimple plugin|added bypass login for local access|added debugging and multiple API approaches for Emby content retrieval|added debugging for TV show ID fields in JellyStat data|added debugging to JellyStat metadata endpoint|added debugging to understand JellyStat API data structure|added debug logging to fetchJellyStatMostViewedByType method|added debug logging to understand TV show ID structure|added dedicated connection settings for User Watch Stats plugin|added detailed debugging to JellyStat poster URL generation|added detailed error logging to JellyStat test connection|Added detailed logging to see what ID fields are available in JellyStat|added dual URL support for JellyStat - internal API, external posters|added embyLiveTVTracker homepage plugin with core integrations|added embyLiveTVTracker plugin with custom modifications|added exportLogs() function to download logs as CSV|added fallback approach using global Items API since user-specific endpoints not accessible|added fetchJellyStatMostViewedByType method to use native JellyStat API|added functions to support emby watch history|added homepage rendering functions to UserWatchStatsSimple plugin|added image for Zipline|added JellyStatHomepageItem trait to Organizr class|added JellyStat homepage plugin|added JellyStat metadata API route to homepage routing|added JellyStat metadata endpoint integration|added missing CSS style for JellyStat metadata popup icon|added missing JellyStat API route to complete homepage integration|added missing JellyStat settings to default config|added missing test connection endpoints for JellyStat and UserWatchStats|added more uniform view|added poster click metadata popup functionality to JellyStat plugin|added poster display for most watched content in JellyStat plugin|added poster_updates.js for testing poster URL generation|added proper Emby/Jellyfin link button to JellyStat metadata popup|added RustDesk logo|added test endpoint for plugin|added User Watch Statistics feature|added User Watch Stats plugin icon and additional config updates|added User Watch Stats plugin integration|feat: added homepage item for prompage|feat: added test plugin trait for user watch stats homepage integration|feat: added User Watch Statistics homepage plugin|JellyStat: ensure metadata popups work like Emby by adding hidden inline-popups anchors alongside -metadata-div containers; keeps existing metadata-get attributes intact|JellyStat: make metadata endpoint robust\\n- Use 'metadata' permission gate (not 'main')\\n- Avoid external calls; return safe minimal payload to prevent 500s\\n- added try/catch and fallback success response|res(icons): added icons for: copyparty, backrest, flaresolverr, trilium, amule",
    "fixed": "- Fix double-escaped strings in HTML content generation|- Fixed apostrophe in comment that was breaking PHP string parsing|- Fixed data fetching methods to use correct JellyStat API calls|- Fixed issue where image URLs were generated as 'http://proxy/...' instead of using the proper JellyStat URL|- Fixed JavaScript regex string escaping in PHP heredoc|- Fixed JavaScript string escaping in metadata popup elements for movies and TV shows|- Fixed mismatched HTML span tags in button elements|- Fixed modal body targeting to avoid infinite loops|- Fixed N/A year display in movie/TV show posters to show empty strings|- Fixed N/A year display in table rows to show empty cells instead|- Fixed onerror attribute JavaScript to use proper quote escaping|- Fixed permissions to check global config keys, enabling save button functionality|- Fixed poster URL generation to use correct JellyStat proxy endpoint format|- Fixed quote escaping issues that prevented the page from loading|- Fixed single quotes in JavaScript strings inside PHP causing parse errors|- Fixed switch statement formatting and return value quotes|- Fixed unquoted JavaScript case values causing PHP parse error|- Fixed URL configuration to use https://jellystat.glassnetworks.net (not port 3001)|- Fixes 404 errors from attempting to call non-existent API endpoints|- Fixes 500 error when clicking JellyStat items for metadata popup|- Fix escaped quotes and regex patterns in JavaScript within PHP string|- Fixes CORS issues, opaque response blocking, and mixed content errors|- Fixes Internal Server Error caused by calling non-existent writeLog method|- Fixes missing icon in metadata popup when source is 'jellystat'|- Fixes missing save button issue in plugin settings interface|- Fixes mixed content warnings in browser console|- Fixes overly restrictive permission requirements blocking iframe mode testing|- Fixes PHP parse error causing 500 Internal Server Error|- Fixes potential 401 Unauthorized errors caused by malformed auth headers|- Fix JavaScript variable injection using json_encode() for safe escaping|- Fix JellyStat plugin permissions to include API key validation:|- Fix nullable parameter deprecation warning in setResponse method|- Fix settings structure to match working Organizr plugin patterns|- Fix TV show episode aggregation by using SeriesName as primary identifier|- Fix undefined function errors for getPosterUrl, getTypeIcon, formatDuration|- Fix userWatchStats plugin config keys to match default config pattern:|- Removed redundant 'Bearer ' prefix in Authorization header construction|- Set poster containers to fixed 150x225px dimensions instead of percentage-based padding|- Simple CSS fix instead of complex JavaScript override|- This fixes the 404 'Endpoint Not Found' error when testing plugin connections|- This fixes the 500 Internal Server Error when JellyStatHomepageItem trait is enabled|- This fixes the FastRoute\\BadRouteException: 'Cannot register two routes matching \"/api/v2/test/userWatchStats\"'|- This fixes the method collision issue caused by removing HomepageUserWatchStats trait|Add homepage settings and UI for User Watch Statistics\\n\\n- Add userWatchStatsSettingsArray() function to make plugin appear in homepage settings\\n- Add homepage UI functions (homepageOrderUserWatchStats)\\n- Add proper permissions and test connection functions\\n- Add JavaScript for interactive UI with auto-refresh\\n- Fix API response format for getUserWatchStats\\n- Plugin now properly integrates with Organizr's homepage system|fix: added prompage logo|fix: JellyStat metadata image URLs now use proper external URL|fix: Use unique config variables for userWatchStats plugin|Fix authentication method in fetchJellyStatMostViewedByType|Fix Bearer token authorization header in JellyStat plugin|fix cert check|Fix duplicate route error by removing redundant userWatchStats test endpoint|fixed plex oauth login|fixed sonarr and radarr calendar images (#1963)|fixed syntax error in the JavaScript file at line 2258. The error is }catch{ which is missing the parameter in the catch block.|Fix Emby API approaches - remove non-working Latest endpoint and prioritize working methods|fix emby logo again maybe?|fix emby logo again maybe? again|fix emby logo again maybe? again 2|fix emby logo again maybe? again 3|fix emby logo again maybe? again 4|Fix Emby most watched to show actual media content|Fix exception handling for Emby DatePlayed SQLite errors|Fix exportLogs query string - use proper URL parameter separators (&)|Fix homepage plugin configuration inconsistencies|Fix JavaScript function order issue causing webpage crash|Fix JavaScript quote escaping in TV shows and music sections|Fix JavaScript ReferenceError: formatDuration is not defined|Fix JavaScript string escaping issues in UserWatchStatsSimple|Fix JavaScript syntax error in sanitizeId function|Fix JellyStat API authentication and data fetching|Fix JellyStat duration formatting by reverting to original formatDuration function|Fix JellyStat image URLs to use direct Emby/Jellyfin server URLs|Fix JellyStat logging to use proper chained setLoggerChannel pattern|Fix JellyStat logging to use proper Organizr logger methods|Fix JellyStat metadata popup: Add missing case in minified JS|Fix JellyStat metadata popup integration|Fix JellyStat play count accuracy and remove unused code|Fix JellyStat poster display with correct proxy endpoint|Fix JellyStat poster metadata popups with ID sanitization|Fix JellyStat poster URL generation|Fix JellyStat poster URL generation to match working format|Fix JellyStat test connection permissions for iframe mode|Fix JellyStat TV show play count aggregation and improve content type detection|Fix page crashing issues|Fix PHP parse error in JellyStat plugin|Fix PHP syntax error in JavaScript regex|Fix PHP syntax error in jellystat.php - resolve string interpolation in JavaScript|Fix PHP syntax errors in JavaScript quote escaping|Fix PHP syntax errors in JellyStat homepage plugin|Fix PHP syntax errors in JellyStat JavaScript code|Fix PHP syntax errors in JellyStat metadata popup integration|Fix PHP syntax errors in logs page|Fix PHP syntax errors in User Watch Statistics plugin|Fix poster click handler to prevent page hanging|Fix poster dimensions to 150x225px and add debugging for missing stats|Fix poster text cutoff and implement horizontal scrolling carousel|Fix remaining white boxes and eliminate all N/A year displays|Fix save button issue for select elements in plugin settings|Fix syntax error: missing closing brace in JellyStat metadata function|Fix trait method collision between JellyStatHomepageItem and HomepageUserWatchStats|Fix TV show poster composite image issue|Fix User Watch Stats permissions to enable save button|Fix User Watch Stats plugin and add simplified version|Fix User Watch Stats plugin settings discovery issue|Fix userWatchStats plugin settings types for save button functionality|Fix User Watch Stats save button issue by using global config keys for permissions|fix youtube api and emby logo|JellyStat: fix 500 by replacing writeLog() with valid info()/error() logging in route and plugin; keep debug logs|JellyStat: fix malformed metadata div HTML in embedded JS (remove stray quote) to prevent render break; keep hidden inline-popups anchor approach|JellyStat: Fix TV show poster dimensions to match movies (150x225)|Revert \"Fix JellyStat TV show play count aggregation and improve content type detection\"|This fixes issues where metadata popups wouldn't appear for items with|This fixes the 'Uncaught ReferenceError: formatDuration is not defined' error that was preventing|This fixes the missing JellyStat integration by including the JellyStatHomepageItem trait in the main Organizr class, enabling JellyStat to appear as a homepage item.|This should fix the 'N/A' display issue under posters and provide more accurate year information when available from the JellyStat API data.|WIP: Fix domainsBlocked function syntax error (partial fix)",
    "notes": "- Activity log approach counts each time content is started, not just per-user|- Actor thumbnails via JellyStat image proxy|- Align plugin data with JellyStat web UI for consistent most viewed statistics|- Aligns with standard types used by other working plugins (Emby, etc.)|- All buttons now have correct HTML structure without extra closing span tags|- All functionality retained while resolving syntax validation errors|- All JavaScript code now properly escaped for PHP string context|- Allows save button to appear when select values are modified in plugin settings|- All PHP syntax errors resolved, plugin now parses correctly|- All PHP syntax errors resolved - file now parses correctly|- Applied consistent styling across movies, TV shows, and music sections|- Apply glass gradient background for overlay text visibility|- Apply ID sanitization to both movies and TV shows poster sections|- Authorization header now correctly formatted as 'Bearer \u003Ctoken\u003E' exactly once|- Auto-refresh functionality with real-time update indicators|- Backend API was already implemented, issue was missing frontend case|- Backend now uses internal URL (e.g., http://192.168.80.77:3000) for API requests|- Better debugging information for JellyStat API integration issues|- Better differentiation between series-level and episode-level IDs|- Better error handling and fallback displays|- Better error messages and timeout handling|- Better stream analysis for accurate content classification|- Both endpoints follow the same pattern as other test connection routes|- Calculate totals and breakdowns across all libraries for better insights|- Cast duration and rating to '0' strings instead of empty to avoid undefined access errors|- Chain logging methods directly after setLoggerChannel call|- Changed all debug() calls to info() to ensure log messages appear|- Changed all text to white with proper contrast and shadows|- Changed fillWidth from 400 to 200 to match working JellyStat proxy URLs|- Changed from Bearer token to query parameter authentication (?apiKey=)|- Changed settingsOption type from 'multiple-api-key' to 'token' for userWatchStatsApikey|- Changed settingsOption type from 'multiple-url' to 'url' for userWatchStatsURL|- Changed single quotes to double quotes in JavaScript string literals within PHP heredoc|- Changed single quotes to double quotes to prevent PHP parse error|- Changed text to white with subtle text shadows for excellent readability|- Change from POST request with Bearer token headers to GET request with query parameters|- Check for empty/null responses, JSON decode failures, and various error strings|- Cleaner implementation that directly shows the modal instead of triggering hidden links|- Clean up debug logging that was causing PHP errors|- Clean up test and simple plugin versions|- Cleanup trap for safer execution|- Clean up UI for better integration with existing theme|- Compatible with existing Organizr modal system using #database modal|- Completes the JellyStat homepage integration by providing the API endpoint|- Comprehensive configuration options including refresh intervals, display toggles|- Comprehensive metadata fetching with multiple endpoint fallbacks|- Comprehensive tagline and summary handling|- Configurable display options and auto-refresh intervals|- Configurable time periods and result limits|- Configuration updates for plugin settings|- Connection testing for all supported media servers|- Content type breakdown table now uses the standard formatDuration function|- Core API modifications to support embyLiveTVTracker functionality|- Correct malformed string concatenation in loading state|- Count how many users have marked each item as 'Played'|- Counts actual PlaybackStart events from the last X days|- Create comprehensive userWatchStats.php homepage item trait|- Created floating poster design that blends seamlessly with Organizr theme|- Created Netflix-style single-row scrolling experience for posters|- Created seamless glass container that integrates with any Organizr theme|- Created test homepage plugin file with identical functionality to existing plugins|- Create userWatchStats_simple.php with minimal implementation|- CSV is automatically downloaded as 'organizr_logs.csv' file|- Debug which ID is being selected for poster generation|- Display all connection fields (Plex, Emby, Jellyfin) directly in settings array|- Dual display modes: native statistics view and embedded interface|- Duration conversion from Jellyfin ticks to milliseconds|- Enable independent configuration for Plex (Tautulli), Emby, and Jellyfin servers|- Enables better log level management and filtering|- Enables the test connection buttons in the JellyStat and UserWatchStats plugin settings|- Enhanced curl with failure detection|- Enhanced dual URL support for internal HTTP API calls and external HTTPS poster display|- Enhanced error handling and logging for API calls|- Enhanced error handling with graceful fallbacks|- Enhanced error reporting with specific API endpoint failure details|- Enhanced header styling with white text and clean typography|- Enhanced history API call with date filtering using startDate parameter|- Enhanced library details table with type icons, episode/season counts, and watch time|- Enhanced logic for choosing between ParentId and NowPlayingItemId|- Enhanced poster styling with rounded corners and deeper shadows|- Enhanced TV show ID selection logic for better series poster identification|- Enhanced TV show year extraction to check SeriesProductionYear, ProductionYear, and PremiereDate fields|- Enhanced typography with improved line-height and word wrapping|- Enhanced year extraction from series and movie metadata|- Enhance getJellyStatMetadata() to return real metadata from JellyStat|- Enhance visual design with proper icons and badges for media types|- Ensure all metadata fields are properly cast to strings to prevent JavaScript 'replace' errors|- Ensured year text is always visible when available (no more cutoff)|- Ensure fallback method is called in all failure scenarios|- Ensure matching defaults for homepage functionality|- Ensure no conflicts with existing Tautulli plugin configuration|- Ensure play counts match JellyStat's native UI statistics|- Ensure proper escaping in embedded JS and sanitize poster IDs|- Ensure proper trait loading and function references|- Ensures all poster sections (movies, shows, music) use consistent escaping|- Ensures most_watched array gets populated even when DatePlayed API fails|- Ensures Organizr's change detection works properly for dropdown selections|- Ensures PHP string concatenation works correctly in all poster sections|- Ensures poster images, actor images, and thumbnails load correctly|- Ensures proper Bearer token format without duplication|- Ensures proper JavaScript syntax for UI rendering|- Ensures save button and form interactions work correctly|- Ensures unique series posters instead of overlaid/repeated images|- Expanded exception handling from Requests_Exception to all Exception types|- Expanded text info area from 45px to 85px height (80% more space)|- Extract metadata like year, title, and play statistics from history|- Falls back to JellyStat's own endpoints if media servers aren't configured|- Falls back to user aggregation method if activity log isn't accessible|- Filter out archived content from results|- Focus on available JellyStat API data (getLibraries endpoint)|- Focus on Plex/Tautulli connection testing for debugging|- Follow existing plugin configuration patterns for consistency|- Follows Organizr plugin architecture and conventions|- Follows same pattern as EmbyLiveTVTracker plugin for proper form validation|- Frontend continues to use external URL (e.g., https://jellystat.glassnetworks.net) for poster images|- Frontend now properly calls getJellyStatMetadata for JellyStat posters|- Full Emby/Jellyfin data structure compatibility for buildMetadata()|- Function positioned before existing logContext function for logical organization|- Group content by unique identifiers and count play occurrences|- Handle different response formats from Emby API endpoints|- Handle edge cases for content type detection and missing data|- Help diagnose the 500 Internal Server Error issue|- Homepage route integration for Live TV monitoring|- If internal URL is not set, falls back to main URL for backwards compatibility|- Iframe mode embeds full JellyStat interface with configurable height|- Iframe mode now only requires jellyStatURL (not API key)|- Implement activity log-based approach for getting most watched content|- Implement content type breakdown table showing distribution by media type|- Implemented buildJellyStatMetadata() function to generate popup HTML|- Implemented fallback API testing with /api/getUsers endpoint|- Implemented horizontal scrolling carousel instead of grid wrapping|- Implement fetchJellyStatMostViewedByType method that uses JellyStat's /stats/getMostViewedByType endpoint|- Implement poster cards with responsive grid layout|- Implement sortable columns (title, type, plays, runtime, year)|- Improve collapsible sections for user stats and recent activity|- Improve content type detection logic for movies vs music vs TV shows|- Improve data aggregation across all users for server-wide statistics|- Improved connectivity testing with fallback checks|- Improve debugging with console logging for poster URLs and IDs|- Improved error detection to catch SQLite exceptions from DatePlayed sorting|- Improved error messages for failed API key validation|- Improved item ID extraction from JellyStat history API for proper poster generation|- Improved logging for debugging|- Improved movie year extraction to check ProductionYear and PremiereDate fields|- Improved URL construction with better trailing slash handling|- Improved URL construction with proper trailing slash handling|- Improved visual hierarchy with transparent backgrounds and white text|- Improved visual layout with colored summary boxes and detailed statistics|- Improve error handling for missing movie/show/music data|- Improve logging for route/method to aid debugging|- Improves log accessibility through Organizr's admin interface|- Improve TV show ID extraction logic to use SeriesId and ShowId fields|- Include getPosterUrl helper for image URL generation|- Include JavaScript for refresh functionality and API integration|- Include proper error handling and logging|- Include response status, data counts, and error details|- Include search functionality for filtering by title|- Include settings for media server selection, display modes, refresh intervals, and UI options|- Include SSL certificate options (disable cert check, custom certificate)|- Includes user statistics, watch time, top users, and activity tracking|- Increased page size from 500 to 10,000 items to capture more complete data|- Increased poster height from 280px to 320px for more text space|- Jellyfin is preferred over Emby when both are configured (since JellyStat tracks Jellyfin)|- JellyStat metadata function now checks if Emby or Jellyfin is configured|- JellyStat metadata popups should now work with Organizr's built-in system|- JellyStat plugin can now properly display analytics data on homepage|- Link button now shows proper Emby/Jellyfin icon and opens in correct tab|- Log all available ID fields for TV shows to understand data structure|- Log each step of the fetchJellyStatMostViewedByType method|- Log what parameters are passed and how URLs are constructed|- Made connection fields dynamic based on selected media server (only shows relevant fields)|- Made fallback more aggressive to handle edge cases|- Maintain consistency with existing Organizr plugin architecture|- Maintain consistent poster aspect ratios across all content types|- Maintain dual URL support (external HTTPS for frontend, internal HTTP for backend)|- Maintained all core functionality for Emby integration|- Maintained all functionality while providing completely transparent design|- Maintained fallback to episode name year extraction for TV shows as last resort|- Maintain play count badges and poster functionality|- Maintain text visibility and readability while removing background shapes|- Matches native Emby/Jellyfin plugin behavior for consistency|- Modified jellystatHomepagePermissions to dynamically check display mode|- Modified poster display to hide year text when N/A instead of showing 'N/A'|- Modify all API methods to use dedicated settings instead of global configs|- Move helper functions to top of script before they are called|- Movies, TV shows, and music poster sections all work correctly|- Native mode displays libraries, users, most watched content, and recent activity|- Native mode still requires both jellyStatURL and jellyStatApikey|- New homepage plugin for tracking Emby Live TV usage|- Now shows actual watch statistics instead of placeholder data|- Official JellyStat icon integration|- Only the /test/jellystat endpoint was actually needed as it was missing|- Only use JellyStat proxy URLs as fallback when metadata comes from JellyStat itself|- Organizr default log level is INFO, so DEBUG messages weren't showing|- PHP syntax validation now passes|- PHP syntax validation now passes (php -l)|- PHP syntax validation now passes without errors|- Plugin icon and interface components|- Plugin now properly displays most watched content and user statistics|- Plugin now works identically to EmbyLiveTVTracker with proper save button behavior|- Plugin should now function normally again|- Plugin still uses dedicated URL/token fields for functionality, but permissions now check global keys|- Poster cards now use standard Organizr metadata popup integration with data-source='jellystat'|- Posters now display a popup with title, year, play count, type, and source information|- Posters should now display correctly instead of white placeholder boxes|- Preserve JellyStat image proxy integration with proper endpoint format|- Preserve original IDs in data-key attributes for API calls|- Prevents JavaScript syntax errors that were breaking the page|- Prioritize SeriesId and ShowId over generic IDs for better series poster identification|- Process history to identify movies, TV shows, and music based on duration and metadata|- Proper error handling and permission controls|- Proper image URL generation with JellyStat proxy endpoints|- Proper integration with Organizr's HTTP client and patterns|- Properly escape backslashes and quotes for JavaScript embedded in PHP|- Properly escaped all JavaScript quotes in PHP strings to avoid syntax errors|- Properly escaped single quotes in JavaScript onclick handlers|- Provides complete homepage widget structure for proper form integration|- Provides consistent logging across the application|- Provides foundation for enhanced metadata display consistent with other media server plugins|- Provides true 'most watched' based on user engagement|- Query each user's watched content and sum play counts by item|- Query increased to fetch more items per user for better accuracy.|- Reduce poster card height from 320px to 225px (poster only)|- Remove 10,000 record limit that was causing incomplete play count statistics|- Remove calls to non-existent /stats/getMostViewedByType endpoint|- Remove custom JavaScript click handler in favor of built-in metadata-get system|- Removed all white box backgrounds from poster cards for cleaner look|- Removed duplicate /test/userWatchStats route at line 790-811|- Removed excessive debugging logs for cleaner output|- Removed fallback to non-existent /api/getUsers endpoint|- Removed incorrect API key authentication for image proxy (not needed)|- Removed problematic hidden elements and trigger mechanism|- Removed unused fetchJellyStatMostViewedByType method for cleaner codebase|- Remove duplicate function definitions at bottom|- Remove dynamic connection fields method that was causing settings discovery to fail|- Remove excessive escaping in error handling|- Remove hardcoded domain mapping and use configured URL directly|- Remove license check from userWatchStats.php to enable plugin|- Remove non-existent HomepageUserWatchStats trait that was causing fatal errors|- Remove problematic activity log approach that was returning auth events|- Remove problematic apostrophes in JavaScript comments within PHP strings|- Remove static text display under posters for cleaner look|- Replace conflicting Tautulli config variables with unique ones|- Replaced complex JavaScript string concatenation that was causing PHP parse errors|- Replace double-quote escaping with single quotes in onerror handlers|- Replaced single quotes with double quotes in CSS display values ('none', 'flex')|- Replaced white-box container with modern transparent glass design|- Replace error_log() calls with -\u003EwriteLog('debug', ...)|- Replace incorrect writeLog() calls with setLoggerChannel() and logger-\u003Edebug()|- Replace label badge classes with direct color styling|- Replace manual history processing with native API calls for accurate most viewed data|- Replace non-existent API endpoints with real /api/getHistory endpoint|- Replace problematic regex backreference with explicit string manipulation|- Replace simple fallback with proper play count aggregation|- Replace single quotes with escaped double quotes in onerror handlers|- Required for plugin to function properly in settings interface and homepage display|- Resolved fatal error: formatDuration method collision|- Resolved mixed content issues and SSL certificate problems|- Resolves 401 Unauthorized errors introduced in commit d1504c304|- Resolves 500 Internal Server Error on JellyStat test connection|- Resolves issue where save button wasn't appearing for User Watch Stats plugin|- Restore original working approach using /api/getHistory with processJellyStatHistory|- Retrieve real play counts from Emby's PlayCount field.|- Reverted formatJellyStatDuration back to formatDuration in jellystat.php|- Revert formatJellyStatDuration back to formatDuration in JellyStat component|- Rich metadata extraction including title, year, genres, ratings, duration, cast|- Route calls getUserWatchStatsSimple() method from HomepageUserWatchStatsSimple trait|- Route follows same pattern as other homepage items like userWatchStats|- Should now match native JellyStat UI statistics more accurately|- Should now properly create log entries in JellyStat channel|- Should now see JellyStat logging output in the logs|- Should provide more accurate play counts by tracking actual playback events|- Should resolve poster loading issues for TV shows and movies|- Should resolve TV shows displaying collection posters instead of series posters|- Simplified modal approach by directly using #database modal|- Simplified test logic to focus on /api/getLibraries endpoint|- Simplified the UI to use basic table view with proper error handling|- Simplified TV show ID selection logic for poster generation|- Simplify and harden getJellyStatMetadata response path|- Simplify settings to avoid form complexity issues|- Simplify to use direct media item retrieval sorted by DatePlayed|- Sort by play count to generate most watched/listened lists|- Sort by total plays across all users for true 'most watched'|- SSL certificate support and connection testing|- Support for all media types (movies, TV shows, music)|- Support for GITHUB_REPO environment variable|- Support for movies (2:3 aspect), shows (2:3 aspect), and music (1:1 aspect)|- Support for Plex (via Tautulli), Emby, and Jellyfin|- Support for top users, most watched content, and recent activity|- Support Movie, Series, and Audio content types with configurable days and limits|- Support poster display for movies, shows, and music cover art|- Switch from unreliable Emby PlayCount to reliable Played flag|- Test connection now properly validates working JellyStat API endpoints|- The jellyStatImageBaseUrl is now properly initialized at the beginning of the function|- The original route at line 147-168 was already present and functional|- This enables the save button in settings interface by requiring these fields|  - This ensures both URL and API key are validated before allowing access|- This ensures the plugin appears properly in Organizr's homepage settings interface|- This isolates whether naming or registration conventions affect UI integration and save button visibility|- This matches the pattern used by /api/getLibraries and /api/getHistory which work correctly|- This matches the pattern used by EmbyLiveTVTracker and ensures Organizr recognizes the required fields for enabling the save button|- This provides rich metadata for JellyStat homepage items when a compatible media server is available|- This resolves mixed content issues while maintaining SSL certificate compatibility|- This resolves the 404 error when clicking on JellyStat poster cards for metadata popups|- This should help identify what data is available from Emby|- This should now show recently played movies/episodes as most watched|- This should provide accurate aggregation of total plays.|- This should provide more accurate play counts matching native JellyStat UI|- This should resolve the save button issue in plugin settings|- This URL is consistently used for all image generation (item posters and actor thumbnails)|- This will help identify why posters show as white boxes|- Track metadata source (Emby/Jellyfin/JellyStat) when fetching item details|- Try 3 different approaches: DatePlayed sort, general items, and latest items|  - Update all related config references throughout the plugin|- Update connection test method with proper server-specific API calls|- Updated all functions to use global config keys (plexURL/plexToken, embyURL/embyToken, jellyfinURL/jellyfinToken)|- Updated API endpoints to match actual JellyStat API structure|- Updated data mapping to handle JellyStat response format|- Updated data retrieval functions to use global config keys|- Updated routes for connection testing and plugin management|- Updated test connection to work with global config keys for all media servers|- Updated to use /proxy/Items/Images/Primary?id={id}&fillWidth=400&quality=90|- Updated userWatchStatsHomepagePermissions() to check global media server config keys (plexURL/plexToken, embyURL/embyToken, jellyfinURL/jellyfinToken) based on selected server|- Update getJellyStatMetadata method to return safer data structure with proper string values|- Update JellyStat to use formatJellyStatDuration instead of formatDuration for better consistency|- Update organizr.class.php to use only primary plugin trait|- Update permissions to use unique config variables|  - Update userWatchStatsApikey \u2192 homepageUserWatchStatsToken|  - Update userWatchStatsURL \u2192 homepageUserWatchStatsURL|- Use 1,000 records per page for optimal API performance|- Use Bearer token authentication as required by JellyStat stats API|- Used flexbox for perfect text centering within poster info area|- Use direct media server URLs with authentication tokens for images when metadata comes from Emby/Jellyfin|- Used trait conflict resolution to prioritize JellyStatHomepageItem::formatDuration|- Use fallback to counting Played flag if PlayCount is not available.|- Use fillWidth=200 instead of 400 to match working JellyStat proxy format|- Useful for debugging mixed content and URL resolution issues|- Use JellyStat channel for all debug logging|- Use proper writeLog() method for debugging|- Use sanitized IDs for HTML element IDs and CSS selectors|- Use setLoggerChannel('JellyStat')-\u003Edebug() pattern like EmbyLiveTVTracker|- Use static field definitions instead of calling getUserWatchStatsConnectionFields()|- Uses unique config variable names to prevent conflicts with Tautulli plugin|- Use theme-appropriate colors: blue (#337ab7) for primary stats, light blue (#5bc0de) for secondary stats, green (#5cb85c) for totals|- Use the same authentication method (?apiKey=) as other working JellyStat API endpoints|- Use unique identifiers to prevent conflicts with original plugin|- Use userWatchStatsURL, userWatchStatsApikey instead of tautulliURL, tautulliApikey|- When available, fetches rich metadata directly from the media server|- Will help identify correct field to use for series posters vs collection posters|- Will help identify why play counts don't match native UI|- Works around Emby's PlayCount tracking issues|aggregated to the series level, causing incorrect play counts in the plugin|Changed api key info from overview to app keys tab.|Change JellyStat logging from debug to info level|compared to JellyStat's native interface.|Complete User Watch Stats plugin with dynamic connection fields and proper save button functionality|consistent popup functionality across all poster content.|debug and try posters|dont send login if bypass|enhance debugging|Enhanced JellyStat metadata implementation|Enhance Emby most watched content retrieval|Enhance error detection and fallback triggering|Enhance JellyStat native stats with comprehensive analytics|Enhance User Watch Statistics UI with filtering, sorting, and improved layout|feat: integrate HomepageUserWatchStats trait and improve JellyStat duration formatting|feat: JellyStat metadata now uses Emby/Jellyfin as fallback source|history data for TV shows. This will help us understand why library|IDs containing special characters or starting with digits, ensuring|Implement Netflix-style hover overlay for JellyStat posters|Implement pagination for JellyStat history API to fetch complete play data|Implement proper most watched aggregation across all users|Implement proper most watched aggregation using real play counts from all Emby users|Improve linux-update.sh with better error handling|Improve play count aggregation|Improve TV show poster ID selection logic|Improve year extraction and display for JellyStat posters|include user stats|JellyStat: implement real metadata fetch for popup; try JellyStat API/proxy, map fields to buildMetadata schema (title, year, genres, rating, duration, image) with graceful fallbacks|JellyStat: Replace Unicode escapes with literal HTML angle brackets for consistency|JellyStat homepage: enable metadata popups end-to-end|Make bg transparent|metadata feat: keep Emby/Jellyfin link visible even if metadata fetch fails for JellyStat popups|posters are being used instead of series posters.|Posters now display full titles without cutoff and scroll horizontally in a single row.|proper configuration validation for both homepage plugins.|Ready for remote testing via POST /api/v2/homepage/jellystat/metadata|Remove all writeLog calls that don't exist in current Organizr version|Remove colored oval badges and apply colors directly to text|Remove debug code that broke JellyStat plugin|Remove homepageOrderUserWatchStats case block from buildHomepageSettings method|Remove white boxes and create modern transparent poster design|rename the plugin in settings|  required by the frontend JavaScript for data fetching|Revert to using /api/getHistory endpoint for most watched content|Streamline JellyStat test connection to use only available endpoints|Temporarily comment out JellyStatHomepageItem trait for debugging|the JellyStat homepage widget from displaying data after it successfully loaded from the API.|The JellyStat plugin has its own formatJellyStatDuration() function that should be used instead.|The plugin now has a modern, clean appearance without any white boxes or N/A text clutter.|The posters now have a modern, Netflix-style appearance without bulky containers.|The real issue was that the JavaScript code was calling formatDuration() which doesn't exist.|These changes resolve API endpoint authorization errors by ensuring|These changes resolve the primary causes of page crashes and PHP warnings.|This resolves discrepancies where TV show episodes were not being properly|This reverts commit f83bfc62431a5e676f24f9ee26b095885a645a8c.|Try Emby activity log for accurate play counts|Update JellyStat debug logging to use Organizr's native logging system|Update JellyStat plugin to use actual API data with poster display|Update ko[Korean].json|Update pihole widget to use the v6 api|update to use the v6 api|Use Played flag instead of PlayCount for accurate statistics|Wait for Switchery to update the checkbox state"
  }
}