Compare commits

...

1824 commits

Author SHA1 Message Date
JonnyWong16
1144bba580
v2.15.3
Some checks failed
Publish Snap / Build Snap Package (armhf) (push) Has been cancelled
Publish Docker / Build Docker Image (push) Has been cancelled
Publish Snap / Build Snap Package (arm64) (push) Has been cancelled
CodeQL / CodeQL Analysis (push) Has been cancelled
Publish Snap / Build Snap Package (amd64) (push) Has been cancelled
Publish Installers / Build MacOS Installer (push) Has been cancelled
Publish Installers / Build Windows Installer (push) Has been cancelled
Publish Snap / Discord Notification (push) Has been cancelled
Publish Docker / Discord Notification (push) Has been cancelled
Publish Installers / Discord Notification (push) Has been cancelled
Publish Installers / VirusTotal Scan (push) Has been cancelled
Publish Installers / Release Installers (push) Has been cancelled
2025-08-03 10:17:15 -07:00
JonnyWong16
443eb8da15
Disable browser autocomplete in notification and newsletter configs
Fixes #2557
2025-08-03 10:10:01 -07:00
Komu Wairagu
5ecd570f95
Allow users to set config values through environment variables. (#2543)
* - Allow users to set config values through environment variables.
- Fixes: https://github.com/Tautulli/Tautulli/issues/2309

* Prefix environment variables with `TAUTULLI_`
For: https://github.com/Tautulli/Tautulli/issues/2309

* Update handling Tautulli environment variables

* Add log message when environment variable not saved to config

---------

Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>
2025-08-03 09:42:58 -07:00
Tom Niget
b8589513c1
Remove duplicate "Total" entry in graph tooltips (#2534) 2025-08-03 09:42:44 -07:00
JonnyWong16
d46710962c
Add ability to return svg files using pms_image_proxy 2025-08-03 09:35:06 -07:00
JonnyWong16
5921a7d83f
Fix rounding of minutes in global stats play duration
Some checks failed
CodeQL / CodeQL Analysis (push) Has been cancelled
Publish Docker / Build Docker Image (push) Has been cancelled
Publish Installers / Build MacOS Installer (push) Has been cancelled
Publish Installers / Build Windows Installer (push) Has been cancelled
Publish Snap / Build Snap Package (amd64) (push) Has been cancelled
Publish Snap / Build Snap Package (arm64) (push) Has been cancelled
Publish Snap / Build Snap Package (armhf) (push) Has been cancelled
Publish Docker / Discord Notification (push) Has been cancelled
Publish Installers / VirusTotal Scan (push) Has been cancelled
Publish Installers / Release Installers (push) Has been cancelled
Publish Installers / Discord Notification (push) Has been cancelled
Publish Snap / Discord Notification (push) Has been cancelled
2025-07-14 19:54:45 -07:00
JonnyWong16
9a6253d775
Enable jquery.scrollbar on macosx and webkit
Fixes #2221

Ref: gromo/jquery.scrollbar#134
2025-05-10 16:30:02 -07:00
JonnyWong16
43fc7eebfe
Update is_hdr helper function 2025-05-10 16:26:12 -07:00
JonnyWong16
c4f8a81190
Add hearingImpaired and visualImparied to exporter fields
* `hearingImpaired` for `SubtitleStreams`
* `visualImpaired` for `AudioStreams`
2025-05-10 16:25:39 -07:00
JonnyWong16
f6bffe1850
Update plexapi==4.17.0 2025-05-10 16:13:23 -07:00
dependabot[bot]
3cb71f94a3
Bump plexapi from 4.16.1 to 4.17.0 (#2538)
Bumps [plexapi](https://github.com/pushingkarmaorg/python-plexapi) from 4.16.1 to 4.17.0.
- [Release notes](https://github.com/pushingkarmaorg/python-plexapi/releases)
- [Commits](https://github.com/pushingkarmaorg/python-plexapi/compare/4.16.1...4.17.0)

---
updated-dependencies:
- dependency-name: plexapi
  dependency-version: 4.17.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2025-05-10 16:10:03 -07:00
JonnyWong16
ff5edc06fe
Update crypto donation 2025-05-10 15:56:52 -07:00
JonnyWong16
cc88cffc1f
Fix retrieving history for collections/playlists with over 1000 items 2025-05-03 16:08:17 -07:00
JonnyWong16
e735294e1c
Uppercase ZIP archive export download tooltip 2025-04-18 18:21:27 -07:00
JonnyWong16
889026b092
Add auto sync winget fork to workflow 2025-04-12 16:56:10 -07:00
JonnyWong16
76f6a2da6b
v2.15.2 2025-04-12 16:02:46 -07:00
Tom Niget
d2a14ea6c0
Add hidden-by-default Total curve to the daily stream graph (#2497)
* Add hidden-by-default Total curve to the daily stream graph

* Update curve color

Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

---------

Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>
2025-04-12 15:58:28 -07:00
JonnyWong16
e6c0a12dd5
Add stream count to tab title on homepage
Closes #2517
2025-03-30 20:30:01 -07:00
JonnyWong16
24dd403a72
Activity card only link to library if section_id available 2025-03-29 20:42:53 -07:00
JonnyWong16
a876e006d6
Fix Trakt URL redirect to media page
Fixes #2513
2025-03-29 20:42:44 -07:00
dependabot[bot]
74786f0ed1
Bump cryptography from 43.0.3 to 44.0.2 (#2519)
Bumps [cryptography](https://github.com/pyca/cryptography) from 43.0.3 to 44.0.2.
- [Changelog](https://github.com/pyca/cryptography/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pyca/cryptography/compare/43.0.3...44.0.2)

---
updated-dependencies:
- dependency-name: cryptography
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-24 14:05:05 -07:00
dependabot[bot]
99e575383c
Bump pyopenssl from 24.2.1 to 25.0.0 (#2482)
Bumps [pyopenssl](https://github.com/pyca/pyopenssl) from 24.2.1 to 25.0.0.
- [Changelog](https://github.com/pyca/pyopenssl/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pyca/pyopenssl/compare/24.2.1...25.0.0)

---
updated-dependencies:
- dependency-name: pyopenssl
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2025-03-24 14:04:46 -07:00
JonnyWong16
3e784c7495
Check stream watched status before stopped status
Fixes #2506
2025-03-23 20:41:30 -07:00
JonnyWong16
68dc095c83
Do not redirect API requests to login page
Fixes #2490
2025-03-23 20:10:43 -07:00
JonnyWong16
ad2ec0e2bf
Fix CherryPy CORS response headers
Fixes #2279
2025-03-23 19:44:10 -07:00
JonnyWong16
09c28e434d
Check Pushover attachment under 5MB limit
Fixes #2396
2025-03-23 18:12:08 -07:00
JonnyWong16
cfc7b817b3
Downgrade pyinstaller to 6.10.0 2025-03-23 16:19:54 -07:00
JonnyWong16
b3aa29c677
Swap source and stream columns in steam info modal 2025-03-23 16:05:01 -07:00
JonnyWong16
e4d181ba5b
Add PATCH method for webhooks 2025-03-16 12:26:34 -07:00
JonnyWong16
53e5f89725
Add audio profile notification parameters 2025-03-16 12:26:33 -07:00
JonnyWong16
0879b848b9
Add link to library page from activity card media type icon 2025-03-16 12:26:32 -07:00
JonnyWong16
c70381c3ff
Fix ntfy notifications not sending if provider link is blank 2025-03-16 12:26:30 -07:00
JonnyWong16
f23d3eb81c
Fix changelog username 2025-03-16 12:26:28 -07:00
luzpaz
2ed603f288
Fix typos (#2520)
Found via codespell
2025-03-16 12:25:29 -07:00
JonnyWong16
a96fd23d72
v2.15.1 2025-01-11 15:27:24 -08:00
JonnyWong16
65dc466c07
Add Github token to release virus scan 2025-01-09 15:13:20 -08:00
JonnyWong16
0a4730625c
Update copyright year 2025-01-09 15:12:49 -08:00
JonnyWong16
67fa4ca645
Add logos to season and episode exports 2025-01-09 10:45:49 -08:00
JonnyWong16
078c293bd7
Update plexapi=4.16.1 2025-01-09 10:45:29 -08:00
JonnyWong16
85e9237608
Update pyjwt==2.10.1 2025-01-09 10:16:47 -08:00
dependabot[bot]
f9b3631745
Bump pyjwt from 2.10.0 to 2.10.1 (#2445)
Bumps [pyjwt](https://github.com/jpadilla/pyjwt) from 2.10.0 to 2.10.1.
- [Release notes](https://github.com/jpadilla/pyjwt/releases)
- [Changelog](https://github.com/jpadilla/pyjwt/blob/master/CHANGELOG.rst)
- [Commits](https://github.com/jpadilla/pyjwt/compare/2.10.0...2.10.1)

---
updated-dependencies:
- dependency-name: pyjwt
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2025-01-09 10:14:37 -08:00
JonnyWong16
8f03e27617
Add VirusTotal scan to installer build CI 2025-01-09 09:57:58 -08:00
JonnyWong16
63fe386057
Disable basic auth for /newsletter and /image endpoints
Fixes #2472
2025-01-09 09:13:57 -08:00
chrisdecker08
b7c4f2eefe
detect HDR transcodes via colorTrc attribute (#2466) 2024-12-14 12:24:08 -08:00
JonnyWong16
37ef098718
Flip docker container healthcheck https first 2024-11-28 16:36:03 -08:00
JonnyWong16
78864d7a97
v2.15.0 2024-11-24 14:57:29 -08:00
JonnyWong16
62a05712f8
Add logos to exporter 2024-11-24 14:55:51 -08:00
JonnyWong16
ca0e1c321d
Convert CustomArrow to string in newsletter raw json 2024-11-24 14:17:35 -08:00
JonnyWong16
b9cb7102c4
Add plex_slug and plex_watch_url to nofication parameters 2024-11-19 10:58:55 -08:00
JonnyWong16
6e6fe1fb65
Add slugs to metadata details 2024-11-19 10:36:34 -08:00
peagravel
9c473c6528
Add friendly name to the top bar of config modals (#2432) 2024-11-19 10:14:45 -08:00
Castle
5c38de0dfb
Allow Telegram blockquote expandable (#2427)
* Allow Telegram blockquote expandable

Blockquote is not yet supported, this feature adds support along with expandable functionality.

* Add support for tg-emoji in Telegram HTML

---------

Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>
2024-11-19 10:12:00 -08:00
JonnyWong16
ea66f6713b
Add hasVoiceActivity to exporter fields 2024-11-19 10:09:02 -08:00
dependabot[bot]
dd9a35df51
Bump pyjwt from 2.9.0 to 2.10.0 (#2441)
* Bump pyjwt from 2.9.0 to 2.10.0

Bumps [pyjwt](https://github.com/jpadilla/pyjwt) from 2.9.0 to 2.10.0.
- [Release notes](https://github.com/jpadilla/pyjwt/releases)
- [Changelog](https://github.com/jpadilla/pyjwt/blob/master/CHANGELOG.rst)
- [Commits](https://github.com/jpadilla/pyjwt/compare/2.9.0...2.10.0)

---
updated-dependencies:
- dependency-name: pyjwt
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update pyjwt==2.10.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-11-19 10:01:27 -08:00
dependabot[bot]
feca713b76
Bump dnspython from 2.6.1 to 2.7.0 (#2440)
* Bump dnspython from 2.6.1 to 2.7.0

Bumps [dnspython](https://github.com/rthalley/dnspython) from 2.6.1 to 2.7.0.
- [Release notes](https://github.com/rthalley/dnspython/releases)
- [Changelog](https://github.com/rthalley/dnspython/blob/main/doc/whatsnew.rst)
- [Commits](https://github.com/rthalley/dnspython/compare/v2.6.1...v2.7.0)

---
updated-dependencies:
- dependency-name: dnspython
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update dnspython==2.7.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-11-19 10:00:50 -08:00
dependabot[bot]
0836fb902c
Bump plexapi from 4.15.16 to 4.16.0 (#2439)
* Bump plexapi from 4.15.16 to 4.16.0

Bumps [plexapi](https://github.com/pkkid/python-plexapi) from 4.15.16 to 4.16.0.
- [Release notes](https://github.com/pkkid/python-plexapi/releases)
- [Commits](https://github.com/pkkid/python-plexapi/compare/4.15.16...4.16.0)

---
updated-dependencies:
- dependency-name: plexapi
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update plexapi==4.16.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-11-19 10:00:37 -08:00
dependabot[bot]
eb2c372d82
Bump bleach from 6.1.0 to 6.2.0 (#2438)
* Bump bleach from 6.1.0 to 6.2.0

Bumps [bleach](https://github.com/mozilla/bleach) from 6.1.0 to 6.2.0.
- [Changelog](https://github.com/mozilla/bleach/blob/main/CHANGES)
- [Commits](https://github.com/mozilla/bleach/compare/v6.1.0...v6.2.0)

---
updated-dependencies:
- dependency-name: bleach
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update bleach==6.2.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-11-19 10:00:24 -08:00
dependabot[bot]
be2e63e7e0
Bump pyparsing from 3.1.4 to 3.2.0 (#2437)
* Bump pyparsing from 3.1.4 to 3.2.0

Bumps [pyparsing](https://github.com/pyparsing/pyparsing) from 3.1.4 to 3.2.0.
- [Release notes](https://github.com/pyparsing/pyparsing/releases)
- [Changelog](https://github.com/pyparsing/pyparsing/blob/master/CHANGES)
- [Commits](https://github.com/pyparsing/pyparsing/compare/3.1.4...3.2.0)

---
updated-dependencies:
- dependency-name: pyparsing
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update pyparsing==3.2.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-11-19 10:00:11 -08:00
dependabot[bot]
2fe3f039cc
Bump tokenize-rt from 6.0.0 to 6.1.0 (#2436)
* Bump tokenize-rt from 6.0.0 to 6.1.0

Bumps [tokenize-rt](https://github.com/asottile/tokenize-rt) from 6.0.0 to 6.1.0.
- [Commits](https://github.com/asottile/tokenize-rt/compare/v6.0.0...v6.1.0)

---
updated-dependencies:
- dependency-name: tokenize-rt
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update tokenize-rt==6.1.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-11-19 09:59:58 -08:00
dependabot[bot]
baf926e5db
Bump markupsafe from 2.1.5 to 3.0.2 (#2435)
Bumps [markupsafe](https://github.com/pallets/markupsafe) from 2.1.5 to 3.0.2.
- [Release notes](https://github.com/pallets/markupsafe/releases)
- [Changelog](https://github.com/pallets/markupsafe/blob/main/CHANGES.rst)
- [Commits](https://github.com/pallets/markupsafe/compare/2.1.5...3.0.2)

---
updated-dependencies:
- dependency-name: markupsafe
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2024-11-19 09:59:40 -08:00
JonnyWong16
85b63fb61a
Remove backports.zoneinfo 2024-11-19 09:34:49 -08:00
JonnyWong16
afc29604cc
Bump zipp==3.21.0
Closes #2433
2024-11-19 09:34:48 -08:00
JonnyWong16
5b47cebdc7
Bump minimum Python version to 3.9 2024-11-16 15:21:41 -08:00
JonnyWong16
d9f38f9390
Fix artist title for fixing metadata match
Fixes #2429
2024-11-16 15:19:57 -08:00
JonnyWong16
86d775a586
Update OneSignal API calls 2024-11-16 15:19:56 -08:00
dependabot[bot]
ddb4f6131b
Bump pyinstaller from 6.8.0 to 6.11.1 (#2431)
Bumps [pyinstaller](https://github.com/pyinstaller/pyinstaller) from 6.8.0 to 6.11.1.
- [Release notes](https://github.com/pyinstaller/pyinstaller/releases)
- [Changelog](https://github.com/pyinstaller/pyinstaller/blob/develop/doc/CHANGES.rst)
- [Commits](https://github.com/pyinstaller/pyinstaller/compare/v6.8.0...v6.11.1)

---
updated-dependencies:
- dependency-name: pyinstaller
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-11-16 15:02:52 -08:00
dependabot[bot]
599e52de6a
Bump cryptography from 43.0.0 to 43.0.3 (#2421)
Bumps [cryptography](https://github.com/pyca/cryptography) from 43.0.0 to 43.0.3.
- [Changelog](https://github.com/pyca/cryptography/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pyca/cryptography/compare/43.0.0...43.0.3)

---
updated-dependencies:
- dependency-name: cryptography
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2024-11-16 14:53:44 -08:00
dependabot[bot]
84be60cb36
Bump pywin32 from 306 to 308 (#2417)
Bumps [pywin32](https://github.com/mhammond/pywin32) from 306 to 308.
- [Release notes](https://github.com/mhammond/pywin32/releases)
- [Changelog](https://github.com/mhammond/pywin32/blob/main/CHANGES.txt)
- [Commits](https://github.com/mhammond/pywin32/commits)

---
updated-dependencies:
- dependency-name: pywin32
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2024-11-16 14:53:33 -08:00
dependabot[bot]
d9a87f9726
Bump packaging from 24.1 to 24.2 (#2428)
* Bump packaging from 24.1 to 24.2

Bumps [packaging](https://github.com/pypa/packaging) from 24.1 to 24.2.
- [Release notes](https://github.com/pypa/packaging/releases)
- [Changelog](https://github.com/pypa/packaging/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pypa/packaging/compare/24.1...24.2)

---
updated-dependencies:
- dependency-name: packaging
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update packaging==24.2

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-11-16 14:52:11 -08:00
dependabot[bot]
9289ead996
Bump mako from 1.3.5 to 1.3.6 (#2423)
* Bump mako from 1.3.5 to 1.3.6

Bumps [mako](https://github.com/sqlalchemy/mako) from 1.3.5 to 1.3.6.
- [Release notes](https://github.com/sqlalchemy/mako/releases)
- [Changelog](https://github.com/sqlalchemy/mako/blob/main/CHANGES)
- [Commits](https://github.com/sqlalchemy/mako/commits)

---
updated-dependencies:
- dependency-name: mako
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update mako==1.3.6

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-11-16 14:51:58 -08:00
dependabot[bot]
af752e0acc
Bump xmltodict from 0.13.0 to 0.14.2 (#2418)
* Bump xmltodict from 0.13.0 to 0.14.2

Bumps [xmltodict](https://github.com/martinblech/xmltodict) from 0.13.0 to 0.14.2.
- [Changelog](https://github.com/martinblech/xmltodict/blob/master/CHANGELOG.md)
- [Commits](https://github.com/martinblech/xmltodict/compare/v0.13.0...v0.14.2)

---
updated-dependencies:
- dependency-name: xmltodict
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update xmltodict==0.14.2

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-11-16 14:51:45 -08:00
dependabot[bot]
86abd130b0
Bump profilehooks from 1.12.0 to 1.13.0 (#2414)
* Bump profilehooks from 1.12.0 to 1.13.0

Bumps [profilehooks](https://github.com/mgedmin/profilehooks) from 1.12.0 to 1.13.0.
- [Changelog](https://github.com/mgedmin/profilehooks/blob/master/CHANGES.rst)
- [Commits](https://github.com/mgedmin/profilehooks/compare/1.12.0...1.13.0)

---
updated-dependencies:
- dependency-name: profilehooks
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update profilehooks==1.13.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-11-16 14:51:34 -08:00
dependabot[bot]
fc2c7cc871
Bump tzdata from 2024.1 to 2024.2 (#2409)
* Bump tzdata from 2024.1 to 2024.2

Bumps [tzdata](https://github.com/python/tzdata) from 2024.1 to 2024.2.
- [Release notes](https://github.com/python/tzdata/releases)
- [Changelog](https://github.com/python/tzdata/blob/master/NEWS.md)
- [Commits](https://github.com/python/tzdata/compare/2024.1...2024.2)

---
updated-dependencies:
- dependency-name: tzdata
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update tzdata==2024.2

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-11-16 14:51:22 -08:00
dependabot[bot]
025e8bcf58
Bump platformdirs from 4.2.2 to 4.3.6 (#2403)
* Bump platformdirs from 4.2.2 to 4.3.6

Bumps [platformdirs](https://github.com/tox-dev/platformdirs) from 4.2.2 to 4.3.6.
- [Release notes](https://github.com/tox-dev/platformdirs/releases)
- [Changelog](https://github.com/tox-dev/platformdirs/blob/main/CHANGES.rst)
- [Commits](https://github.com/tox-dev/platformdirs/compare/4.2.2...4.3.6)

---
updated-dependencies:
- dependency-name: platformdirs
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update platformdirs==4.3.6

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-11-16 14:51:10 -08:00
dependabot[bot]
bf07912711
Bump idna from 3.7 to 3.10 (#2400)
* Bump idna from 3.7 to 3.10

Bumps [idna](https://github.com/kjd/idna) from 3.7 to 3.10.
- [Release notes](https://github.com/kjd/idna/releases)
- [Changelog](https://github.com/kjd/idna/blob/master/HISTORY.rst)
- [Commits](https://github.com/kjd/idna/compare/v3.7...v3.10)

---
updated-dependencies:
- dependency-name: idna
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update idna==3.10

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-11-16 14:50:57 -08:00
dependabot[bot]
48b1c7b522
Bump pytz from 2024.1 to 2024.2 (#2398)
* Bump pytz from 2024.1 to 2024.2

Bumps [pytz](https://github.com/stub42/pytz) from 2024.1 to 2024.2.
- [Release notes](https://github.com/stub42/pytz/releases)
- [Commits](https://github.com/stub42/pytz/compare/release_2024.1...release_2024.2)

---
updated-dependencies:
- dependency-name: pytz
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update pytz==2024.2

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-11-16 14:49:08 -08:00
dependabot[bot]
e69852fa0e
Bump importlib-metadata from 8.2.0 to 8.5.0 (#2397)
* Bump importlib-metadata from 8.2.0 to 8.5.0

Bumps [importlib-metadata](https://github.com/python/importlib_metadata) from 8.2.0 to 8.5.0.
- [Release notes](https://github.com/python/importlib_metadata/releases)
- [Changelog](https://github.com/python/importlib_metadata/blob/main/NEWS.rst)
- [Commits](https://github.com/python/importlib_metadata/compare/v8.2.0...v8.5.0)

---
updated-dependencies:
- dependency-name: importlib-metadata
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update importlib-metadata==8.5.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-11-16 14:48:53 -08:00
dependabot[bot]
01589cb8b0
Bump importlib-resources from 6.4.0 to 6.4.5 (#2394)
* Bump importlib-resources from 6.4.0 to 6.4.5

Bumps [importlib-resources](https://github.com/python/importlib_resources) from 6.4.0 to 6.4.5.
- [Release notes](https://github.com/python/importlib_resources/releases)
- [Changelog](https://github.com/python/importlib_resources/blob/main/NEWS.rst)
- [Commits](https://github.com/python/importlib_resources/compare/v6.4.0...v6.4.5)

---
updated-dependencies:
- dependency-name: importlib-resources
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update importlib-resources==6.4.5

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-11-16 14:48:10 -08:00
dependabot[bot]
f3a2c02e96
Bump certifi from 2024.7.4 to 2024.8.30 (#2391)
* Bump certifi from 2024.7.4 to 2024.8.30

Bumps [certifi](https://github.com/certifi/python-certifi) from 2024.7.4 to 2024.8.30.
- [Commits](https://github.com/certifi/python-certifi/compare/2024.07.04...2024.08.30)

---
updated-dependencies:
- dependency-name: certifi
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update certifi==2024.8.30

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-11-16 14:47:58 -08:00
dependabot[bot]
d3f7eef84f
Bump pyparsing from 3.1.2 to 3.1.4 (#2388)
* Bump pyparsing from 3.1.2 to 3.1.4

Bumps [pyparsing](https://github.com/pyparsing/pyparsing) from 3.1.2 to 3.1.4.
- [Release notes](https://github.com/pyparsing/pyparsing/releases)
- [Changelog](https://github.com/pyparsing/pyparsing/blob/master/CHANGES)
- [Commits](https://github.com/pyparsing/pyparsing/compare/pyparsing_3.1.2...3.1.4)

---
updated-dependencies:
- dependency-name: pyparsing
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update pyparsing==3.1.4

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-11-16 14:47:48 -08:00
dependabot[bot]
2f3d24a0e7
Bump simplejson from 3.19.2 to 3.19.3 (#2379)
* Bump simplejson from 3.19.2 to 3.19.3

Bumps [simplejson](https://github.com/simplejson/simplejson) from 3.19.2 to 3.19.3.
- [Release notes](https://github.com/simplejson/simplejson/releases)
- [Changelog](https://github.com/simplejson/simplejson/blob/master/CHANGES.txt)
- [Commits](https://github.com/simplejson/simplejson/compare/v3.19.2...v3.19.3)

---
updated-dependencies:
- dependency-name: simplejson
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update simplejson==3.19.3

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-11-16 14:47:38 -08:00
JonnyWong16
2d3271376b
Remove unused cache_image function
Fixes #2426
2024-11-02 11:13:37 -07:00
JonnyWong16
940c2ae6cd
v2.14.6 2024-10-12 16:55:38 -07:00
JonnyWong16
1cdfd5f30a
Refactor scroller code 2024-09-28 14:30:40 -07:00
JonnyWong16
e3f4851883
Make recent rows touch scrollable 2024-09-28 13:17:09 -07:00
JonnyWong16
1353247b55
Allow formatting newsletter date parameters 2024-09-25 15:11:21 -07:00
JonnyWong16
3cf6560de3
Support apscheduler cron expressions 2024-09-25 11:54:55 -07:00
JonnyWong16
9ca8d59372
Fix auto-update not running 2024-09-23 16:52:17 -07:00
JonnyWong16
921a3a0af9
Round human duration to nearest significant base 2024-09-22 18:03:28 -07:00
JonnyWong16
3bb53f480e
Change snap package to cryptography 2024-09-21 14:17:08 -07:00
JonnyWong16
6979a4025f
v2.14.5 2024-09-20 20:29:15 -07:00
dependabot[bot]
cc1a325eac
Bump plexapi from 4.15.15 to 4.15.16 (#2383)
* Bump plexapi from 4.15.15 to 4.15.16

Bumps [plexapi](https://github.com/pkkid/python-plexapi) from 4.15.15 to 4.15.16.
- [Release notes](https://github.com/pkkid/python-plexapi/releases)
- [Commits](https://github.com/pkkid/python-plexapi/compare/4.15.15...4.15.16)

---
updated-dependencies:
- dependency-name: plexapi
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update plexapi==4.15.16

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-09-20 20:24:00 -07:00
JonnyWong16
de697cb2ca
Add 2k resolution override 2024-09-15 14:27:05 -07:00
JonnyWong16
596cf57d61
Do no initialize db connection in ActivityProcessor 2024-09-15 14:26:45 -07:00
JonnyWong16
ac32297160
Close database connection on garbage collection 2024-09-04 13:28:54 -07:00
JonnyWong16
330b8a3a82
Encode ntfy payload 2024-08-31 16:10:00 -07:00
JonnyWong16
5cf39cb097
Add Docker image labels 2024-08-17 11:27:17 -07:00
JonnyWong16
14c9c7a393
Replace PyCryptodome with Cryptography 2024-08-16 20:40:31 -07:00
JonnyWong16
cf8fb2e65d
Catch exception trying to remove PID file 2024-08-16 19:32:53 -07:00
JonnyWong16
623a9f2919
v2.14.4 2024-08-10 19:41:23 -07:00
JonnyWong16
3fb46a9ab7
Update workflow snapcraft actions branch 2024-08-10 19:30:12 -07:00
Teodor-Stelian Baltaretu
cfd81684b7
Removed deprecated getdefaultlocale (#2345) (#2364)
* Removed deprecated getdefaultlocale (#2345)

* Added Special Case For Windows (#2345)

* Refactored the changes into a cleaner code with comments (#2345)

* Changed the encoding method used and the selection of language

* Removed hardcoded encoding in Windows handling
2024-08-10 19:24:06 -07:00
dependabot[bot]
fb4f0046f3
Bump pyopenssl from 24.1.0 to 24.2.1 (#2368)
Bumps [pyopenssl](https://github.com/pyca/pyopenssl) from 24.1.0 to 24.2.1.
- [Changelog](https://github.com/pyca/pyopenssl/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pyca/pyopenssl/compare/24.1.0...24.2.1)

---
updated-dependencies:
- dependency-name: pyopenssl
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2024-08-10 19:20:21 -07:00
dependabot[bot]
7d4efac75d
Bump tokenize-rt from 5.2.0 to 6.0.0 (#2376)
* Bump tokenize-rt from 5.2.0 to 6.0.0

Bumps [tokenize-rt](https://github.com/asottile/tokenize-rt) from 5.2.0 to 6.0.0.
- [Commits](https://github.com/asottile/tokenize-rt/compare/v5.2.0...v6.0.0)

---
updated-dependencies:
- dependency-name: tokenize-rt
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update tokenize-rt==6.0.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-08-10 19:19:28 -07:00
dependabot[bot]
509d18801b
Bump cloudinary from 1.40.0 to 1.41.0 (#2375)
* Bump cloudinary from 1.40.0 to 1.41.0

Bumps [cloudinary](https://github.com/cloudinary/pycloudinary) from 1.40.0 to 1.41.0.
- [Release notes](https://github.com/cloudinary/pycloudinary/releases)
- [Changelog](https://github.com/cloudinary/pycloudinary/blob/master/CHANGELOG.md)
- [Commits](https://github.com/cloudinary/pycloudinary/compare/1.40.0...1.41.0)

---
updated-dependencies:
- dependency-name: cloudinary
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update cloudinary==1.41.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-08-10 19:18:37 -07:00
dependabot[bot]
da501df846
Bump pyjwt from 2.8.0 to 2.9.0 (#2374)
* Bump pyjwt from 2.8.0 to 2.9.0

Bumps [pyjwt](https://github.com/jpadilla/pyjwt) from 2.8.0 to 2.9.0.
- [Release notes](https://github.com/jpadilla/pyjwt/releases)
- [Changelog](https://github.com/jpadilla/pyjwt/blob/master/CHANGELOG.rst)
- [Commits](https://github.com/jpadilla/pyjwt/compare/2.8.0...2.9.0)

---
updated-dependencies:
- dependency-name: pyjwt
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update pyjwt==2.9.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-08-10 19:18:24 -07:00
dependabot[bot]
43cb027592
Bump tempora from 5.6.0 to 5.7.0 (#2371)
* Bump tempora from 5.6.0 to 5.7.0

Bumps [tempora](https://github.com/jaraco/tempora) from 5.6.0 to 5.7.0.
- [Release notes](https://github.com/jaraco/tempora/releases)
- [Changelog](https://github.com/jaraco/tempora/blob/main/NEWS.rst)
- [Commits](https://github.com/jaraco/tempora/compare/v5.6.0...v5.7.0)

---
updated-dependencies:
- dependency-name: tempora
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update tempora==5.7.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-08-10 19:16:20 -07:00
dependabot[bot]
2e6f541ec2
Bump importlib-metadata from 8.0.0 to 8.2.0 (#2370)
* Bump importlib-metadata from 8.0.0 to 8.2.0

Bumps [importlib-metadata](https://github.com/python/importlib_metadata) from 8.0.0 to 8.2.0.
- [Release notes](https://github.com/python/importlib_metadata/releases)
- [Changelog](https://github.com/python/importlib_metadata/blob/main/NEWS.rst)
- [Commits](https://github.com/python/importlib_metadata/compare/v8.0.0...v8.2.0)

---
updated-dependencies:
- dependency-name: importlib-metadata
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update importlib-metadata==8.2.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-08-10 19:16:03 -07:00
JonnyWong16
822d5a452c
Capitalize macOS platform 2024-08-10 19:13:56 -07:00
dependabot[bot]
7696d031d3
Bump certifi from 2024.6.2 to 2024.7.4 (#2361)
* Bump certifi from 2024.6.2 to 2024.7.4

Bumps [certifi](https://github.com/certifi/python-certifi) from 2024.6.2 to 2024.7.4.
- [Commits](https://github.com/certifi/python-certifi/compare/2024.06.02...2024.07.04)

---
updated-dependencies:
- dependency-name: certifi
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update certifi==2024.7.4

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>
2024-07-06 11:05:03 -07:00
dependabot[bot]
50ced86ba5
Bump importlib-metadata from 7.1.0 to 8.0.0 (#2360)
* Bump importlib-metadata from 7.1.0 to 8.0.0

Bumps [importlib-metadata](https://github.com/python/importlib_metadata) from 7.1.0 to 8.0.0.
- [Release notes](https://github.com/python/importlib_metadata/releases)
- [Changelog](https://github.com/python/importlib_metadata/blob/main/NEWS.rst)
- [Commits](https://github.com/python/importlib_metadata/compare/v7.1.0...v8.0.0)

---
updated-dependencies:
- dependency-name: importlib-metadata
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update importlib-metadata==8.0.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>
2024-07-06 11:04:54 -07:00
JonnyWong16
e934d09eff
Update plexapi==4.15.15 requirements.txt 2024-07-06 11:03:05 -07:00
JonnyWong16
96c5cb216c
Update plexapi==4.15.15 2024-07-06 11:02:21 -07:00
Nate Harris
2ee2ab652c
[FEAT] Add ntfy as a notifier (#2356)
* - Add ntfy as a notifier

* - Fix media poster attachment in ntfy
2024-07-06 10:02:36 -07:00
JonnyWong16
193b82c54a
Update Slack notification attachment 2024-06-30 14:15:11 -07:00
JonnyWong16
7d00383d1c
v2.14.3 2024-06-19 19:14:20 -07:00
dependabot[bot]
6f84ce8048
Bump docker/build-push-action from 5 to 6 (#2354)
Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 5 to 6.
- [Release notes](https://github.com/docker/build-push-action/releases)
- [Commits](https://github.com/docker/build-push-action/compare/v5...v6)

---
updated-dependencies:
- dependency-name: docker/build-push-action
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-06-19 00:06:18 -07:00
dependabot[bot]
709db66b10
Bump pyinstaller from 6.6.0 to 6.8.0 (#2346)
Bumps [pyinstaller](https://github.com/pyinstaller/pyinstaller) from 6.6.0 to 6.8.0.
- [Release notes](https://github.com/pyinstaller/pyinstaller/releases)
- [Changelog](https://github.com/pyinstaller/pyinstaller/blob/develop/doc/CHANGES.rst)
- [Commits](https://github.com/pyinstaller/pyinstaller/compare/v6.6.0...v6.8.0)

---
updated-dependencies:
- dependency-name: pyinstaller
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2024-06-19 00:06:02 -07:00
dependabot[bot]
2f1607b96b
Bump packaging from 24.0 to 24.1 (#2347)
* Bump packaging from 24.0 to 24.1

Bumps [packaging](https://github.com/pypa/packaging) from 24.0 to 24.1.
- [Release notes](https://github.com/pypa/packaging/releases)
- [Changelog](https://github.com/pypa/packaging/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pypa/packaging/compare/24.0...24.1)

---
updated-dependencies:
- dependency-name: packaging
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update packaging==24.1

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-06-19 00:04:34 -07:00
dependabot[bot]
28ad2716ba
Bump pyobjc-framework-cocoa from 10.2 to 10.3.1 (#2348)
Bumps [pyobjc-framework-cocoa](https://github.com/ronaldoussoren/pyobjc) from 10.2 to 10.3.1.
- [Release notes](https://github.com/ronaldoussoren/pyobjc/releases)
- [Changelog](https://github.com/ronaldoussoren/pyobjc/blob/master/docs/changelog.rst)
- [Commits](https://github.com/ronaldoussoren/pyobjc/compare/v10.2...v10.3.1)

---
updated-dependencies:
- dependency-name: pyobjc-framework-cocoa
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-06-19 00:04:15 -07:00
dependabot[bot]
f1a8164b94
Bump pyobjc-core from 10.2 to 10.3.1 (#2349)
Bumps [pyobjc-core](https://github.com/ronaldoussoren/pyobjc) from 10.2 to 10.3.1.
- [Release notes](https://github.com/ronaldoussoren/pyobjc/releases)
- [Changelog](https://github.com/ronaldoussoren/pyobjc/blob/master/docs/changelog.rst)
- [Commits](https://github.com/ronaldoussoren/pyobjc/compare/v10.2...v10.3.1)

---
updated-dependencies:
- dependency-name: pyobjc-core
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2024-06-19 00:03:23 -07:00
dependabot[bot]
3bc94cad6c
Bump tempora from 5.5.1 to 5.6.0 (#2355)
* Bump tempora from 5.5.1 to 5.6.0

Bumps [tempora](https://github.com/jaraco/tempora) from 5.5.1 to 5.6.0.
- [Release notes](https://github.com/jaraco/tempora/releases)
- [Changelog](https://github.com/jaraco/tempora/blob/main/NEWS.rst)
- [Commits](https://github.com/jaraco/tempora/compare/v5.5.1...v5.6.0)

---
updated-dependencies:
- dependency-name: tempora
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update tempora==5.6.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-06-19 00:02:54 -07:00
dependabot[bot]
a528f052b9
Bump cherrypy from 18.9.0 to 18.10.0 (#2353)
* Bump cherrypy from 18.9.0 to 18.10.0

Bumps [cherrypy](https://github.com/cherrypy/cherrypy) from 18.9.0 to 18.10.0.
- [Changelog](https://github.com/cherrypy/cherrypy/blob/main/CHANGES.rst)
- [Commits](https://github.com/cherrypy/cherrypy/compare/v18.9.0...v18.10.0)

---
updated-dependencies:
- dependency-name: cherrypy
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update cherrypy==18.10.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-06-19 00:02:35 -07:00
dependabot[bot]
5e977c044a
Bump zipp from 3.18.2 to 3.19.2 (#2343)
* Bump zipp from 3.18.2 to 3.19.2

Bumps [zipp](https://github.com/jaraco/zipp) from 3.18.2 to 3.19.2.
- [Release notes](https://github.com/jaraco/zipp/releases)
- [Changelog](https://github.com/jaraco/zipp/blob/main/NEWS.rst)
- [Commits](https://github.com/jaraco/zipp/compare/v3.18.2...v3.19.2)

---
updated-dependencies:
- dependency-name: zipp
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update zipp==3.19.2

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-06-19 00:02:06 -07:00
dependabot[bot]
afa25d45f6
Bump certifi from 2024.2.2 to 2024.6.2 (#2342)
* Bump certifi from 2024.2.2 to 2024.6.2

Bumps [certifi](https://github.com/certifi/python-certifi) from 2024.2.2 to 2024.6.2.
- [Commits](https://github.com/certifi/python-certifi/compare/2024.02.02...2024.06.02)

---
updated-dependencies:
- dependency-name: certifi
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update certifi==2024.6.2

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-06-19 00:01:47 -07:00
dependabot[bot]
43e71d836a
Bump requests from 2.31.0 to 2.32.3 (#2338)
* Bump requests from 2.31.0 to 2.32.3

Bumps [requests](https://github.com/psf/requests) from 2.31.0 to 2.32.3.
- [Release notes](https://github.com/psf/requests/releases)
- [Changelog](https://github.com/psf/requests/blob/main/HISTORY.md)
- [Commits](https://github.com/psf/requests/compare/v2.31.0...v2.32.3)

---
updated-dependencies:
- dependency-name: requests
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update requests==2.32.3

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-06-19 00:01:34 -07:00
JonnyWong16
55573d26ea
Ignore shutdown exception in cheroot 2024-06-18 19:19:18 -07:00
JonnyWong16
f1d44c051d
Fix loading of scheduled tasks when tasks are disabled 2024-06-06 21:39:33 -07:00
JonnyWong16
a3af8ed362
Fix width of use secure connection checkbox in wizard 2024-06-03 23:14:19 -07:00
JonnyWong16
912fd75a2f
Remove pms_is_remote setting
* Automatically determine if a server is local or remote
2024-06-03 23:14:19 -07:00
JonnyWong16
5778672dab
Fix webserver restarting 2024-05-25 18:41:17 -07:00
JonnyWong16
dcdf5a2992
Fix SQLite quotes for history date filters 2024-05-21 10:40:00 -07:00
JonnyWong16
73cfa8e0c0
Add git clean to reset git install 2024-05-18 14:29:53 -07:00
JonnyWong16
795d568df2
v2.14.2 2024-05-18 13:56:06 -07:00
JonnyWong16
8396a04ce8
Update plexapi==4.15.13 2024-05-18 13:52:52 -07:00
JonnyWong16
8419eee4b2
Catch exception when decoding server response message 2024-05-18 13:50:37 -07:00
dependabot[bot]
c505e26656
Bump zipp from 3.18.1 to 3.18.2 (#2326)
* Bump zipp from 3.18.1 to 3.18.2

Bumps [zipp](https://github.com/jaraco/zipp) from 3.18.1 to 3.18.2.
- [Release notes](https://github.com/jaraco/zipp/releases)
- [Changelog](https://github.com/jaraco/zipp/blob/main/NEWS.rst)
- [Commits](https://github.com/jaraco/zipp/compare/v3.18.1...v3.18.2)

---
updated-dependencies:
- dependency-name: zipp
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update zipp==3.18.2

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-05-18 11:17:26 -07:00
dependabot[bot]
37ffe68ce2
Bump mako from 1.3.3 to 1.3.5 (#2325)
* Bump mako from 1.3.3 to 1.3.5

Bumps [mako](https://github.com/sqlalchemy/mako) from 1.3.3 to 1.3.5.
- [Release notes](https://github.com/sqlalchemy/mako/releases)
- [Changelog](https://github.com/sqlalchemy/mako/blob/main/CHANGES)
- [Commits](https://github.com/sqlalchemy/mako/commits)

---
updated-dependencies:
- dependency-name: mako
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update mako==1.3.5

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-05-18 11:17:13 -07:00
dependabot[bot]
dc9e778111
Bump platformdirs from 4.2.1 to 4.2.2 (#2324)
* Bump platformdirs from 4.2.1 to 4.2.2

Bumps [platformdirs](https://github.com/platformdirs/platformdirs) from 4.2.1 to 4.2.2.
- [Release notes](https://github.com/platformdirs/platformdirs/releases)
- [Changelog](https://github.com/platformdirs/platformdirs/blob/main/CHANGES.rst)
- [Commits](https://github.com/platformdirs/platformdirs/compare/4.2.1...4.2.2)

---
updated-dependencies:
- dependency-name: platformdirs
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update platformdirs==4.2.2

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-05-18 11:17:01 -07:00
JonnyWong16
68bf1c70f7
Overwrite image provider export field for uploaded assets 2024-05-13 20:56:40 -07:00
JonnyWong16
ee0b4c0602
Add artProvider and thumbProvider to exporter fields 2024-05-12 22:38:05 -07:00
JonnyWong16
5c115dec68
Fix uploading MacOS installer release asset 2024-05-11 09:51:05 -07:00
JonnyWong16
1d77f32665
v2.14.1-beta 2024-05-11 09:33:49 -07:00
JonnyWong16
af01b8c6cc
Fix appending user ids 2024-05-09 22:43:57 -07:00
JonnyWong16
dd9d3b97a2
Update workflow joncloud/makensis-action@v4.1
[skip ci]
2024-05-09 22:41:07 -07:00
JonnyWong16
96c20ad893
Update cloudinary==1.40.0 2024-05-09 22:31:06 -07:00
dependabot[bot]
5e90f3bb31
Bump paho-mqtt from 2.0.0 to 2.1.0 (#2316)
* Bump paho-mqtt from 2.0.0 to 2.1.0

Bumps [paho-mqtt](https://github.com/eclipse/paho.mqtt.python) from 2.0.0 to 2.1.0.
- [Release notes](https://github.com/eclipse/paho.mqtt.python/releases)
- [Changelog](https://github.com/eclipse/paho.mqtt.python/blob/master/ChangeLog.txt)
- [Commits](https://github.com/eclipse/paho.mqtt.python/compare/v2.0.0...v2.1.0)

---
updated-dependencies:
- dependency-name: paho-mqtt
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update paho-mqtt==2.1.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-05-09 22:28:50 -07:00
dependabot[bot]
dab46249f2
Bump websocket-client from 1.7.0 to 1.8.0 (#2313)
* Bump websocket-client from 1.7.0 to 1.8.0

Bumps [websocket-client](https://github.com/websocket-client/websocket-client) from 1.7.0 to 1.8.0.
- [Release notes](https://github.com/websocket-client/websocket-client/releases)
- [Changelog](https://github.com/websocket-client/websocket-client/blob/master/ChangeLog)
- [Commits](https://github.com/websocket-client/websocket-client/compare/v1.7.0...v1.8.0)

---
updated-dependencies:
- dependency-name: websocket-client
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update websocket-client==1.8.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-05-09 22:28:14 -07:00
dependabot[bot]
5d0ba8b222
Bump platformdirs from 4.2.0 to 4.2.1 (#2312)
* Bump platformdirs from 4.2.0 to 4.2.1

Bumps [platformdirs](https://github.com/platformdirs/platformdirs) from 4.2.0 to 4.2.1.
- [Release notes](https://github.com/platformdirs/platformdirs/releases)
- [Changelog](https://github.com/platformdirs/platformdirs/blob/main/CHANGES.rst)
- [Commits](https://github.com/platformdirs/platformdirs/compare/4.2.0...4.2.1)

---
updated-dependencies:
- dependency-name: platformdirs
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update platformdirs==4.2.1

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-05-09 22:27:59 -07:00
dependabot[bot]
3e8a5663a3
Bump plexapi from 4.15.11 to 4.15.12 (#2311)
* Bump plexapi from 4.15.11 to 4.15.12

Bumps [plexapi](https://github.com/pkkid/python-plexapi) from 4.15.11 to 4.15.12.
- [Release notes](https://github.com/pkkid/python-plexapi/releases)
- [Commits](https://github.com/pkkid/python-plexapi/compare/4.15.11...4.15.12)

---
updated-dependencies:
- dependency-name: plexapi
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update plexapi==4.15.12

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-05-09 22:27:15 -07:00
dependabot[bot]
6414a0ba12
Bump cheroot from 10.0.0 to 10.0.1 (#2310)
* Bump cheroot from 10.0.0 to 10.0.1

Bumps [cheroot](https://github.com/cherrypy/cheroot) from 10.0.0 to 10.0.1.
- [Release notes](https://github.com/cherrypy/cheroot/releases)
- [Changelog](https://github.com/cherrypy/cheroot/blob/main/CHANGES.rst)
- [Commits](https://github.com/cherrypy/cheroot/compare/v10.0.0...v10.0.1)

---
updated-dependencies:
- dependency-name: cheroot
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update cheroot==10.0.1

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-05-09 22:27:04 -07:00
dependabot[bot]
bcac5b7897
Bump cloudinary from 1.39.1 to 1.40.0 (#2308)
Bumps [cloudinary](https://github.com/cloudinary/pycloudinary) from 1.39.1 to 1.40.0.
- [Release notes](https://github.com/cloudinary/pycloudinary/releases)
- [Changelog](https://github.com/cloudinary/pycloudinary/blob/master/CHANGELOG.md)
- [Commits](https://github.com/cloudinary/pycloudinary/compare/1.39.1...1.40.0)

---
updated-dependencies:
- dependency-name: cloudinary
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2024-05-09 22:20:53 -07:00
Tom Niget
de3393d62b
Remove Python 2 handling code (#2098)
* Remove Python 2 update modal

* Remove Python 2 handling code

* Remove backports dependencies

* Remove uses of future and __future__

* Fix import

* Remove requirements

* Update lib folder

* Clean up imports and blank lines

---------

Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>
2024-05-09 22:18:08 -07:00
JonnyWong16
dcec1f6f5f
Update snapcraft git data folder 2024-05-09 21:55:26 -07:00
JonnyWong16
65905a6647
Fix escaping regex string 2024-05-09 21:52:39 -07:00
JonnyWong16
5de2cf85c3
Workaround users remaining in friends list without shared libraries 2024-05-09 20:49:06 -07:00
JonnyWong16
a7660d5c03
v2.14.0-beta 2024-04-18 22:41:23 -07:00
JonnyWong16
5e02db897f
Remove anonymous redirect 2024-04-18 13:12:56 -07:00
JonnyWong16
52e2950aa9
Add no-referrer policy 2024-04-18 13:12:47 -07:00
dependabot[bot]
acf1b2384a
Bump pyinstaller from 6.5.0 to 6.6.0 (#2307)
Bumps [pyinstaller](https://github.com/pyinstaller/pyinstaller) from 6.5.0 to 6.6.0.
- [Release notes](https://github.com/pyinstaller/pyinstaller/releases)
- [Changelog](https://github.com/pyinstaller/pyinstaller/blob/develop/doc/CHANGES.rst)
- [Commits](https://github.com/pyinstaller/pyinstaller/compare/v6.5.0...v6.6.0)

---
updated-dependencies:
- dependency-name: pyinstaller
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-04-18 13:03:30 -07:00
dependabot[bot]
07166ae6b2
Bump idna from 3.6 to 3.7 (#2304)
* Bump idna from 3.6 to 3.7

Bumps [idna](https://github.com/kjd/idna) from 3.6 to 3.7.
- [Release notes](https://github.com/kjd/idna/releases)
- [Changelog](https://github.com/kjd/idna/blob/master/HISTORY.rst)
- [Commits](https://github.com/kjd/idna/compare/v3.6...v3.7)

---
updated-dependencies:
- dependency-name: idna
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update idna==3.7

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-04-18 13:01:25 -07:00
dependabot[bot]
80984bd296
Bump mako from 1.3.2 to 1.3.3 (#2303)
* Bump mako from 1.3.2 to 1.3.3

Bumps [mako](https://github.com/sqlalchemy/mako) from 1.3.2 to 1.3.3.
- [Release notes](https://github.com/sqlalchemy/mako/releases)
- [Changelog](https://github.com/sqlalchemy/mako/blob/main/CHANGES)
- [Commits](https://github.com/sqlalchemy/mako/commits)

---
updated-dependencies:
- dependency-name: mako
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update mako==1.3.3

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-04-18 13:01:09 -07:00
JonnyWong16
6a9e532805
Change path join for session metadata cache 2024-04-07 15:58:28 -07:00
JonnyWong16
2258a88168
Use metadata from session for stale live tv sessions 2024-04-07 15:58:01 -07:00
JonnyWong16
282810e9ca
Increase Remote app PBKDF2 iterations to 600,000 and SHA256 hash
OWASP Cheat Sheet recommends 600,000 iterations for SHA256.

https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html#pbkdf2
2024-04-04 22:57:17 -07:00
JonnyWong16
4582ff4a56
Fix grouping live tv history 2024-04-01 21:47:33 -07:00
JonnyWong16
10e62ca42d
Fix stats on live tv info pages 2024-04-01 19:02:52 -07:00
JonnyWong16
e3245bc126
Add live tv channel keys notification parameters 2024-04-01 19:02:52 -07:00
JonnyWong16
3dc6d226f8
Add live tv channel keys to database 2024-04-01 19:02:52 -07:00
JonnyWong16
177962d626
Change live tv text to channel title 2024-04-01 19:02:52 -07:00
JonnyWong16
5e4f656155
Add space to session start live tv log message 2024-04-01 19:02:52 -07:00
JonnyWong16
980fc8a43f
Fix live tv history watched status 2024-04-01 19:02:52 -07:00
JonnyWong16
458e89b8d7
Get live TV metadata from epg 2024-04-01 19:02:52 -07:00
JonnyWong16
b8185afdf9
Temporary fix for live tv session missing duration 2024-03-31 17:09:35 -07:00
JonnyWong16
85519b1b45
Update plexapi==4.15.11 2024-03-31 16:11:00 -07:00
dependabot[bot]
653a6d5c12
Bump pyinstaller from 6.4.0 to 6.5.0 (#2298)
Bumps [pyinstaller](https://github.com/pyinstaller/pyinstaller) from 6.4.0 to 6.5.0.
- [Release notes](https://github.com/pyinstaller/pyinstaller/releases)
- [Changelog](https://github.com/pyinstaller/pyinstaller/blob/develop/doc/CHANGES.rst)
- [Commits](https://github.com/pyinstaller/pyinstaller/compare/v6.4.0...v6.5.0)

---
updated-dependencies:
- dependency-name: pyinstaller
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-03-30 15:46:44 -07:00
dependabot[bot]
b2a8601c70
Bump pyobjc-framework-cocoa from 10.1 to 10.2 (#2299)
Bumps [pyobjc-framework-cocoa](https://github.com/ronaldoussoren/pyobjc) from 10.1 to 10.2.
- [Release notes](https://github.com/ronaldoussoren/pyobjc/releases)
- [Changelog](https://github.com/ronaldoussoren/pyobjc/blob/master/docs/changelog.rst)
- [Commits](https://github.com/ronaldoussoren/pyobjc/compare/v10.1...v10.2)

---
updated-dependencies:
- dependency-name: pyobjc-framework-cocoa
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2024-03-30 15:30:09 -07:00
dependabot[bot]
938b48c5aa
Bump pyobjc-core from 10.1 to 10.2 (#2294)
Bumps [pyobjc-core](https://github.com/ronaldoussoren/pyobjc) from 10.1 to 10.2.
- [Release notes](https://github.com/ronaldoussoren/pyobjc/releases)
- [Changelog](https://github.com/ronaldoussoren/pyobjc/blob/master/docs/changelog.rst)
- [Commits](https://github.com/ronaldoussoren/pyobjc/compare/v10.1...v10.2)

---
updated-dependencies:
- dependency-name: pyobjc-core
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2024-03-30 15:29:37 -07:00
dependabot[bot]
cdfffda877
Bump pyopenssl from 24.0.0 to 24.1.0 (#2290)
Bumps [pyopenssl](https://github.com/pyca/pyopenssl) from 24.0.0 to 24.1.0.
- [Changelog](https://github.com/pyca/pyopenssl/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pyca/pyopenssl/compare/24.0.0...24.1.0)

---
updated-dependencies:
- dependency-name: pyopenssl
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2024-03-30 15:29:25 -07:00
dependabot[bot]
b6eca379fa
Bump idna from 3.4 to 3.6 (#2300)
* Bump idna from 3.4 to 3.6

Bumps [idna](https://github.com/kjd/idna) from 3.4 to 3.6.
- [Changelog](https://github.com/kjd/idna/blob/master/HISTORY.rst)
- [Commits](https://github.com/kjd/idna/compare/v3.4...v3.6)

---
updated-dependencies:
- dependency-name: idna
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update idna==3.6

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-03-30 15:29:14 -07:00
dependabot[bot]
aa2006c2cc
Bump markupsafe from 2.1.3 to 2.1.5 (#2297)
Bumps [markupsafe](https://github.com/pallets/markupsafe) from 2.1.3 to 2.1.5.
- [Release notes](https://github.com/pallets/markupsafe/releases)
- [Changelog](https://github.com/pallets/markupsafe/blob/main/CHANGES.rst)
- [Commits](https://github.com/pallets/markupsafe/compare/2.1.3...2.1.5)

---
updated-dependencies:
- dependency-name: markupsafe
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2024-03-30 15:29:02 -07:00
dependabot[bot]
26358427ce
Bump pyparsing from 3.1.1 to 3.1.2 (#2296)
* Bump pyparsing from 3.1.1 to 3.1.2

Bumps [pyparsing](https://github.com/pyparsing/pyparsing) from 3.1.1 to 3.1.2.
- [Release notes](https://github.com/pyparsing/pyparsing/releases)
- [Changelog](https://github.com/pyparsing/pyparsing/blob/master/CHANGES)
- [Commits](https://github.com/pyparsing/pyparsing/compare/3.1.1...pyparsing_3.1.2)

---
updated-dependencies:
- dependency-name: pyparsing
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update pyparsing==3.1.2

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-03-30 15:28:45 -07:00
dependabot[bot]
1d96e0f859
Bump tzdata from 2023.3 to 2024.1 (#2295)
* Bump tzdata from 2023.3 to 2024.1

Bumps [tzdata](https://github.com/python/tzdata) from 2023.3 to 2024.1.
- [Release notes](https://github.com/python/tzdata/releases)
- [Changelog](https://github.com/python/tzdata/blob/master/NEWS.md)
- [Commits](https://github.com/python/tzdata/compare/2023.3...2024.1)

---
updated-dependencies:
- dependency-name: tzdata
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update tzdata==2024.1

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-03-30 15:28:14 -07:00
dependabot[bot]
0d1d2a3e6b
Bump requests-oauthlib from 1.3.1 to 2.0.0 (#2293)
* Bump requests-oauthlib from 1.3.1 to 2.0.0

Bumps [requests-oauthlib](https://github.com/requests/requests-oauthlib) from 1.3.1 to 2.0.0.
- [Release notes](https://github.com/requests/requests-oauthlib/releases)
- [Changelog](https://github.com/requests/requests-oauthlib/blob/master/HISTORY.rst)
- [Commits](https://github.com/requests/requests-oauthlib/compare/v1.3.1...v2.0.0)

---
updated-dependencies:
- dependency-name: requests-oauthlib
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update requests-oauthlib==2.0.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-03-30 15:28:02 -07:00
dependabot[bot]
452a4afdcf
Bump tempora from 5.5.0 to 5.5.1 (#2292)
Bumps [tempora](https://github.com/jaraco/tempora) from 5.5.0 to 5.5.1.
- [Release notes](https://github.com/jaraco/tempora/releases)
- [Changelog](https://github.com/jaraco/tempora/blob/main/NEWS.rst)
- [Commits](https://github.com/jaraco/tempora/compare/v5.5.0...v5.5.1)

---
updated-dependencies:
- dependency-name: tempora
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2024-03-30 15:27:42 -07:00
dependabot[bot]
bfc4f66739
Bump python-dateutil from 2.8.2 to 2.9.0.post0 (#2291)
Bumps [python-dateutil](https://github.com/dateutil/dateutil) from 2.8.2 to 2.9.0.post0.
- [Release notes](https://github.com/dateutil/dateutil/releases)
- [Changelog](https://github.com/dateutil/dateutil/blob/master/NEWS)
- [Commits](https://github.com/dateutil/dateutil/compare/2.8.2...2.9.0.post0)

---
updated-dependencies:
- dependency-name: python-dateutil
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2024-03-30 15:27:31 -07:00
dependabot[bot]
f82aecb88c
Bump paho-mqtt from 1.6.1 to 2.0.0 (#2288)
* Bump paho-mqtt from 1.6.1 to 2.0.0

Bumps [paho-mqtt](https://github.com/eclipse/paho.mqtt.python) from 1.6.1 to 2.0.0.
- [Release notes](https://github.com/eclipse/paho.mqtt.python/releases)
- [Changelog](https://github.com/eclipse/paho.mqtt.python/blob/master/ChangeLog.txt)
- [Commits](https://github.com/eclipse/paho.mqtt.python/compare/v1.6.1...v2.0.0)

---
updated-dependencies:
- dependency-name: paho-mqtt
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update paho-mqtt==2.0.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-03-30 15:27:16 -07:00
dependabot[bot]
75a1750a4e
Bump cherrypy from 18.8.0 to 18.9.0 (#2289)
Bumps [cherrypy](https://github.com/cherrypy/cherrypy) from 18.8.0 to 18.9.0.
- [Changelog](https://github.com/cherrypy/cherrypy/blob/main/CHANGES.rst)
- [Commits](https://github.com/cherrypy/cherrypy/compare/v18.8.0...v18.9.0)

---
updated-dependencies:
- dependency-name: cherrypy
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2024-03-26 15:10:51 -07:00
JonnyWong16
51196a7fb1
Update cherrypy==18.9.0 2024-03-24 17:55:28 -07:00
JonnyWong16
2fc618c01f
Revert "Bump cherrypy from 18.8.0 to 18.9.0 (#2266)"
This reverts commit faef9a94c4.
2024-03-24 17:55:28 -07:00
JonnyWong16
fcd8ef11f4
Add before and after parameters to get_home_stats API
Closes #2231
2024-03-24 17:26:18 -07:00
JonnyWong16
c737161164
Add dovi notification parameters
Closes #2240
2024-03-24 16:37:46 -07:00
JonnyWong16
de3121cba9
Add Dolby Vision info to media info 2024-03-24 16:36:18 -07:00
JonnyWong16
9fe58a6d86
Add lan streams and wan streams notification parameters
Closes #2276
2024-03-24 16:09:41 -07:00
JonnyWong16
cfdb6975f0
Add platform version and product version notification parameters
Closes #2244
2024-03-24 16:09:21 -07:00
JonnyWong16
41693ee5f1
Remove synced items from UI 2024-03-24 15:46:57 -07:00
JonnyWong16
7a11b10947
Fix Cloudinary delete all limit of 1000 2024-03-24 15:44:43 -07:00
JonnyWong16
4430c14374
Fix incorrect reachability websocket event key 2024-03-24 15:31:14 -07:00
dependabot[bot]
e248c13c15
Bump importlib-metadata from 6.8.0 to 7.1.0 (#2286)
* Bump importlib-metadata from 6.8.0 to 7.1.0

Bumps [importlib-metadata](https://github.com/python/importlib_metadata) from 6.8.0 to 7.1.0.
- [Release notes](https://github.com/python/importlib_metadata/releases)
- [Changelog](https://github.com/python/importlib_metadata/blob/main/NEWS.rst)
- [Commits](https://github.com/python/importlib_metadata/compare/v6.8.0...v7.1.0)

---
updated-dependencies:
- dependency-name: importlib-metadata
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update importlib-metadata==7.1.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-03-24 15:29:52 -07:00
dependabot[bot]
b01b21ae05
Bump importlib-resources from 6.0.1 to 6.4.0 (#2285)
* Bump importlib-resources from 6.0.1 to 6.4.0

Bumps [importlib-resources](https://github.com/python/importlib_resources) from 6.0.1 to 6.4.0.
- [Release notes](https://github.com/python/importlib_resources/releases)
- [Changelog](https://github.com/python/importlib_resources/blob/main/NEWS.rst)
- [Commits](https://github.com/python/importlib_resources/compare/v6.0.1...v6.4.0)

---
updated-dependencies:
- dependency-name: importlib-resources
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update importlib-resources==6.4.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-03-24 15:27:55 -07:00
dependabot[bot]
6c6fa34ba4
Bump cloudinary from 1.34.0 to 1.39.1 (#2283)
* Bump cloudinary from 1.34.0 to 1.39.1

Bumps [cloudinary](https://github.com/cloudinary/pycloudinary) from 1.34.0 to 1.39.1.
- [Release notes](https://github.com/cloudinary/pycloudinary/releases)
- [Changelog](https://github.com/cloudinary/pycloudinary/blob/master/CHANGELOG.md)
- [Commits](https://github.com/cloudinary/pycloudinary/compare/1.34.0...1.39.1)

---
updated-dependencies:
- dependency-name: cloudinary
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update cloudinary==1.39.1

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-03-24 15:27:42 -07:00
dependabot[bot]
24fff60ed4
Bump zipp from 3.16.2 to 3.18.1 (#2281)
* Bump zipp from 3.16.2 to 3.18.1

Bumps [zipp](https://github.com/jaraco/zipp) from 3.16.2 to 3.18.1.
- [Release notes](https://github.com/jaraco/zipp/releases)
- [Changelog](https://github.com/jaraco/zipp/blob/main/NEWS.rst)
- [Commits](https://github.com/jaraco/zipp/compare/v3.16.2...v3.18.1)

---
updated-dependencies:
- dependency-name: zipp
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update zipp==3.18.1

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-03-24 15:27:03 -07:00
dependabot[bot]
4398dfa821
Bump packaging from 23.1 to 24.0 (#2274)
* Bump packaging from 23.1 to 24.0

Bumps [packaging](https://github.com/pypa/packaging) from 23.1 to 24.0.
- [Release notes](https://github.com/pypa/packaging/releases)
- [Changelog](https://github.com/pypa/packaging/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pypa/packaging/compare/23.1...24.0)

---
updated-dependencies:
- dependency-name: packaging
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update packaging==24.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-03-24 15:26:46 -07:00
dependabot[bot]
a0170a6f3d
Bump beautifulsoup4 from 4.12.2 to 4.12.3 (#2267)
* Bump beautifulsoup4 from 4.12.2 to 4.12.3

Bumps [beautifulsoup4](https://www.crummy.com/software/BeautifulSoup/bs4/) from 4.12.2 to 4.12.3.

---
updated-dependencies:
- dependency-name: beautifulsoup4
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update beautifulsoup4==4.12.3

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-03-24 15:26:22 -07:00
dependabot[bot]
faef9a94c4
Bump cherrypy from 18.8.0 to 18.9.0 (#2266)
* Bump cherrypy from 18.8.0 to 18.9.0

Bumps [cherrypy](https://github.com/cherrypy/cherrypy) from 18.8.0 to 18.9.0.
- [Changelog](https://github.com/cherrypy/cherrypy/blob/main/CHANGES.rst)
- [Commits](https://github.com/cherrypy/cherrypy/compare/v18.8.0...v18.9.0)

---
updated-dependencies:
- dependency-name: cherrypy
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update cherrypy==18.9.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-03-24 15:25:44 -07:00
dependabot[bot]
cfefa928be
Bump dnspython from 2.4.2 to 2.6.1 (#2264)
* Bump dnspython from 2.4.2 to 2.6.1

Bumps [dnspython](https://github.com/rthalley/dnspython) from 2.4.2 to 2.6.1.
- [Release notes](https://github.com/rthalley/dnspython/releases)
- [Changelog](https://github.com/rthalley/dnspython/blob/main/doc/whatsnew.rst)
- [Commits](https://github.com/rthalley/dnspython/compare/v2.4.2...v2.6.1)

---
updated-dependencies:
- dependency-name: dnspython
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update dnspython==2.6.1

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-03-24 15:25:23 -07:00
dependabot[bot]
aca7e72715
Bump distro from 1.8.0 to 1.9.0 (#2262)
* Bump distro from 1.8.0 to 1.9.0

Bumps [distro](https://github.com/python-distro/distro) from 1.8.0 to 1.9.0.
- [Release notes](https://github.com/python-distro/distro/releases)
- [Changelog](https://github.com/python-distro/distro/blob/master/CHANGELOG.md)
- [Commits](https://github.com/python-distro/distro/compare/v1.8.0...v1.9.0)

---
updated-dependencies:
- dependency-name: distro
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update distro==1.9.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-03-24 15:24:31 -07:00
dependabot[bot]
b7836102a9
Bump backports-functools-lru-cache from 1.6.6 to 2.0.0 (#2263)
* Bump backports-functools-lru-cache from 1.6.6 to 2.0.0

Bumps [backports-functools-lru-cache](https://github.com/jaraco/backports.functools_lru_cache) from 1.6.6 to 2.0.0.
- [Release notes](https://github.com/jaraco/backports.functools_lru_cache/releases)
- [Changelog](https://github.com/jaraco/backports.functools_lru_cache/blob/main/NEWS.rst)
- [Commits](https://github.com/jaraco/backports.functools_lru_cache/compare/v1.6.6...v2.0.0)

---
updated-dependencies:
- dependency-name: backports-functools-lru-cache
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update backports-functools-lru-cache==2.0.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-03-24 15:24:05 -07:00
dependabot[bot]
13eb0fd6db
Bump platformdirs from 3.11.0 to 4.2.0 (#2258)
* Bump platformdirs from 3.11.0 to 4.2.0

Bumps [platformdirs](https://github.com/platformdirs/platformdirs) from 3.11.0 to 4.2.0.
- [Release notes](https://github.com/platformdirs/platformdirs/releases)
- [Changelog](https://github.com/platformdirs/platformdirs/blob/main/CHANGES.rst)
- [Commits](https://github.com/platformdirs/platformdirs/compare/3.11.0...4.2.0)

---
updated-dependencies:
- dependency-name: platformdirs
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update platformdirs==4.2.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-03-24 15:23:44 -07:00
dependabot[bot]
a4cfc6323d
Bump certifi from 2023.7.22 to 2024.2.2 (#2257)
* Bump certifi from 2023.7.22 to 2024.2.2

Bumps [certifi](https://github.com/certifi/python-certifi) from 2023.7.22 to 2024.2.2.
- [Commits](https://github.com/certifi/python-certifi/compare/2023.07.22...2024.02.02)

---
updated-dependencies:
- dependency-name: certifi
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update certifi==2024.2.2

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-03-24 15:23:15 -07:00
dependabot[bot]
4468c3e4af
Bump mako from 1.2.4 to 1.3.2 (#2256)
* Bump mako from 1.2.4 to 1.3.2

Bumps [mako](https://github.com/sqlalchemy/mako) from 1.2.4 to 1.3.2.
- [Release notes](https://github.com/sqlalchemy/mako/releases)
- [Changelog](https://github.com/sqlalchemy/mako/blob/main/CHANGES)
- [Commits](https://github.com/sqlalchemy/mako/commits)

---
updated-dependencies:
- dependency-name: mako
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update mako==1.3.2

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-03-24 15:22:16 -07:00
dependabot[bot]
52819f7da6
Bump pytz from 2023.3 to 2024.1 (#2254)
* Bump pytz from 2023.3 to 2024.1

Bumps [pytz](https://github.com/stub42/pytz) from 2023.3 to 2024.1.
- [Release notes](https://github.com/stub42/pytz/releases)
- [Commits](https://github.com/stub42/pytz/compare/release_2023.3...release_2024.1)

---
updated-dependencies:
- dependency-name: pytz
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update pytz==2024.1

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-03-24 15:22:05 -07:00
dependabot[bot]
24b6d37bbe
Bump websocket-client from 1.6.2 to 1.7.0 (#2207)
* Bump websocket-client from 1.6.2 to 1.7.0

Bumps [websocket-client](https://github.com/websocket-client/websocket-client) from 1.6.2 to 1.7.0.
- [Release notes](https://github.com/websocket-client/websocket-client/releases)
- [Changelog](https://github.com/websocket-client/websocket-client/blob/master/ChangeLog)
- [Commits](https://github.com/websocket-client/websocket-client/compare/v1.6.2...v1.7.0)

---
updated-dependencies:
- dependency-name: websocket-client
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update websocket-client==1.7.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-03-24 15:21:51 -07:00
dependabot[bot]
dbffb519f5
Bump bleach from 6.0.0 to 6.1.0 (#2177)
* Bump bleach from 6.0.0 to 6.1.0

Bumps [bleach](https://github.com/mozilla/bleach) from 6.0.0 to 6.1.0.
- [Changelog](https://github.com/mozilla/bleach/blob/main/CHANGES)
- [Commits](https://github.com/mozilla/bleach/compare/v6.0.0...v6.1.0)

---
updated-dependencies:
- dependency-name: bleach
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update bleach==6.1.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-03-24 15:21:33 -07:00
dependabot[bot]
e307796475
Bump simplejson from 3.19.1 to 3.19.2 (#2176)
* Bump simplejson from 3.19.1 to 3.19.2

Bumps [simplejson](https://github.com/simplejson/simplejson) from 3.19.1 to 3.19.2.
- [Release notes](https://github.com/simplejson/simplejson/releases)
- [Changelog](https://github.com/simplejson/simplejson/blob/master/CHANGES.txt)
- [Commits](https://github.com/simplejson/simplejson/compare/v3.19.1...v3.19.2)

---
updated-dependencies:
- dependency-name: simplejson
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update simplejson==3.19.2

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-03-24 15:21:17 -07:00
dependabot[bot]
c1b8be0227
Bump arrow from 1.2.3 to 1.3.0 (#2172)
* Bump arrow from 1.2.3 to 1.3.0

Bumps [arrow](https://github.com/arrow-py/arrow) from 1.2.3 to 1.3.0.
- [Release notes](https://github.com/arrow-py/arrow/releases)
- [Changelog](https://github.com/arrow-py/arrow/blob/master/CHANGELOG.rst)
- [Commits](https://github.com/arrow-py/arrow/compare/1.2.3...1.3.0)

---
updated-dependencies:
- dependency-name: arrow
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update arrow==1.3.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-03-24 15:20:52 -07:00
dependabot[bot]
d3504e8a3c
Bump softprops/action-gh-release from 1 to 2 (#2273)
Bumps [softprops/action-gh-release](https://github.com/softprops/action-gh-release) from 1 to 2.
- [Release notes](https://github.com/softprops/action-gh-release/releases)
- [Changelog](https://github.com/softprops/action-gh-release/blob/master/CHANGELOG.md)
- [Commits](https://github.com/softprops/action-gh-release/compare/v1...v2)

---
updated-dependencies:
- dependency-name: softprops/action-gh-release
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2024-03-24 14:53:44 -07:00
dependabot[bot]
344f19c9d6
Bump actions/cache from 3 to 4 (#2261)
Bumps [actions/cache](https://github.com/actions/cache) from 3 to 4.
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](https://github.com/actions/cache/compare/v3...v4)

---
updated-dependencies:
- dependency-name: actions/cache
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2024-03-24 14:53:10 -07:00
JonnyWong16
901c484f89
Include deleted usernames in log filter 2024-03-14 12:15:02 -07:00
JonnyWong16
149c7fa7a0
Bump snap to core22 2024-03-02 17:03:56 -08:00
JonnyWong16
b73a2e9acc
Update workflow statuses 2024-03-02 16:29:01 -08:00
JonnyWong16
b48e9f4074
Update installer workflow for universal macOS binary
Bump python to 3.11
2024-03-02 16:29:01 -08:00
dependabot[bot]
36fbff5503
Bump actions/download-artifact from 3 to 4 (#2223)
Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 3 to 4.
- [Release notes](https://github.com/actions/download-artifact/releases)
- [Commits](https://github.com/actions/download-artifact/compare/v3...v4)

---
updated-dependencies:
- dependency-name: actions/download-artifact
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2024-03-02 14:35:56 -08:00
dependabot[bot]
355be99512
Bump actions/upload-artifact from 3 to 4 (#2224)
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 3 to 4.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](https://github.com/actions/upload-artifact/compare/v3...v4)

---
updated-dependencies:
- dependency-name: actions/upload-artifact
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2024-03-02 14:35:43 -08:00
dependabot[bot]
a397b90c23
Bump github/codeql-action from 2 to 3 (#2222)
Bumps [github/codeql-action](https://github.com/github/codeql-action) from 2 to 3.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/github/codeql-action/compare/v2...v3)

---
updated-dependencies:
- dependency-name: github/codeql-action
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2024-03-02 14:35:11 -08:00
dependabot[bot]
6a19beb476
Bump actions/stale from 8 to 9 (#2214)
Bumps [actions/stale](https://github.com/actions/stale) from 8 to 9.
- [Release notes](https://github.com/actions/stale/releases)
- [Changelog](https://github.com/actions/stale/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/stale/compare/v8...v9)

---
updated-dependencies:
- dependency-name: actions/stale
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2024-03-02 14:34:58 -08:00
dependabot[bot]
71e6ea00c9
Bump actions/setup-python from 4 to 5 (#2211)
Bumps [actions/setup-python](https://github.com/actions/setup-python) from 4 to 5.
- [Release notes](https://github.com/actions/setup-python/releases)
- [Commits](https://github.com/actions/setup-python/compare/v4...v5)

---
updated-dependencies:
- dependency-name: actions/setup-python
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2024-03-02 14:34:18 -08:00
dependabot[bot]
7e4f7c0c56
Bump dessant/label-actions from 3 to 4 (#2195)
Bumps [dessant/label-actions](https://github.com/dessant/label-actions) from 3 to 4.
- [Release notes](https://github.com/dessant/label-actions/releases)
- [Changelog](https://github.com/dessant/label-actions/blob/main/CHANGELOG.md)
- [Commits](https://github.com/dessant/label-actions/compare/v3...v4)

---
updated-dependencies:
- dependency-name: dessant/label-actions
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2024-03-02 14:33:52 -08:00
JonnyWong16
36ed4bfa3c
Set pyinstaller --contents-directory
Revert back to old one-dir behaviour

Ref.: pyinstaller/pyinstaller#7713
2024-03-02 14:31:44 -08:00
JonnyWong16
7ee2c59075
Add playlist sourceURI to exporter 2024-03-02 14:10:31 -08:00
JonnyWong16
82089fdb7b
Add track genres to exporter 2024-03-02 14:10:31 -08:00
JonnyWong16
cc070cfc6b
Add slug attribute to exporter 2024-03-02 14:10:31 -08:00
dependabot[bot]
78a7a48587
Bump pyinstaller from 5.13.0 to 6.4.0 (#2253)
Bumps [pyinstaller](https://github.com/pyinstaller/pyinstaller) from 5.13.0 to 6.4.0.
- [Release notes](https://github.com/pyinstaller/pyinstaller/releases)
- [Changelog](https://github.com/pyinstaller/pyinstaller/blob/develop/doc/CHANGES.rst)
- [Commits](https://github.com/pyinstaller/pyinstaller/compare/v5.13.0...v6.4.0)

---
updated-dependencies:
- dependency-name: pyinstaller
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2024-03-02 14:10:17 -08:00
dependabot[bot]
f403fdcc5b
Bump pyobjc-framework-cocoa from 9.2 to 10.1 (#2218)
Bumps [pyobjc-framework-cocoa](https://github.com/ronaldoussoren/pyobjc) from 9.2 to 10.1.
- [Release notes](https://github.com/ronaldoussoren/pyobjc/releases)
- [Changelog](https://github.com/ronaldoussoren/pyobjc/blob/master/docs/changelog.rst)
- [Commits](https://github.com/ronaldoussoren/pyobjc/compare/v9.2...v10.1)

---
updated-dependencies:
- dependency-name: pyobjc-framework-cocoa
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2024-03-02 14:10:07 -08:00
dependabot[bot]
50dba6bf19
Bump pyobjc-core from 9.2 to 10.1 (#2219)
Bumps [pyobjc-core](https://github.com/ronaldoussoren/pyobjc) from 9.2 to 10.1.
- [Release notes](https://github.com/ronaldoussoren/pyobjc/releases)
- [Changelog](https://github.com/ronaldoussoren/pyobjc/blob/master/docs/changelog.rst)
- [Commits](https://github.com/ronaldoussoren/pyobjc/compare/v9.2...v10.1)

---
updated-dependencies:
- dependency-name: pyobjc-core
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2024-03-02 14:08:25 -08:00
dependabot[bot]
23591a0435
Bump pyopenssl from 23.2.0 to 24.0.0 (#2252)
Bumps [pyopenssl](https://github.com/pyca/pyopenssl) from 23.2.0 to 24.0.0.
- [Changelog](https://github.com/pyca/pyopenssl/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pyca/pyopenssl/compare/23.2.0...24.0.0)

---
updated-dependencies:
- dependency-name: pyopenssl
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2024-03-02 14:07:39 -08:00
dependabot[bot]
60f29b0fa4
Bump pycryptodomex from 3.18.0 to 3.20.0 (#2237)
Bumps [pycryptodomex](https://github.com/Legrandin/pycryptodome) from 3.18.0 to 3.20.0.
- [Release notes](https://github.com/Legrandin/pycryptodome/releases)
- [Changelog](https://github.com/Legrandin/pycryptodome/blob/master/Changelog.rst)
- [Commits](https://github.com/Legrandin/pycryptodome/compare/v3.18.0...v3.20.0)

---
updated-dependencies:
- dependency-name: pycryptodomex
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2024-03-02 14:02:24 -08:00
dependabot[bot]
b1c0972077
Bump plexapi from 4.15.4 to 4.15.10 (#2251)
* Bump plexapi from 4.15.4 to 4.15.10

Bumps [plexapi](https://github.com/pkkid/python-plexapi) from 4.15.4 to 4.15.10.
- [Release notes](https://github.com/pkkid/python-plexapi/releases)
- [Commits](https://github.com/pkkid/python-plexapi/compare/4.15.4...4.15.10)

---
updated-dependencies:
- dependency-name: plexapi
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update plexapi==4.15.10

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2024-03-02 13:52:45 -08:00
JonnyWong16
040972bcba
Increase PBKDF2 iterations to 600,000
OWASP Cheat Sheet recommends 600,000 iterations.

https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html#pbkdf2
2024-02-19 17:31:28 -08:00
JonnyWong16
c172965ec8
Don't need to refresh Pushover config after entering token 2024-02-17 15:23:14 -08:00
JonnyWong16
d0c07326ab
Change cookie expires to max-age 2023-12-07 23:05:34 -08:00
JonnyWong16
d019efcf91
v2.13.4 2023-12-06 23:18:16 -08:00
JonnyWong16
fe7a59c7f9
Fix use UTC for JWT expiry and max-age for cookie 2023-12-06 23:09:32 -08:00
JonnyWong16
e3113ebd30
Fix configuration table None system language 2023-12-06 13:20:33 -08:00
JonnyWong16
5525b9851c
Fix issue number in changelog 2023-12-03 14:02:51 -08:00
JonnyWong16
8cb74f7480
v2.13.3 2023-12-03 13:49:55 -08:00
JonnyWong16
98ceb0a81d
Add time formats to order of notification text modifiers 2023-12-03 13:45:13 -08:00
JonnyWong16
325271a88e
Update the stream duration on activity cards
* Fixes #2206

Some clients like Plexamp use the same sessionKey when the track changes.
2023-12-03 13:33:37 -08:00
JonnyWong16
ddc8a08fc7
Replace usage of utcnow()
`datetime.utcnow()` deprecated in Python 3.12
2023-11-21 11:36:08 -08:00
JonnyWong16
d0c1e467bd
Add support for thetvdb_url for movies 2023-11-19 13:46:57 -08:00
JonnyWong16
380cbd232c
Add file_size_bytes notification parameter
* Change type of file_size parameter and update description to indicate it is in human readable format.
2023-11-19 13:05:16 -08:00
JonnyWong16
98c363f559
Update Notification Text Modifiers modal with Time Formats 2023-11-13 11:28:53 -08:00
JonnyWong16
5abdfd7377
Make datestamp and timestamp formattable 2023-11-13 11:25:39 -08:00
JonnyWong16
8fd62e30b3
Fix duration_time typo 2023-11-09 17:17:24 -08:00
JonnyWong16
89aad6952b
Fix activity card overflow due to screen scaling
* Fixes #2033
2023-11-09 16:43:41 -08:00
JonnyWong16
2da3714dd1
Add CustomArrow date/time formatter 2023-11-07 17:18:48 -08:00
JonnyWong16
ab5836a65b
Add duration_time notification parameter 2023-11-07 17:12:19 -08:00
JonnyWong16
ae17d2dde0
Switch actions/create-release to softprops/action-gh-release
* actions/create-release deprecated
2023-11-04 13:44:49 -07:00
JonnyWong16
f1c12c0bbe
Switch appdirs to platformdirs 2023-11-04 13:29:40 -07:00
JonnyWong16
32cf26884b
Add system language and sqlite version to configuration table 2023-10-26 11:05:51 -07:00
JonnyWong16
dd380b583f
Add system language to startup logs 2023-10-26 11:05:34 -07:00
JonnyWong16
c215afbf84
v2.13.2 2023-10-26 09:27:31 -07:00
JonnyWong16
d63c0cb469
Guard against None transcode_key 2023-10-26 09:24:48 -07:00
JonnyWong16
98583d139a
Add config override for PMS_LANGUAGE 2023-10-26 09:05:47 -07:00
JonnyWong16
ab16adcffc
Add link from concurrent stream stats card to graphs page 2023-10-23 16:04:29 -07:00
herby2212
a31dcb5508
Quater values for History Watch Status (#2179)
* initial release

* change fillup orientation to clockwise

* fix indentation for css

* fix 50 percent circle orientation

* optimize colors and padding
2023-10-23 15:51:35 -07:00
JonnyWong16
1e4fc05ecf
Add ping method to refresh token 2023-10-17 11:23:04 -07:00
JonnyWong16
efdd4156d8
Update IP helper function 2023-10-16 15:04:19 -07:00
JonnyWong16
7245e97726
Fix concurrent streams graph query 2023-10-10 21:27:13 -07:00
JonnyWong16
d8d1f75605
Use group_by_keys helper for library stats 2023-10-10 19:32:30 -07:00
JonnyWong16
b32183b7b6
Speed up graphs data lookup 2023-10-10 19:18:47 -07:00
JonnyWong16
a59e07c07d
Add metadataDirectory to exporter fields 2023-10-10 14:23:26 -07:00
dependabot[bot]
aa4d98ee34
Bump plexapi from 4.15.0 to 4.15.4 (#2175)
* Bump plexapi from 4.15.0 to 4.15.4

Bumps [plexapi](https://github.com/pkkid/python-plexapi) from 4.15.0 to 4.15.4.
- [Release notes](https://github.com/pkkid/python-plexapi/releases)
- [Commits](https://github.com/pkkid/python-plexapi/compare/4.15.0...4.15.4)

---
updated-dependencies:
- dependency-name: plexapi
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update plexapi==4.15.4

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2023-10-10 14:22:10 -07:00
JonnyWong16
fdc1dd3525
Add trigger time to notification and newsletter tables 2023-10-09 11:37:56 -07:00
JonnyWong16
62be48df9c
Change colour of max. concurrent stream series 2023-10-09 11:33:40 -07:00
JonnyWong16
982c893c49
Use helper function to cast play duration to int 2023-10-09 11:27:46 -07:00
JonnyWong16
0fa7553d97
Fix right float cog icon on mobile devices table 2023-10-09 11:27:46 -07:00
JonnyWong16
b18c31f431
Update table right flow overflow 2023-10-09 11:27:46 -07:00
JonnyWong16
a668932ea8
Remove banners from exports 2023-10-09 11:27:46 -07:00
herby2212
59fe34982e
Concurrent Streams per Day Graph (#2046)
* initial commit

* fix grouping in webserve

* remove event handler and adapt cursor

* optimize most concurrent calculation

* update branch from nightly and user filter

* max concurrent streams in graph

* made several changes mentioned in review
2023-10-07 13:45:11 -07:00
dependabot[bot]
4938954c61
Bump docker/setup-buildx-action from 2 to 3 (#2152)
Bumps [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action) from 2 to 3.
- [Release notes](https://github.com/docker/setup-buildx-action/releases)
- [Commits](https://github.com/docker/setup-buildx-action/compare/v2...v3)

---
updated-dependencies:
- dependency-name: docker/setup-buildx-action
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2023-09-18 12:59:23 -07:00
dependabot[bot]
76f1335a55
Bump docker/build-push-action from 4 to 5 (#2151)
Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 4 to 5.
- [Release notes](https://github.com/docker/build-push-action/releases)
- [Commits](https://github.com/docker/build-push-action/compare/v4...v5)

---
updated-dependencies:
- dependency-name: docker/build-push-action
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2023-09-18 12:57:59 -07:00
dependabot[bot]
5e75d0ce73
Bump docker/setup-qemu-action from 2 to 3 (#2150)
Bumps [docker/setup-qemu-action](https://github.com/docker/setup-qemu-action) from 2 to 3.
- [Release notes](https://github.com/docker/setup-qemu-action/releases)
- [Commits](https://github.com/docker/setup-qemu-action/compare/v2...v3)

---
updated-dependencies:
- dependency-name: docker/setup-qemu-action
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2023-09-18 12:57:43 -07:00
dependabot[bot]
26419f4610
Bump docker/login-action from 2 to 3 (#2149)
Bumps [docker/login-action](https://github.com/docker/login-action) from 2 to 3.
- [Release notes](https://github.com/docker/login-action/releases)
- [Commits](https://github.com/docker/login-action/compare/v2...v3)

---
updated-dependencies:
- dependency-name: docker/login-action
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2023-09-18 12:57:32 -07:00
dependabot[bot]
aaea924aaa
Bump actions/checkout from 3 to 4 (#2145)
Bumps [actions/checkout](https://github.com/actions/checkout) from 3 to 4.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v3...v4)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2023-09-18 12:57:18 -07:00
JonnyWong16
6d858367a4
v2.13.1 2023-08-25 11:49:55 -07:00
JonnyWong16
85bc9c39ae
Update tzlocal==5.0.1 2023-08-25 11:33:56 -07:00
dependabot[bot]
80e6131a0d
Revert "Bump apscheduler from 3.10.1 to 3.10.4 (#2133)"
This reverts commit 2c42150799.
2023-08-25 11:23:49 -07:00
JonnyWong16
1b26775ec6
Revert "Remove importlib-metadata and importlib-resources"
This reverts commit 38435ae81c.
2023-08-25 11:05:53 -07:00
JonnyWong16
fa510792f1
Revert "Remove importlib-metadata and importlib-resources"
This reverts commit 47b2f55c97.
2023-08-25 11:05:46 -07:00
JonnyWong16
289a8a2334
v2.13.0 2023-08-25 09:11:08 -07:00
JonnyWong16
47b2f55c97
Remove importlib-metadata and importlib-resources 2023-08-24 14:18:46 -07:00
JonnyWong16
38435ae81c
Remove importlib-metadata and importlib-resources 2023-08-24 13:49:16 -07:00
JonnyWong16
b133904b48
Drop support for Python 3.7 2023-08-24 12:20:50 -07:00
JonnyWong16
67842cfa02
Add subtitleStream exporter fields for on-demand subtitles 2023-08-24 12:17:53 -07:00
JonnyWong16
24fbc9a17a
Add track chapter exporter fields 2023-08-24 12:17:21 -07:00
dependabot[bot]
b2c16eba07
Bump plexapi from 4.13.4 to 4.15.0 (#2132)
* Bump plexapi from 4.13.4 to 4.15.0

Bumps [plexapi](https://github.com/pkkid/python-plexapi) from 4.13.4 to 4.15.0.
- [Release notes](https://github.com/pkkid/python-plexapi/releases)
- [Commits](https://github.com/pkkid/python-plexapi/compare/4.13.4...4.15.0)

---
updated-dependencies:
- dependency-name: plexapi
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update plexapi==4.15.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2023-08-24 12:10:56 -07:00
dependabot[bot]
2c42150799
Bump apscheduler from 3.10.1 to 3.10.4 (#2133)
* Bump apscheduler from 3.10.1 to 3.10.4

Bumps [apscheduler](https://github.com/agronholm/apscheduler) from 3.10.1 to 3.10.4.
- [Changelog](https://github.com/agronholm/apscheduler/blob/3.10.4/docs/versionhistory.rst)
- [Commits](https://github.com/agronholm/apscheduler/compare/3.10.1...3.10.4)

---
updated-dependencies:
- dependency-name: apscheduler
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update apscheduler==3.10.4

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2023-08-24 12:10:08 -07:00
dependabot[bot]
3debeada2a
Bump pyparsing from 3.0.9 to 3.1.1 (#2131)
* Bump pyparsing from 3.0.9 to 3.1.1

Bumps [pyparsing](https://github.com/pyparsing/pyparsing) from 3.0.9 to 3.1.1.
- [Release notes](https://github.com/pyparsing/pyparsing/releases)
- [Changelog](https://github.com/pyparsing/pyparsing/blob/master/CHANGES)
- [Commits](https://github.com/pyparsing/pyparsing/compare/pyparsing_3.0.9...3.1.1)

---
updated-dependencies:
- dependency-name: pyparsing
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update pyparsing==3.1.1

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2023-08-24 12:09:51 -07:00
dependabot[bot]
d0c7f25a3f
Bump markupsafe from 2.1.2 to 2.1.3 (#2130)
* Bump markupsafe from 2.1.2 to 2.1.3

Bumps [markupsafe](https://github.com/pallets/markupsafe) from 2.1.2 to 2.1.3.
- [Release notes](https://github.com/pallets/markupsafe/releases)
- [Changelog](https://github.com/pallets/markupsafe/blob/main/CHANGES.rst)
- [Commits](https://github.com/pallets/markupsafe/compare/2.1.2...2.1.3)

---
updated-dependencies:
- dependency-name: markupsafe
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update markupsave==2.1.3

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2023-08-24 12:09:39 -07:00
dependabot[bot]
371d35433c
Bump tokenize-rt from 5.0.0 to 5.2.0 (#2129)
* Bump tokenize-rt from 5.0.0 to 5.2.0

Bumps [tokenize-rt](https://github.com/asottile/tokenize-rt) from 5.0.0 to 5.2.0.
- [Commits](https://github.com/asottile/tokenize-rt/compare/v5.0.0...v5.2.0)

---
updated-dependencies:
- dependency-name: tokenize-rt
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update tokenize-rt==5.2.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2023-08-24 12:09:28 -07:00
dependabot[bot]
4033114175
Bump cheroot from 9.0.0 to 10.0.0 (#2128)
* Bump cheroot from 9.0.0 to 10.0.0

Bumps [cheroot](https://github.com/cherrypy/cheroot) from 9.0.0 to 10.0.0.
- [Release notes](https://github.com/cherrypy/cheroot/releases)
- [Changelog](https://github.com/cherrypy/cheroot/blob/main/CHANGES.rst)
- [Commits](https://github.com/cherrypy/cheroot/compare/v9.0.0...v10.0.0)

---
updated-dependencies:
- dependency-name: cheroot
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update cheroot==10.0.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2023-08-24 12:09:15 -07:00
dependabot[bot]
9423f65a90
Bump backports-functools-lru-cache from 1.6.4 to 1.6.6 (#2127)
* Bump backports-functools-lru-cache from 1.6.4 to 1.6.6

Bumps [backports-functools-lru-cache](https://github.com/jaraco/backports.functools_lru_cache) from 1.6.4 to 1.6.6.
- [Release notes](https://github.com/jaraco/backports.functools_lru_cache/releases)
- [Changelog](https://github.com/jaraco/backports.functools_lru_cache/blob/main/NEWS.rst)
- [Commits](https://github.com/jaraco/backports.functools_lru_cache/compare/v1.6.4...v1.6.6)

---
updated-dependencies:
- dependency-name: backports-functools-lru-cache
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update backports-functools-lru-cache==1.6.6

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2023-08-24 12:06:08 -07:00
dependabot[bot]
72f1ce7865
Bump importlib-resources from 5.12.0 to 6.0.1 (#2126)
* Bump importlib-resources from 5.12.0 to 6.0.1

Bumps [importlib-resources](https://github.com/python/importlib_resources) from 5.12.0 to 6.0.1.
- [Release notes](https://github.com/python/importlib_resources/releases)
- [Changelog](https://github.com/python/importlib_resources/blob/main/NEWS.rst)
- [Commits](https://github.com/python/importlib_resources/compare/v5.12.0...v6.0.1)

---
updated-dependencies:
- dependency-name: importlib-resources
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update importlib-resources==6.0.1

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2023-08-24 12:05:53 -07:00
dependabot[bot]
9383d5120c
Bump portend from 3.1.0 to 3.2.0 (#2125)
Bumps [portend](https://github.com/jaraco/portend) from 3.1.0 to 3.2.0.
- [Release notes](https://github.com/jaraco/portend/releases)
- [Changelog](https://github.com/jaraco/portend/blob/main/NEWS.rst)
- [Commits](https://github.com/jaraco/portend/compare/v3.1.0...v3.2.0)

---
updated-dependencies:
- dependency-name: portend
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2023-08-24 12:05:41 -07:00
dependabot[bot]
69d052f758
Bump zipp from 3.15.0 to 3.16.2 (#2124)
* Bump zipp from 3.15.0 to 3.16.2

Bumps [zipp](https://github.com/jaraco/zipp) from 3.15.0 to 3.16.2.
- [Release notes](https://github.com/jaraco/zipp/releases)
- [Changelog](https://github.com/jaraco/zipp/blob/main/NEWS.rst)
- [Commits](https://github.com/jaraco/zipp/compare/v3.15.0...v3.16.2)

---
updated-dependencies:
- dependency-name: zipp
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update zipp==3.16.2

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2023-08-24 12:05:25 -07:00
dependabot[bot]
c0aa4e4996
Bump dnspython from 2.3.0 to 2.4.2 (#2123)
* Bump dnspython from 2.3.0 to 2.4.2

Bumps [dnspython](https://github.com/rthalley/dnspython) from 2.3.0 to 2.4.2.
- [Release notes](https://github.com/rthalley/dnspython/releases)
- [Changelog](https://github.com/rthalley/dnspython/blob/master/doc/whatsnew.rst)
- [Commits](https://github.com/rthalley/dnspython/compare/v2.3.0...v2.4.2)

---
updated-dependencies:
- dependency-name: dnspython
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update dnspython==2.4.2

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2023-08-24 12:05:11 -07:00
JonnyWong16
9f00f5dafa
Fix watched notification trigger description
Fixes #2104
2023-08-23 22:04:27 -07:00
dependabot[bot]
7266a60343
Bump cloudinary from 1.32.0 to 1.34.0 (#2109)
* Bump cloudinary from 1.32.0 to 1.34.0

Bumps [cloudinary](https://github.com/cloudinary/pycloudinary) from 1.32.0 to 1.34.0.
- [Release notes](https://github.com/cloudinary/pycloudinary/releases)
- [Changelog](https://github.com/cloudinary/pycloudinary/blob/master/CHANGELOG.md)
- [Commits](https://github.com/cloudinary/pycloudinary/compare/1.32.0...1.34.0)

---
updated-dependencies:
- dependency-name: cloudinary
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update cloudinary==1.34.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2023-08-23 21:56:41 -07:00
JonnyWong16
edd8c5fdc3
Pin urllib3<2 in requirements.txt
[skip ci]
2023-08-23 21:54:59 -07:00
JonnyWong16
d6b3ed178e
Downgraade urllib3==1.26.16 2023-08-23 21:52:33 -07:00
dependabot[bot]
eac78a3047
Bump websocket-client from 1.5.1 to 1.6.2 (#2122)
* Bump websocket-client from 1.5.1 to 1.6.2

Bumps [websocket-client](https://github.com/websocket-client/websocket-client) from 1.5.1 to 1.6.2.
- [Release notes](https://github.com/websocket-client/websocket-client/releases)
- [Changelog](https://github.com/websocket-client/websocket-client/blob/master/ChangeLog)
- [Commits](https://github.com/websocket-client/websocket-client/compare/v1.5.1...v1.6.2)

---
updated-dependencies:
- dependency-name: websocket-client
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update websocket-client==1.6.2

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2023-08-23 21:45:28 -07:00
dependabot[bot]
c93f470371
Bump pyjwt from 2.6.0 to 2.8.0 (#2115)
* Bump pyjwt from 2.6.0 to 2.8.0

Bumps [pyjwt](https://github.com/jpadilla/pyjwt) from 2.6.0 to 2.8.0.
- [Release notes](https://github.com/jpadilla/pyjwt/releases)
- [Changelog](https://github.com/jpadilla/pyjwt/blob/master/CHANGELOG.rst)
- [Commits](https://github.com/jpadilla/pyjwt/compare/2.6.0...2.8.0)

---
updated-dependencies:
- dependency-name: pyjwt
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update pyjwt==2.8.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2023-08-23 21:45:15 -07:00
dependabot[bot]
77f38bbf93 Bump urllib3 from 1.26.15 to 2.0.4 (#2113)
* Bump urllib3 from 1.26.15 to 2.0.4

Bumps [urllib3](https://github.com/urllib3/urllib3) from 1.26.15 to 2.0.4.
- [Release notes](https://github.com/urllib3/urllib3/releases)
- [Changelog](https://github.com/urllib3/urllib3/blob/main/CHANGES.rst)
- [Commits](https://github.com/urllib3/urllib3/compare/1.26.15...2.0.4)

---
updated-dependencies:
- dependency-name: urllib3
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update urllib3==2.0.4

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2023-08-23 21:44:36 -07:00
dependabot[bot]
1e903b164b
Bump tempora from 5.2.1 to 5.5.0 (#2111)
* Bump tempora from 5.2.1 to 5.5.0

Bumps [tempora](https://github.com/jaraco/tempora) from 5.2.1 to 5.5.0.
- [Release notes](https://github.com/jaraco/tempora/releases)
- [Changelog](https://github.com/jaraco/tempora/blob/main/NEWS.rst)
- [Commits](https://github.com/jaraco/tempora/compare/v5.2.1...v5.5.0)

---
updated-dependencies:
- dependency-name: tempora
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update tempora==5.5.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2023-08-23 21:43:27 -07:00
dependabot[bot]
9a196f3dca
Bump certifi from 2022.12.7 to 2023.7.22 (#2110)
* Bump certifi from 2022.12.7 to 2023.7.22

Bumps [certifi](https://github.com/certifi/python-certifi) from 2022.12.7 to 2023.7.22.
- [Commits](https://github.com/certifi/python-certifi/compare/2022.12.07...2023.07.22)

---
updated-dependencies:
- dependency-name: certifi
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update certifi==2023.7.22

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2023-08-23 21:42:53 -07:00
dependabot[bot]
6b6d43ef43
Bump requests from 2.28.2 to 2.31.0 (#2078)
* Bump requests from 2.28.2 to 2.31.0

Bumps [requests](https://github.com/psf/requests) from 2.28.2 to 2.31.0.
- [Release notes](https://github.com/psf/requests/releases)
- [Changelog](https://github.com/psf/requests/blob/main/HISTORY.md)
- [Commits](https://github.com/psf/requests/compare/v2.28.2...v2.31.0)

---
updated-dependencies:
- dependency-name: requests
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update requests==2.31.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2023-08-23 21:40:02 -07:00
dependabot[bot]
478d9e6aa5
Bump soupsieve from 2.4 to 2.4.1 (#2051)
* Bump soupsieve from 2.4 to 2.4.1

Bumps [soupsieve](https://github.com/facelessuser/soupsieve) from 2.4 to 2.4.1.
- [Release notes](https://github.com/facelessuser/soupsieve/releases)
- [Commits](https://github.com/facelessuser/soupsieve/compare/2.4...2.4.1)

---
updated-dependencies:
- dependency-name: soupsieve
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Remove soupsieve

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2023-08-23 21:39:21 -07:00
dependabot[bot]
c5bbaaf39c
Bump packaging from 23.0 to 23.1 (#2043)
* Bump packaging from 23.0 to 23.1

Bumps [packaging](https://github.com/pypa/packaging) from 23.0 to 23.1.
- [Release notes](https://github.com/pypa/packaging/releases)
- [Changelog](https://github.com/pypa/packaging/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pypa/packaging/compare/23.0...23.1)

---
updated-dependencies:
- dependency-name: packaging
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update packaging==23.1

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2023-08-23 21:38:59 -07:00
dependabot[bot]
e70e08c3f5
Bump beautifulsoup4 from 4.11.2 to 4.12.2 (#2037)
* Bump beautifulsoup4 from 4.11.2 to 4.12.2

Bumps [beautifulsoup4](https://www.crummy.com/software/BeautifulSoup/bs4/) from 4.11.2 to 4.12.2.

---
updated-dependencies:
- dependency-name: beautifulsoup4
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update beautifulsoup4==4.12.2

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2023-08-23 21:38:49 -07:00
dependabot[bot]
1798594569
Bump simplejson from 3.18.3 to 3.19.1 (#2036)
* Bump simplejson from 3.18.3 to 3.19.1

Bumps [simplejson](https://github.com/simplejson/simplejson) from 3.18.3 to 3.19.1.
- [Release notes](https://github.com/simplejson/simplejson/releases)
- [Changelog](https://github.com/simplejson/simplejson/blob/master/CHANGES.txt)
- [Commits](https://github.com/simplejson/simplejson/compare/v3.18.3...v3.19.1)

---
updated-dependencies:
- dependency-name: simplejson
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update simplejson==3.19.1

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2023-08-23 21:38:39 -07:00
dependabot[bot]
70fb00280b
Bump tzdata from 2022.7 to 2023.3 (#2032)
* Bump tzdata from 2022.7 to 2023.3

Bumps [tzdata](https://github.com/python/tzdata) from 2022.7 to 2023.3.
- [Release notes](https://github.com/python/tzdata/releases)
- [Changelog](https://github.com/python/tzdata/blob/master/NEWS.md)
- [Commits](https://github.com/python/tzdata/compare/2022.7...2023.3)

---
updated-dependencies:
- dependency-name: tzdata
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update tzdata==2023.3

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2023-08-23 21:38:28 -07:00
dependabot[bot]
835ea34bea
Bump pytz from 2022.7.1 to 2023.3 (#2031)
* Bump pytz from 2022.7.1 to 2023.3

Bumps [pytz](https://github.com/stub42/pytz) from 2022.7.1 to 2023.3.
- [Release notes](https://github.com/stub42/pytz/releases)
- [Commits](https://github.com/stub42/pytz/compare/release_2022.7.1...release_2023.3)

---
updated-dependencies:
- dependency-name: pytz
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update pytz==2023.3

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2023-08-23 21:38:17 -07:00
dependabot[bot]
a21fffd227
Bump pyinstaller from 5.8.0 to 5.13.0 (#2114)
Bumps [pyinstaller](https://github.com/pyinstaller/pyinstaller) from 5.8.0 to 5.13.0.
- [Release notes](https://github.com/pyinstaller/pyinstaller/releases)
- [Changelog](https://github.com/pyinstaller/pyinstaller/blob/develop/doc/CHANGES.rst)
- [Commits](https://github.com/pyinstaller/pyinstaller/compare/v5.8.0...v5.13.0)

---
updated-dependencies:
- dependency-name: pyinstaller
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-08-23 21:23:35 -07:00
dependabot[bot]
f80cd73982
Bump importlib-metadata from 6.0.0 to 6.8.0 (#2112)
Bumps [importlib-metadata](https://github.com/python/importlib_metadata) from 6.0.0 to 6.8.0.
- [Release notes](https://github.com/python/importlib_metadata/releases)
- [Changelog](https://github.com/python/importlib_metadata/blob/main/NEWS.rst)
- [Commits](https://github.com/python/importlib_metadata/compare/v6.0.0...v6.8.0)

---
updated-dependencies:
- dependency-name: importlib-metadata
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2023-08-23 21:22:24 -07:00
dependabot[bot]
e11a4c50ba
Bump pyobjc-framework-cocoa from 9.0.1 to 9.2 (#2083)
Bumps [pyobjc-framework-cocoa](https://github.com/ronaldoussoren/pyobjc) from 9.0.1 to 9.2.
- [Release notes](https://github.com/ronaldoussoren/pyobjc/releases)
- [Changelog](https://github.com/ronaldoussoren/pyobjc/blob/master/docs/changelog.rst)
- [Commits](https://github.com/ronaldoussoren/pyobjc/compare/v9.0.1...v9.2)

---
updated-dependencies:
- dependency-name: pyobjc-framework-cocoa
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2023-08-23 21:21:55 -07:00
dependabot[bot]
a84b5b51ed
Bump pyobjc-core from 9.0.1 to 9.2 (#2082)
Bumps [pyobjc-core](https://github.com/ronaldoussoren/pyobjc) from 9.0.1 to 9.2.
- [Release notes](https://github.com/ronaldoussoren/pyobjc/releases)
- [Changelog](https://github.com/ronaldoussoren/pyobjc/blob/master/docs/changelog.rst)
- [Commits](https://github.com/ronaldoussoren/pyobjc/compare/v9.0.1...v9.2)

---
updated-dependencies:
- dependency-name: pyobjc-core
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2023-08-23 21:21:16 -07:00
dependabot[bot]
b7c0b104e9
Bump pycryptodomex from 3.17 to 3.18.0 (#2076)
Bumps [pycryptodomex](https://github.com/Legrandin/pycryptodome) from 3.17 to 3.18.0.
- [Release notes](https://github.com/Legrandin/pycryptodome/releases)
- [Changelog](https://github.com/Legrandin/pycryptodome/blob/master/Changelog.rst)
- [Commits](https://github.com/Legrandin/pycryptodome/compare/v3.17.0...v3.18.0)

---
updated-dependencies:
- dependency-name: pycryptodomex
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2023-08-23 21:20:54 -07:00
dependabot[bot]
6fa8bb3768
Bump pyopenssl from 23.0.0 to 23.2.0 (#2081)
Bumps [pyopenssl](https://github.com/pyca/pyopenssl) from 23.0.0 to 23.2.0.
- [Changelog](https://github.com/pyca/pyopenssl/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pyca/pyopenssl/compare/23.0.0...23.2.0)

---
updated-dependencies:
- dependency-name: pyopenssl
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2023-08-23 21:20:05 -07:00
dependabot[bot]
31543d267f
Bump pywin32 from 305 to 306 (#2028)
Bumps [pywin32](https://github.com/mhammond/pywin32) from 305 to 306.
- [Release notes](https://github.com/mhammond/pywin32/releases)
- [Changelog](https://github.com/mhammond/pywin32/blob/main/CHANGES.txt)
- [Commits](https://github.com/mhammond/pywin32/commits)

---
updated-dependencies:
- dependency-name: pywin32
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2023-08-23 21:19:39 -07:00
dependabot[bot]
842e36485a
Bump actions/stale from 7 to 8 (#2025)
Bumps [actions/stale](https://github.com/actions/stale) from 7 to 8.
- [Release notes](https://github.com/actions/stale/releases)
- [Changelog](https://github.com/actions/stale/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/stale/compare/v7...v8)

---
updated-dependencies:
- dependency-name: actions/stale
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2023-08-15 08:42:01 -07:00
JonnyWong16
e2cb15ef49
Add notification image option for iOS Tautulli Remote App 2023-08-02 16:51:20 -07:00
JonnyWong16
b984a99d51
Update workflows action version refs 2023-07-27 20:04:37 -07:00
JonnyWong16
d701d18a81
Update workflows action version refs 2023-07-27 20:04:03 -07:00
JonnyWong16
765804c93b
Don't expose do_state_change 2023-07-20 14:19:05 -07:00
JonnyWong16
b953b951fb
v2.12.6 2023-07-13 15:50:39 -07:00
JonnyWong16
571a6b6d2d
Cast view_offset to int for regrouping history 2023-07-10 08:58:03 -07:00
David Pooley
6010e406c8
Fix simultaneous streams per IP not behaving as expected with IPv6 (#2096)
* Fix IPv6 comparisson for concurrent streams

* Update regex to allow numbers in config variables

* Remove additional logging for local testing

* Update plexpy/notification_handler.py

Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

---------

Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>
2023-07-08 16:32:42 -07:00
JonnyWong16
d91e561a56
Regroup history in separate thread and improve logging 2023-07-07 17:47:38 -07:00
Tom Niget
343a3e9281
Multiselect user filters (#2090)
* Extract user filter generation code into method

* Extend make_user_cond to allow lists of user IDs

* Update documentation for stats APIs to indicate handling of ID lists

* Use multiselect dropdown for user filter on graphs page

Use standard concatenation

Fix select style

Move settings to JS constructor

Change text for no users checked

Don't call selectAll on page init

Add it back

Remove attributes

Fix emptiness check

Allow deselect all

Only refresh if user id changed

* Show "N users" starting at 2 users

Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

* Use helper function split_strip

Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

* Move make_user_cond at bottom and make private

* Add new user picker to history page

* Fix copy-paste error

* Again

* Add CSS for bootstrap-select

---------

Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>
2023-07-07 17:15:16 -07:00
JonnyWong16
b144e6527f
Add button to regroup play history 2023-07-07 14:36:44 -07:00
JonnyWong16
1fe6d1505f
Add method to regroup history 2023-07-07 14:36:44 -07:00
JonnyWong16
085cfa4bef
Fix history grouping incorrect for watched content 2023-07-07 14:36:44 -07:00
JonnyWong16
c761e6e8d0
Fix template_name argument for login page 2023-06-29 00:07:43 -07:00
JonnyWong16
7ff3abe8b7
Rename template_name argument 2023-06-27 17:20:21 -07:00
JonnyWong16
d9b3b311b9
Only initialize mako TemplateLookup once
* Ref: sqlalchemy/mako#378
2023-06-27 14:23:09 -07:00
JonnyWong16
2a48e3375a
Add d3d11va hardware decoder 2023-06-25 17:35:16 -07:00
JonnyWong16
ea6c6078df
v2.12.4 2023-05-23 10:03:36 -07:00
JonnyWong16
f39b9f9087
Fix SQLite Double-Quoted Strings (#2057)
* Fix __init__.py

* Fix activity_pinger.py

* Fix activity_processor.py

* Fix database.py

* Fix datafactory.py

* Fix exporter.py

* Fix graphs.py

* Fix libraries.py

* Fix mobile_app.py

* Fix newsletter_handler.py

* Fix newsletters.py

* Fix notification_handler.py

* Fix notifiers.py

* Fix plexivity_import.py

* Fix plexwatch_import.py

* Fix users.py

* Fix webauth.py
2023-05-15 11:03:26 -07:00
JonnyWong16
3a1d6322ae
Add return ID for async API calls
* export_id, notification_id, and newsletter_notification_d
2023-05-05 15:57:33 -07:00
JonnyWong16
fe4fba353e
Catch KeyError on import db version 2023-04-20 08:50:41 -07:00
JonnyWong16
3b3c59c4bb
Set view offset equal to duration if stopped within the last 10 sec
* Plex reports the view offset every 10 seconds, so the view offset at the end of stream can be short by up to 10 seconds.
2023-04-17 12:50:52 -07:00
JonnyWong16
e9b1db139e
v2.12.3 2023-04-14 11:50:55 -07:00
JonnyWong16
99afb7392b
Use separate log file for script PlexAPI 2023-04-14 11:29:53 -07:00
JonnyWong16
14648a4604
Fix live tv thumb hover on top libraries statistics card 2023-04-13 21:48:31 -07:00
JonnyWong16
07715c6a49
Rename API get_history response duration to play_duration 2023-04-13 15:17:41 -07:00
JonnyWong16
b0921b5f4a
Fix history table sorting by play duration 2023-04-13 15:17:22 -07:00
JonnyWong16
2921c1fc30
Fix live tv thumb and art for top libraries statistics card 2023-04-13 14:48:19 -07:00
JonnyWong16
fa8b51bfd9
Add .vscode to .gitignore 2023-04-13 14:46:30 -07:00
JonnyWong16
eb7a4fb4bf
Fix calculating media info file sizes 2023-03-22 16:48:42 -07:00
JonnyWong16
18110206d6
Fallback subtitle decision if transcoding subtitles 2023-03-16 22:02:44 -07:00
JonnyWong16
7836dc8403
v2.12.2 2023-03-16 18:29:42 -07:00
JonnyWong16
ab7e559f39
Limit platform version to 100 characters 2023-03-15 17:14:53 -07:00
JonnyWong16
710dd7955f
v2.12.1 2023-03-14 13:05:49 -07:00
JonnyWong16
93081e3f6d
Trim analytic event platform version for macOS 2023-03-14 13:02:49 -07:00
JonnyWong16
8664570a78
Don't show audio language for music on activity card 2023-03-14 12:21:45 -07:00
JonnyWong16
e5f55d7fe7
Remove checking for synced items for sessions 2023-03-14 11:19:50 -07:00
JonnyWong16
41f935e1ed
v2.12.0 2023-03-13 12:16:44 -07:00
JonnyWong16
ea5b43419d
Add last_refreshed to get_library_media_info doc string 2023-03-13 12:16:44 -07:00
JonnyWong16
2dd9272f56
Remove extra space in doc strings 2023-03-13 12:05:40 -07:00
dependabot[bot]
705fd2d3e8
Bump urllib3 from 1.26.14 to 1.26.15 (#2017)
* Bump urllib3 from 1.26.14 to 1.26.15

Bumps [urllib3](https://github.com/urllib3/urllib3) from 1.26.14 to 1.26.15.
- [Release notes](https://github.com/urllib3/urllib3/releases)
- [Changelog](https://github.com/urllib3/urllib3/blob/main/CHANGES.rst)
- [Commits](https://github.com/urllib3/urllib3/compare/1.26.14...1.26.15)

---
updated-dependencies:
- dependency-name: urllib3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update urllib3==1.26.15

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2023-03-13 11:53:56 -07:00
JonnyWong16
93d1f10ad3
Add credits markers and audio/subtitle settings to exporter fields 2023-03-10 11:06:44 -08:00
JonnyWong16
eb7495e930
Update plexapi==4.13.4 2023-03-10 11:06:44 -08:00
JonnyWong16
b7da2dedf3
Add hidden setting to override server name 2023-03-07 20:25:49 -08:00
JonnyWong16
000656be00
Add last_refreshed time to get_library_media_info response 2023-03-07 20:16:08 -08:00
JonnyWong16
c90469b0b7
URI encode download logfile parameter 2023-03-03 22:37:57 -08:00
JonnyWong16
3d2959ee51
Use .setAttribute() for QR code address parser 2023-03-03 22:25:01 -08:00
JonnyWong16
4274a29bd6
Use .text() instead of .html() to set graph range values 2023-03-03 22:22:29 -08:00
JonnyWong16
22c5e59ee9
Only run CodeQL on nightly branch 2023-03-03 11:20:29 -08:00
JonnyWong16
39047ea7c3
Add codeql config file
[skip ci]
2023-03-03 11:17:59 -08:00
JonnyWong16
0925234f06
Create .github/workflows/codeql.yml 2023-03-03 11:07:45 -08:00
JonnyWong16
d240984c27
Fix multiline changelog in publish installer workflow
* Ref: https://docs.github.com/en/actions/using-workflows/workflow-commands-for-github-actions#multiline-strings

[skip ci]
2023-03-03 10:59:43 -08:00
JonnyWong16
8f06b39a07
Fix submit winget workflow
[skip ci]
2023-03-03 10:59:22 -08:00
JonnyWong16
aa7606d576
v2.12.0-beta 2023-03-03 10:26:31 -08:00
JonnyWong16
78a3d15039
Add history table to collection and playlist info pages 2023-03-03 10:22:02 -08:00
dependabot[bot]
ec323abb92
Bump apscheduler from 3.10.0 to 3.10.1 (#2013)
* Bump apscheduler from 3.10.0 to 3.10.1

Bumps [apscheduler](https://github.com/agronholm/apscheduler) from 3.10.0 to 3.10.1.
- [Release notes](https://github.com/agronholm/apscheduler/releases)
- [Changelog](https://github.com/agronholm/apscheduler/blob/3.10.1/docs/versionhistory.rst)
- [Commits](https://github.com/agronholm/apscheduler/compare/3.10.0...3.10.1)

---
updated-dependencies:
- dependency-name: apscheduler
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update apscheduler==3.10.1

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2023-03-03 10:21:48 -08:00
dependabot[bot]
69e1b43aa1
Bump soupsieve from 2.3.2.post1 to 2.4 (#2014)
Bumps [soupsieve](https://github.com/facelessuser/soupsieve) from 2.3.2.post1 to 2.4.
- [Release notes](https://github.com/facelessuser/soupsieve/releases)
- [Commits](https://github.com/facelessuser/soupsieve/compare/2.3.2.post1...2.4)

---
updated-dependencies:
- dependency-name: soupsieve
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2023-03-03 10:21:35 -08:00
JonnyWong16
dffa353966
Don't submit to winget for pre-release (beta)
[skip ci]
2023-03-02 22:59:58 -08:00
dependabot[bot]
a241de6dc2
Bump pyinstaller from 5.7.0 to 5.8.0 (#1998)
Bumps [pyinstaller](https://github.com/pyinstaller/pyinstaller) from 5.7.0 to 5.8.0.
- [Release notes](https://github.com/pyinstaller/pyinstaller/releases)
- [Changelog](https://github.com/pyinstaller/pyinstaller/blob/develop/doc/CHANGES.rst)
- [Commits](https://github.com/pyinstaller/pyinstaller/compare/v5.7.0...v5.8.0)

---
updated-dependencies:
- dependency-name: pyinstaller
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-03-02 21:10:48 -08:00
dependabot[bot]
3ba3ea9b7e
Bump pycryptodomex from 3.16.0 to 3.17 (#1983)
Bumps [pycryptodomex](https://github.com/Legrandin/pycryptodome) from 3.16.0 to 3.17.
- [Release notes](https://github.com/Legrandin/pycryptodome/releases)
- [Changelog](https://github.com/Legrandin/pycryptodome/blob/master/Changelog.rst)
- [Commits](https://github.com/Legrandin/pycryptodome/compare/v3.16.0...v3.17.0)

---
updated-dependencies:
- dependency-name: pycryptodomex
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2023-03-02 21:04:49 -08:00
dependabot[bot]
33f9c70181
Bump urllib3 from 1.26.13 to 1.26.14 (#1965)
* Bump urllib3 from 1.26.13 to 1.26.14

Bumps [urllib3](https://github.com/urllib3/urllib3) from 1.26.13 to 1.26.14.
- [Release notes](https://github.com/urllib3/urllib3/releases)
- [Changelog](https://github.com/urllib3/urllib3/blob/1.26.14/CHANGES.rst)
- [Commits](https://github.com/urllib3/urllib3/compare/1.26.13...1.26.14)

---
updated-dependencies:
- dependency-name: urllib3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update urllib3==1.26.14

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2023-03-02 20:58:20 -08:00
dependabot[bot]
eb9c9ffd4e
Bump pyopenssl from 22.1.0 to 23.0.0 (#1955)
Bumps [pyopenssl](https://github.com/pyca/pyopenssl) from 22.1.0 to 23.0.0.
- [Release notes](https://github.com/pyca/pyopenssl/releases)
- [Changelog](https://github.com/pyca/pyopenssl/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pyca/pyopenssl/compare/22.1.0...23.0.0)

---
updated-dependencies:
- dependency-name: pyopenssl
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2023-03-02 20:57:58 -08:00
dependabot[bot]
133c8a3363
Bump cloudinary from 1.30.0 to 1.32.0 (#1996)
* Bump cloudinary from 1.30.0 to 1.32.0

Bumps [cloudinary](https://github.com/cloudinary/pycloudinary) from 1.30.0 to 1.32.0.
- [Release notes](https://github.com/cloudinary/pycloudinary/releases)
- [Changelog](https://github.com/cloudinary/pycloudinary/blob/master/CHANGELOG.md)
- [Commits](https://github.com/cloudinary/pycloudinary/compare/1.30.0...1.32.0)

---
updated-dependencies:
- dependency-name: cloudinary
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update cloudinary==1.32.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2023-03-02 20:57:02 -08:00
dependabot[bot]
66fa93cfaf
Bump websocket-client from 1.4.2 to 1.5.1 (#1993)
* Bump websocket-client from 1.4.2 to 1.5.1

Bumps [websocket-client](https://github.com/websocket-client/websocket-client) from 1.4.2 to 1.5.1.
- [Release notes](https://github.com/websocket-client/websocket-client/releases)
- [Changelog](https://github.com/websocket-client/websocket-client/blob/master/ChangeLog)
- [Commits](https://github.com/websocket-client/websocket-client/compare/v1.4.2...v1.5.1)

---
updated-dependencies:
- dependency-name: websocket-client
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update websocket-client==1.5.1

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2023-03-02 20:56:49 -08:00
dependabot[bot]
d0f3f96709
Bump simplejson from 3.18.0 to 3.18.3 (#1992)
* Bump simplejson from 3.18.0 to 3.18.3

Bumps [simplejson](https://github.com/simplejson/simplejson) from 3.18.0 to 3.18.3.
- [Release notes](https://github.com/simplejson/simplejson/releases)
- [Changelog](https://github.com/simplejson/simplejson/blob/master/CHANGES.txt)
- [Commits](https://github.com/simplejson/simplejson/compare/v3.18.0...v3.18.3)

---
updated-dependencies:
- dependency-name: simplejson
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update simplejson==3.18.3

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2023-03-02 20:56:39 -08:00
dependabot[bot]
8e42757b2d
Bump beautifulsoup4 from 4.11.1 to 4.11.2 (#1987)
* Bump beautifulsoup4 from 4.11.1 to 4.11.2

Bumps [beautifulsoup4](https://www.crummy.com/software/BeautifulSoup/bs4/) from 4.11.1 to 4.11.2.

---
updated-dependencies:
- dependency-name: beautifulsoup4
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update beautifulsoup4==4.11.2

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2023-03-02 20:56:24 -08:00
dependabot[bot]
ded93ef2f5
Bump apscheduler from 3.9.1.post1 to 3.10.0 (#1986)
* Bump apscheduler from 3.9.1.post1 to 3.10.0

Bumps [apscheduler](https://github.com/agronholm/apscheduler) from 3.9.1.post1 to 3.10.0.
- [Release notes](https://github.com/agronholm/apscheduler/releases)
- [Changelog](https://github.com/agronholm/apscheduler/blob/3.10.0/docs/versionhistory.rst)
- [Commits](https://github.com/agronholm/apscheduler/compare/3.9.1.post1...3.10.0)

---
updated-dependencies:
- dependency-name: apscheduler
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update apscheduler==3.10.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2023-03-02 20:55:46 -08:00
dependabot[bot]
1466a391d1
Bump bleach from 5.0.1 to 6.0.0 (#1979)
* Bump bleach from 5.0.1 to 6.0.0

Bumps [bleach](https://github.com/mozilla/bleach) from 5.0.1 to 6.0.0.
- [Release notes](https://github.com/mozilla/bleach/releases)
- [Changelog](https://github.com/mozilla/bleach/blob/main/CHANGES)
- [Commits](https://github.com/mozilla/bleach/compare/v5.0.1...v6.0.0)

---
updated-dependencies:
- dependency-name: bleach
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update bleach==6.0.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2023-03-02 20:55:01 -08:00
dependabot[bot]
6b1b6d0f32
Bump tempora from 5.1.0 to 5.2.1 (#1977)
* Bump tempora from 5.1.0 to 5.2.1

Bumps [tempora](https://github.com/jaraco/tempora) from 5.1.0 to 5.2.1.
- [Release notes](https://github.com/jaraco/tempora/releases)
- [Changelog](https://github.com/jaraco/tempora/blob/main/CHANGES.rst)
- [Commits](https://github.com/jaraco/tempora/compare/v5.1.0...v5.2.1)

---
updated-dependencies:
- dependency-name: tempora
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update tempora==5.2.1

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2023-03-02 20:54:54 -08:00
dependabot[bot]
2fda916331
Bump markupsafe from 2.1.1 to 2.1.2 (#1976)
* Bump markupsafe from 2.1.1 to 2.1.2

Bumps [markupsafe](https://github.com/pallets/markupsafe) from 2.1.1 to 2.1.2.
- [Release notes](https://github.com/pallets/markupsafe/releases)
- [Changelog](https://github.com/pallets/markupsafe/blob/main/CHANGES.rst)
- [Commits](https://github.com/pallets/markupsafe/compare/2.1.1...2.1.2)

---
updated-dependencies:
- dependency-name: markupsafe
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update markupsafe==2.1.2

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2023-03-02 20:54:41 -08:00
dependabot[bot]
32c06a8b72
Bump dnspython from 2.2.1 to 2.3.0 (#1975)
* Bump dnspython from 2.2.1 to 2.3.0

Bumps [dnspython](https://github.com/rthalley/dnspython) from 2.2.1 to 2.3.0.
- [Release notes](https://github.com/rthalley/dnspython/releases)
- [Changelog](https://github.com/rthalley/dnspython/blob/master/doc/whatsnew.rst)
- [Commits](https://github.com/rthalley/dnspython/compare/v2.2.1...v2.3.0)

---
updated-dependencies:
- dependency-name: dnspython
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update dnspython==2.3.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2023-03-02 20:54:32 -08:00
dependabot[bot]
6910079330
Bump pytz from 2022.7 to 2022.7.1 (#1974)
* Bump pytz from 2022.7 to 2022.7.1

Bumps [pytz](https://github.com/stub42/pytz) from 2022.7 to 2022.7.1.
- [Release notes](https://github.com/stub42/pytz/releases)
- [Commits](https://github.com/stub42/pytz/compare/release_2022.7...release_2022.7.1)

---
updated-dependencies:
- dependency-name: pytz
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update pytz==2022.7.1

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2023-03-02 20:54:08 -08:00
dependabot[bot]
9f727d0086
Bump future from 0.18.2 to 0.18.3 (#1970)
* Bump future from 0.18.2 to 0.18.3

Bumps [future](https://github.com/PythonCharmers/python-future) from 0.18.2 to 0.18.3.
- [Release notes](https://github.com/PythonCharmers/python-future/releases)
- [Changelog](https://github.com/PythonCharmers/python-future/blob/master/docs/changelog.rst)
- [Commits](https://github.com/PythonCharmers/python-future/compare/v0.18.2...v0.18.3)

---
updated-dependencies:
- dependency-name: future
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update future==0.18.3

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2023-03-02 20:53:26 -08:00
dependabot[bot]
cc78f17be5
Bump requests from 2.28.1 to 2.28.2 (#1968)
* Bump requests from 2.28.1 to 2.28.2

Bumps [requests](https://github.com/psf/requests) from 2.28.1 to 2.28.2.
- [Release notes](https://github.com/psf/requests/releases)
- [Changelog](https://github.com/psf/requests/blob/main/HISTORY.md)
- [Commits](https://github.com/psf/requests/compare/v2.28.1...v2.28.2)

---
updated-dependencies:
- dependency-name: requests
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update requests==2.28.2

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2023-03-02 20:53:15 -08:00
dependabot[bot]
70e09582da
Bump packaging from 22.0 to 23.0 (#1964)
* Bump packaging from 22.0 to 23.0

Bumps [packaging](https://github.com/pypa/packaging) from 22.0 to 23.0.
- [Release notes](https://github.com/pypa/packaging/releases)
- [Changelog](https://github.com/pypa/packaging/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pypa/packaging/compare/22.0...23.0)

---
updated-dependencies:
- dependency-name: packaging
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update packaging==23.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2023-03-02 20:53:00 -08:00
dependabot[bot]
1f59171dcb
Bump zipp from 3.11.0 to 3.15.0 (#2011)
* Bump zipp from 3.11.0 to 3.15.0

Bumps [zipp](https://github.com/jaraco/zipp) from 3.11.0 to 3.15.0.
- [Release notes](https://github.com/jaraco/zipp/releases)
- [Changelog](https://github.com/jaraco/zipp/blob/main/CHANGES.rst)
- [Commits](https://github.com/jaraco/zipp/compare/v3.11.0...v3.15.0)

---
updated-dependencies:
- dependency-name: zipp
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update zipp==3.15.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2023-03-02 20:50:33 -08:00
dependabot[bot]
c8f43825f9
Bump importlib-resources from 5.10.1 to 5.12.0 (#2004)
* Bump importlib-resources from 5.10.1 to 5.12.0

Bumps [importlib-resources](https://github.com/python/importlib_resources) from 5.10.1 to 5.12.0.
- [Release notes](https://github.com/python/importlib_resources/releases)
- [Changelog](https://github.com/python/importlib_resources/blob/main/CHANGES.rst)
- [Commits](https://github.com/python/importlib_resources/compare/v5.10.1...v5.12.0)

---
updated-dependencies:
- dependency-name: importlib-resources
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update importlib-resources==5.12.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2023-03-02 20:50:15 -08:00
dependabot[bot]
eaa294b2a2
Bump importlib-metadata from 5.2.0 to 6.0.0 (#1954)
* Bump importlib-metadata from 5.2.0 to 6.0.0

Bumps [importlib-metadata](https://github.com/python/importlib_metadata) from 5.2.0 to 6.0.0.
- [Release notes](https://github.com/python/importlib_metadata/releases)
- [Changelog](https://github.com/python/importlib_metadata/blob/main/CHANGES.rst)
- [Commits](https://github.com/python/importlib_metadata/compare/v5.2.0...v6.0.0)

---
updated-dependencies:
- dependency-name: importlib-metadata
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update importlib-metadata==6.0.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2023-03-02 20:49:14 -08:00
dependabot[bot]
5c43daf067
Bump docker/build-push-action from 3 to 4 (#1985)
Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 3 to 4.
- [Release notes](https://github.com/docker/build-push-action/releases)
- [Commits](https://github.com/docker/build-push-action/compare/v3...v4)

---
updated-dependencies:
- dependency-name: docker/build-push-action
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2023-03-02 20:01:45 -08:00
herby2212
0522253194
Add watch time & user stats for playlists (#2012) 2023-02-28 17:33:13 -08:00
herby2212
ae3d75bbe3
watch time & user stats for collections (#1982)
* user_stats for collection

* watch_time_stats for collection

* check for media_type to be compatible with API

* update API and datafactory optimizations

* beautify webserve class

* fix sql query build

* filter on suitable collections

* stats for collections of sub media type

* optimize array creation
2023-02-26 17:32:50 -08:00
JonnyWong16
993909fa08
Use private shared-memory for Snap 2023-02-26 16:17:58 -08:00
JonnyWong16
ce45321e3f
Revert "Add multiprocessing semaphore prefix"
This reverts commit 731d5c9baf.
2023-02-26 16:13:25 -08:00
JonnyWong16
cd3ff6eed7
Remove extra pass 2023-02-26 16:06:44 -08:00
JonnyWong16
731d5c9baf
Add multiprocessing semaphore prefix
* Fixes #2007
2023-02-26 15:17:04 -08:00
JonnyWong16
af3e5574f5
Migrate to Google Analytics 4 2023-02-26 15:09:51 -08:00
JonnyWong16
42eeb90532
Add ga4mp library
* Remove UniversalAnalytics
2023-02-26 15:09:12 -08:00
JonnyWong16
ecb6d8b743
Move track artist to details tag on info page 2023-02-25 16:43:14 -08:00
JonnyWong16
e6d1712afd
Fix styling on collection info pages 2023-02-25 16:35:48 -08:00
JonnyWong16
ebe570d42f
Allow setting a custom Pushover sound
* Closes #2005
2023-02-21 11:12:56 -08:00
JonnyWong16
2a1bf7847b
Last watched statistics card based on credits markers 2023-02-20 18:36:15 -08:00
JonnyWong16
928e1d4b5e
History table watched status based on credits markers 2023-02-20 18:36:15 -08:00
JonnyWong16
c5005c1ea9
Group watched history sessions based on credits markers 2023-02-20 18:36:15 -08:00
JonnyWong16
b2b12044e3
Trigger on_watched based on credits markers 2023-02-20 18:36:15 -08:00
JonnyWong16
b1dd28e39b
Add setting to change video watched completion behaviour 2023-02-20 16:33:19 -08:00
JonnyWong16
c2abfce8e1
Save credits markers offsets to session history 2023-02-19 17:41:48 -08:00
JonnyWong16
6807cebe51
Strip whitespace from condition values 2023-02-17 18:55:28 -08:00
JonnyWong16
87d3c0ae81
Fix missing on_commercial columns in database 2023-02-17 18:54:52 -08:00
JonnyWong16
6b0b3a476f
Add support for commercial marker triggers 2023-02-17 10:01:57 -08:00
JonnyWong16
32bb98e8c1
Update get_metadata_details docs 2023-02-17 09:29:08 -08:00
JonnyWong16
9c6b8f1af5
Simplify metadata credits marker first flag 2023-02-17 09:28:44 -08:00
JonnyWong16
7cc78d448d
Simplify set marker in database 2023-02-16 17:06:46 -08:00
JonnyWong16
599c54c9e1
Refactor activity handler 2023-02-16 17:02:30 -08:00
JonnyWong16
9be3bbbf0f
Update marker notification parameters 2023-02-16 16:20:25 -08:00
JonnyWong16
97af214ac1
Handle seeking through intro/credits markers 2023-02-16 16:19:29 -08:00
JonnyWong16
71bc063155
Add notification triggers for intro/credit markers 2023-02-16 11:31:35 -08:00
JonnyWong16
9a152932ee
Monitor stream intro/credits marker activity 2023-02-16 11:30:33 -08:00
JonnyWong16
a8539b2927
Retrieve intro/credits markers for metadata details 2023-02-16 11:30:33 -08:00
JonnyWong16
0db9548995
Revert "Add prvenance: false to docker/build-push-action"
This reverts commit 548264d51a.
2023-02-14 18:26:50 -08:00
JonnyWong16
e263f0b8a3
Refactor notification image upload code 2023-02-14 18:21:19 -08:00
JonnyWong16
5ab9315f16
Upload notification images directly to Discord 2023-02-14 18:19:35 -08:00
JonnyWong16
b6ff45138f
Add section_id and user_id parameters to get_home_stats API command
* Closes #1944
2023-01-28 14:10:47 -08:00
JonnyWong16
b0a55df862
Add anidb_id and anidb_url notification parameters
* Closes #1973
2023-01-28 14:10:47 -08:00
JonnyWong16
c51ee673e8
Add support for Telegram group topics
* Closes #1980
2023-01-28 14:10:47 -08:00
herby2212
0959f28e95
Add edition detail field for movie info (#1957)
* edition addition for movie info

* swap position to match plex order
2023-01-28 14:09:11 -08:00
JonnyWong16
1e02c26a9a
Relax workflow action versions 2023-01-20 17:09:20 -08:00
JonnyWong16
548264d51a
Add prvenance: false to docker/build-push-action
Ref: docker/buildx#1533
2023-01-20 17:09:20 -08:00
JonnyWong16
460a463be1
Update notification parameter description for Plex API image paths 2023-01-19 13:54:55 -08:00
JonnyWong16
2f6869ed2a
Update CI badges in README
* Ref: badges/shields#8671

[skip ci]
2022-12-23 11:11:04 -08:00
JonnyWong16
3c996f01a9
v2.11.1 2022-12-22 17:58:38 -08:00
JonnyWong16
d9343730da
Downgrade snap to core20 2022-12-22 17:50:24 -08:00
JonnyWong16
7386ca1c42
Add backports.cached-property==1.0.2 2022-12-22 17:28:28 -08:00
James Tufarelli
2a0e07aca5
Fix update check failing when git is not found (#1943)
* Update versioncheck to cast commit_hash to string

After the most recent v2.11.0 update, Tautulli would not start until I made this change to the codebase.

* Update plexpy/versioncheck.py

Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>
2022-12-22 17:28:09 -08:00
JonnyWong16
1e58847bcd
Update snap to core22
* Fixes #1941
2022-12-22 16:24:51 -08:00
JonnyWong16
b0ba73cf46
Fix no started parameter for recently added notifications
* Fixes #1940
2022-12-22 13:52:11 -08:00
JonnyWong16
6181aa178d
Fix publish installer changelog sed command 2022-12-22 12:01:52 -08:00
JonnyWong16
680c8f1ee3
Update publish installer workflow token 2022-12-22 11:44:48 -08:00
JonnyWong16
e8af221e99
Rename submit winget job name 2022-12-22 11:44:30 -08:00
JonnyWong16
808ca348e8
Use source language instead of stream language on activity cards 2022-12-22 11:24:41 -08:00
JonnyWong16
f6dd38ad12
v2.11.0 2022-12-22 11:15:59 -08:00
dependabot[bot]
4064ac083e
Bump actions/setup-python from 4.3.1 to 4.4.0 (#1938)
Bumps [actions/setup-python](https://github.com/actions/setup-python) from 4.3.1 to 4.4.0.
- [Release notes](https://github.com/actions/setup-python/releases)
- [Commits](https://github.com/actions/setup-python/compare/v4.3.1...v4.4.0)

---
updated-dependencies:
- dependency-name: actions/setup-python
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-12-22 10:45:05 -08:00
dependabot[bot]
31f6b02149
Bump plexapi from 4.13.1 to 4.13.2 (#1939)
* Bump plexapi from 4.13.1 to 4.13.2

Bumps [plexapi](https://github.com/pkkid/python-plexapi) from 4.13.1 to 4.13.2.
- [Release notes](https://github.com/pkkid/python-plexapi/releases)
- [Commits](https://github.com/pkkid/python-plexapi/compare/4.13.1...4.13.2)

---
updated-dependencies:
- dependency-name: plexapi
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update plexapi==4.13.2

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-12-22 10:44:51 -08:00
JonnyWong16
8cd5b0b775
Use system language for requests 2022-12-21 17:25:40 -08:00
JonnyWong16
d426c3e12e
Don't capitalize language and display "Unknown" on activity cards 2022-12-21 17:25:18 -08:00
JonnyWong16
8eed162367
Override direct play subtitle decision in stream data modal 2022-12-21 17:24:41 -08:00
JonnyWong16
fe1d850e1c
Display "Unknown" language in stream data modal 2022-12-21 17:24:14 -08:00
JonnyWong16
bcb9a9d6c6
Display subtitle forced in stream data modal 2022-12-21 17:02:10 -08:00
JonnyWong16
5a9ace0b19
Log subtitle forced 2022-12-21 17:01:50 -08:00
JonnyWong16
185a5cb0ea
Add subtitle_forced to database 2022-12-21 17:01:24 -08:00
JonnyWong16
44419fb0bf
Display subtitle language in stream data modal 2022-12-21 16:35:15 -08:00
JonnyWong16
c00dfca2f0
Log subtitle language 2022-12-21 16:35:15 -08:00
JonnyWong16
023fde7a84
Add subtitle_language to database 2022-12-21 16:35:15 -08:00
JonnyWong16
7c030ef362
Link watch statistics to info page using history metadata
* Closes #1882
2022-12-21 16:35:15 -08:00
FSCorrupt
8664b95ca1
Adding stream audio/sub language to activity card. (#1900)
* Update current_activity_instance.html

* Update index.html

* Make sure language is capitalized on activity card

Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>
2022-12-21 16:26:32 -08:00
Jagandeep Brar
74d8bc15ca
Add session_key to LunaSea notifier payload (#1929) 2022-12-21 16:08:14 -08:00
dependabot[bot]
cbe33e93c9
Bump pyinstaller from 5.6.2 to 5.7.0 (#1917)
Bumps [pyinstaller](https://github.com/pyinstaller/pyinstaller) from 5.6.2 to 5.7.0.
- [Release notes](https://github.com/pyinstaller/pyinstaller/releases)
- [Changelog](https://github.com/pyinstaller/pyinstaller/blob/develop/doc/CHANGES.rst)
- [Commits](https://github.com/pyinstaller/pyinstaller/compare/v5.6.2...v5.7.0)

---
updated-dependencies:
- dependency-name: pyinstaller
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-12-21 16:06:32 -08:00
Eric Nemchik
8cf12a2ab5
backports.zoneinfo environment marker (#1926)
https://github.com/pganssle/zoneinfo#installation-and-depending-on-this-library notes:
> Support for `backports.zoneinfo` in Python 3.9+ is currently minimal, since it is expected that you would use the standard library `zoneinfo` module instead.
2022-12-21 16:05:55 -08:00
dependabot[bot]
497ceb8cbb
Bump pyobjc-core from 9.0 to 9.0.1 (#1935)
Bumps [pyobjc-core](https://github.com/ronaldoussoren/pyobjc) from 9.0 to 9.0.1.
- [Release notes](https://github.com/ronaldoussoren/pyobjc/releases)
- [Changelog](https://github.com/ronaldoussoren/pyobjc/blob/master/docs/changelog.rst)
- [Commits](https://github.com/ronaldoussoren/pyobjc/commits)

---
updated-dependencies:
- dependency-name: pyobjc-core
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-12-21 16:05:11 -08:00
dependabot[bot]
18a5962026
Bump pyobjc-framework-cocoa from 9.0 to 9.0.1 (#1933)
Bumps [pyobjc-framework-cocoa](https://github.com/ronaldoussoren/pyobjc) from 9.0 to 9.0.1.
- [Release notes](https://github.com/ronaldoussoren/pyobjc/releases)
- [Changelog](https://github.com/ronaldoussoren/pyobjc/blob/master/docs/changelog.rst)
- [Commits](https://github.com/ronaldoussoren/pyobjc/commits)

---
updated-dependencies:
- dependency-name: pyobjc-framework-cocoa
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-12-21 16:03:50 -08:00
dependabot[bot]
d8150813f1
Bump pycryptodomex from 3.15.0 to 3.16.0 (#1911)
Bumps [pycryptodomex](https://github.com/Legrandin/pycryptodome) from 3.15.0 to 3.16.0.
- [Release notes](https://github.com/Legrandin/pycryptodome/releases)
- [Changelog](https://github.com/Legrandin/pycryptodome/blob/master/Changelog.rst)
- [Commits](https://github.com/Legrandin/pycryptodome/compare/v3.15.0...v3.16.0)

---
updated-dependencies:
- dependency-name: pycryptodomex
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-12-21 16:03:24 -08:00
dependabot[bot]
4398ece2da
Bump pytz from 2022.6 to 2022.7 (#1934)
* Bump pytz from 2022.6 to 2022.7

Bumps [pytz](https://github.com/stub42/pytz) from 2022.6 to 2022.7.
- [Release notes](https://github.com/stub42/pytz/releases)
- [Commits](https://github.com/stub42/pytz/compare/release_2022.6...release_2022.7)

---
updated-dependencies:
- dependency-name: pytz
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update pytz==2022.7

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-12-21 16:02:40 -08:00
dependabot[bot]
8159bf456c
Bump importlib-metadata from 5.0.0 to 5.2.0 (#1932)
* Bump importlib-metadata from 5.0.0 to 5.2.0

Bumps [importlib-metadata](https://github.com/python/importlib_metadata) from 5.0.0 to 5.2.0.
- [Release notes](https://github.com/python/importlib_metadata/releases)
- [Changelog](https://github.com/python/importlib_metadata/blob/main/CHANGES.rst)
- [Commits](https://github.com/python/importlib_metadata/compare/v5.0.0...v5.2.0)

---
updated-dependencies:
- dependency-name: importlib-metadata
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update importlib-metadata==5.2.0

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-12-21 16:02:25 -08:00
dependabot[bot]
56780677fb
Bump packaging from 21.3 to 22.0 (#1922)
* Bump packaging from 21.3 to 22.0

Bumps [packaging](https://github.com/pypa/packaging) from 21.3 to 22.0.
- [Release notes](https://github.com/pypa/packaging/releases)
- [Changelog](https://github.com/pypa/packaging/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pypa/packaging/compare/21.3...22.0)

---
updated-dependencies:
- dependency-name: packaging
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update packaging==22.0

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-12-21 16:01:24 -08:00
dependabot[bot]
dbe0018e24
Bump certifi from 2022.9.24 to 2022.12.7 (#1920)
* Bump certifi from 2022.9.24 to 2022.12.7

Bumps [certifi](https://github.com/certifi/python-certifi) from 2022.9.24 to 2022.12.7.
- [Release notes](https://github.com/certifi/python-certifi/releases)
- [Commits](https://github.com/certifi/python-certifi/compare/2022.09.24...2022.12.07)

---
updated-dependencies:
- dependency-name: certifi
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update certifi==2022.12.7

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-12-21 16:00:56 -08:00
dependabot[bot]
483245506b
Bump importlib-resources from 5.10.0 to 5.10.1 (#1918)
* Bump importlib-resources from 5.10.0 to 5.10.1

Bumps [importlib-resources](https://github.com/python/importlib_resources) from 5.10.0 to 5.10.1.
- [Release notes](https://github.com/python/importlib_resources/releases)
- [Changelog](https://github.com/python/importlib_resources/blob/main/CHANGES.rst)
- [Commits](https://github.com/python/importlib_resources/compare/v5.10.0...v5.10.1)

---
updated-dependencies:
- dependency-name: importlib-resources
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update importlib-resources==5.10.1

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-12-21 16:00:12 -08:00
dependabot[bot]
c61f854318
Bump tzdata from 2022.6 to 2022.7 (#1915)
* Bump tzdata from 2022.6 to 2022.7

Bumps [tzdata](https://github.com/python/tzdata) from 2022.6 to 2022.7.
- [Release notes](https://github.com/python/tzdata/releases)
- [Changelog](https://github.com/python/tzdata/blob/master/NEWS.md)
- [Commits](https://github.com/python/tzdata/compare/2022.6...2022.7)

---
updated-dependencies:
- dependency-name: tzdata
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update tzdata==2022.7

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-12-21 15:59:53 -08:00
dependabot[bot]
e646c0e6eb
Bump zipp from 3.10.0 to 3.11.0 (#1912)
* Bump zipp from 3.10.0 to 3.11.0

Bumps [zipp](https://github.com/jaraco/zipp) from 3.10.0 to 3.11.0.
- [Release notes](https://github.com/jaraco/zipp/releases)
- [Changelog](https://github.com/jaraco/zipp/blob/main/CHANGES.rst)
- [Commits](https://github.com/jaraco/zipp/compare/v3.10.0...v3.11.0)

---
updated-dependencies:
- dependency-name: zipp
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update zipp==3.11.0

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-12-21 15:59:38 -08:00
dependabot[bot]
d596b86c8d
Bump urllib3 from 1.26.12 to 1.26.13 (#1908)
* Bump urllib3 from 1.26.12 to 1.26.13

Bumps [urllib3](https://github.com/urllib3/urllib3) from 1.26.12 to 1.26.13.
- [Release notes](https://github.com/urllib3/urllib3/releases)
- [Changelog](https://github.com/urllib3/urllib3/blob/1.26.13/CHANGES.rst)
- [Commits](https://github.com/urllib3/urllib3/compare/1.26.12...1.26.13)

---
updated-dependencies:
- dependency-name: urllib3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update urllib3==1.26.13

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-12-21 15:59:10 -08:00
dependabot[bot]
3d378eb583
Bump cheroot from 8.6.0 to 9.0.0 (#1903)
* Bump cheroot from 8.6.0 to 9.0.0

Bumps [cheroot](https://github.com/cherrypy/cheroot) from 8.6.0 to 9.0.0.
- [Release notes](https://github.com/cherrypy/cheroot/releases)
- [Changelog](https://github.com/cherrypy/cheroot/blob/main/CHANGES.rst)
- [Commits](https://github.com/cherrypy/cheroot/compare/v8.6.0...v9.0.0)

---
updated-dependencies:
- dependency-name: cheroot
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update cheroot==9.0.0

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-12-21 15:58:54 -08:00
dependabot[bot]
0a5edebea3
Bump tempora from 5.0.2 to 5.1.0 (#1902)
* Bump tempora from 5.0.2 to 5.1.0

Bumps [tempora](https://github.com/jaraco/tempora) from 5.0.2 to 5.1.0.
- [Release notes](https://github.com/jaraco/tempora/releases)
- [Changelog](https://github.com/jaraco/tempora/blob/main/CHANGES.rst)
- [Commits](https://github.com/jaraco/tempora/compare/v5.0.2...v5.1.0)

---
updated-dependencies:
- dependency-name: tempora
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update tempora==5.1.0

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-12-21 15:58:39 -08:00
dependabot[bot]
d736fab432
Bump actions/stale from 6 to 7 (#1937)
Bumps [actions/stale](https://github.com/actions/stale) from 6 to 7.
- [Release notes](https://github.com/actions/stale/releases)
- [Changelog](https://github.com/actions/stale/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/stale/compare/v6...v7)

---
updated-dependencies:
- dependency-name: actions/stale
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-12-21 15:42:30 -08:00
dependabot[bot]
ff81b08491
Bump actions/cache from 3.0.11 to 3.2.0 (#1936)
Bumps [actions/cache](https://github.com/actions/cache) from 3.0.11 to 3.2.0.
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](https://github.com/actions/cache/compare/v3.0.11...v3.2.0)

---
updated-dependencies:
- dependency-name: actions/cache
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-12-21 15:42:02 -08:00
dependabot[bot]
d00916331d
Bump actions/checkout from 3.1.0 to 3.2.0 (#1924)
Bumps [actions/checkout](https://github.com/actions/checkout) from 3.1.0 to 3.2.0.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v3.1.0...v3.2.0)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-12-21 15:41:48 -08:00
dependabot[bot]
ec08c887f4
Bump actions/setup-python from 4.3.0 to 4.3.1 (#1921)
Bumps [actions/setup-python](https://github.com/actions/setup-python) from 4.3.0 to 4.3.1.
- [Release notes](https://github.com/actions/setup-python/releases)
- [Commits](https://github.com/actions/setup-python/compare/v4.3.0...v4.3.1)

---
updated-dependencies:
- dependency-name: actions/setup-python
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-12-21 15:41:32 -08:00
dependabot[bot]
d7aa1ced53
Bump dessant/label-actions from 2 to 3 (#1916)
Bumps [dessant/label-actions](https://github.com/dessant/label-actions) from 2 to 3.
- [Release notes](https://github.com/dessant/label-actions/releases)
- [Changelog](https://github.com/dessant/label-actions/blob/master/CHANGELOG.md)
- [Commits](https://github.com/dessant/label-actions/compare/v2...v3)

---
updated-dependencies:
- dependency-name: dessant/label-actions
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-12-21 15:41:04 -08:00
JonnyWong16
8a1cd2841b
Revert "Pin diddlesnaps/snapcraft-multiarch-action@v1.5.0"
This reverts commit 6156edf5fe.
2022-12-21 15:14:22 -08:00
JonnyWong16
5f8fbe1230
Add meta color-scheme to newsletter template
* Allows CSS to support light and dark themes
2022-12-21 15:13:14 -08:00
JonnyWong16
8cfe60b485
Add started and stopped notification parameters
* Closes #1931
2022-12-21 14:55:33 -08:00
JonnyWong16
6156edf5fe
Pin diddlesnaps/snapcraft-multiarch-action@v1.5.0 2022-11-29 20:55:14 -08:00
JonnyWong16
e2326cd06a
Mask more user and metadata fields for guest access
Fixes #1913
2022-11-29 14:04:24 -08:00
JonnyWong16
94eb5cdef3
Add movie editionTitle to exporter 2022-11-24 09:15:07 -08:00
JonnyWong16
8c552d3086
Only validate condition operator if parameter is present 2022-11-21 20:48:47 -08:00
JonnyWong16
5a8797a6dd
Shorten TLS log message 2022-11-15 15:56:11 -08:00
dependabot[bot]
192dd64dbe
Bump mako from 1.2.3 to 1.2.4 (#1899)
* Bump mako from 1.2.3 to 1.2.4

Bumps [mako](https://github.com/sqlalchemy/mako) from 1.2.3 to 1.2.4.
- [Release notes](https://github.com/sqlalchemy/mako/releases)
- [Changelog](https://github.com/sqlalchemy/mako/blob/main/CHANGES)
- [Commits](https://github.com/sqlalchemy/mako/commits)

---
updated-dependencies:
- dependency-name: mako
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update mako==1.2.4

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-11-15 15:56:03 -08:00
dependabot[bot]
259a96995a
Bump simplejson from 3.17.6 to 3.18.0 (#1898)
* Bump simplejson from 3.17.6 to 3.18.0

Bumps [simplejson](https://github.com/simplejson/simplejson) from 3.17.6 to 3.18.0.
- [Release notes](https://github.com/simplejson/simplejson/releases)
- [Changelog](https://github.com/simplejson/simplejson/blob/master/CHANGES.txt)
- [Commits](https://github.com/simplejson/simplejson/compare/v3.17.6...v3.18.0)

---
updated-dependencies:
- dependency-name: simplejson
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update simplejson==3.18.0

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-11-15 15:55:50 -08:00
dependabot[bot]
60da559332
Bump pyjwt from 2.4.0 to 2.6.0 (#1897)
* Bump pyjwt from 2.4.0 to 2.6.0

Bumps [pyjwt](https://github.com/jpadilla/pyjwt) from 2.4.0 to 2.6.0.
- [Release notes](https://github.com/jpadilla/pyjwt/releases)
- [Changelog](https://github.com/jpadilla/pyjwt/blob/master/CHANGELOG.rst)
- [Commits](https://github.com/jpadilla/pyjwt/compare/2.4.0...2.6.0)

---
updated-dependencies:
- dependency-name: pyjwt
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update pyjwt==2.6.0

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-11-14 11:27:25 -08:00
dependabot[bot]
79cf61c53e
Bump rumps from 0.3.0 to 0.4.0 (#1896)
* Bump rumps from 0.3.0 to 0.4.0

Bumps [rumps](https://github.com/jaredks/rumps) from 0.3.0 to 0.4.0.
- [Release notes](https://github.com/jaredks/rumps/releases)
- [Changelog](https://github.com/jaredks/rumps/blob/master/CHANGES.rst)
- [Commits](https://github.com/jaredks/rumps/commits)

---
updated-dependencies:
- dependency-name: rumps
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update rumps==0.4.0

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-11-14 11:27:16 -08:00
dependabot[bot]
b31d75aeee
Bump distro from 1.7.0 to 1.8.0 (#1895)
* Bump distro from 1.7.0 to 1.8.0

Bumps [distro](https://github.com/python-distro/distro) from 1.7.0 to 1.8.0.
- [Release notes](https://github.com/python-distro/distro/releases)
- [Changelog](https://github.com/python-distro/distro/blob/master/CHANGELOG.md)
- [Commits](https://github.com/python-distro/distro/compare/v1.7.0...v1.8.0)

---
updated-dependencies:
- dependency-name: distro
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update distro==1.8.0

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-11-14 11:27:01 -08:00
dependabot[bot]
6b835226cd
Bump cloudinary from 1.29.0 to 1.30.0 (#1890)
* Bump cloudinary from 1.29.0 to 1.30.0

Bumps [cloudinary](https://github.com/cloudinary/pycloudinary) from 1.29.0 to 1.30.0.
- [Release notes](https://github.com/cloudinary/pycloudinary/releases)
- [Changelog](https://github.com/cloudinary/pycloudinary/blob/master/CHANGELOG.md)
- [Commits](https://github.com/cloudinary/pycloudinary/compare/1.29.0...1.30.0)

---
updated-dependencies:
- dependency-name: cloudinary
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update cloudinary==1.30.0

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-11-14 11:26:24 -08:00
dependabot[bot]
7f132439be
Bump tokenize-rt from 4.2.1 to 5.0.0 (#1889)
* Bump tokenize-rt from 4.2.1 to 5.0.0

Bumps [tokenize-rt](https://github.com/asottile/tokenize-rt) from 4.2.1 to 5.0.0.
- [Release notes](https://github.com/asottile/tokenize-rt/releases)
- [Commits](https://github.com/asottile/tokenize-rt/compare/v4.2.1...v5.0.0)

---
updated-dependencies:
- dependency-name: tokenize-rt
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update tokenize-rt==5.0.0

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-11-14 11:26:09 -08:00
dependabot[bot]
6365327595
Bump pyopenssl from 22.0.0 to 22.1.0 (#1893)
Bumps [pyopenssl](https://github.com/pyca/pyopenssl) from 22.0.0 to 22.1.0.
- [Release notes](https://github.com/pyca/pyopenssl/releases)
- [Changelog](https://github.com/pyca/pyopenssl/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pyca/pyopenssl/compare/22.0.0...22.1.0)

---
updated-dependencies:
- dependency-name: pyopenssl
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-11-14 11:25:40 -08:00
dependabot[bot]
8d40224d61
Bump pywin32 from 304 to 305 (#1894)
Bumps [pywin32](https://github.com/mhammond/pywin32) from 304 to 305.
- [Release notes](https://github.com/mhammond/pywin32/releases)
- [Changelog](https://github.com/mhammond/pywin32/blob/main/CHANGES.txt)
- [Commits](https://github.com/mhammond/pywin32/commits)

---
updated-dependencies:
- dependency-name: pywin32
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-11-14 11:24:36 -08:00
dependabot[bot]
b3091d7366
Bump pyobjc-framework-cocoa from 8.5 to 9.0 (#1891)
Bumps [pyobjc-framework-cocoa](https://github.com/ronaldoussoren/pyobjc) from 8.5 to 9.0.
- [Release notes](https://github.com/ronaldoussoren/pyobjc/releases)
- [Changelog](https://github.com/ronaldoussoren/pyobjc/blob/master/docs/changelog.rst)
- [Commits](https://github.com/ronaldoussoren/pyobjc/compare/v8.5...v9.0)

---
updated-dependencies:
- dependency-name: pyobjc-framework-cocoa
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-11-14 11:24:22 -08:00
dependabot[bot]
fb21815ca0
Bump apscheduler from 3.9.1 to 3.9.1.post1 (#1892)
Bumps [apscheduler](https://github.com/agronholm/apscheduler) from 3.9.1 to 3.9.1.post1.
- [Release notes](https://github.com/agronholm/apscheduler/releases)
- [Changelog](https://github.com/agronholm/apscheduler/blob/master/docs/versionhistory.rst)
- [Commits](https://github.com/agronholm/apscheduler/compare/3.9.1...3.9.1.post1)

---
updated-dependencies:
- dependency-name: apscheduler
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-11-14 11:24:06 -08:00
JonnyWong16
0f39171f93
Make webserver TLS version advanced config
Ref: #1870
2022-11-14 11:09:22 -08:00
JonnyWong16
100fdd1df1
Change export m3u8 to m3u extension
* m3u files are still encoded using UTF-8
2022-11-13 19:09:58 -08:00
JonnyWong16
1cdb55a6a9
Set SSLContext.minimum_version to TLSv1.2
`ssl.OP_NO_TLSv1` and `ssl.OP_NO_TLSv1_1` deprecated since Python 3.7 and OpenSSL 1.1.0.

Ref: #1870
2022-11-13 01:03:36 -08:00
JonnyWong16
977eec8a66
Disable TLS 1.0 and TLS 1.1 in webserver
Fixes #1870
2022-11-13 00:19:02 -08:00
JonnyWong16
05739ea959
pyOpenSSL only required for generating self-signed certificates 2022-11-13 00:17:28 -08:00
JonnyWong16
ed735e5fa3
Shorten winget workflow name 2022-11-12 17:57:44 -08:00
dependabot[bot]
76cc56a215
Bump cherrypy from 18.6.1 to 18.8.0 (#1796)
* Bump cherrypy from 18.6.1 to 18.8.0

Bumps [cherrypy](https://github.com/cherrypy/cherrypy) from 18.6.1 to 18.8.0.
- [Release notes](https://github.com/cherrypy/cherrypy/releases)
- [Changelog](https://github.com/cherrypy/cherrypy/blob/main/CHANGES.rst)
- [Commits](https://github.com/cherrypy/cherrypy/compare/v18.6.1...v18.8.0)

---
updated-dependencies:
- dependency-name: cherrypy
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update cherrypy==18.8.0

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>
2022-11-12 17:53:03 -08:00
dependabot[bot]
e79da07973
Bump plexapi from 4.12.1 to 4.13.1 (#1888)
Bumps [plexapi](https://github.com/pkkid/python-plexapi) from 4.12.1 to 4.13.1.
- [Release notes](https://github.com/pkkid/python-plexapi/releases)
- [Commits](https://github.com/pkkid/python-plexapi/compare/4.12.1...4.13.1)

---
updated-dependencies:
- dependency-name: plexapi
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-11-12 17:29:35 -08:00
dependabot[bot]
3af08f0d07
Bump websocket-client from 1.3.2 to 1.4.2 (#1886)
* Bump websocket-client from 1.3.2 to 1.4.2

Bumps [websocket-client](https://github.com/websocket-client/websocket-client) from 1.3.2 to 1.4.2.
- [Release notes](https://github.com/websocket-client/websocket-client/releases)
- [Changelog](https://github.com/websocket-client/websocket-client/blob/master/ChangeLog)
- [Commits](https://github.com/websocket-client/websocket-client/compare/v1.3.2...v1.4.2)

---
updated-dependencies:
- dependency-name: websocket-client
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update websocket-client==1.4.2

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-11-12 17:29:02 -08:00
dependabot[bot]
a5ccc9a1a3
Bump pytz from 2022.1 to 2022.6 (#1880)
* Bump pytz from 2022.1 to 2022.6

Bumps [pytz](https://github.com/stub42/pytz) from 2022.1 to 2022.6.
- [Release notes](https://github.com/stub42/pytz/releases)
- [Commits](https://github.com/stub42/pytz/compare/release_2022.1...release_2022.6)

---
updated-dependencies:
- dependency-name: pytz
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update pytz==2022.6

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-11-12 17:26:45 -08:00
dependabot[bot]
8a4cb13b18
Bump tzdata from 2022.1 to 2022.6 (#1878)
* Bump tzdata from 2022.1 to 2022.6

Bumps [tzdata](https://github.com/python/tzdata) from 2022.1 to 2022.6.
- [Release notes](https://github.com/python/tzdata/releases)
- [Changelog](https://github.com/python/tzdata/blob/master/NEWS.md)
- [Commits](https://github.com/python/tzdata/compare/2022.1...2022.6)

---
updated-dependencies:
- dependency-name: tzdata
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update tzdata==2022.6

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-11-12 17:25:54 -08:00
dependabot[bot]
c2f47a52b4
Bump httpagentparser from 1.9.2 to 1.9.5 (#1869)
* Bump httpagentparser from 1.9.2 to 1.9.5

Bumps [httpagentparser](https://github.com/shon/httpagentparser) from 1.9.2 to 1.9.5.
- [Release notes](https://github.com/shon/httpagentparser/releases)
- [Commits](https://github.com/shon/httpagentparser/commits)

---
updated-dependencies:
- dependency-name: httpagentparser
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update httpagentparser==1.9.5

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-11-12 17:23:34 -08:00
dependabot[bot]
d26ce224ce
Bump mako from 1.2.0 to 1.2.3 (#1845)
* Bump mako from 1.2.0 to 1.2.3

Bumps [mako](https://github.com/sqlalchemy/mako) from 1.2.0 to 1.2.3.
- [Release notes](https://github.com/sqlalchemy/mako/releases)
- [Changelog](https://github.com/sqlalchemy/mako/blob/main/CHANGES)
- [Commits](https://github.com/sqlalchemy/mako/commits)

---
updated-dependencies:
- dependency-name: mako
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update mako==1.2.3

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-11-12 17:19:17 -08:00
dependabot[bot]
58aab24c28
Bump arrow from 1.2.2 to 1.2.3 (#1829)
* Bump arrow from 1.2.2 to 1.2.3

Bumps [arrow](https://github.com/arrow-py/arrow) from 1.2.2 to 1.2.3.
- [Release notes](https://github.com/arrow-py/arrow/releases)
- [Changelog](https://github.com/arrow-py/arrow/blob/master/CHANGELOG.rst)
- [Commits](https://github.com/arrow-py/arrow/compare/1.2.2...1.2.3)

---
updated-dependencies:
- dependency-name: arrow
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update arrow==1.2.3

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-11-12 17:18:11 -08:00
dependabot[bot]
76649be6e4
Bump tempora from 5.0.1 to 5.0.2 (#1795)
Bumps [tempora](https://github.com/jaraco/tempora) from 5.0.1 to 5.0.2.
- [Release notes](https://github.com/jaraco/tempora/releases)
- [Changelog](https://github.com/jaraco/tempora/blob/main/CHANGES.rst)
- [Commits](https://github.com/jaraco/tempora/compare/v5.0.1...v5.0.2)

---
updated-dependencies:
- dependency-name: tempora
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-11-12 17:14:13 -08:00
dependabot[bot]
af1aed0b6b
Bump requests from 2.27.1 to 2.28.1 (#1781)
* Bump requests from 2.27.1 to 2.28.1

Bumps [requests](https://github.com/psf/requests) from 2.27.1 to 2.28.1.
- [Release notes](https://github.com/psf/requests/releases)
- [Changelog](https://github.com/psf/requests/blob/main/HISTORY.md)
- [Commits](https://github.com/psf/requests/compare/v2.27.1...v2.28.1)

---
updated-dependencies:
- dependency-name: requests
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update requests==2.28.1

* Update urllib3==1.26.12

* Update certifi==2022.9.24

* Update idna==3.4

* Update charset-normalizer==2.1.1

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-11-12 17:12:19 -08:00
dependabot[bot]
baa0e08c2a
Bump zipp from 3.8.0 to 3.10.0 (#1872)
* Bump zipp from 3.8.0 to 3.10.0

Bumps [zipp](https://github.com/jaraco/zipp) from 3.8.0 to 3.10.0.
- [Release notes](https://github.com/jaraco/zipp/releases)
- [Changelog](https://github.com/jaraco/zipp/blob/main/CHANGES.rst)
- [Commits](https://github.com/jaraco/zipp/compare/v3.8.0...v3.10.0)

---
updated-dependencies:
- dependency-name: zipp
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update zipp==3.10.0

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-11-12 17:12:06 -08:00
dependabot[bot]
d889e810f4
Bump bleach from 5.0.0 to 5.0.1 (#1777)
* Bump bleach from 5.0.0 to 5.0.1

Bumps [bleach](https://github.com/mozilla/bleach) from 5.0.0 to 5.0.1.
- [Release notes](https://github.com/mozilla/bleach/releases)
- [Changelog](https://github.com/mozilla/bleach/blob/main/CHANGES)
- [Commits](https://github.com/mozilla/bleach/commits)

---
updated-dependencies:
- dependency-name: bleach
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update bleach==5.0.1

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-11-12 17:11:49 -08:00
dependabot[bot]
21f5fee403
Bump idna from 3.3 to 3.4 (#1835)
Bumps [idna](https://github.com/kjd/idna) from 3.3 to 3.4.
- [Release notes](https://github.com/kjd/idna/releases)
- [Changelog](https://github.com/kjd/idna/blob/master/HISTORY.rst)
- [Commits](https://github.com/kjd/idna/compare/v3.3...v3.4)

---
updated-dependencies:
- dependency-name: idna
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-11-12 17:11:08 -08:00
dependabot[bot]
fbb016a7fd
Bump certifi from 2022.5.18.1 to 2022.9.24 (#1849)
Bumps [certifi](https://github.com/certifi/python-certifi) from 2022.5.18.1 to 2022.9.24.
- [Release notes](https://github.com/certifi/python-certifi/releases)
- [Commits](https://github.com/certifi/python-certifi/compare/2022.05.18.1...2022.09.24)

---
updated-dependencies:
- dependency-name: certifi
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-11-12 17:10:37 -08:00
dependabot[bot]
cc0c4b638d
Bump urllib3 from 1.26.9 to 1.26.12 (#1823)
Bumps [urllib3](https://github.com/urllib3/urllib3) from 1.26.9 to 1.26.12.
- [Release notes](https://github.com/urllib3/urllib3/releases)
- [Changelog](https://github.com/urllib3/urllib3/blob/main/CHANGES.rst)
- [Commits](https://github.com/urllib3/urllib3/compare/1.26.9...1.26.12)

---
updated-dependencies:
- dependency-name: urllib3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-11-12 17:10:26 -08:00
JonnyWong16
c73450c0db
Update importlib-resources==5.10.0
[skip ci]
2022-11-12 17:05:05 -08:00
JonnyWong16
5bb9dbd0f6
Update importlib-metadata==5.0.0
[skip ci]
2022-11-12 17:04:54 -08:00
dependabot[bot]
20be945e8c
Bump mshick/add-pr-comment from 1 to 2 (#1885)
Bumps [mshick/add-pr-comment](https://github.com/mshick/add-pr-comment) from 1 to 2.
- [Release notes](https://github.com/mshick/add-pr-comment/releases)
- [Commits](https://github.com/mshick/add-pr-comment/compare/v1...v2)

---
updated-dependencies:
- dependency-name: mshick/add-pr-comment
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-11-12 17:03:24 -08:00
dependabot[bot]
b11b7e62e9
Bump pyinstaller from 5.1 to 5.6.2 (#1879)
Bumps [pyinstaller](https://github.com/pyinstaller/pyinstaller) from 5.1 to 5.6.2.
- [Release notes](https://github.com/pyinstaller/pyinstaller/releases)
- [Changelog](https://github.com/pyinstaller/pyinstaller/blob/develop/doc/CHANGES.rst)
- [Commits](https://github.com/pyinstaller/pyinstaller/compare/v5.1...v5.6.2)

---
updated-dependencies:
- dependency-name: pyinstaller
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>
2022-11-12 17:00:58 -08:00
dependabot[bot]
76a3b3d2a5
Bump importlib-resources from 5.7.1 to 5.10.0 (#1862)
Bumps [importlib-resources](https://github.com/python/importlib_resources) from 5.7.1 to 5.10.0.
- [Release notes](https://github.com/python/importlib_resources/releases)
- [Changelog](https://github.com/python/importlib_resources/blob/main/CHANGES.rst)
- [Commits](https://github.com/python/importlib_resources/compare/v5.7.1...v5.10.0)

---
updated-dependencies:
- dependency-name: importlib-resources
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-11-12 17:00:33 -08:00
dependabot[bot]
65452f08ce
Bump importlib-metadata from 4.11.4 to 5.0.0 (#1856)
Bumps [importlib-metadata](https://github.com/python/importlib_metadata) from 4.11.4 to 5.0.0.
- [Release notes](https://github.com/python/importlib_metadata/releases)
- [Changelog](https://github.com/python/importlib_metadata/blob/main/CHANGES.rst)
- [Commits](https://github.com/python/importlib_metadata/compare/v4.11.4...v5.0.0)

---
updated-dependencies:
- dependency-name: importlib-metadata
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-11-12 16:52:22 -08:00
dependabot[bot]
75e492556b
Bump pyobjc-core from 8.5 to 9.0 (#1887)
Bumps [pyobjc-core](https://github.com/ronaldoussoren/pyobjc) from 8.5 to 9.0.
- [Release notes](https://github.com/ronaldoussoren/pyobjc/releases)
- [Changelog](https://github.com/ronaldoussoren/pyobjc/blob/master/docs/changelog.rst)
- [Commits](https://github.com/ronaldoussoren/pyobjc/compare/v8.5...v9.0)

---
updated-dependencies:
- dependency-name: pyobjc-core
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-11-12 16:52:16 -08:00
dependabot[bot]
a58a4ed632
Bump pycryptodomex from 3.14.1 to 3.15.0 (#1773)
Bumps [pycryptodomex](https://github.com/Legrandin/pycryptodome) from 3.14.1 to 3.15.0.
- [Release notes](https://github.com/Legrandin/pycryptodome/releases)
- [Changelog](https://github.com/Legrandin/pycryptodome/blob/master/Changelog.rst)
- [Commits](https://github.com/Legrandin/pycryptodome/compare/v3.14.1...v3.15.0)

---
updated-dependencies:
- dependency-name: pycryptodomex
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-11-12 16:51:59 -08:00
Paarth Shah
2ea85f31e7
Bump minimum python version in CONTRIBUTING.md. (#1854)
* Bump minimum python version in CONTRIBUTING.md.

* Fix random typo.

* More touch-ups.

[skip ci]
2022-11-12 16:48:40 -08:00
JonnyWong16
38cc3bc7f2
Update winget workflow token
[skip ci]
2022-11-07 13:34:25 -08:00
JonnyWong16
04d6bfbd78
Fix publish installer changelog 2022-11-07 13:22:37 -08:00
JonnyWong16
d7f6a1b186
v2.10.5 2022-11-07 13:14:21 -08:00
JonnyWong16
b1e2a30dc1
Fix publish installer workflow 2022-11-07 12:31:17 -08:00
JonnyWong16
defbbbff92
Patch set-output to environment files in GitHub workflow
* https://github.blog/changelog/2022-10-11-github-actions-deprecating-save-state-and-set-output-commands/
2022-11-07 12:22:30 -08:00
JonnyWong16
7c8cea74e4
Fix padding on condition operator dropdown on small screens 2022-11-07 12:05:04 -08:00
JonnyWong16
a3ad40122d
Add months timeframe for newsletters
* Closes #1876
2022-11-07 11:26:13 -08:00
JonnyWong16
b74a1a3c32
Separate stdout and stderr console logging
* Closes #1874
2022-11-07 10:41:49 -08:00
JonnyWong16
894eaf0365
Check IPv6 HTTP host when retrieving app URL 2022-11-07 10:41:49 -08:00
JonnyWong16
ed53d66aa7
Launch browser with IPv6 http_host 2022-11-07 10:41:49 -08:00
dependabot[bot]
c53566225c
Bump actions/cache from 3.0.8 to 3.0.11 (#1864)
Bumps [actions/cache](https://github.com/actions/cache) from 3.0.8 to 3.0.11.
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](https://github.com/actions/cache/compare/v3.0.8...v3.0.11)

---
updated-dependencies:
- dependency-name: actions/cache
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-11-07 09:30:51 -08:00
dependabot[bot]
a1b6c35bd2
Bump actions/setup-python from 4.2.0 to 4.3.0 (#1859)
Bumps [actions/setup-python](https://github.com/actions/setup-python) from 4.2.0 to 4.3.0.
- [Release notes](https://github.com/actions/setup-python/releases)
- [Commits](https://github.com/actions/setup-python/compare/v4.2.0...v4.3.0)

---
updated-dependencies:
- dependency-name: actions/setup-python
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-11-07 09:30:40 -08:00
dependabot[bot]
1977ca7db2
Bump actions/checkout from 3.0.2 to 3.1.0 (#1858)
Bumps [actions/checkout](https://github.com/actions/checkout) from 3.0.2 to 3.1.0.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v3.0.2...v3.1.0)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-11-07 09:30:30 -08:00
dependabot[bot]
4b97382b7c
Bump actions/stale from 5 to 6 (#1844)
Bumps [actions/stale](https://github.com/actions/stale) from 5 to 6.
- [Release notes](https://github.com/actions/stale/releases)
- [Changelog](https://github.com/actions/stale/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/stale/compare/v5...v6)

---
updated-dependencies:
- dependency-name: actions/stale
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-11-07 09:30:19 -08:00
JonnyWong16
5975b59c93
Add user_thumb to get_history response 2022-11-05 20:03:48 +00:00
JonnyWong16
571bbb2db1
Fallback season thumb to show thumb in get_metadata 2022-11-01 16:37:36 +00:00
JonnyWong16
08bc365a7c
Add collections to get_children_metadata API data 2022-10-25 16:11:37 +00:00
JonnyWong16
e6829310ad
Validate notifier custom conditions before saving
* Fixes #1846
2022-10-10 19:05:13 +00:00
JonnyWong16
a9949a07da
Update filterer
* Clear condition operator if type changes
2022-10-10 18:05:14 +00:00
JonnyWong16
5faeafedd5
Fix API 400 response code 2022-10-01 19:24:57 +00:00
JonnyWong16
0f872ab440
Fix broken link on library stats cards 2022-09-27 23:41:27 +00:00
JonnyWong16
15afbe3001
Add edition_title notification parameter 2022-09-27 23:28:48 +00:00
JonnyWong16
a8be53e0dc
Add edition_title to metadata details 2022-09-27 21:18:52 +00:00
JonnyWong16
90cf863305
Update pip cache in publish-installers workflow 2022-09-15 10:05:57 -07:00
JonnyWong16
5ace9e163d
Set default library count to 0 2022-09-12 16:47:06 -07:00
JonnyWong16
54af528f6c
Add submit-winget.yml workflow 2022-09-10 09:17:01 -07:00
JonnyWong16
0a6b12329c
Link to MusicBrainz track for notifications 2022-09-09 16:14:31 -07:00
JonnyWong16
41b796e007
v2.10.4 2022-09-05 11:07:25 -07:00
dependabot[bot]
925efe0db7
Bump actions/cache from 3.0.6 to 3.0.8 (#1822)
Bumps [actions/cache](https://github.com/actions/cache) from 3.0.6 to 3.0.8.
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](https://github.com/actions/cache/compare/v3.0.6...v3.0.8)

---
updated-dependencies:
- dependency-name: actions/cache
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-08-26 09:17:13 -07:00
JonnyWong16
806c8814b6
Unpin QEMU in snap workflow 2022-08-23 11:22:54 -07:00
JonnyWong16
70256dd0b9
Update snap login in workflow 2022-08-23 10:48:01 -07:00
JonnyWong16
ac520d656b
Add "does not begin with" and "does not end with" condition operators 2022-08-19 10:41:02 -07:00
JonnyWong16
3c40f83738
Update filterer.jquery.js 2022-08-19 10:36:10 -07:00
JonnyWong16
b2777e30f2
Add git safe directory to snapcraft.yml 2022-08-18 16:40:38 -07:00
JonnyWong16
84fb1a2dc2
Add quality profile tooltip 2022-08-18 16:35:06 -07:00
JonnyWong16
b73f8cc30e
Remove unused architectures in snap workflow 2022-08-18 10:14:14 -07:00
JonnyWong16
c3572f3212
Add workflow dispatch to workflows
[skip ci]
2022-08-18 10:11:47 -07:00
JonnyWong16
85dda97e52
Fix library stats not shown for libraries without history
* Fixes #1818
2022-08-18 10:02:32 -07:00
JonnyWong16
8114079eac
Fix album count showing 0 2022-08-11 09:46:15 -07:00
JonnyWong16
444b138e97
Update v2.10.3 changelog 2022-08-09 17:22:49 -07:00
JonnyWong16
24f05a03c0
v2.10.3 2022-08-09 17:20:12 -07:00
JonnyWong16
b83e9e3257
Fix channel identifier overflow on activity card
* Fixes #1802
2022-08-09 17:16:07 -07:00
JonnyWong16
2a83502ca1
Username log filter longer than 3 characters 2022-08-09 17:02:47 -07:00
JonnyWong16
0bf1329d03
Add guides to Artist, Album, and Track export attributes 2022-08-09 17:02:47 -07:00
JonnyWong16
c1f433ab60
Add languageTag to export attribute 2022-08-09 16:44:41 -07:00
dependabot[bot]
23c881f4d1
Bump plexapi from 4.11.2 to 4.12.1 (#1811)
Bumps [plexapi](https://github.com/pkkid/python-plexapi) from 4.11.2 to 4.12.1.
- [Release notes](https://github.com/pkkid/python-plexapi/releases)
- [Commits](https://github.com/pkkid/python-plexapi/compare/4.11.2...4.12.1)

---
updated-dependencies:
- dependency-name: plexapi
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-08-09 16:38:19 -07:00
dependabot[bot]
e85834706a
Bump actions/cache from 3.0.5 to 3.0.6 (#1808)
Bumps [actions/cache](https://github.com/actions/cache) from 3.0.5 to 3.0.6.
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](https://github.com/actions/cache/compare/v3.0.5...v3.0.6)

---
updated-dependencies:
- dependency-name: actions/cache
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-08-09 16:36:16 -07:00
dependabot[bot]
8327c48111
Bump actions/setup-python from 4.1.0 to 4.2.0 (#1805)
Bumps [actions/setup-python](https://github.com/actions/setup-python) from 4.1.0 to 4.2.0.
- [Release notes](https://github.com/actions/setup-python/releases)
- [Commits](https://github.com/actions/setup-python/compare/v4.1.0...v4.2.0)

---
updated-dependencies:
- dependency-name: actions/setup-python
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-08-09 16:36:03 -07:00
JonnyWong16
e7b96ed9ae
Only filter usernames >= 3 characters
* Fixes #1806
2022-08-03 10:52:58 -07:00
JonnyWong16
3ab0c8fe22
Use last played artwork on library stats cards 2022-08-01 15:02:51 -07:00
JonnyWong16
4ae1f6cef9
Allow fallback to another pms image 2022-08-01 14:48:35 -07:00
JonnyWong16
3631e723bc
Add last played metadata to library stats 2022-08-01 14:47:16 -07:00
JonnyWong16
ddcf350353
Add last played metadata to home stats top_libraries and top_users 2022-08-01 14:46:32 -07:00
JonnyWong16
2b339f60bc
Update PayPal URL 2022-07-29 20:04:08 -07:00
JonnyWong16
52e399144a
Add Stripe donation 2022-07-29 19:40:50 -07:00
JonnyWong16
c45ded5a98
Implement X-Plex-Container-Size for retrieving library items
PMS 1.28 log warning
```
Missing X-Plex-Container-Size header. This will fail with status code 400 in the future.
```
2022-07-24 14:13:22 -07:00
JonnyWong16
85eaed57e0
Clean up lookup table unique constraints on start up 2022-07-18 15:33:37 -07:00
JonnyWong16
6e6de11aaa
Cache usernames for log filter
* Fixes #1705
2022-07-18 15:31:23 -07:00
JonnyWong16
9f1b7de623
Add show_year notification parameter 2022-07-14 18:45:00 -07:00
JonnyWong16
aeb572f211
Add parent_year and grandparent_year to get_metadata_details 2022-07-14 18:39:59 -07:00
JonnyWong16
b598e9fc0c
Make sure token is saved before populating server dropdown list 2022-07-14 16:14:10 -07:00
JonnyWong16
b6cb946ae2
Add json support for MQTT notifications 2022-07-14 12:29:12 -07:00
dependabot[bot]
39afabf1b7
Bump actions/cache from 3.0.4 to 3.0.5 (#1792)
Bumps [actions/cache](https://github.com/actions/cache) from 3.0.4 to 3.0.5.
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](https://github.com/actions/cache/compare/v3.0.4...v3.0.5)

---
updated-dependencies:
- dependency-name: actions/cache
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-07-14 12:14:34 -07:00
dependabot[bot]
8cbf93fda4
Bump actions/setup-python from 4.0.0 to 4.1.0 (#1788)
Bumps [actions/setup-python](https://github.com/actions/setup-python) from 4.0.0 to 4.1.0.
- [Release notes](https://github.com/actions/setup-python/releases)
- [Commits](https://github.com/actions/setup-python/compare/v4.0.0...v4.1.0)

---
updated-dependencies:
- dependency-name: actions/setup-python
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-07-14 12:14:16 -07:00
dependabot[bot]
03938ebf2c
Bump actions/setup-python from 3.1.2 to 4.0.0 (#1760)
Bumps [actions/setup-python](https://github.com/actions/setup-python) from 3.1.2 to 4.0.0.
- [Release notes](https://github.com/actions/setup-python/releases)
- [Commits](https://github.com/actions/setup-python/compare/v3.1.2...v4.0.0)

---
updated-dependencies:
- dependency-name: actions/setup-python
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-07-03 15:41:07 -07:00
dependabot[bot]
167a914e20
Bump joncloud/makensis-action from 3.6 to 3.7 (#1775)
Bumps [joncloud/makensis-action](https://github.com/joncloud/makensis-action) from 3.6 to 3.7.
- [Release notes](https://github.com/joncloud/makensis-action/releases)
- [Commits](https://github.com/joncloud/makensis-action/compare/v3.6...v3.7)

---
updated-dependencies:
- dependency-name: joncloud/makensis-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-07-03 15:40:56 -07:00
dependabot[bot]
7f15c00f7e
Bump actions/cache from 3.0.3 to 3.0.4 (#1759)
Bumps [actions/cache](https://github.com/actions/cache) from 3.0.3 to 3.0.4.
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](https://github.com/actions/cache/compare/v3.0.3...v3.0.4)

---
updated-dependencies:
- dependency-name: actions/cache
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-07-03 15:40:36 -07:00
dependabot[bot]
22070ea549
Bump technote-space/workflow-conclusion-action from 2.2 to 3.0 (#1758)
Bumps [technote-space/workflow-conclusion-action](https://github.com/technote-space/workflow-conclusion-action) from 2.2 to 3.0.
- [Release notes](https://github.com/technote-space/workflow-conclusion-action/releases)
- [Changelog](https://github.com/technote-space/workflow-conclusion-action/blob/main/.releasegarc)
- [Commits](https://github.com/technote-space/workflow-conclusion-action/compare/v2.2...v3.0)

---
updated-dependencies:
- dependency-name: technote-space/workflow-conclusion-action
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-07-03 15:40:24 -07:00
JonnyWong16
746d44922e
v2.10.2 2022-07-03 15:32:18 -07:00
JonnyWong16
ec99a2f3d9
Fix updating cron default value in newsletter table 2022-07-03 15:22:25 -07:00
JonnyWong16
d482177342
Update Python version in readme 2022-07-03 15:22:25 -07:00
JonnyWong16
285fa3a0f5
Clear user friendly name if equal to username 2022-07-03 15:22:25 -07:00
JonnyWong16
98433a7c54
Fix username not showing on home stats cards 2022-07-03 15:22:25 -07:00
JonnyWong16
d4def8e5ae
Fix cover size on info page 2022-07-03 15:22:25 -07:00
TheMeanCanEHdian
ed103bc5de
Update library icons to latest Plex style. (#1779)
* Update library icons to latest Plex style.

* Add back mistakenly removed live icons.

* Update live icon to match new style.

* Adjust icon size.

* Better center icon.
2022-07-03 13:31:33 -07:00
JonnyWong16
15fb052716
Fix stream audio info when playing a secondary track 2022-06-04 17:57:57 -07:00
JonnyWong16
ebbd66d056
Fix empty recently added error message 2022-06-03 09:41:36 -07:00
JonnyWong16
a2c589fca4
v2.10.1 2022-06-01 10:18:41 -07:00
JonnyWong16
1bd5168156
Fix OneSignal device validation
* OneSignal changed to only accept `app_id` as a query parameter instead of in the payload
2022-06-01 09:42:47 -07:00
JonnyWong16
0576920b89
Add support for mbid:// guids in notification parameters
* Requires PMS 1.27.0.5849
2022-05-31 10:57:44 -07:00
JonnyWong16
ca3c2b09cf
Add grandparent_guids and parent_guids to get_metadata_details 2022-05-31 10:57:44 -07:00
dependabot[bot]
695a00350b
Bump actions/cache from 3.0.2 to 3.0.3 (#1755)
Bumps [actions/cache](https://github.com/actions/cache) from 3.0.2 to 3.0.3.
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](https://github.com/actions/cache/compare/v3.0.2...v3.0.3)

---
updated-dependencies:
- dependency-name: actions/cache
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-05-31 10:52:15 -07:00
dependabot[bot]
b7ca9c3502
Bump plexapi from 4.11.1 to 4.11.2 (#1753)
* Bump plexapi from 4.11.1 to 4.11.2

Bumps [plexapi](https://github.com/pkkid/python-plexapi) from 4.11.1 to 4.11.2.
- [Release notes](https://github.com/pkkid/python-plexapi/releases)
- [Commits](https://github.com/pkkid/python-plexapi/compare/4.11.1...4.11.2)

---
updated-dependencies:
- dependency-name: plexapi
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update plexapi==4.11.2

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-05-31 10:51:53 -07:00
JonnyWong16
fffd936b0f
Change shared_libraries to list for get_user 2022-05-28 15:03:52 -07:00
JonnyWong16
bd83c8d55c
Remove server_token from get_users 2022-05-28 15:03:24 -07:00
JonnyWong16
b905e0139c
Add continent to geoip lookup 2022-05-28 08:51:10 -07:00
JonnyWong16
b9b844dd38
Check for a blank user_id when retrieving user details 2022-05-25 11:37:32 -07:00
JonnyWong16
e9d370a4b4
v2.10.0 2022-05-23 10:57:21 -07:00
dependabot[bot]
248fb6724a
Bump importlib-metadata from 4.11.3 to 4.11.4 (#1750)
* Bump importlib-metadata from 4.11.3 to 4.11.4

Bumps [importlib-metadata](https://github.com/python/importlib_metadata) from 4.11.3 to 4.11.4.
- [Release notes](https://github.com/python/importlib_metadata/releases)
- [Changelog](https://github.com/python/importlib_metadata/blob/main/CHANGES.rst)
- [Commits](https://github.com/python/importlib_metadata/compare/v4.11.3...v4.11.4)

---
updated-dependencies:
- dependency-name: importlib-metadata
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update importlib-metadata==4.11.4

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-05-23 10:45:11 -07:00
JonnyWong16
bb01141cfc
Fix parsing Windows path on Linux for notification filename parameter 2022-05-20 10:57:58 -07:00
dependabot[bot]
775375b8b4
Bump plexapi from 4.11.0 to 4.11.1 (#1749)
* Bump plexapi from 4.11.0 to 4.11.1

Bumps [plexapi](https://github.com/pkkid/python-plexapi) from 4.11.0 to 4.11.1.
- [Release notes](https://github.com/pkkid/python-plexapi/releases)
- [Commits](https://github.com/pkkid/python-plexapi/compare/4.11.0...4.11.1)

---
updated-dependencies:
- dependency-name: plexapi
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update plexapi==4.11.1

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-05-20 10:57:35 -07:00
dependabot[bot]
010377870d
Bump certifi from 2021.10.8 to 2022.5.18.1 (#1748)
* Bump certifi from 2021.10.8 to 2022.5.18.1

Bumps [certifi](https://github.com/certifi/python-certifi) from 2021.10.8 to 2022.5.18.1.
- [Release notes](https://github.com/certifi/python-certifi/releases)
- [Commits](https://github.com/certifi/python-certifi/compare/2021.10.08...2022.05.18.1)

---
updated-dependencies:
- dependency-name: certifi
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update certifi==2022.5.18.1

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-05-20 10:57:24 -07:00
JonnyWong16
9967786997
Add new exporter fields for PlexAPI 4.11.0 2022-05-18 11:25:25 -07:00
JonnyWong16
07eba40096
Update default user thumb image 2022-05-18 11:24:41 -07:00
dependabot[bot]
399fd6ff91
Bump plexapi from 4.9.2 to 4.11.0 (#1690)
* Bump plexapi from 4.9.2 to 4.10.1

Bumps [plexapi](https://github.com/pkkid/python-plexapi) from 4.9.2 to 4.10.1.
- [Release notes](https://github.com/pkkid/python-plexapi/releases)
- [Commits](https://github.com/pkkid/python-plexapi/compare/4.9.2...4.10.1)

---
updated-dependencies:
- dependency-name: plexapi
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update plexapi==4.11.0

* Update requirements.txt

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-05-18 11:24:15 -07:00
dependabot[bot]
f1b95f5837
Bump pyinstaller from 5.0.1 to 5.1 (#1746)
Bumps [pyinstaller](https://github.com/pyinstaller/pyinstaller) from 5.0.1 to 5.1.
- [Release notes](https://github.com/pyinstaller/pyinstaller/releases)
- [Changelog](https://github.com/pyinstaller/pyinstaller/blob/develop/doc/CHANGES.rst)
- [Commits](https://github.com/pyinstaller/pyinstaller/compare/v5.0.1...v5.1)

---
updated-dependencies:
- dependency-name: pyinstaller
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-05-18 10:54:11 -07:00
dependabot[bot]
abc01bb64d
Bump actions/cache from 3.0.1 to 3.0.2 (#1745)
Bumps [actions/cache](https://github.com/actions/cache) from 3.0.1 to 3.0.2.
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](https://github.com/actions/cache/compare/v3.0.1...v3.0.2)

---
updated-dependencies:
- dependency-name: actions/cache
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-05-18 10:45:00 -07:00
dependabot[bot]
bdc907ee67
Bump actions/setup-python from 3.1.1 to 3.1.2 (#1744)
Bumps [actions/setup-python](https://github.com/actions/setup-python) from 3.1.1 to 3.1.2.
- [Release notes](https://github.com/actions/setup-python/releases)
- [Commits](https://github.com/actions/setup-python/compare/v3.1.1...v3.1.2)

---
updated-dependencies:
- dependency-name: actions/setup-python
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-05-18 10:44:47 -07:00
JonnyWong16
1e99d51fe2
Add importlib-metadata to requirements-package.txt 2022-05-16 22:37:28 -07:00
JonnyWong16
27b72663d4
Fix platform in get_home_stats and get_user_player_stats API docs 2022-05-16 21:25:18 -07:00
dependabot[bot]
bff4a3f6ba
Bump pyinstaller from 4.9 to 5.0.1 (#1730)
Bumps [pyinstaller](https://github.com/pyinstaller/pyinstaller) from 4.9 to 5.0.1.
- [Release notes](https://github.com/pyinstaller/pyinstaller/releases)
- [Changelog](https://github.com/pyinstaller/pyinstaller/blob/develop/doc/CHANGES.rst)
- [Commits](https://github.com/pyinstaller/pyinstaller/compare/v4.9...v5.0.1)

---
updated-dependencies:
- dependency-name: pyinstaller
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-05-16 21:24:56 -07:00
dependabot[bot]
ba3275fed7
Bump pywin32 from 303 to 304 (#1732)
Bumps [pywin32](https://github.com/mhammond/pywin32) from 303 to 304.
- [Release notes](https://github.com/mhammond/pywin32/releases)
- [Changelog](https://github.com/mhammond/pywin32/blob/main/CHANGES.txt)
- [Commits](https://github.com/mhammond/pywin32/commits)

---
updated-dependencies:
- dependency-name: pywin32
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-05-16 21:23:40 -07:00
dependabot[bot]
df58950585
Bump pyobjc-core from 8.2 to 8.5 (#1725)
Bumps [pyobjc-core](https://github.com/ronaldoussoren/pyobjc) from 8.2 to 8.5.
- [Release notes](https://github.com/ronaldoussoren/pyobjc/releases)
- [Changelog](https://github.com/ronaldoussoren/pyobjc/blob/master/docs/changelog.rst)
- [Commits](https://github.com/ronaldoussoren/pyobjc/compare/v8.2...v8.5)

---
updated-dependencies:
- dependency-name: pyobjc-core
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-05-16 21:23:21 -07:00
dependabot[bot]
fbf22b5ea2
Bump pyobjc-framework-cocoa from 8.2 to 8.5 (#1724)
Bumps [pyobjc-framework-cocoa](https://github.com/ronaldoussoren/pyobjc) from 8.2 to 8.5.
- [Release notes](https://github.com/ronaldoussoren/pyobjc/releases)
- [Changelog](https://github.com/ronaldoussoren/pyobjc/blob/master/docs/changelog.rst)
- [Commits](https://github.com/ronaldoussoren/pyobjc/compare/v8.2...v8.5)

---
updated-dependencies:
- dependency-name: pyobjc-framework-cocoa
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-05-16 21:21:44 -07:00
dependabot[bot]
1af3c43320
Bump docker/login-action from 1 to 2 (#1738)
Bumps [docker/login-action](https://github.com/docker/login-action) from 1 to 2.
- [Release notes](https://github.com/docker/login-action/releases)
- [Commits](https://github.com/docker/login-action/compare/v1...v2)

---
updated-dependencies:
- dependency-name: docker/login-action
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-05-16 21:21:18 -07:00
dependabot[bot]
228101fd48
Bump docker/setup-buildx-action from 1 to 2 (#1737)
Bumps [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action) from 1 to 2.
- [Release notes](https://github.com/docker/setup-buildx-action/releases)
- [Commits](https://github.com/docker/setup-buildx-action/compare/v1...v2)

---
updated-dependencies:
- dependency-name: docker/setup-buildx-action
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-05-16 21:21:09 -07:00
dependabot[bot]
54a878f7b1
Bump docker/setup-qemu-action from 1 to 2 (#1736)
Bumps [docker/setup-qemu-action](https://github.com/docker/setup-qemu-action) from 1 to 2.
- [Release notes](https://github.com/docker/setup-qemu-action/releases)
- [Commits](https://github.com/docker/setup-qemu-action/compare/v1...v2)

---
updated-dependencies:
- dependency-name: docker/setup-qemu-action
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-05-16 21:21:01 -07:00
dependabot[bot]
9df184d7f4
Bump docker/build-push-action from 2 to 3 (#1735)
Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 2 to 3.
- [Release notes](https://github.com/docker/build-push-action/releases)
- [Upgrade guide](https://github.com/docker/build-push-action/blob/master/UPGRADE.md)
- [Commits](https://github.com/docker/build-push-action/compare/v2...v3)

---
updated-dependencies:
- dependency-name: docker/build-push-action
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-05-16 21:20:50 -07:00
dependabot[bot]
86dd3f0db7
Bump actions/checkout from 2 to 3.0.2 (#1726)
Bumps [actions/checkout](https://github.com/actions/checkout) from 2 to 3.0.2.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v2...v3.0.2)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-05-16 21:20:39 -07:00
dependabot[bot]
89d9fcac66
Bump actions/stale from 4 to 5 (#1714)
Bumps [actions/stale](https://github.com/actions/stale) from 4 to 5.
- [Release notes](https://github.com/actions/stale/releases)
- [Changelog](https://github.com/actions/stale/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/stale/compare/v4...v5)

---
updated-dependencies:
- dependency-name: actions/stale
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-05-16 21:20:19 -07:00
dependabot[bot]
f6214c9a98
Bump actions/upload-artifact from 2 to 3 (#1712)
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 2 to 3.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](https://github.com/actions/upload-artifact/compare/v2...v3)

---
updated-dependencies:
- dependency-name: actions/upload-artifact
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-05-16 21:20:05 -07:00
dependabot[bot]
988c6750aa
Bump actions/download-artifact from 2 to 3 (#1711)
Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 2 to 3.
- [Release notes](https://github.com/actions/download-artifact/releases)
- [Commits](https://github.com/actions/download-artifact/compare/v2...v3)

---
updated-dependencies:
- dependency-name: actions/download-artifact
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-05-16 21:19:54 -07:00
dependabot[bot]
04b745b584
Bump actions/setup-python from 2 to 3.1.1 (#1709)
Bumps [actions/setup-python](https://github.com/actions/setup-python) from 2 to 3.1.1.
- [Release notes](https://github.com/actions/setup-python/releases)
- [Commits](https://github.com/actions/setup-python/compare/v2...v3.1.1)

---
updated-dependencies:
- dependency-name: actions/setup-python
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-05-16 21:19:14 -07:00
dependabot[bot]
f068bcca01
Bump actions/cache from 2 to 3.0.1 (#1701)
Bumps [actions/cache](https://github.com/actions/cache) from 2 to 3.0.1.
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](https://github.com/actions/cache/compare/v2...v3.0.1)

---
updated-dependencies:
- dependency-name: actions/cache
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-05-16 21:17:59 -07:00
dependabot[bot]
b3aeaafd00
Bump pyjwt from 2.3.0 to 2.4.0 (#1743)
* Bump pyjwt from 2.3.0 to 2.4.0

Bumps [pyjwt](https://github.com/jpadilla/pyjwt) from 2.3.0 to 2.4.0.
- [Release notes](https://github.com/jpadilla/pyjwt/releases)
- [Changelog](https://github.com/jpadilla/pyjwt/blob/master/CHANGELOG.rst)
- [Commits](https://github.com/jpadilla/pyjwt/compare/2.3.0...2.4.0)

---
updated-dependencies:
- dependency-name: pyjwt
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update pyjwt==2.4.0

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-05-16 20:56:13 -07:00
dependabot[bot]
d17015de44
Bump pyparsing from 3.0.7 to 3.0.9 (#1741)
* Bump pyparsing from 3.0.7 to 3.0.9

Bumps [pyparsing](https://github.com/pyparsing/pyparsing) from 3.0.7 to 3.0.9.
- [Release notes](https://github.com/pyparsing/pyparsing/releases)
- [Changelog](https://github.com/pyparsing/pyparsing/blob/master/CHANGES)
- [Commits](https://github.com/pyparsing/pyparsing/compare/pyparsing_3.0.7...pyparsing_3.0.9)

---
updated-dependencies:
- dependency-name: pyparsing
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update pyparsing==3.0.9

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-05-16 20:55:40 -07:00
dependabot[bot]
93b6370759
Bump xmltodict from 0.12.0 to 0.13.0 (#1739)
* Bump xmltodict from 0.12.0 to 0.13.0

Bumps [xmltodict](https://github.com/martinblech/xmltodict) from 0.12.0 to 0.13.0.
- [Release notes](https://github.com/martinblech/xmltodict/releases)
- [Changelog](https://github.com/martinblech/xmltodict/blob/master/CHANGELOG.md)
- [Commits](https://github.com/martinblech/xmltodict/compare/v0.12.0...v0.13.0)

---
updated-dependencies:
- dependency-name: xmltodict
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update xmltodict==0.13.0

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-05-16 20:55:30 -07:00
dependabot[bot]
55812ce2f0
Bump importlib-resources from 5.6.0 to 5.7.1 (#1723)
* Bump importlib-resources from 5.6.0 to 5.7.1

Bumps [importlib-resources](https://github.com/python/importlib_resources) from 5.6.0 to 5.7.1.
- [Release notes](https://github.com/python/importlib_resources/releases)
- [Changelog](https://github.com/python/importlib_resources/blob/main/CHANGES.rst)
- [Commits](https://github.com/python/importlib_resources/compare/v5.6.0...v5.7.1)

---
updated-dependencies:
- dependency-name: importlib-resources
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update importlib-resources==5.7.1

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-05-16 20:48:17 -07:00
dependabot[bot]
467ae352f5
Bump beautifulsoup4 from 4.10.0 to 4.11.1 (#1717)
* Bump beautifulsoup4 from 4.10.0 to 4.11.1

Bumps [beautifulsoup4](https://www.crummy.com/software/BeautifulSoup/bs4/) from 4.10.0 to 4.11.1.

---
updated-dependencies:
- dependency-name: beautifulsoup4
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update beautifulsoup4==4.11.1

* Update soupsieve==2.3.2.post1

* Update requirements.txt

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-05-16 20:46:21 -07:00
dependabot[bot]
a1fe0b04d7
Bump bleach from 4.1.0 to 5.0.0 (#1708)
* Bump bleach from 4.1.0 to 5.0.0

Bumps [bleach](https://github.com/mozilla/bleach) from 4.1.0 to 5.0.0.
- [Release notes](https://github.com/mozilla/bleach/releases)
- [Changelog](https://github.com/mozilla/bleach/blob/main/CHANGES)
- [Commits](https://github.com/mozilla/bleach/compare/v4.1.0...v5.0.0)

---
updated-dependencies:
- dependency-name: bleach
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update bleach==5.0.0

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-05-16 20:41:47 -07:00
dependabot[bot]
d510e0f600
Bump websocket-client from 1.2.3 to 1.3.2 (#1700)
* Bump websocket-client from 1.2.3 to 1.3.2

Bumps [websocket-client](https://github.com/websocket-client/websocket-client) from 1.2.3 to 1.3.2.
- [Release notes](https://github.com/websocket-client/websocket-client/releases)
- [Changelog](https://github.com/websocket-client/websocket-client/blob/master/ChangeLog)
- [Commits](https://github.com/websocket-client/websocket-client/compare/v1.2.3...v1.3.2)

---
updated-dependencies:
- dependency-name: websocket-client
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update websocket-client==1.3.2

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-05-16 20:40:13 -07:00
dependabot[bot]
67baf9a260
Bump urllib3 from 1.26.8 to 1.26.9 (#1688)
* Bump urllib3 from 1.26.8 to 1.26.9

Bumps [urllib3](https://github.com/urllib3/urllib3) from 1.26.8 to 1.26.9.
- [Release notes](https://github.com/urllib3/urllib3/releases)
- [Changelog](https://github.com/urllib3/urllib3/blob/1.26.9/CHANGES.rst)
- [Commits](https://github.com/urllib3/urllib3/compare/1.26.8...1.26.9)

---
updated-dependencies:
- dependency-name: urllib3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update urllib3==1.26.9

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-05-16 20:35:58 -07:00
dependabot[bot]
238afb4794
Bump mako from 1.1.6 to 1.2.0 (#1684)
* Bump mako from 1.1.6 to 1.2.0

Bumps [mako](https://github.com/sqlalchemy/mako) from 1.1.6 to 1.2.0.
- [Release notes](https://github.com/sqlalchemy/mako/releases)
- [Changelog](https://github.com/sqlalchemy/mako/blob/main/CHANGES)
- [Commits](https://github.com/sqlalchemy/mako/commits)

---
updated-dependencies:
- dependency-name: mako
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update mako==1.2.0

* Update MarkupSafe==2.1.1

* Add importlib-metadata==4.11.3

* Update requirements.txt

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-05-16 20:33:50 -07:00
dependabot[bot]
aa0c58ef0e
Bump dnspython from 2.2.0 to 2.2.1 (#1679)
* Bump dnspython from 2.2.0 to 2.2.1

Bumps [dnspython](https://github.com/rthalley/dnspython) from 2.2.0 to 2.2.1.
- [Release notes](https://github.com/rthalley/dnspython/releases)
- [Changelog](https://github.com/rthalley/dnspython/blob/master/doc/whatsnew.rst)
- [Commits](https://github.com/rthalley/dnspython/compare/v2.2.0...v2.2.1)

---
updated-dependencies:
- dependency-name: dnspython
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update dnspython==2.2.1

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-05-16 20:33:29 -07:00
dependabot[bot]
54c9214b03
Bump apscheduler from 3.8.0 to 3.9.1 (#1675)
* Bump apscheduler from 3.8.0 to 3.9.1

Bumps [apscheduler](https://github.com/agronholm/apscheduler) from 3.8.0 to 3.9.1.
- [Release notes](https://github.com/agronholm/apscheduler/releases)
- [Changelog](https://github.com/agronholm/apscheduler/blob/3.9.1/docs/versionhistory.rst)
- [Commits](https://github.com/agronholm/apscheduler/compare/3.8.0...3.9.1)

---
updated-dependencies:
- dependency-name: apscheduler
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update apscheduler==3.9.1

* Update pytz==2022.1

* Add pytz-deprecation-shim==0.1.0.post0

* Update tzdata==2022.1

* Update tzlocal==4.2

* Update requirements.txt

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-05-16 20:32:37 -07:00
dependabot[bot]
942e09e59e
Bump distro from 1.6.0 to 1.7.0 (#1658)
* Bump distro from 1.6.0 to 1.7.0

Bumps [distro](https://github.com/python-distro/distro) from 1.6.0 to 1.7.0.
- [Release notes](https://github.com/python-distro/distro/releases)
- [Changelog](https://github.com/python-distro/distro/blob/master/CHANGELOG.md)
- [Commits](https://github.com/python-distro/distro/compare/v1.6.0...v1.7.0)

---
updated-dependencies:
- dependency-name: distro
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update distro==1.7.0

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-05-16 20:32:27 -07:00
JonnyWong16
f08687b960
Fix Dolby Vision detection
* Plex renamed "Dolby Vision" to "DoVi" in the display title.
2022-05-12 13:11:14 -07:00
JonnyWong16
1f7ddd4d01
Disable PlexAPI auto-reloading when fetching collections/playlists 2022-05-12 13:11:14 -07:00
JonnyWong16
df54df5e65
Set PlexAPI log level to debug 2022-04-26 11:02:07 -07:00
JonnyWong16
1371cfa889
Trigger on_stop notification after successful db write
* Prevent race condition from querying the db using the notification trigger
2022-04-14 20:54:07 -07:00
dependabot[bot]
dd59a79005
Bump zipp from 3.7.0 to 3.8.0 (#1706)
* Bump zipp from 3.7.0 to 3.8.0

Bumps [zipp](https://github.com/jaraco/zipp) from 3.7.0 to 3.8.0.
- [Release notes](https://github.com/jaraco/zipp/releases)
- [Changelog](https://github.com/jaraco/zipp/blob/main/CHANGES.rst)
- [Commits](https://github.com/jaraco/zipp/compare/v3.7.0...v3.8.0)

---
updated-dependencies:
- dependency-name: zipp
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update zipp==3.8.0

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-04-12 18:42:59 -07:00
dependabot[bot]
fa52d99691
Bump importlib-resources from 5.4.0 to 5.6.0 (#1699)
* Bump importlib-resources from 5.4.0 to 5.6.0

Bumps [importlib-resources](https://github.com/python/importlib_resources) from 5.4.0 to 5.6.0.
- [Release notes](https://github.com/python/importlib_resources/releases)
- [Changelog](https://github.com/python/importlib_resources/blob/main/CHANGES.rst)
- [Commits](https://github.com/python/importlib_resources/compare/v5.4.0...v5.6.0)

---
updated-dependencies:
- dependency-name: importlib-resources
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update importlib-resources==5.6.0

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-04-12 18:42:48 -07:00
JonnyWong16
c54c811eec
Update jaraco.text==3.7.0
[skip ci]
2022-04-12 18:41:08 -07:00
JonnyWong16
d5afac4104
Add jaraco.context==4.1.1
[skip ci]
2022-04-12 18:40:59 -07:00
JonnyWong16
3e8ef3c1b4
Update jaraco.collections==3.5.1
[skip ci]
2022-04-12 18:40:47 -07:00
JonnyWong16
addf9ea324
Update jaraco.classes==3.2.1
[skip ci]
2022-04-12 18:40:33 -07:00
JonnyWong16
ab24116b1b
Fix get_users_table API docs 2022-04-12 13:28:13 -07:00
JonnyWong16
d4002b2e2b
Change values to int instead of "Checked" in users and libraries table
* get_users_table: allow_guest, do_notify, keep_history
* get_libraries_table: do_notify, do_notify_created, keep_history
2022-04-12 12:43:12 -07:00
JonnyWong16
b0950abdd9
v2.9.7 2022-04-11 15:26:25 -07:00
JonnyWong16
a9860fe62a
Fix managed users no username 2022-04-11 15:10:53 -07:00
JonnyWong16
dd389b0f94
v2.9.6 2022-04-10 15:48:32 -07:00
JonnyWong16
1ce292a0b6
Only build snap on amd64, arm64, armhf 2022-04-10 15:40:57 -07:00
JonnyWong16
a2fac2b11c
Improve display of dynamic range on activity cards
* Ref #1654. Thanks @herby2212.
2022-04-09 17:52:17 -07:00
JonnyWong16
4862aee9a1
Add hidden user title (Full Name) column to users table 2022-04-08 20:03:05 -07:00
JonnyWong16
aa6592eec7
Fix importing Plex usernames
* Fixes #1710
* Also import the user title (Full Name)
2022-04-08 20:03:05 -07:00
JonnyWong16
e996c4b375
Change default update check interval to hours instead of minutes 2022-04-04 21:06:25 -07:00
JonnyWong16
73b94782f9
Add hidden username and email columns to users table 2022-04-01 21:31:06 -07:00
JonnyWong16
b737ab96b4
Change include summary option for Discord and Slack for all media types 2022-04-01 21:08:10 -07:00
JonnyWong16
5c06accca0
Mask emails and longer usernames first 2022-04-01 10:19:41 -07:00
JonnyWong16
3cd98457c2
Apply PMS_TIMEOUT setting to websocket connection 2022-03-26 15:47:53 -07:00
JonnyWong16
944a231e5b
Change websocket header to a dict 2022-03-26 15:47:17 -07:00
JonnyWong16
5d84587ee2
Fix validating Plex login in setup wizard
* Fixes #1697
2022-03-26 15:40:28 -07:00
JonnyWong16
9a4ca69590
v2.9.5 2022-03-26 15:11:20 -07:00
JonnyWong16
9c8e8b4351
Simplify default settings in setup wizard 2022-03-26 14:57:44 -07:00
JonnyWong16
87389320fb
Fix live tv filter in history query
* Fixes #1691
2022-03-18 15:50:01 -07:00
JonnyWong16
eb1d724417
Add Tautulli to X-Plex-Device-Name header 2022-03-16 16:59:58 -07:00
JonnyWong16
50d90d16bf
Update App Store link to specify iphone 2022-03-11 20:18:10 -08:00
JonnyWong16
35aca11feb
Escape characters in username log filter
* Remove filter for friendly names
2022-02-27 17:03:11 -08:00
JonnyWong16
84a14c0f25
Colour active filter buttons 2022-02-27 16:50:29 -08:00
JonnyWong16
bd9fe54fd7
Enable dynamic anonymous redirect by default in setup wizard 2022-02-24 19:11:30 -08:00
JonnyWong16
74cd494162
Pass media_type when retrieving show and artist children for newsletter
* Fix different album types not shown on newsletter. (#1559)
2022-02-21 12:14:14 -08:00
JonnyWong16
297620f4a9
Reorder db migrations 2022-02-21 09:42:50 -08:00
JonnyWong16
d657a609ff
Reschedule tasks after changing backup interval
* Fixes #1662
2022-02-19 16:37:03 -08:00
JonnyWong16
3c48ea49f3
Retrieve season summary and fallback to show summary
* Fixes #1657
2022-02-18 23:27:02 -08:00
JonnyWong16
ec363b2ef3
Add transcode offset keys to get_activity API docs 2022-02-13 12:17:57 -08:00
JonnyWong16
6d84d1b4c9
Improve calculation for transcode progress bar 2022-02-13 11:59:06 -08:00
JonnyWong16
cfd1bf445f
v2.9.4 2022-02-12 19:17:01 -08:00
JonnyWong16
b4600c8306
Bump config version to set first_run_complete flag 2022-02-12 18:56:08 -08:00
JonnyWong16
636806ae17
Fix Tautulli starting multiple instances on Windows 2022-02-12 18:05:17 -08:00
JonnyWong16
40dc6e08ef
Fix first_run_complete config flag 2022-02-12 17:59:14 -08:00
JonnyWong16
ee43f001e4
v2.9.3 2022-02-09 09:30:19 -08:00
JonnyWong16
3eef2b7f21
Fix missing first run complete flag causing setup wizard loop 2022-02-09 09:22:50 -08:00
JonnyWong16
51d701521a
Fix username logger blacklist preventing Tautulli from starting 2022-02-09 09:22:13 -08:00
JonnyWong16
b73aa888c2
v2.9.2 2022-02-08 10:35:23 -08:00
JonnyWong16
6d092b4984
Add additional Telegram HTML tags 2022-02-08 10:29:22 -08:00
JonnyWong16
32ef43fe6e
Revert "Default Telegram to MarkdownV2 when HTML disabled"
This reverts commit b9f04ac71a.

Ref #1635
2022-02-08 10:29:22 -08:00
JonnyWong16
088bbd3bb6
Skip Local user when masking logs 2022-02-07 23:36:03 -08:00
JonnyWong16
e970a260a1
v2.9.1 2022-02-07 23:18:18 -08:00
JonnyWong16
17800df0aa
v2.9.0 2022-02-07 22:59:20 -08:00
JonnyWong16
31aa9965d1
Fix screen rotation in PWA
* Fixes #1633
2022-02-07 22:46:52 -08:00
dependabot[bot]
97ef7c4981
Bump pyinstaller from 4.8 to 4.9 (#1644)
Bumps [pyinstaller](https://github.com/pyinstaller/pyinstaller) from 4.8 to 4.9.
- [Release notes](https://github.com/pyinstaller/pyinstaller/releases)
- [Changelog](https://github.com/pyinstaller/pyinstaller/blob/v4.9/doc/CHANGES.rst)
- [Commits](https://github.com/pyinstaller/pyinstaller/compare/v4.8...v4.9)

---
updated-dependencies:
- dependency-name: pyinstaller
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-02-07 22:23:02 -08:00
dependabot[bot]
922ab07ff1
Bump pycryptodomex from 3.13.0 to 3.14.1 (#1646)
Bumps [pycryptodomex](https://github.com/Legrandin/pycryptodome) from 3.13.0 to 3.14.1.
- [Release notes](https://github.com/Legrandin/pycryptodome/releases)
- [Changelog](https://github.com/Legrandin/pycryptodome/blob/master/Changelog.rst)
- [Commits](https://github.com/Legrandin/pycryptodome/compare/v3.13.0...v3.14.1)

---
updated-dependencies:
- dependency-name: pycryptodomex
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-02-07 22:22:00 -08:00
dependabot[bot]
8170244812
Bump pyopenssl from 21.0.0 to 22.0.0 (#1638)
Bumps [pyopenssl](https://github.com/pyca/pyopenssl) from 21.0.0 to 22.0.0.
- [Release notes](https://github.com/pyca/pyopenssl/releases)
- [Changelog](https://github.com/pyca/pyopenssl/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pyca/pyopenssl/compare/21.0.0...22.0.0)

---
updated-dependencies:
- dependency-name: pyopenssl
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-02-07 22:21:23 -08:00
dependabot[bot]
9a9c98d0a0
Bump plexapi from 4.9.1 to 4.9.2 (#1647)
* Bump plexapi from 4.9.1 to 4.9.2

Bumps [plexapi](https://github.com/pkkid/python-plexapi) from 4.9.1 to 4.9.2.
- [Release notes](https://github.com/pkkid/python-plexapi/releases)
- [Commits](https://github.com/pkkid/python-plexapi/compare/4.9.1...4.9.2)

---
updated-dependencies:
- dependency-name: plexapi
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update plexapi==4.9.2

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>
2022-02-07 21:58:50 -08:00
dependabot[bot]
44e65952f9
Bump cloudinary from 1.28.1 to 1.29.0 (#1643)
* Bump cloudinary from 1.28.1 to 1.29.0

Bumps [cloudinary](https://github.com/cloudinary/pycloudinary) from 1.28.1 to 1.29.0.
- [Release notes](https://github.com/cloudinary/pycloudinary/releases)
- [Changelog](https://github.com/cloudinary/pycloudinary/blob/master/CHANGELOG.md)
- [Commits](https://github.com/cloudinary/pycloudinary/compare/1.28.1...1.29.0)

---
updated-dependencies:
- dependency-name: cloudinary
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update cloudinary==1.29.0

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-02-07 21:58:28 -08:00
dependabot[bot]
9c3d700584
Bump tempora from 5.0.0 to 5.0.1 (#1642)
Bumps [tempora](https://github.com/jaraco/tempora) from 5.0.0 to 5.0.1.
- [Release notes](https://github.com/jaraco/tempora/releases)
- [Changelog](https://github.com/jaraco/tempora/blob/main/CHANGES.rst)
- [Commits](https://github.com/jaraco/tempora/compare/v5.0.0...v5.0.1)

---
updated-dependencies:
- dependency-name: tempora
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-02-07 21:58:10 -08:00
dependabot[bot]
61960aa744
Bump requests-oauthlib from 1.3.0 to 1.3.1 (#1636)
* Bump requests-oauthlib from 1.3.0 to 1.3.1

Bumps [requests-oauthlib](https://github.com/requests/requests-oauthlib) from 1.3.0 to 1.3.1.
- [Release notes](https://github.com/requests/requests-oauthlib/releases)
- [Changelog](https://github.com/requests/requests-oauthlib/blob/master/HISTORY.rst)
- [Commits](https://github.com/requests/requests-oauthlib/compare/v1.3.0...v1.3.1)

---
updated-dependencies:
- dependency-name: requests-oauthlib
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update requests-oauthlib==1.3.1

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-02-07 21:57:50 -08:00
dependabot[bot]
5523d4ba88
Bump httpagentparser from 1.9.1 to 1.9.2 (#1631)
* Bump httpagentparser from 1.9.1 to 1.9.2

Bumps [httpagentparser](https://github.com/shon/httpagentparser) from 1.9.1 to 1.9.2.
- [Release notes](https://github.com/shon/httpagentparser/releases)
- [Commits](https://github.com/shon/httpagentparser/commits)

---
updated-dependencies:
- dependency-name: httpagentparser
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update httpagentparser==1.9.2

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-02-07 21:57:29 -08:00
dependabot[bot]
2d9e109f97
Bump arrow from 1.2.1 to 1.2.2 (#1630)
* Bump arrow from 1.2.1 to 1.2.2

Bumps [arrow](https://github.com/arrow-py/arrow) from 1.2.1 to 1.2.2.
- [Release notes](https://github.com/arrow-py/arrow/releases)
- [Changelog](https://github.com/arrow-py/arrow/blob/master/CHANGELOG.rst)
- [Commits](https://github.com/arrow-py/arrow/compare/1.2.1...1.2.2)

---
updated-dependencies:
- dependency-name: arrow
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update arrow==1.2.2

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-02-07 21:57:11 -08:00
JonnyWong16
8e6f8d7735
Remove unnecessary insert statement 2022-02-07 09:12:07 -08:00
JonnyWong16
c3d09d34f8
Prevent rating_key collisions when updating metadata 2022-02-06 23:18:53 -08:00
JonnyWong16
cba746920a
Add Telegram channel ID to config label and description 2022-02-03 12:22:23 -08:00
JonnyWong16
e33767de9b
Fix updating section_id when updating metadata 2022-02-01 22:06:53 -08:00
JonnyWong16
636d2fe43e
Add disc number notification parameter 2022-01-31 15:04:41 -08:00
JonnyWong16
fe388e903d
Fix export download not including images 2022-01-30 17:26:08 -08:00
JonnyWong16
b9f04ac71a
Default Telegram to MarkdownV2 when HTML disabled 2022-01-30 16:50:23 -08:00
JonnyWong16
96025c839d
Separate out plex.direct IP address log filter 2022-01-27 10:52:07 -08:00
JonnyWong16
2145f1e272
Check for local IPv6 addresses 2022-01-26 22:26:25 -08:00
JonnyWong16
f2a664953c
Assume IPv6 is public address
* Fixes #1629
2022-01-26 21:33:27 -08:00
JonnyWong16
994ebfc680
v2.9.0-beta 2022-01-26 14:49:48 -08:00
JonnyWong16
e7a4cb9233
Add connection details to IP address modal 2022-01-25 16:06:52 -08:00
JonnyWong16
12dddc2d89
Add location, relayed, and secure to get_history response 2022-01-25 14:08:55 -08:00
dependabot[bot]
484c7ed4a2
Bump pyinstaller from 4.7 to 4.8 (#1614)
Bumps [pyinstaller](https://github.com/pyinstaller/pyinstaller) from 4.7 to 4.8.
- [Release notes](https://github.com/pyinstaller/pyinstaller/releases)
- [Changelog](https://github.com/pyinstaller/pyinstaller/blob/develop/doc/CHANGES-3.rst)
- [Commits](https://github.com/pyinstaller/pyinstaller/compare/v4.7...v4.8)

---
updated-dependencies:
- dependency-name: pyinstaller
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-01-25 12:57:59 -08:00
dependabot[bot]
f3638909cd
Bump pyobjc-framework-cocoa from 8.1 to 8.2 (#1624)
Bumps [pyobjc-framework-cocoa](https://github.com/ronaldoussoren/pyobjc) from 8.1 to 8.2.
- [Release notes](https://github.com/ronaldoussoren/pyobjc/releases)
- [Changelog](https://github.com/ronaldoussoren/pyobjc/blob/master/docs/changelog.rst)
- [Commits](https://github.com/ronaldoussoren/pyobjc/commits/v8.2)

---
updated-dependencies:
- dependency-name: pyobjc-framework-cocoa
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-01-25 12:50:22 -08:00
dependabot[bot]
4323a77d12
Bump pyobjc-core from 8.1 to 8.2 (#1626)
Bumps [pyobjc-core](https://github.com/ronaldoussoren/pyobjc) from 8.1 to 8.2.
- [Release notes](https://github.com/ronaldoussoren/pyobjc/releases)
- [Changelog](https://github.com/ronaldoussoren/pyobjc/blob/master/docs/changelog.rst)
- [Commits](https://github.com/ronaldoussoren/pyobjc/commits/v8.2)

---
updated-dependencies:
- dependency-name: pyobjc-core
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-01-25 12:49:08 -08:00
dependabot[bot]
32951488e0
Bump pycryptodomex from 3.12.0 to 3.13.0 (#1623)
Bumps [pycryptodomex](https://github.com/Legrandin/pycryptodome) from 3.12.0 to 3.13.0.
- [Release notes](https://github.com/Legrandin/pycryptodome/releases)
- [Changelog](https://github.com/Legrandin/pycryptodome/blob/master/Changelog.rst)
- [Commits](https://github.com/Legrandin/pycryptodome/compare/v3.12.0...v3.13.0)

---
updated-dependencies:
- dependency-name: pycryptodomex
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2022-01-25 12:47:16 -08:00
JonnyWong16
113043d9bc
Add setting to mask usernames in logs 2022-01-25 12:44:49 -08:00
JonnyWong16
2331c76326
Add fee note to donation methods 2022-01-25 12:03:47 -08:00
dependabot[bot]
7f0abe0fe6
Bump plexapi from 4.8.0 to 4.9.1 (#1627)
* Bump plexapi from 4.8.0 to 4.9.1

Bumps [plexapi](https://github.com/pkkid/python-plexapi) from 4.8.0 to 4.9.1.
- [Release notes](https://github.com/pkkid/python-plexapi/releases)
- [Commits](https://github.com/pkkid/python-plexapi/compare/4.8.0...4.9.1)

---
updated-dependencies:
- dependency-name: plexapi
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update plexapi==4.9.1

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>
2022-01-25 11:08:49 -08:00
dependabot[bot]
a4ab5ab9be
Bump pyparsing from 3.0.6 to 3.0.7 (#1620)
* Bump pyparsing from 3.0.6 to 3.0.7

Bumps [pyparsing](https://github.com/pyparsing/pyparsing) from 3.0.6 to 3.0.7.
- [Release notes](https://github.com/pyparsing/pyparsing/releases)
- [Changelog](https://github.com/pyparsing/pyparsing/blob/master/CHANGES)
- [Commits](https://github.com/pyparsing/pyparsing/compare/pyparsing_3.0.6...pyparsing_3.0.7)

---
updated-dependencies:
- dependency-name: pyparsing
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update pyparsing==3.0.7

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-01-25 11:08:37 -08:00
dependabot[bot]
3c93b5600f
Bump dnspython from 2.0.0 to 2.2.0 (#1618)
* Bump dnspython from 2.0.0 to 2.2.0

Bumps [dnspython]() from 2.0.0 to 2.2.0.

---
updated-dependencies:
- dependency-name: dnspython
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update dnspython==2.2.0

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-01-25 11:08:24 -08:00
dependabot[bot]
515a5d42d3
Bump cloudinary from 1.28.0 to 1.28.1 (#1615)
* Bump cloudinary from 1.28.0 to 1.28.1

Bumps [cloudinary](https://github.com/cloudinary/pycloudinary) from 1.28.0 to 1.28.1.
- [Release notes](https://github.com/cloudinary/pycloudinary/releases)
- [Changelog](https://github.com/cloudinary/pycloudinary/blob/master/CHANGELOG.md)
- [Commits](https://github.com/cloudinary/pycloudinary/compare/1.28.0...1.28.1)

---
updated-dependencies:
- dependency-name: cloudinary
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update cloudinary==1.28.1

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-01-25 11:08:12 -08:00
dependabot[bot]
2829041dc3
Bump tempora from 4.1.2 to 5.0.0 (#1609)
* Bump tempora from 4.1.2 to 5.0.0

Bumps [tempora](https://github.com/jaraco/tempora) from 4.1.2 to 5.0.0.
- [Release notes](https://github.com/jaraco/tempora/releases)
- [Changelog](https://github.com/jaraco/tempora/blob/main/CHANGES.rst)
- [Commits](https://github.com/jaraco/tempora/compare/v4.1.2...v5.0.0)

---
updated-dependencies:
- dependency-name: tempora
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update tempora==5.0.0

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-01-25 11:07:56 -08:00
dependabot[bot]
c03edf6893
Bump urllib3 from 1.26.7 to 1.26.8 (#1607)
* Bump urllib3 from 1.26.7 to 1.26.8

Bumps [urllib3](https://github.com/urllib3/urllib3) from 1.26.7 to 1.26.8.
- [Release notes](https://github.com/urllib3/urllib3/releases)
- [Changelog](https://github.com/urllib3/urllib3/blob/1.26.8/CHANGES.rst)
- [Commits](https://github.com/urllib3/urllib3/compare/1.26.7...1.26.8)

---
updated-dependencies:
- dependency-name: urllib3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update urllib3==1.26.8

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-01-25 11:07:41 -08:00
dependabot[bot]
fe32b31d7a
Bump requests from 2.27.0 to 2.27.1 (#1605)
* Bump requests from 2.27.0 to 2.27.1

Bumps [requests](https://github.com/psf/requests) from 2.27.0 to 2.27.1.
- [Release notes](https://github.com/psf/requests/releases)
- [Changelog](https://github.com/psf/requests/blob/main/HISTORY.md)
- [Commits](https://github.com/psf/requests/compare/v2.27.0...v2.27.1)

---
updated-dependencies:
- dependency-name: requests
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update requests==2.27.1

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2022-01-25 11:07:16 -08:00
JonnyWong16
3f3c3aab11
Update ipwhois==1.2.0 fork
* ipwhois fork with support for dnspython 2.2.0 and namedtuple patch
2022-01-22 21:12:16 -08:00
JonnyWong16
8bb83cff64
Save client id with token 2022-01-20 23:11:21 -08:00
JonnyWong16
654ff7bdb6
Improve logger regex 2022-01-20 13:46:32 -08:00
JonnyWong16
1eb58ba864
Add get_tautulli_info API command 2022-01-20 10:17:51 -08:00
JonnyWong16
de8fa32557
Add feedback message for saving new Plex token 2022-01-20 10:11:06 -08:00
JonnyWong16
1be7375a49
Add favicons to newsletter auth page 2022-01-16 12:21:04 -08:00
JonnyWong16
66e6b9499a
Add intermediary login page to view Plex XML 2022-01-16 12:20:48 -08:00
JonnyWong16
86cf872595
Clean up getattr and setattr for configs 2022-01-16 11:23:10 -08:00
JonnyWong16
c78bef851e
Null do not download keys for get_settings API command 2022-01-16 11:22:40 -08:00
JonnyWong16
71d64a4b3f
Add do not download keys to config 2022-01-16 11:22:07 -08:00
JonnyWong16
81dc790a0c
Revert "Remove get_settings API command"
This reverts commit c39f89356c.
2022-01-15 16:16:24 -08:00
JonnyWong16
c35cbb06e2
Remove tokens from downloaded config 2022-01-15 16:14:20 -08:00
JonnyWong16
ce0cdf9ce6
Remove tokens from downloaded database 2022-01-15 16:13:53 -08:00
JonnyWong16
6742ce613a
Do not import pms_token or jwt_secret 2022-01-15 16:12:14 -08:00
JonnyWong16
3de0a84882
Increase verify server timeout 2022-01-12 09:59:08 -08:00
JonnyWong16
a6e568ea5d
Fix Crypto donation referrer link 2022-01-09 16:53:02 -08:00
JonnyWong16
206a175839
Add logger warning message when authentication is disabled 2022-01-05 15:56:23 -08:00
JonnyWong16
16f20c941c
Add advanced config setting to enable Plex XML shortcuts 2022-01-05 15:56:01 -08:00
JonnyWong16
f8048a01a6
Validate settings when saving config 2022-01-05 15:52:09 -08:00
JonnyWong16
3c3d72850f
Remove PMS token from UI 2022-01-05 14:04:33 -08:00
JonnyWong16
b7937b8740
Proxy PMS downloads json through server 2022-01-05 14:04:33 -08:00
JonnyWong16
d943877e76
Proxy token check through server 2022-01-05 11:17:35 -08:00
JonnyWong16
c39f89356c
Remove get_settings API command 2022-01-05 10:53:25 -08:00
JonnyWong16
2410eb3380
v2.8.1 2022-01-04 13:43:43 -08:00
dependabot[bot]
754f93816c
Bump zipp from 3.6.0 to 3.7.0 (#1601)
Bumps [zipp](https://github.com/jaraco/zipp) from 3.6.0 to 3.7.0.
- [Release notes](https://github.com/jaraco/zipp/releases)
- [Changelog](https://github.com/jaraco/zipp/blob/main/CHANGES.rst)
- [Commits](https://github.com/jaraco/zipp/compare/v3.6.0...v3.7.0)

---
updated-dependencies:
- dependency-name: zipp
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-01-04 13:31:34 -08:00
dependabot[bot]
3689834051
Bump cheroot from 8.5.2 to 8.6.0 (#1603)
* Bump cheroot from 8.5.2 to 8.6.0

Bumps [cheroot](https://github.com/cherrypy/cheroot) from 8.5.2 to 8.6.0.
- [Release notes](https://github.com/cherrypy/cheroot/releases)
- [Changelog](https://github.com/cherrypy/cheroot/blob/master/CHANGES.rst)
- [Commits](https://github.com/cherrypy/cheroot/compare/v8.5.2...v8.6.0)

---
updated-dependencies:
- dependency-name: cheroot
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update cheroot==8.6.0

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>
2022-01-04 13:20:50 -08:00
dependabot[bot]
bb5ebe0fa5
Bump requests from 2.26.0 to 2.27.0 (#1602)
* Bump requests from 2.26.0 to 2.27.0

Bumps [requests](https://github.com/psf/requests) from 2.26.0 to 2.27.0.
- [Release notes](https://github.com/psf/requests/releases)
- [Changelog](https://github.com/psf/requests/blob/main/HISTORY.md)
- [Commits](https://github.com/psf/requests/compare/v2.26.0...v2.27.0)

---
updated-dependencies:
- dependency-name: requests
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update requests==2.27.0

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>
2022-01-04 13:20:40 -08:00
dependabot[bot]
2c7a3934cb
Bump websocket-client from 1.2.1 to 1.2.3 (#1587)
* Bump websocket-client from 1.2.1 to 1.2.3

Bumps [websocket-client](https://github.com/websocket-client/websocket-client) from 1.2.1 to 1.2.3.
- [Release notes](https://github.com/websocket-client/websocket-client/releases)
- [Changelog](https://github.com/websocket-client/websocket-client/blob/master/ChangeLog)
- [Commits](https://github.com/websocket-client/websocket-client/compare/v1.2.1...v1.2.3)

---
updated-dependencies:
- dependency-name: websocket-client
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update websocket-client==1.2.3

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>
2022-01-04 13:20:22 -08:00
dependabot[bot]
d652067ca5
Bump pywin32 from 302 to 303 (#1599)
Bumps [pywin32](https://github.com/mhammond/pywin32) from 302 to 303.
- [Release notes](https://github.com/mhammond/pywin32/releases)
- [Changelog](https://github.com/mhammond/pywin32/blob/main/CHANGES.txt)
- [Commits](https://github.com/mhammond/pywin32/commits)

---
updated-dependencies:
- dependency-name: pywin32
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-01-04 12:39:58 -08:00
dependabot[bot]
2198d819c1
Bump pyobjc-framework-cocoa from 8.0 to 8.1 (#1580)
Bumps [pyobjc-framework-cocoa](https://github.com/ronaldoussoren/pyobjc) from 8.0 to 8.1.
- [Release notes](https://github.com/ronaldoussoren/pyobjc/releases)
- [Changelog](https://github.com/ronaldoussoren/pyobjc/blob/master/docs/changelog.rst)
- [Commits](https://github.com/ronaldoussoren/pyobjc/commits)

---
updated-dependencies:
- dependency-name: pyobjc-framework-cocoa
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-01-04 12:38:28 -08:00
dependabot[bot]
e5e643a0c6
Bump pyobjc-core from 8.0 to 8.1 (#1579)
Bumps [pyobjc-core](https://github.com/ronaldoussoren/pyobjc) from 8.0 to 8.1.
- [Release notes](https://github.com/ronaldoussoren/pyobjc/releases)
- [Changelog](https://github.com/ronaldoussoren/pyobjc/blob/master/docs/changelog.rst)
- [Commits](https://github.com/ronaldoussoren/pyobjc/commits)

---
updated-dependencies:
- dependency-name: pyobjc-core
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-01-04 12:36:41 -08:00
dependabot[bot]
6df1b7dc87
Bump pycryptodomex from 3.11.0 to 3.12.0 (#1585)
Bumps [pycryptodomex](https://github.com/Legrandin/pycryptodome) from 3.11.0 to 3.12.0.
- [Release notes](https://github.com/Legrandin/pycryptodome/releases)
- [Changelog](https://github.com/Legrandin/pycryptodome/blob/master/Changelog.rst)
- [Commits](https://github.com/Legrandin/pycryptodome/compare/v3.11.0...v3.12.0)

---
updated-dependencies:
- dependency-name: pycryptodomex
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-01-04 12:33:41 -08:00
JonnyWong16
925a16e66d
Add total time result to user player stats 2022-01-03 12:55:42 -08:00
JonnyWong16
cd59e1d4c4
Remove media_type argument from item stats API call 2022-01-03 12:53:21 -08:00
JonnyWong16
3fc2368078
Add total time result to library user stats 2022-01-03 12:45:25 -08:00
JonnyWong16
094b2211c3
Add grouping and query_days parameters for item stats API 2022-01-03 12:45:25 -08:00
JonnyWong16
93940b710b
Add removable media plug to snap 2021-12-26 11:50:47 -08:00
JonnyWong16
1e61f1332e
Clean __pycache__ and .pyc after update 2021-12-16 11:07:35 -08:00
JonnyWong16
8d832730f2
Update exporter docs collection/playlist note 2021-12-16 10:13:04 -08:00
JonnyWong16
7b061f49c5
Make clean_pyc scripts executable 2021-12-15 20:25:14 -08:00
JonnyWong16
a944f5ae06
v2.8.0 2021-12-15 20:16:36 -08:00
JonnyWong16
9432fee1ba
Fix get_history when media_type == 'all' 2021-12-04 13:06:53 -08:00
JonnyWong16
d5d3766f90
Improve Plex log reader 2021-11-29 21:25:48 -08:00
JonnyWong16
eee5402c80
Add before and after parameter to get_history API command 2021-11-29 20:00:31 -08:00
JonnyWong16
98fe7d7a0f
Pin apscheduler==3.8.0 requirement 2021-11-29 10:19:19 -08:00
JonnyWong16
0a570e7772
Update tzdata==2021.5 2021-11-29 10:14:40 -08:00
JonnyWong16
c0fb1dbbdc
Revert "Update apscheduler==3.8.1"
This reverts commit 973cad264f.
2021-11-29 10:11:05 -08:00
JonnyWong16
045bfb9502
v2.8.0-beta 2021-11-28 14:32:14 -08:00
JonnyWong16
ae3135e66e
Update dependabot pull request limit 2021-11-28 14:24:52 -08:00
JonnyWong16
3a50981976
Update plexapi==4.8.0 2021-11-28 14:23:21 -08:00
JonnyWong16
36b55398a8
Update soupsieve==2.3.1 2021-11-28 14:23:21 -08:00
JonnyWong16
dcfd8abddd
Update cloudinary==1.28.0 2021-11-28 14:23:21 -08:00
JonnyWong16
0325e9327f
Update portend==3.1.0 2021-11-28 14:23:21 -08:00
JonnyWong16
5f43c4c890
Update mako==1.1.6 2021-11-28 14:14:57 -08:00
JonnyWong16
5dbc15ce4b
Update simplejson==3.17.6 2021-11-28 14:14:57 -08:00
JonnyWong16
f52d985f8c
Update packaging==21.3 2021-11-28 14:14:57 -08:00
JonnyWong16
0ec2d70e4b
Update pyparsing==3.0.6 2021-11-28 14:14:57 -08:00
JonnyWong16
563f697563
Update importlib-resources==5.4.0 2021-11-28 14:14:57 -08:00
JonnyWong16
c79c48fcca
Update arrow==1.2.1 2021-11-28 14:14:57 -08:00
JonnyWong16
03012cd2b2
Update tokenize-rt==4.2.1 2021-11-28 14:14:57 -08:00
JonnyWong16
966a6696d1
Update paho-mqtt==1.6.1 2021-11-28 14:14:57 -08:00
JonnyWong16
d981f6e51f
Update pyjwt==2.3.0 2021-11-28 14:14:57 -08:00
JonnyWong16
973cad264f
Update apscheduler==3.8.1 2021-11-28 14:14:57 -08:00
dependabot[bot]
a6c933cfce
Bump plexapi from 4.7.2 to 4.8.0 (#1573)
Bumps [plexapi](https://github.com/pkkid/python-plexapi) from 4.7.2 to 4.8.0.
- [Release notes](https://github.com/pkkid/python-plexapi/releases)
- [Commits](https://github.com/pkkid/python-plexapi/compare/4.7.2...4.8.0)

---
updated-dependencies:
- dependency-name: plexapi
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2021-11-28 14:14:35 -08:00
dependabot[bot]
dc45e503a6
Bump soupsieve from 2.2.1 to 2.3.1 (#1575)
Bumps [soupsieve](https://github.com/facelessuser/soupsieve) from 2.2.1 to 2.3.1.
- [Release notes](https://github.com/facelessuser/soupsieve/releases)
- [Commits](https://github.com/facelessuser/soupsieve/compare/2.2.1...2.3.1)

---
updated-dependencies:
- dependency-name: soupsieve
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2021-11-28 14:13:13 -08:00
dependabot[bot]
75dc12ff03
Bump cloudinary from 1.26.0 to 1.28.0 (#1568)
Bumps [cloudinary](https://github.com/cloudinary/pycloudinary) from 1.26.0 to 1.28.0.
- [Release notes](https://github.com/cloudinary/pycloudinary/releases)
- [Changelog](https://github.com/cloudinary/pycloudinary/blob/master/CHANGELOG.md)
- [Commits](https://github.com/cloudinary/pycloudinary/compare/1.26.0...1.28.0)

---
updated-dependencies:
- dependency-name: cloudinary
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2021-11-28 14:12:08 -08:00
dependabot[bot]
66008ca533
Bump tzdata from 2021.2.post0 to 2021.5 (#1542)
Bumps [tzdata](https://github.com/python/tzdata) from 2021.2.post0 to 2021.5.
- [Release notes](https://github.com/python/tzdata/releases)
- [Changelog](https://github.com/python/tzdata/blob/master/NEWS.md)
- [Commits](https://github.com/python/tzdata/compare/2021.2.post0...2021.5)

---
updated-dependencies:
- dependency-name: tzdata
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>

[skip ci]
2021-11-28 14:11:40 -08:00
dependabot[bot]
423b76686d
Bump pyobjc-framework-cocoa from 7.3 to 8.0 (#1576)
Bumps [pyobjc-framework-cocoa](https://github.com/ronaldoussoren/pyobjc) from 7.3 to 8.0.
- [Release notes](https://github.com/ronaldoussoren/pyobjc/releases)
- [Changelog](https://github.com/ronaldoussoren/pyobjc/blob/master/docs/changelog.rst)
- [Commits](https://github.com/ronaldoussoren/pyobjc/compare/v7.3...v8.0)

---
updated-dependencies:
- dependency-name: pyobjc-framework-cocoa
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2021-11-28 14:10:35 -08:00
dependabot[bot]
d3fdee4dca
Bump pyobjc-core from 7.3 to 8.0 (#1574)
Bumps [pyobjc-core](https://github.com/ronaldoussoren/pyobjc) from 7.3 to 8.0.
- [Release notes](https://github.com/ronaldoussoren/pyobjc/releases)
- [Changelog](https://github.com/ronaldoussoren/pyobjc/blob/master/docs/changelog.rst)
- [Commits](https://github.com/ronaldoussoren/pyobjc/compare/v7.3...v8.0)

---
updated-dependencies:
- dependency-name: pyobjc-core
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2021-11-28 14:08:19 -08:00
dependabot[bot]
2f7fb821c2
Bump pyinstaller from 4.5.1 to 4.7 (#1570)
Bumps [pyinstaller](https://github.com/pyinstaller/pyinstaller) from 4.5.1 to 4.7.
- [Release notes](https://github.com/pyinstaller/pyinstaller/releases)
- [Changelog](https://github.com/pyinstaller/pyinstaller/blob/v4.7/doc/CHANGES.rst)
- [Commits](https://github.com/pyinstaller/pyinstaller/compare/v4.5.1...v4.7)

---
updated-dependencies:
- dependency-name: pyinstaller
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2021-11-28 14:07:28 -08:00
dependabot[bot]
e8e147c063
Bump mako from 1.1.5 to 1.1.6 (#1577)
Bumps [mako](https://github.com/sqlalchemy/mako) from 1.1.5 to 1.1.6.
- [Release notes](https://github.com/sqlalchemy/mako/releases)
- [Changelog](https://github.com/sqlalchemy/mako/blob/main/CHANGES)
- [Commits](https://github.com/sqlalchemy/mako/commits)

---
updated-dependencies:
- dependency-name: mako
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2021-11-28 14:02:21 -08:00
dependabot[bot]
8f2cf8fe10
Bump portend from 3.0.0 to 3.1.0 (#1572)
Bumps [portend](https://github.com/jaraco/portend) from 3.0.0 to 3.1.0.
- [Release notes](https://github.com/jaraco/portend/releases)
- [Changelog](https://github.com/jaraco/portend/blob/main/CHANGES.rst)
- [Commits](https://github.com/jaraco/portend/compare/v3.0.0...v3.1.0)

---
updated-dependencies:
- dependency-name: portend
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2021-11-28 14:01:04 -08:00
dependabot[bot]
55a51f79d5
Bump simplejson from 3.17.5 to 3.17.6 (#1569)
Bumps [simplejson](https://github.com/simplejson/simplejson) from 3.17.5 to 3.17.6.
- [Release notes](https://github.com/simplejson/simplejson/releases)
- [Changelog](https://github.com/simplejson/simplejson/blob/master/CHANGES.txt)
- [Commits](https://github.com/simplejson/simplejson/compare/v3.17.5...v3.17.6)

---
updated-dependencies:
- dependency-name: simplejson
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2021-11-28 13:59:54 -08:00
dependabot[bot]
3ce250b909
Bump packaging from 21.0 to 21.3 (#1565)
Bumps [packaging](https://github.com/pypa/packaging) from 21.0 to 21.3.
- [Release notes](https://github.com/pypa/packaging/releases)
- [Changelog](https://github.com/pypa/packaging/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pypa/packaging/compare/21.0...21.3)

---
updated-dependencies:
- dependency-name: packaging
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2021-11-28 13:58:05 -08:00
dependabot[bot]
e40234b599
Bump pyparsing from 2.4.7 to 3.0.6 (#1564)
Bumps [pyparsing](https://github.com/pyparsing/pyparsing) from 2.4.7 to 3.0.6.
- [Release notes](https://github.com/pyparsing/pyparsing/releases)
- [Changelog](https://github.com/pyparsing/pyparsing/blob/master/CHANGES)
- [Commits](https://github.com/pyparsing/pyparsing/compare/pyparsing_2.4.7...pyparsing_3.0.6)

---
updated-dependencies:
- dependency-name: pyparsing
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2021-11-28 13:55:05 -08:00
dependabot[bot]
b7489302fd
Bump importlib-resources from 5.2.2 to 5.4.0 (#1554)
Bumps [importlib-resources](https://github.com/python/importlib_resources) from 5.2.2 to 5.4.0.
- [Release notes](https://github.com/python/importlib_resources/releases)
- [Changelog](https://github.com/python/importlib_resources/blob/main/CHANGES.rst)
- [Commits](https://github.com/python/importlib_resources/compare/v5.2.2...v5.4.0)

---
updated-dependencies:
- dependency-name: importlib-resources
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2021-11-28 13:53:54 -08:00
dependabot[bot]
1fe1fd6595
Bump arrow from 1.2.0 to 1.2.1 (#1543)
Bumps [arrow](https://github.com/arrow-py/arrow) from 1.2.0 to 1.2.1.
- [Release notes](https://github.com/arrow-py/arrow/releases)
- [Changelog](https://github.com/arrow-py/arrow/blob/master/CHANGELOG.rst)
- [Commits](https://github.com/arrow-py/arrow/compare/1.2.0...1.2.1)

---
updated-dependencies:
- dependency-name: arrow
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2021-11-28 13:52:26 -08:00
dependabot[bot]
89a265d226
Bump tokenize-rt from 4.1.0 to 4.2.1 (#1539)
Bumps [tokenize-rt](https://github.com/asottile/tokenize-rt) from 4.1.0 to 4.2.1.
- [Release notes](https://github.com/asottile/tokenize-rt/releases)
- [Commits](https://github.com/asottile/tokenize-rt/compare/v4.1.0...v4.2.1)

---
updated-dependencies:
- dependency-name: tokenize-rt
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2021-11-28 13:50:04 -08:00
dependabot[bot]
efb1a7e3b7
Bump paho-mqtt from 1.5.1 to 1.6.1 (#1538)
Bumps [paho-mqtt](https://github.com/eclipse/paho.mqtt.python) from 1.5.1 to 1.6.1.
- [Release notes](https://github.com/eclipse/paho.mqtt.python/releases)
- [Changelog](https://github.com/eclipse/paho.mqtt.python/blob/master/ChangeLog.txt)
- [Commits](https://github.com/eclipse/paho.mqtt.python/compare/v1.5.1...v1.6.1)

---
updated-dependencies:
- dependency-name: paho-mqtt
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

[skip ci]
2021-11-28 13:49:05 -08:00
JonnyWong16
ebd09e9d3b
Update requirements.txt
[skip ci]
2021-11-28 13:42:07 -08:00
JonnyWong16
bf8aca21e4
Add upload database max file size note 2021-11-28 13:29:18 -08:00
JonnyWong16
d8e581f263
Adjust info page summary margin 2021-11-28 13:29:18 -08:00
dependabot[bot]
4604140ef6
Bump apscheduler from 3.8.0 to 3.8.1 (#1545)
Bumps [apscheduler](https://github.com/agronholm/apscheduler) from 3.8.0 to 3.8.1.
- [Release notes](https://github.com/agronholm/apscheduler/releases)
- [Changelog](https://github.com/agronholm/apscheduler/blob/master/docs/versionhistory.rst)
- [Commits](https://github.com/agronholm/apscheduler/compare/3.8.0...3.8.1)

---
updated-dependencies:
- dependency-name: apscheduler
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-11-28 13:29:00 -08:00
dependabot[bot]
36a7bee9f0
Bump pyjwt from 2.2.0 to 2.3.0 (#1528)
Bumps [pyjwt](https://github.com/jpadilla/pyjwt) from 2.2.0 to 2.3.0.
- [Release notes](https://github.com/jpadilla/pyjwt/releases)
- [Changelog](https://github.com/jpadilla/pyjwt/blob/master/CHANGELOG.rst)
- [Commits](https://github.com/jpadilla/pyjwt/compare/2.2.0...2.3.0)

---
updated-dependencies:
- dependency-name: pyjwt
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-11-28 13:25:00 -08:00
JonnyWong16
776efbb6a3
Add note passwords not copied when duplicating notifier or newsletters 2021-11-13 22:24:54 -08:00
JonnyWong16
e9762cdef6
Fix confirm modal click handler triggering multiple times 2021-11-13 22:24:12 -08:00
JonnyWong16
876741b40b
Add description toggle to info page
* Fixes #1546
2021-11-13 21:53:32 -08:00
JonnyWong16
98d02d0b89
Add missing column to sessions table 2021-11-13 21:03:34 -08:00
JonnyWong16
0a2cc953c6
Update added issues label action message
[skip ci]
2021-11-13 21:03:34 -08:00
Niccolò Maggioni
90f3e9ac85
Make all calls honor VERIFY_SSL_CERT setting (#1541)
* Make PmsConnect honor VERIFY_SSL_CERT setting

* Make all websockets and WebUI tests honor VERIFY_SSL_CERT setting

Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>
2021-11-13 21:03:12 -08:00
JonnyWong16
93cb067454
Update get_metadata_childern to include all artist album types
* Fixes #1559
2021-11-06 21:44:55 -08:00
JonnyWong16
cd85269fe5
Add Gotify notification agent 2021-11-06 20:48:52 -08:00
JonnyWong16
274801ee0b
Add note for music provider 3rd party API 2021-11-06 19:53:29 -08:00
JonnyWong16
ef60ce5bb0
Add Microsoft Teams webhook notification agent
* Closes #1514
2021-11-06 19:53:29 -08:00
JonnyWong16
3fffbcbe36
Fix expanding child DataTables 2021-10-25 17:23:29 -07:00
JonnyWong16
ecb66f39c9
Add dynamic anonymous redirect service setting 2021-10-24 21:27:27 -07:00
JonnyWong16
c13b1a67f2
Don't save table search or page state
* Fixes #1532
2021-10-24 20:42:37 -07:00
JonnyWong16
acef75f10a
Fix arrow.timestamp() method 2021-10-22 11:07:05 -07:00
JonnyWong16
5a5e6b2f4e
Only set z-index for docker mount warning on welcome page 2021-10-21 19:59:29 -07:00
herby2212
c6ff8940b4
Add watch time and user stats to info pages (#1471)
* watch time stats for show

* watch time stats for movie

* User Stats for movies and shows

* implementation for missing media types

* cleanup

* no data + rescrict guest access implementation

Co-authored-by: herby2212 <jannes.nagel@gmx.de>
2021-10-21 17:33:29 -07:00
reloxx13
22f4b33087
Add clean_pyc.bat (#1527)
* Create clean_pyc.bat

Add pyc cleaner script for windows to clear all pyc cache files.
https://github.com/Tautulli/Tautulli/issues/1523#issuecomment-944938745

* Update clean_pyc.bat

fix comment

* Remove __pycache__ folders in clean_pyc scripts

Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>
2021-10-21 17:30:17 -07:00
JonnyWong16
14d1ff65f4
Fix history Direct Stream filter button not selected on reloading page 2021-10-19 17:55:09 -07:00
JonnyWong16
b9d4f57a4e
Fix history Live TV filter when combined with other filters 2021-10-19 17:54:28 -07:00
JonnyWong16
d041c8a03b
Fix dataTables css capitalization 2021-10-19 11:59:42 -07:00
JonnyWong16
f4e1b762e9
Update all css and js references 2021-10-17 11:33:51 -07:00
JonnyWong16
73a4bb7640
Update Highcharts-9.2.2 2021-10-17 11:33:15 -07:00
JonnyWong16
a888b1818f
Update DataTables-1.11.3 2021-10-17 11:27:00 -07:00
JonnyWong16
3112f3dcad
Update jquery-3.6.0 2021-10-17 11:25:18 -07:00
JonnyWong16
5fd17040be
Fix total plays graph
* arrow.timestamp() function instead of attribute
2021-10-16 11:30:03 -07:00
JonnyWong16
2916749360
Revert "Remove MarkupSafe-2.0.1"
This reverts commit 5eb5fe8fba.
2021-10-16 09:55:35 -07:00
JonnyWong16
eb18b24bd6
Remove sgmllib3 2021-10-15 18:56:55 -07:00
JonnyWong16
bb45062fde
Fix Windows systray import 2021-10-15 18:56:43 -07:00
JonnyWong16
0888e58e5f
Update requirements.txt
* infi.systray from fork
2021-10-15 18:56:27 -07:00
JonnyWong16
c01b4da33d
Update infi.systray fork
From https://github.com/JonnyWong16/infi.systray.git@develop
2021-10-15 18:55:53 -07:00
JonnyWong16
94ef9b30c7
Add album and track exporter fields
* album.formats and album.subformats
* album.hasSonicAnalysis and track.hasSonicAnalysis
2021-10-15 18:14:36 -07:00
JonnyWong16
91e0d4b403
Revert "Restrict plexapi to Python>=3.7"
This reverts commit fdde2c6143.
2021-10-15 18:01:23 -07:00
JonnyWong16
c9675b2fde
Update package installers to Python 3.9 2021-10-15 17:33:34 -07:00
JonnyWong16
81d8d5e1ae
Combine package requirements into single file 2021-10-15 17:24:07 -07:00
JonnyWong16
60920101bf
Add importlib-resources==5.2.2 to package requirements 2021-10-15 17:22:57 -07:00
JonnyWong16
5eb5fe8fba
Remove MarkupSafe-2.0.1 2021-10-15 09:17:52 -07:00
JonnyWong16
ea398827cb
Downgrade tzlocal-2.1 2021-10-15 09:17:52 -07:00
JonnyWong16
5d46655507
Merge pull request #1521 from Tautulli/dependabot/pip/nightly/pywin32-302
Bump pywin32 from 301 to 302
2021-10-15 02:16:28 -07:00
dependabot[bot]
90f79fc4f9
Bump pywin32 from 301 to 302
Bumps [pywin32](https://github.com/mhammond/pywin32) from 301 to 302.
- [Release notes](https://github.com/mhammond/pywin32/releases)
- [Changelog](https://github.com/mhammond/pywin32/blob/main/CHANGES.txt)
- [Commits](https://github.com/mhammond/pywin32/commits)

---
updated-dependencies:
- dependency-name: pywin32
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-10-15 09:11:47 +00:00
JonnyWong16
85e082b48b
Merge pull request #1519 from Tautulli/dependabot/pip/nightly/pycryptodomex-3.11.0
Bump pycryptodomex from 3.10.1 to 3.11.0
2021-10-15 02:10:57 -07:00
dependabot[bot]
df3882817a
Bump pycryptodomex from 3.10.1 to 3.11.0
Bumps [pycryptodomex](https://github.com/Legrandin/pycryptodome) from 3.10.1 to 3.11.0.
- [Release notes](https://github.com/Legrandin/pycryptodome/releases)
- [Changelog](https://github.com/Legrandin/pycryptodome/blob/master/Changelog.rst)
- [Commits](https://github.com/Legrandin/pycryptodome/compare/v3.10.1...v3.11.0)

---
updated-dependencies:
- dependency-name: pycryptodomex
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-10-15 09:06:40 +00:00
JonnyWong16
274677a182
Merge pull request #1515 from Tautulli/dependabot/pip/nightly/pyopenssl-21.0.0
Bump pyopenssl from 20.0.1 to 21.0.0
2021-10-15 02:06:11 -07:00
JonnyWong16
0f07d42426
Merge pull request #1510 from Tautulli/dependabot/pip/nightly/apscheduler-3.8.0
Bump apscheduler from 3.7.0 to 3.8.0
2021-10-15 02:06:02 -07:00
JonnyWong16
6831174e62
Merge pull request #1502 from Tautulli/dependabot/github_actions/nightly/technote-space/workflow-conclusion-action-2.2
Bump technote-space/workflow-conclusion-action from 2.1.7 to 2.2
2021-10-15 02:05:54 -07:00
JonnyWong16
fc8448629e
Merge branch 'feature/requirements' into nightly 2021-10-15 02:03:47 -07:00
JonnyWong16
fdde2c6143
Restrict plexapi to Python>=3.7 2021-10-15 02:00:35 -07:00
JonnyWong16
1a70729243
Update MQTT notification agent 2021-10-15 02:00:35 -07:00
JonnyWong16
50aa8faa8d
Fix arrow get timestamp from integer 2021-10-15 02:00:35 -07:00
JonnyWong16
d2e84886f6
Fix jwt encoding 2021-10-15 02:00:35 -07:00
JonnyWong16
6d0fcf0970
Remove unused logger functions 2021-10-15 02:00:35 -07:00
JonnyWong16
5e6126ecbd
Fix system timezone string 2021-10-15 02:00:35 -07:00
JonnyWong16
04c54296fc
Update .gitignore 2021-10-15 02:00:35 -07:00
JonnyWong16
8cb8614911
Add requirements.txt 2021-10-15 02:00:35 -07:00
JonnyWong16
f0b700233f
Remove unused Python 2 libraries 2021-10-15 02:00:35 -07:00
JonnyWong16
53369cd8a6
Remove unnecessary lib files 2021-10-15 01:56:57 -07:00
JonnyWong16
afbfebbe59
Remove contextlib2 2021-10-15 01:56:57 -07:00
JonnyWong16
08faff47ce
Add MarkupSafe-2.0.1 2021-10-15 01:56:57 -07:00
JonnyWong16
7d74869316
Add zipp-3.6.0 2021-10-15 01:56:57 -07:00
JonnyWong16
f238343aa2
Add importlib-resources-5.2.2 2021-10-15 01:56:57 -07:00
JonnyWong16
b09faab852
Add tzdata-2021.2.post0 2021-10-15 01:56:57 -07:00
JonnyWong16
607b6fa250
Update tzlocal windows mappings 2021-10-15 01:56:57 -07:00
JonnyWong16
912912dbf9
Update tokenize-rt-4.1.0 2021-10-15 01:56:57 -07:00
JonnyWong16
41ef595edc
Update xmltodict-0.12.0 2021-10-15 01:56:57 -07:00
JonnyWong16
7dd3963bf2
Update facebook-sdk-3.1.0 2021-10-15 01:56:57 -07:00
JonnyWong16
586f033347
Update python-twitter-3.5 2021-10-15 01:56:57 -07:00
JonnyWong16
cdeff390d9
Update simplejson-3.17.5 2021-10-15 01:56:57 -07:00
JonnyWong16
f165d2d080
Update requests-oauthlib-1.3.0 2021-10-15 01:56:57 -07:00
JonnyWong16
e55576fd80
Update gntp-1.0.3 2021-10-15 01:56:57 -07:00
JonnyWong16
624ae06b35
Add backports.zoneinfo-0.2.1 2021-10-15 01:56:57 -07:00
JonnyWong16
9ba5656ad8
Update backports.functools-lru-cache-1.6.4 2021-10-15 01:56:57 -07:00
JonnyWong16
0770a301c7
Update python-plexapi-4.7.2 2021-10-14 23:18:51 -07:00
JonnyWong16
c8b02b06d6
Update six-1.16.0 2021-10-14 23:18:51 -07:00
JonnyWong16
db79e050c2
Update IPy-1.01 2021-10-14 23:18:51 -07:00
JonnyWong16
f6f6421154
Update distro-1.6.0 2021-10-14 23:18:51 -07:00
JonnyWong16
eca3fac3ea
Update contextlib2-21.6.0 2021-10-14 23:18:51 -07:00
JonnyWong16
aa127ecbda
Update websocket-client-1.2.1 2021-10-14 23:18:51 -07:00
JonnyWong16
c67f18d65c
Update tzlocal-3.0 2021-10-14 23:18:51 -07:00
JonnyWong16
9d78e6ae4c
Update pytz-2021.3 2021-10-14 23:18:51 -07:00
JonnyWong16
d76838a607
Update oauthlib-3.1.1 2021-10-14 23:18:51 -07:00
JonnyWong16
e58aa40099
Update httpagentparser-1.9.1 2021-10-14 23:18:51 -07:00
JonnyWong16
586fd15464
Update html5lib-1.1 2021-10-14 23:18:51 -07:00
JonnyWong16
3a116486e7
Update phao-mqtt-1.5.1 2021-10-14 23:18:51 -07:00
JonnyWong16
d2c14f11ae
Update musicbrainzngs-0.7.1 2021-10-14 23:18:51 -07:00
JonnyWong16
668f6bfbb8
Update Mako-1.1.5 2021-10-14 23:18:51 -07:00
JonnyWong16
4eb0fea423
Update PyJWT-2.2.0 2021-10-14 23:18:51 -07:00
JonnyWong16
b55b053b1e
Patch ipwhois host lookup
* Args need to be unpacked into the namedtuple
2021-10-14 23:18:51 -07:00
JonnyWong16
2c4cc34b2b
Update ipwhois-1.2.0 2021-10-14 23:18:51 -07:00
JonnyWong16
4d62245cf5
Update dnspython-2.2.0 2021-10-14 23:18:51 -07:00
JonnyWong16
4b28040d59
Update cloudinary-1.26.0 2021-10-14 23:18:51 -07:00
JonnyWong16
ebffd124f6
Update cherrypy-18.6.1 2021-10-14 23:18:51 -07:00
JonnyWong16
b3ae6bd695
Update jaraco.functools-3.3.0 2021-10-14 23:18:51 -07:00
JonnyWong16
979c70f129
Add jaraco.collections-3.4.0 2021-10-14 23:18:51 -07:00
JonnyWong16
ff764e1065
Add jaraco.text-3.5.1 2021-10-14 23:18:51 -07:00
JonnyWong16
fed42da9bb
Add jaraco.classes-3.2.1 2021-10-14 23:18:51 -07:00
JonnyWong16
182e5f553e
Update cheroot-8.5.2 2021-10-14 23:18:51 -07:00
JonnyWong16
4ac151d7de
Update more-itertools-8.10.0 2021-10-14 23:18:51 -07:00
JonnyWong16
a94edb4644
Update tempora-4.1.2 2021-10-14 23:18:51 -07:00
JonnyWong16
edd2f21ce1
Update portend-3.0.0 2021-10-14 23:18:51 -07:00
JonnyWong16
f3f4f9edf6
Update requests-2.26.0 2021-10-14 23:18:51 -07:00
JonnyWong16
b6595232d2
Update urllib3-1.26.7 2021-10-14 23:18:51 -07:00
JonnyWong16
a3bfabb5f6
Update idna-3.3 2021-10-14 23:18:51 -07:00
JonnyWong16
2f1a08009f
Add charset_normalizer-2.0.7 2021-10-14 23:18:51 -07:00
JonnyWong16
4c25cc3cc2
Remove chardet-3.0.4 2021-10-14 23:18:51 -07:00
JonnyWong16
41df696772
Update certifi-2021.10.8 2021-10-14 23:18:51 -07:00
JonnyWong16
a4130d6c56
Update bleach-4.1.0 2021-10-14 23:18:51 -07:00
JonnyWong16
4086529906
Add packaging-21.0 2021-10-14 23:18:51 -07:00
JonnyWong16
d6f94aaa8b
Add webencodings-0.5.1 2021-10-14 23:18:51 -07:00
JonnyWong16
82ed09cac9
Add pyparsing-2.4.7 2021-10-14 23:18:51 -07:00
JonnyWong16
ab8fa4d5b3
Update beautifulsoup4-4.10.0 2021-10-14 23:18:51 -07:00
JonnyWong16
b581460b51
Update soupsieve-2.2.1 2021-10-14 23:18:51 -07:00
JonnyWong16
9a54fb9a44
Update arrow-1.2.0 2021-10-14 23:18:51 -07:00
JonnyWong16
3b645cf6c3
Update datutil-2.8.2 2021-10-14 23:18:51 -07:00
JonnyWong16
439ca8ebb8
Add typing-extensions-3.10.0.2 2021-10-14 23:18:51 -07:00
JonnyWong16
dd32f1e5b4
Update apshceduler-3.8.0 2021-10-14 23:18:51 -07:00
JonnyWong16
ec3702c358
Update appdirs-1.4.4 2021-10-14 23:18:51 -07:00
JonnyWong16
5f22ad26ad
v2.7.7 2021-10-14 23:15:26 -07:00
JonnyWong16
9850025eef
Uncenter manual recently added notification agent selection dropdown 2021-10-14 22:52:43 -07:00
JonnyWong16
e34e775f41
Set different client ID when fetching a new Plex token 2021-10-11 21:24:58 -07:00
JonnyWong16
ef8557b50a
Keep docker mount log message when check is disabled 2021-10-09 16:51:18 -07:00
JonnyWong16
a49175b3b1
Add advanced setting to disable docker mount check 2021-10-09 16:42:35 -07:00
JonnyWong16
f4073c30ac
Move docker mount log message 2021-10-09 16:35:10 -07:00
JonnyWong16
9d4d740e8a
Add docker mount warning log message on startup 2021-10-09 16:15:38 -07:00
JonnyWong16
8f3a108f3b
Add docker mount warning message 2021-10-09 16:11:21 -07:00
JonnyWong16
92440224de
Add Android and Apple icon to Tautulli Remote App settings tab 2021-10-04 18:31:01 -07:00
dependabot[bot]
1eeddc876c
Bump pyopenssl from 20.0.1 to 21.0.0
Bumps [pyopenssl](https://github.com/pyca/pyopenssl) from 20.0.1 to 21.0.0.
- [Release notes](https://github.com/pyca/pyopenssl/releases)
- [Changelog](https://github.com/pyca/pyopenssl/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pyca/pyopenssl/compare/20.0.1...21.0.0)

---
updated-dependencies:
- dependency-name: pyopenssl
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-09-29 17:12:18 +00:00
JonnyWong16
6ba550531e
Fix star rating on newsletter template
* Plex change from critic rating to audience rating
* Fixes #1511
2021-09-27 10:01:05 -07:00
JonnyWong16
9fddcf3057
Fix replacement of colon and exclamation outside of eval expression 2021-09-27 00:50:25 -07:00
dependabot[bot]
9cb904419f
Bump apscheduler from 3.7.0 to 3.8.0
Bumps [apscheduler](https://github.com/agronholm/apscheduler) from 3.7.0 to 3.8.0.
- [Release notes](https://github.com/agronholm/apscheduler/releases)
- [Changelog](https://github.com/agronholm/apscheduler/blob/3.8.0/docs/versionhistory.rst)
- [Commits](https://github.com/agronholm/apscheduler/compare/v3.7.0...3.8.0)

---
updated-dependencies:
- dependency-name: apscheduler
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-09-24 17:16:26 +00:00
JonnyWong16
830ef460af
Add LunaSea notification agent 2021-09-19 20:22:29 -07:00
JonnyWong16
3a5bf646ec
Fix dropdown text left aligned 2021-09-14 17:51:54 -07:00
JonnyWong16
11a5075574
Dockerfile make config folder first 2021-09-13 16:59:39 -07:00
JonnyWong16
6a1225925e
Add docker config file to detect bind mount 2021-09-13 16:10:07 -07:00
JonnyWong16
c8d8075830
Change docker base image to ghcr.io 2021-09-13 16:09:32 -07:00
JonnyWong16
8d70c4b9da
Fix return value of get_recently_added_details when exception 2021-09-13 16:05:49 -07:00
JonnyWong16
0fe422b71d
Fix sorting of mobile devices table 2021-09-10 10:05:02 -07:00
dependabot[bot]
b82b1cdfd5
Bump technote-space/workflow-conclusion-action from 2.1.7 to 2.2
Bumps [technote-space/workflow-conclusion-action](https://github.com/technote-space/workflow-conclusion-action) from 2.1.7 to 2.2.
- [Release notes](https://github.com/technote-space/workflow-conclusion-action/releases)
- [Changelog](https://github.com/technote-space/workflow-conclusion-action/blob/main/.releasegarc)
- [Commits](https://github.com/technote-space/workflow-conclusion-action/compare/v2.1.7...v2.2)

---
updated-dependencies:
- dependency-name: technote-space/workflow-conclusion-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-09-06 17:12:43 +00:00
JonnyWong16
db90b8ad18
v2.7.6 2021-08-31 13:46:21 -07:00
JonnyWong16
1a18d63ea5
Update Tautulli Remote App Store link 2021-08-31 09:32:26 -07:00
JonnyWong16
09eba5d8b5
Add startup error alert message 2021-08-27 14:17:16 -07:00
JonnyWong16
0fbb28eca2
Don't stale PRs in review
[skip ci]
2021-08-27 12:49:51 -07:00
JonnyWong16
fd2c23a016
Speed up docker startup
* Only chown files with incorrect permissions
2021-08-25 17:34:33 -07:00
JonnyWong16
9bfcde3abb
Change QR background to "not-white" 2021-08-19 11:35:25 -07:00
JonnyWong16
fee25a6aea
Update QR code generation with kjua 2021-08-19 09:51:26 -07:00
JonnyWong16
27cacb7a8f
Add kjua for QR code 2021-08-19 09:50:04 -07:00
JonnyWong16
c1cf18ad24
Remove jquery.qrcode 2021-08-19 09:49:54 -07:00
JonnyWong16
3a68080a26
Remove x264 from HW encoders 2021-08-19 09:19:04 -07:00
JonnyWong16
a1a340f4e8
Merge pull request #1463 from Tautulli/dependabot/pip/nightly/pyobjc-framework-cocoa-7.3
Bump pyobjc-framework-cocoa from 6.2.2 to 7.3
2021-08-15 18:12:56 -07:00
dependabot[bot]
b5de25f8a4
Bump pyobjc-framework-cocoa from 6.2.2 to 7.3
Bumps [pyobjc-framework-cocoa](https://github.com/ronaldoussoren/pyobjc) from 6.2.2 to 7.3.
- [Release notes](https://github.com/ronaldoussoren/pyobjc/releases)
- [Changelog](https://github.com/ronaldoussoren/pyobjc/blob/master/docs/changelog.rst)
- [Commits](https://github.com/ronaldoussoren/pyobjc/compare/v6.2.2...v7.3)

---
updated-dependencies:
- dependency-name: pyobjc-framework-cocoa
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-08-16 01:06:29 +00:00
JonnyWong16
6b27b673cb
Merge pull request #1458 from Tautulli/dependabot/pip/nightly/pyobjc-core-7.3
Bump pyobjc-core from 6.2.2 to 7.3
2021-08-15 17:16:04 -07:00
JonnyWong16
36bab1785f
Merge pull request #1485 from Tautulli/dependabot/pip/nightly/pyinstaller-4.5.1
Bump pyinstaller from 4.2 to 4.5.1
2021-08-15 17:11:24 -07:00
dependabot[bot]
855bf2334e
Bump pyinstaller from 4.2 to 4.5.1
Bumps [pyinstaller](https://github.com/pyinstaller/pyinstaller) from 4.2 to 4.5.1.
- [Release notes](https://github.com/pyinstaller/pyinstaller/releases)
- [Changelog](https://github.com/pyinstaller/pyinstaller/blob/v4.5.1/doc/CHANGES.rst)
- [Commits](https://github.com/pyinstaller/pyinstaller/compare/v4.2...v4.5.1)

---
updated-dependencies:
- dependency-name: pyinstaller
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-08-16 00:09:36 +00:00
JonnyWong16
998630d40c
Merge pull request #1466 from Tautulli/dependabot/pip/nightly/apscheduler-3.7.0
Bump apscheduler from 3.6.3 to 3.7.0
2021-08-15 17:00:27 -07:00
dependabot[bot]
70d7a307d6
Bump pyobjc-core from 6.2.2 to 7.3
Bumps [pyobjc-core](https://github.com/ronaldoussoren/pyobjc) from 6.2.2 to 7.3.
- [Release notes](https://github.com/ronaldoussoren/pyobjc/releases)
- [Changelog](https://github.com/ronaldoussoren/pyobjc/blob/master/docs/changelog.rst)
- [Commits](https://github.com/ronaldoussoren/pyobjc/compare/v6.2.2...v7.3)

---
updated-dependencies:
- dependency-name: pyobjc-core
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-08-15 23:57:44 +00:00
dependabot[bot]
e44d69316f
Bump apscheduler from 3.6.3 to 3.7.0
Bumps [apscheduler](https://github.com/agronholm/apscheduler) from 3.6.3 to 3.7.0.
- [Release notes](https://github.com/agronholm/apscheduler/releases)
- [Changelog](https://github.com/agronholm/apscheduler/blob/master/docs/versionhistory.rst)
- [Commits](https://github.com/agronholm/apscheduler/compare/v3.6.3...v3.7.0)

---
updated-dependencies:
- dependency-name: apscheduler
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-08-15 23:57:44 +00:00
JonnyWong16
474b4f3cfe
Merge pull request #1464 from Tautulli/dependabot/pip/nightly/pycryptodomex-3.10.1
Bump pycryptodomex from 3.9.9 to 3.10.1
2021-08-15 16:57:07 -07:00
JonnyWong16
f92587c4f9
Merge pull request #1465 from Tautulli/dependabot/github_actions/nightly/actions/stale-4
Bump actions/stale from 3 to 4
2021-08-15 16:55:21 -07:00
JonnyWong16
ebb82eaecc
Merge branch 'nightly' into dependabot/github_actions/nightly/actions/stale-4 2021-08-15 16:54:27 -07:00
JonnyWong16
d17432460d
Remove skip-stale-issue-message and skip-stale-pr-message 2021-08-15 16:53:43 -07:00
JonnyWong16
4e0bb34d6c
Merge pull request #1462 from Tautulli/dependabot/github_actions/nightly/technote-space/workflow-conclusion-action-2.1.7
Bump technote-space/workflow-conclusion-action from 1 to 2.1.7
2021-08-15 16:50:19 -07:00
JonnyWong16
9410f46446
Merge pull request #1460 from Tautulli/dependabot/github_actions/nightly/joncloud/makensis-action-3.6
Bump joncloud/makensis-action from 3.4 to 3.6
2021-08-15 16:46:36 -07:00
dependabot[bot]
f02820a2c1
Bump pycryptodomex from 3.9.9 to 3.10.1
Bumps [pycryptodomex](https://github.com/Legrandin/pycryptodome) from 3.9.9 to 3.10.1.
- [Release notes](https://github.com/Legrandin/pycryptodome/releases)
- [Changelog](https://github.com/Legrandin/pycryptodome/blob/master/Changelog.rst)
- [Commits](https://github.com/Legrandin/pycryptodome/compare/v3.9.9...v3.10.1)

---
updated-dependencies:
- dependency-name: pycryptodomex
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-08-15 23:40:29 +00:00
JonnyWong16
cafce3afe1
Merge pull request #1486 from Tautulli/dependabot/pip/package/pywin32-301
Bump pywin32 from 300 to 301 in /package
2021-08-15 16:39:46 -07:00
JonnyWong16
4d230e3a6b
Merge pull request #1483 from TheMeanCanEHdian/nightly
Convert issue templates to forms.
[skip ci]
2021-08-15 16:39:18 -07:00
JonnyWong16
5d05f6826a
Add new episode exporter fields 2021-08-15 15:28:01 -07:00
JonnyWong16
3fe77932a0
Update PlexAPI to 4.6.3 2021-08-15 15:23:53 -07:00
JonnyWong16
4ec8ef3ab3
Fix exporting collections and playlists
Fixes #1484
2021-08-15 15:17:20 -07:00
JonnyWong16
fd9ed1291d
Ignore dependencies for stale workflow
[skip ci]
2021-08-15 15:10:01 -07:00
dependabot[bot]
d5ea507bac
Bump pywin32 from 300 to 301 in /package
Bumps [pywin32](https://github.com/mhammond/pywin32) from 300 to 301.
- [Release notes](https://github.com/mhammond/pywin32/releases)
- [Changelog](https://github.com/mhammond/pywin32/blob/master/CHANGES.txt)
- [Commits](https://github.com/mhammond/pywin32/commits)

---
updated-dependencies:
- dependency-name: pywin32
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-08-09 20:57:11 +00:00
TheMeanCanEHdian
f28a4e92b4 Update various formatting items.
- Change `ex.` to `eg.`
- Move non-example placeholders to descriptions
- Add description to Steps to Reproduce & Relevant Settings
2021-08-07 11:17:23 -05:00
TheMeanCanEHdian
2aaa15793a Fix formatting of placeholders and use descriptions. 2021-08-07 10:25:14 -05:00
TheMeanCanEHdian
c06c046c48 Convert issue templates to forms. 2021-08-07 10:12:30 -05:00
JonnyWong16
670d2b31f7
Replace colon and exclamation in notification eval expression 2021-07-28 18:15:51 -07:00
JonnyWong16
05a00e9872
Fix colon in notification text eval being parsed as format specifier 2021-07-28 17:43:21 -07:00
JonnyWong16
3c1417108d
Use hmac compare_digest to check password 2021-07-22 17:47:27 -07:00
JonnyWong16
81ff471149
Fix typo in newsletter config 2021-07-22 17:46:52 -07:00
JonnyWong16
e0077f9386
Fix changelog headers 2021-07-15 13:33:24 -07:00
dependabot[bot]
608232a195
Bump actions/stale from 3 to 4
Bumps [actions/stale](https://github.com/actions/stale) from 3 to 4.
- [Release notes](https://github.com/actions/stale/releases)
- [Changelog](https://github.com/actions/stale/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/stale/compare/v3...v4)

---
updated-dependencies:
- dependency-name: actions/stale
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-07-15 20:24:13 +00:00
dependabot[bot]
150aa7b2e7
Bump technote-space/workflow-conclusion-action from 1 to 2.1.7
Bumps [technote-space/workflow-conclusion-action](https://github.com/technote-space/workflow-conclusion-action) from 1 to 2.1.7.
- [Release notes](https://github.com/technote-space/workflow-conclusion-action/releases)
- [Changelog](https://github.com/technote-space/workflow-conclusion-action/blob/master/.releasegarc)
- [Commits](https://github.com/technote-space/workflow-conclusion-action/compare/v1...v2.1.7)

---
updated-dependencies:
- dependency-name: technote-space/workflow-conclusion-action
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-07-15 20:24:08 +00:00
dependabot[bot]
6a408ea12a
Bump joncloud/makensis-action from 3.4 to 3.6
Bumps [joncloud/makensis-action](https://github.com/joncloud/makensis-action) from 3.4 to 3.6.
- [Release notes](https://github.com/joncloud/makensis-action/releases)
- [Commits](https://github.com/joncloud/makensis-action/compare/v3.4...v3.6)

---
updated-dependencies:
- dependency-name: joncloud/makensis-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-07-15 20:24:03 +00:00
JonnyWong16
5fbe9d476b
v2.7.5 2021-07-15 13:22:54 -07:00
JonnyWong16
73001a4427
Check for HTTP Basic Auth in AuthController 2021-07-15 13:21:09 -07:00
JonnyWong16
cc1092a8a2
Add Tautulli Remote iOS TestFlight badge 2021-07-15 13:05:17 -07:00
JonnyWong16
9f3ece4279
Add dependabot
[skip ci]
2021-07-08 20:48:21 -07:00
JonnyWong16
2ea4b6b63d
Remove basic auth setting 2021-07-08 20:22:02 -07:00
JonnyWong16
fe765f7827
Update fixed label comment action
[skip ci]
2021-07-03 18:48:23 -07:00
JonnyWong16
5c885a7e57
Remove clear logs button from settings 2021-07-02 15:14:31 -07:00
JonnyWong16
3422a99fc5
Remove duplicates from Imgur and Cloudinary lookup tables 2021-07-01 16:58:18 -07:00
JonnyWong16
c6548c80b3
Fix deleted libraries adding to watch statistics
* Fixes #1456
2021-07-01 16:31:50 -07:00
JonnyWong16
f7fc16a1d8
Don't hash a blank password when removing authentication
* Fixes #1455
2021-07-01 10:52:22 -07:00
JonnyWong16
5a4ee2179a
Fix guest session user ID in history query
* Fixes #1454
2021-07-01 10:41:33 -07:00
JonnyWong16
1f87799e57
Improve token security for Python 3 2021-07-01 09:21:46 -07:00
JonnyWong16
b4598dca20
Update remote app notification agent platform specific settings 2021-06-30 18:01:39 -07:00
JonnyWong16
15c7212031
Add option group type to notifier and newsletter config modal 2021-06-30 17:43:48 -07:00
JonnyWong16
741f3d836a
Rename Tautulli android app to remote app 2021-06-27 12:45:32 -07:00
JonnyWong16
bde2372d90
Add platform and version to mobile devices 2021-06-27 11:46:47 -07:00
JonnyWong16
c0837defed
Fix padding on newsletter config modal 2021-06-27 10:51:04 -07:00
JonnyWong16
9476897527
v2.7.4 2021-06-19 11:45:57 -07:00
JonnyWong16
eb46ff41fc
Show search bar in collapsed navbar
* Fixes #1446
2021-06-18 11:05:10 -07:00
JonnyWong16
fe034d97b1
Fix blank columns not added to csv / json export 2021-06-18 10:01:06 -07:00
JonnyWong16
e99063d6c0
Test data folder writable with file
* Fixes #1441
2021-06-18 09:40:17 -07:00
JonnyWong16
394a411167
Don't hash a blank password 2021-06-17 09:29:02 -07:00
JonnyWong16
6085eec8c2
Update exporter fields 2021-06-15 22:25:59 -07:00
JonnyWong16
fec17a7344
Update PlexAPI to 4.6.1 2021-06-15 22:12:59 -07:00
JonnyWong16
b0a395ad0b
Always hash http password 2021-06-15 21:09:37 -07:00
JonnyWong16
dff9a56950
Add len function to notification expressions 2021-06-09 15:40:35 -07:00
JonnyWong16
9ca5d81b60
Update graphs SQL queries to match homepage 2021-06-05 12:25:12 -07:00
JonnyWong16
98b4fa41a7
Don't show seconds in users / libraries total duration 2021-06-05 10:29:09 -07:00
JonnyWong16
fcc70a9b74
Fix rounding of seconds in user / library watch time stats 2021-06-05 10:28:45 -07:00
JonnyWong16
b9c1dccf48
Fix rounding of seconds on home stats 2021-06-05 09:48:39 -07:00
JonnyWong16
092d858b12
Update library and user watch time query to match homepage 2021-06-05 08:54:13 -07:00
JonnyWong16
895d67fad3
Patch ipwhois host lookup
* Args need to be unpacked into the namedtuple
2021-06-02 11:31:14 -07:00
JonnyWong16
1d0ece57c9
Fix notification agent help text tab links 2021-06-02 11:30:30 -07:00
JonnyWong16
41dfd27ff7
Add reveal button to setup wizard password field 2021-05-28 18:21:06 -07:00
JonnyWong16
80a836e3e0
Don't append notification children if failed to retrieve metadata 2021-05-26 17:54:49 -07:00
JonnyWong16
45879d0049
Add documentation for notification text expressions 2021-05-25 12:22:48 -07:00
JonnyWong16
93ed5c5eb8
Helper round ndigits is optional 2021-05-25 11:54:17 -07:00
JonnyWong16
843f7bcabe
Fix article typo in condition tilde help text 2021-05-25 11:28:06 -07:00
JonnyWong16
4fa0aafcc1 Fix limit quality profile to source bitrate 2021-05-25 11:25:18 -07:00
JonnyWong16
70e88a9013 Add tilde for blank condition values 2021-05-25 11:25:18 -07:00
JonnyWong16
a2b2d1d227 Replace eval functions with helpers to catch exceptions 2021-05-25 11:25:18 -07:00
JonnyWong16
3510224cde
Fix notification param prefix/suffix without literal text 2021-05-24 16:52:33 -07:00
JonnyWong16
006cfd1ffa
Allow < and > in string eval 2021-05-24 13:22:19 -07:00
JonnyWong16
d9f702e7f2
Add ability to evaluate math in notification text 2021-05-24 12:53:41 -07:00
JonnyWong16
be86ddbec0
v2.7.3 2021-05-22 21:16:41 -07:00
JonnyWong16
fc2ab8be25
Set themoviedb lookup rating key 2021-05-19 21:43:32 -07:00
JonnyWong16
2ea8ac133a Fix hidden and advanced settings css 2021-05-16 16:32:13 -07:00
JonnyWong16
cf0cc36b15 Expose Tautulli update check interval setting 2021-05-16 16:32:13 -07:00
JonnyWong16
28439b5042 Change check GitHub interval to hours 2021-05-16 16:32:13 -07:00
JonnyWong16
b8d0bbe930 Add settings to toggle repeat update notifications 2021-05-16 16:32:13 -07:00
JonnyWong16
0659e60720 Check for existing notify tag for PMS and Tautulli update notifications 2021-05-16 16:32:13 -07:00
JonnyWong16
e0a85e2391 Add tag to notify_log database table 2021-05-16 16:32:13 -07:00
JonnyWong16
2bc25c459f Fix incorrect quality profile when transcoding increases bitrate 2021-05-16 16:32:13 -07:00
JonnyWong16
e5da3423e9
Add duration in seconds to notification parameters
Fixes #1434
2021-05-14 16:23:13 -07:00
JonnyWong16
35b69b8cfc
Update label workflows
[skip ci]
2021-05-14 16:00:02 -07:00
JonnyWong16
40b1aa0737
Update pull request template
[skip ci]
2021-05-14 14:43:20 -07:00
JonnyWong16
f6083b12ba
Redirect to logout when clearing login logs 2021-05-14 14:10:28 -07:00
JonnyWong16
add1b4ec54 Add expiry and sign out button to login logs 2021-05-14 14:03:05 -07:00
JonnyWong16
8db75cf718 Add method to logout user sessions 2021-05-14 14:03:05 -07:00
JonnyWong16
da1c342971 Store JWT token in database 2021-05-14 14:03:05 -07:00
JonnyWong16
6c34e2cb22
Update doc strings for edit_user and edit_library for required params
* Fixes #1432
2021-05-06 18:46:32 -07:00
JonnyWong16
897f415695
Restore title argument to recently added queue jobs
* Fixes #1429
2021-05-06 18:43:22 -07:00
JonnyWong16
29637fe5cc
Add do not upload attachments to issues template
[skip ci]
2021-05-06 13:26:47 -07:00
JonnyWong16
5f8b99e7ef
Merge pull request #1425 from psaab/thread_pool
Add config for CheryPy Thread Pool Size
2021-05-03 10:20:56 -07:00
Paul Saab
5becbd91d4 Config for CheryPy Thread Pool Size
In some instances, a static thread pool size of 10 is too small.
Provide a way to modify this via the config.
2021-05-03 10:17:03 -07:00
JonnyWong16
bb44341535
Quote strings in stale issues workflow
[skip ci]
2021-05-01 23:00:11 -07:00
JonnyWong16
bc921e6f34
Add stale issues workflow
[skip ci]
2021-05-01 22:54:20 -07:00
JonnyWong16
18b4084ae1
Remove stale issues bot
[skip ci]
2021-05-01 22:54:07 -07:00
JonnyWong16
b87bd1dab2
Add stale issues bot
[skip ci]
2021-04-29 12:00:34 -07:00
JonnyWong16
fc3a81a622
Prevent closing modals when mouse drags outside 2021-04-29 10:01:54 -07:00
JonnyWong16
6a575824ef
Show collections tab for music libraries
* Hide collections tab for photo libraries
* Fixes #1421
2021-04-28 12:38:42 -07:00
JonnyWong16
613f70886e
Change date calculation for watch statistics 2021-04-28 12:24:02 -07:00
JonnyWong16
23e177d1d3
Update graph headers 2021-04-25 14:09:58 -07:00
JonnyWong16
1a48829d23
Add check for release commit hash 2021-04-24 08:56:18 -07:00
JonnyWong16
39ad3f9047
v2.7.2 2021-04-24 08:24:02 -07:00
JonnyWong16
7b08e3a2a7
Update info pages for smart collections 2021-04-23 14:56:59 -07:00
JonnyWong16
cc18b1b177
Display smart collection cog icon in collections table 2021-04-23 14:56:42 -07:00
JonnyWong16
feb8d355c7
Patch PlexAPI for displaying smart collections 2021-04-23 14:55:44 -07:00
JonnyWong16
0f9fb9deb7
Retrieve collection thumb instead of composite 2021-04-23 14:29:07 -07:00
JonnyWong16
bd53c19bf3
v2.7.1 2021-04-22 18:13:58 -07:00
JonnyWong16
b692389736
Cast rating keys to int for recently added queue
Fixes #1420
2021-04-22 18:01:21 -07:00
JonnyWong16
07ccd2af96
Ignore items with future added at dates in newsletter 2021-04-22 17:40:59 -07:00
JonnyWong16
abdde65c2e
Remove clear logs button from UI 2021-04-22 15:55:09 -07:00
JonnyWong16
b6ccce89bc
Fix graph tabs button css on mobile layout 2021-04-22 15:53:49 -07:00
JonnyWong16
f5fc07f192
Rename graph tabs and headers 2021-04-22 15:53:49 -07:00
JonnyWong16
653be526de
Update issues label action 2021-04-11 17:03:58 -07:00
JonnyWong16
c88083aef2
Rename PlexServer attribute 2021-04-11 12:58:37 -07:00
JonnyWong16
dae6c075d1
Remove all unused Plex token functions 2021-04-10 18:50:27 -07:00
JonnyWong16
4ed22d96d0
Add Issue ref # to changelog 2021-04-10 11:41:21 -07:00
JonnyWong16
c780f1fd6c
v2.7.0 2021-04-10 10:44:17 -07:00
JonnyWong16
40e0db4f70
Reveal token input fields if blank 2021-04-10 10:35:58 -07:00
JonnyWong16
74b4e45915
Update PlexAPI to 4.5.2 2021-04-05 13:57:16 -07:00
JonnyWong16
f6ca1dfa28
Add reveal button to GitHub API Token setting 2021-04-05 13:55:22 -07:00
JonnyWong16
e6c193772c
Fix sorting episodes in newsletter with missing season number 2021-04-05 12:19:21 -07:00
JonnyWong16
5cd0d31b00
Fix activity card progress bar width
* Fixes #1404
2021-04-04 19:37:32 -07:00
JonnyWong16
1eaf7ca151
v2.7.0-beta 2021-04-03 11:41:56 -07:00
JonnyWong16
7045597c61
Add Plex server down notification threshold setting 2021-04-03 11:34:53 -07:00
JonnyWong16
802dfe10be
Change all delete/edit warnings to tooltips 2021-04-02 20:55:12 -07:00
JonnyWong16
dfb2853dc5
Adjust button bar on mobile layout 2021-04-02 20:21:28 -07:00
JonnyWong16
76e8523ae4
Make history filter multi-select on other pages 2021-04-02 16:25:26 -07:00
JonnyWong16
73496c5075
Change history filters to multi-select 2021-04-02 12:35:24 -07:00
JonnyWong16
57d3be6f69
Allow comma separated parameters for get_history 2021-04-02 12:02:00 -07:00
JonnyWong16
1311f688f2
Add split strip helper function 2021-04-02 12:02:00 -07:00
JonnyWong16
5197418cb8
Use datatables helper for total_duration query 2021-04-02 11:43:23 -07:00
JonnyWong16
9b4f4b8ae4
Refactor datatables static methods 2021-04-02 11:42:48 -07:00
JonnyWong16
b32b1bae7c
Fix direct stream filter on history tables 2021-04-02 10:51:28 -07:00
JonnyWong16
1615a73da9
Don't retrieve metadata for recently added before it is available
* Fixes #1392
2021-04-02 10:33:37 -07:00
JonnyWong16
0ff2fd91d5
Update Microsoft Edge platform icon 2021-04-01 16:43:18 -07:00
JonnyWong16
5e03d6b922
Add Alexa rgba colour 2021-04-01 16:31:11 -07:00
JonnyWong16
25db370f9d
Add Amazon Alexa platform icon 2021-04-01 15:32:55 -07:00
JonnyWong16
63b363dfe4
Make update metadata music match case insensitive 2021-04-01 15:31:38 -07:00
JonnyWong16
7d509b2e8e
Add logging for update metadata 2021-04-01 10:36:18 -07:00
JonnyWong16
a3ff434f2d
Move section_id in update_metadata_details 2021-03-31 19:55:17 -07:00
JonnyWong16
323a13ae17
Add Plex token check and error message to settings page 2021-03-29 16:15:40 -07:00
JonnyWong16
bb1d324ac2
Add all raw unexposed notification parameters 2021-03-29 15:21:21 -07:00
JonnyWong16
5d09a5352d
Rename use ssl to use secure connection 2021-03-29 15:00:43 -07:00
JonnyWong16
c74b380f99
Add transcode decision selection to history tables 2021-03-29 13:22:43 -07:00
JonnyWong16
0b1c4691dc
Trim trailing slash on base url setting 2021-03-29 11:23:44 -07:00
JonnyWong16
bd6dd74518
Add guid notification parameter 2021-03-29 10:59:11 -07:00
JonnyWong16
98ad8693b0
Skip importing version_info table 2021-03-29 00:22:53 -07:00
JonnyWong16
5ca5f24a66
Copy database path to cache and delete after importing 2021-03-29 00:20:55 -07:00
JonnyWong16
0f2dbf2c94
Migrate database on import 2021-03-29 00:20:55 -07:00
JonnyWong16
b3a7850b55
Add version info to database 2021-03-29 00:20:55 -07:00
JonnyWong16
01c4f45b77
Exclude activity from history table modal 2021-03-28 19:07:25 -07:00
JonnyWong16
8928a3c901
Fix history table modal loading 2021-03-28 18:52:41 -07:00
JonnyWong16
31144c1ed4
Patch bootstrap tooltips
* https://github.com/twbs/bootstrap/issues/21830#issuecomment-298294889
2021-03-28 17:45:51 -07:00
JonnyWong16
9b519ac884
Update most active libraries query 2021-03-27 22:33:59 -07:00
JonnyWong16
62fe591d19
Update session_history table indices stopped asc 2021-03-27 21:54:08 -07:00
JonnyWong16
3136e0c82f
Add more database indices 2021-03-27 21:37:05 -07:00
JonnyWong16
6086e84630
Migrate section_id to session_history table 2021-03-27 21:35:05 -07:00
JonnyWong16
6d13051b1e
Optimize library watch time query 2021-03-27 19:54:21 -07:00
JonnyWong16
7442e53c6c
Optimize user watch time query 2021-03-27 19:54:12 -07:00
JonnyWong16
dca5a534fd
Optimize home stats queries 2021-03-27 19:49:44 -07:00
JonnyWong16
6b9cbc0a7a
Create session_history database indices 2021-03-27 19:49:03 -07:00
JonnyWong16
3db0a07fd2
Add optional include_last_accessed parameter to get_library 2021-03-27 18:03:36 -07:00
JonnyWong16
88cae2b0dc
Add optional include_last_seen parameter to get_user 2021-03-27 18:03:07 -07:00
JonnyWong16
c3f9072e21
Update readme header 2021-03-26 12:08:38 -07:00
JonnyWong16
adc11bc232
Fix get_library when last_accessed is null 2021-03-26 08:41:09 -07:00
JonnyWong16
52fad05feb
Fix get_user when last_seen is null 2021-03-26 08:40:57 -07:00
JonnyWong16
1413733271
Remove unused jquery cachedScript 2021-03-25 23:48:04 -07:00
JonnyWong16
4530e816b0
Add last_accessed to get_library response 2021-03-25 19:21:58 -07:00
JonnyWong16
b6f4c2e945
Add last_seen to get_user response 2021-03-25 19:07:46 -07:00
JonnyWong16
d46d0900cb
Update all user thumbs to pms_image_proxy 2021-03-25 18:14:26 -07:00
JonnyWong16
8ade73fa35
Fix refreshing images in browser 2021-03-25 18:13:01 -07:00
JonnyWong16
3a520405c4
Add image type option to remote app notifications 2021-03-25 16:39:52 -07:00
JonnyWong16
7ebed4ffd7
Reorganize get user/library details 2021-03-22 10:29:35 -07:00
JonnyWong16
1ff6a54d70
Also check for linkLocal IP addresses 2021-03-22 10:27:25 -07:00
JonnyWong16
bc47f9abd7
Update pms_image_proxy docs with user fallback 2021-03-22 10:05:38 -07:00
JonnyWong16
db1ba94578
Simplify isPrivateIP check 2021-03-22 10:05:14 -07:00
JonnyWong16
12350d6b54
Update ipaddr.js 2021-03-22 10:04:36 -07:00
JonnyWong16
ace9f7c294
Fix spacing of rating images on media page 2021-03-21 17:50:45 -07:00
JonnyWong16
cba4c00ca0
Add valid OneSignal ID note in Android App notification settings 2021-03-20 13:15:21 -07:00
JonnyWong16
5f2e3f58e7
Accept disabled OneSignal id 2021-03-20 12:38:01 -07:00
JonnyWong16
f31f1f1a17
Fix default cron value in database newsletters table 2021-03-19 21:02:55 -07:00
JonnyWong16
407af0450f
Cache GitHub data with release version 2021-03-19 18:11:10 -07:00
JonnyWong16
74d6b18b47
Add blurhash user background for Most Active Users card 2021-03-19 11:10:30 -07:00
JonnyWong16
b19b9a70be
Add pms_image_proxy fallback for user thumb 2021-03-19 11:10:01 -07:00
JonnyWong16
58606885aa
Add blurhash js 2021-03-19 11:08:18 -07:00
JonnyWong16
d93d9b7d4f
Add SSL/TLS support for email 2021-03-18 18:11:35 -07:00
JonnyWong16
53121adfee
v2.6.10 2021-03-17 12:13:48 -07:00
JonnyWong16
e7e5d205a4
Fix upgrading config with top_libraries if the top_users card is missing 2021-03-17 12:10:27 -07:00
JonnyWong16
59b41e862b
v2.6.9 2021-03-17 08:55:54 -07:00
JonnyWong16
0c59592c0f
Merge branch 'master' into nightly 2021-03-17 08:55:41 -07:00
JonnyWong16
6b5b09e723
Merge branch 'beta' into nightly 2021-03-17 08:55:35 -07:00
jonny
387e52becd
Revert "GitBook: [master] 11 pages modified"
This reverts commit 276e41adfd.
2021-03-16 15:17:42 -07:00
jonny
238590f6d0
Revert "GitBook: [beta] 11 pages modified"
This reverts commit ae088a170b.
2021-03-16 15:17:13 -07:00
jonny
490b15b9a3
Revert "GitBook: [nightly] 11 pages modified"
This reverts commit 2acb220f3e.
2021-03-16 15:14:46 -07:00
JonnyWong16
036c574600
Hide sensitive notification agent text fields 2021-03-16 15:11:17 -07:00
JonnyWong16
fab279e3ad
Hide mobile device token text field 2021-03-16 15:11:17 -07:00
JonnyWong16
22d312758d
Hide sensitive setting text fields with button to reveal 2021-03-16 15:11:17 -07:00
JonnyWong16
f3bd1bb80d
Keep invalid device tokens in logger blacklist 2021-03-16 15:11:17 -07:00
JonnyWong16
d20d2b5155
Fix remove newsletter calendar days note 2021-03-16 15:11:17 -07:00
jonny
2acb220f3e
GitBook: [nightly] 11 pages modified 2021-03-16 22:06:28 +00:00
jonny
ae088a170b
GitBook: [beta] 11 pages modified 2021-03-16 22:06:27 +00:00
jonny
276e41adfd
GitBook: [master] 11 pages modified 2021-03-16 22:04:01 +00:00
JonnyWong16
d965d3c36e
Reorganize home stats order 2021-03-15 17:16:17 -07:00
JonnyWong16
a5491eb58e
Use grandparent_rating_key for home stats images, fallback to rating_key 2021-03-15 17:13:32 -07:00
JonnyWong16
c5aba43b68
Add grandparent_rating_key to home stats 2021-03-15 17:12:57 -07:00
JonnyWong16
db6d5da414
Remove HTTP Host setting from UI 2021-03-15 15:49:17 -07:00
JonnyWong16
c0f7f1a409
Update get_home_stats API docs 2021-03-15 14:06:17 -07:00
JonnyWong16
7b920208a4
Add limit 1 when retrieving library last play 2021-03-15 14:01:23 -07:00
JonnyWong16
1e3905f47f
Fix top libraries stats using API commands 2021-03-15 13:58:09 -07:00
JonnyWong16
a1e0b2483d
Add blank keys to top_libraries stats 2021-03-15 13:30:35 -07:00
JonnyWong16
e4bf0fb1c1
Make sure query days is a string before splitting 2021-03-15 13:14:53 -07:00
JonnyWong16
5cc510616f
Fix popovers with images
Fixes #1391
2021-03-15 12:04:45 -07:00
JonnyWong16
b7d0a466e7
Add tautulli_update_exe and tautulli_update_pkg notification parameters 2021-03-15 12:04:45 -07:00
JonnyWong16
5b38b919c4
Update count notification parameter descriptions 2021-03-15 12:04:45 -07:00
JonnyWong16
3dd9dfa48b
Merge pull request #1389 from herby2212/nightly
Add most active libraries card and total plays to home stats
2021-03-15 12:03:55 -07:00
JonnyWong16
5609960d6a
Formatting cleanup 2021-03-15 12:01:49 -07:00
JonnyWong16
e25c18bb20
Fix if library watch time stats are blocked for guest access 2021-03-15 12:01:41 -07:00
herby2212
2949fd4079 add row limit 2021-03-15 19:29:04 +01:00
herby2212
bd65e75cf4 fix music library fallback and update code style 2021-03-14 23:59:03 +01:00
JonnyWong16
4c47501687
Fix pms_image_proxy with http images 2021-03-14 14:27:33 -07:00
JonnyWong16
a2f661df0d
Update exporter fields for new Plex TV agent 2021-03-11 17:17:48 -08:00
JonnyWong16
32ca522c32
Update PlexAPI to 4.4.1 2021-03-11 17:17:33 -08:00
JonnyWong16
9d94b137ce
Add logging for OneSignal validation 2021-03-11 13:53:56 -08:00
JonnyWong16
c59a052b48
Add flag for OneSignal validation failed 2021-03-11 13:53:56 -08:00
JonnyWong16
23b70bb24e
Async validation of OneSignal ID when registering a device 2021-03-11 13:53:56 -08:00
herby2212
bd2517e190 include dynamic library background and thumbnail 2021-03-10 19:55:55 +01:00
JonnyWong16
15f90ea433
Improve temporary device token flow 2021-03-09 23:09:57 -08:00
JonnyWong16
f7e1dc97d8
v2.6.8 2021-03-08 10:59:45 -08:00
JonnyWong16
06a9bb10cc
Fix API return error for HTTP status 500 2021-03-08 10:55:31 -08:00
JonnyWong16
4585057a9e
Catch exception validating OneSignal ID 2021-03-08 10:41:04 -08:00
JonnyWong16
5adb6ca19a
Update wiki links 2021-03-07 14:53:06 -08:00
JonnyWong16
2204da6d9f
v2.6.7 2021-03-07 14:24:11 -08:00
JonnyWong16
133a7896c8
Add originalTitle and bannerFile to show export fields 2021-03-07 12:23:51 -08:00
JonnyWong16
6fb4b35076
Update PlexAPI to 4.4.0 2021-03-07 12:06:56 -08:00
JonnyWong16
0e4de17853
Fix popover poster in tables 2021-03-07 12:04:48 -08:00
JonnyWong16
5454a27ec0
Update bootstrap to 3.4.1 2021-03-07 12:04:17 -08:00
herby2212
a772fc0bcf naming, values, config und library link update 2021-03-07 02:54:28 +01:00
JonnyWong16
a87e14f132
Update remote app Google Play link 2021-03-06 15:22:54 -08:00
JonnyWong16
6089d44ed0
Update pull_request_template.md
[skip ci]
2021-03-06 12:19:51 -08:00
JonnyWong16
02986e946f
Fix exception handling in http_handler 2021-03-05 19:41:59 -08:00
JonnyWong16
8549306a7b
Stop showing entire changelog on new install
[skip ci]
2021-03-05 19:33:01 -08:00
JonnyWong16
41ee863d2a
Don't include skip ci commits for Docker/Snap update check 2021-03-05 19:19:12 -08:00
JonnyWong16
834ce9448d
Fix typos in readme
[skip ci]
2021-03-05 18:41:30 -08:00
JonnyWong16
6b6ed3417f
Update newsletters to support season titles 2021-03-05 17:01:56 -08:00
JonnyWong16
1bb4b4a08d
Update workflows 2021-03-05 10:55:13 -08:00
JonnyWong16
eb728a0d54
Update tables to support season titles 2021-03-04 18:30:16 -08:00
JonnyWong16
f92ba453c8
Update UI to support season titles 2021-03-04 18:19:51 -08:00
JonnyWong16
84448600d2
Add helper function for short season number 2021-03-04 18:00:25 -08:00
JonnyWong16
390391c750
Add season_name notification parameter 2021-03-04 17:26:48 -08:00
JonnyWong16
b45de48019
Add TVDB rating image to info page 2021-03-04 17:12:01 -08:00
JonnyWong16
9847360dc6
Update issues and wiki links 2021-03-04 16:54:46 -08:00
JonnyWong16
a22078eb95
Update Python version in CONTRIBUTING.md
[skip ci]
2021-03-04 16:53:22 -08:00
JonnyWong16
097b4a9e78
Add feature request template
[skip ci]
2021-03-02 19:20:54 -08:00
JonnyWong16
fa850aa4c3
Update readme
[skip ci]
2021-03-02 19:13:15 -08:00
JonnyWong16
5491b96491
Update readme
[skip ci]
2021-03-02 19:10:32 -08:00
JonnyWong16
f75012b640
Update readme
[skip ci]
2021-03-02 18:46:40 -08:00
JonnyWong16
83ba14cbd3
Revert "Move pull request template"
This reverts commit c1d77c21eb.
[skip ci]
2021-03-02 17:40:37 -08:00
JonnyWong16
c1d77c21eb
Move pull request template
[skip ci]
2021-03-02 17:35:03 -08:00
JonnyWong16
ba20f950cd
Add issues workflow
[skip ci]
2021-03-02 17:28:27 -08:00
JonnyWong16
b481d6d119
Add issues template
[skip ci]
2021-03-02 17:19:37 -08:00
JonnyWong16
d297e77d31
Manually trigger lock issues workflow
[skip ci]
2021-03-02 16:44:35 -08:00
JonnyWong16
f11200af72
Lock all issues
[skip ci]
2021-03-02 16:11:15 -08:00
JonnyWong16
ffabd79479
Add [skip ci] to workflows 2021-03-02 16:07:40 -08:00
herby2212
9fa72c64b8 remove total plays from library statistics 2021-03-02 01:37:20 +01:00
herby2212
4e959be84d add most active libraries and total plays to home 2021-03-01 21:54:14 +01:00
JonnyWong16
6ee9e99c23
Bit of cleanup 2021-02-28 15:24:34 -08:00
JonnyWong16
63866e8b52
Merge pull request #1388 from herby2212/master
add audio language to stream data
2021-02-28 15:23:11 -08:00
JonnyWong16
9adb2ef7b1
Update workflows 2021-02-28 15:07:34 -08:00
herby2212
d854ea0d13 fix syntax 2021-02-28 21:52:44 +01:00
herby2212
bb767deb7d add audio language code and format code 2021-02-28 21:46:01 +01:00
JonnyWong16
8b9dee1984
Update workflows 2021-02-28 09:53:00 -08:00
herby2212
d4986a5018 add audio language to stream data 2021-02-28 17:48:25 +01:00
JonnyWong16
3b5801a2cd
Add function to initialize plexapi 2021-02-27 19:17:33 -08:00
JonnyWong16
af8a5342fb
Return error result for terminate_session 2021-02-27 13:21:12 -08:00
JonnyWong16
0868fa749d
Return error result for delete_synced_item 2021-02-27 13:11:02 -08:00
JonnyWong16
775616b52d
Add option to return response from http_handler 2021-02-27 13:10:11 -08:00
JonnyWong16
166d30b3ee
Revert QEMU image for snap builds 2021-02-22 19:50:47 -08:00
JonnyWong16
18dd4951f7
Update pms_image_proxy for playlist images 2021-02-22 18:13:21 -08:00
JonnyWong16
358d44f1af
Disable sync table links if multiple rating keys 2021-02-22 17:35:22 -08:00
JonnyWong16
e9e8fd31a4
Reload plexapi module after changing environment variables 2021-02-22 17:34:29 -08:00
JonnyWong16
dda9d76843
String synced playlist rating key 2021-02-22 17:06:14 -08:00
JonnyWong16
676a797f21
Bump snap package to python3.8 2021-02-20 13:54:46 -08:00
JonnyWong16
947892c93f
Return a sync_media_type for synced collections/playlists 2021-02-20 13:42:39 -08:00
JonnyWong16
ea199178b2
get_synced_items API machine_id is optional 2021-02-20 13:34:17 -08:00
JonnyWong16
c6e663b542
Fix synced items rating key for collections/playlists 2021-02-20 13:32:17 -08:00
JonnyWong16
dd64a4a3d7
Set default url and token in Plex object 2021-02-20 13:28:31 -08:00
JonnyWong16
1cc98e7f7d
Remove plexapi warnings 2021-02-15 16:45:38 -08:00
JonnyWong16
ab74a0da9b
Update spec files 2021-02-12 19:13:52 -08:00
JonnyWong16
6e160bb8f8
Remove Windows exe auto updater 2021-02-12 19:11:46 -08:00
JonnyWong16
2cc5bf812f
v2.6.6 2021-02-06 12:32:25 -08:00
JonnyWong16
3a71b10c6a
Update pyinstaller to 4.2 2021-02-05 10:14:23 -08:00
JonnyWong16
46c1a1be93
Add more metadata to get_home_stats API command 2021-02-04 17:22:40 -08:00
JonnyWong16
8c96a09bc6
Fix plexapi config path 2021-02-03 15:42:18 -08:00
JonnyWong16
553b615481
Set plexapi config path to Tautulli data dir 2021-02-03 15:33:16 -08:00
JonnyWong16
5c63308441
Update plexapi to 4.3.1 2021-02-03 15:31:34 -08:00
JonnyWong16
270af26b82
Add get_children_metadata API command 2021-02-02 13:39:14 -08:00
JonnyWong16
5b5ccee23b
Strip HTTP root on login redirect 2021-01-29 10:32:44 -08:00
JonnyWong16
6a534ade9f
Redirect internally after login instead of client side
* Fixes Tautulli/Tautulli-Issues#300
2021-01-29 10:04:34 -08:00
JonnyWong16
674966510d
Return empty list for datatable errors 2021-01-27 11:51:27 -08:00
JonnyWong16
5ca8184948
Create DummyObject to not crash when starting with Python 2
* This disables the collections, playlists, and exporter features
2021-01-25 18:30:47 -08:00
JonnyWong16
4a463f04f1
Add thumbUrl and artUrl to plexapi Collections
* pkkid/python-plexapi#651
2021-01-25 09:23:08 -08:00
JonnyWong16
d5fd5778dd
Fix plexapi Photoalbum key
* pkkid/python-plexapi#650
2021-01-24 21:34:09 -08:00
JonnyWong16
08e08293fe
Update requests to 2.25.1 2021-01-24 21:16:27 -08:00
JonnyWong16
140a725950
Update library collections and playlist methods 2021-01-24 21:14:45 -08:00
JonnyWong16
d8196bf63c
Fix exporter docs for collection items 2021-01-24 21:14:30 -08:00
JonnyWong16
f8e94224cf
Update export fields 2021-01-24 21:10:29 -08:00
JonnyWong16
f497c11d73
Update plexapi to 4.3.0 2021-01-24 19:53:39 -08:00
JonnyWong16
6b013da697
Fix trailing slash in public domain suffix 2021-01-21 17:50:12 -08:00
JonnyWong16
eb0e3f5afe
Rename fix metadata to fix match 2021-01-20 22:18:14 -08:00
JonnyWong16
ce7d7169f9
Update pull request workflow 2021-01-18 08:50:03 -08:00
JonnyWong16
22dadfd845
Fix Plex API media audioProfile 2021-01-18 08:47:49 -08:00
JonnyWong16
97f80adf0b
v2.6.5 2021-01-09 14:24:27 -08:00
JonnyWong16
2fc7b08909
Add misfire grace time to scheduled tasks 2021-01-09 14:15:32 -08:00
JonnyWong16
defceed696
Fix homepage server status when sections are disabled 2021-01-06 17:24:53 -08:00
JonnyWong16
249533ac51
Migrate snap user data 2021-01-05 17:56:53 -08:00
JonnyWong16
12aee8762e
Allow snap package to access home directory 2021-01-05 10:19:41 -08:00
JonnyWong16
d9325b7adf
Add Crypto link to funding 2020-12-28 14:16:16 -08:00
JonnyWong16
4975cad4fa
Keep news open for longer 2020-12-27 14:53:33 -08:00
JonnyWong16
33fc079318
More logger blacklist improvements 2020-12-27 14:52:18 -08:00
JonnyWong16
b3b2752554
Fix regex masking in logger args 2020-12-27 13:15:06 -08:00
JonnyWong16
505cf25ca3
Add back crypto donation 2020-12-25 14:01:04 -08:00
JonnyWong16
9747e3ba98
Add pull request workflow 2020-12-24 18:23:06 -08:00
JonnyWong16
729191722a
Fix typo 2020-12-24 17:00:39 -08:00
JonnyWong16
ff2cf73f23
Update .gitignore 2020-12-24 16:43:00 -08:00
JonnyWong16
9c4d97c0f8
Update installer workflow 2020-12-24 16:43:00 -08:00
JonnyWong16
be911e7700
Move nsis plugin folder 2020-12-24 16:42:37 -08:00
JonnyWong16
00629c0983
Use updater to modify Task Scheduler XML 2020-12-24 16:41:28 -08:00
JonnyWong16
52ebc9a908
Move Tautulli to Program Files x64 2020-12-24 16:41:21 -08:00
JonnyWong16
a029d6a931
Restart Tautulli process if Windows installer failed 2020-12-22 19:26:53 -08:00
JonnyWong16
7641e3b081
Add logger function to Windows updater 2020-12-22 19:18:45 -08:00
JonnyWong16
b54210480f
Don't shutdown for Windows installer update 2020-12-22 19:09:27 -08:00
JonnyWong16
0d9c1c640e
Update Windows updater 2020-12-22 19:09:06 -08:00
JonnyWong16
7f84353c69
Disable console window when running task scheduler 2020-12-22 16:24:21 -08:00
JonnyWong16
c319a4a5cc
Don't auto restart when updating Windows install 2020-12-22 16:22:45 -08:00
JonnyWong16
60f13df992
Add auto update for Windows exe install 2020-12-22 15:59:19 -08:00
JonnyWong16
dea51e32a5
Strip branch and version when reading text file in Windows updater 2020-12-22 15:46:11 -08:00
JonnyWong16
7019f5618b
Update Windows powershell command to move updater 2020-12-22 15:36:21 -08:00
JonnyWong16
9106c068ac
Update Windows installer workflow 2020-12-22 15:26:37 -08:00
JonnyWong16
0b845294fb
Add Tautulli Windows exe updater 2020-12-22 15:21:06 -08:00
JonnyWong16
7e850dd88d
Fix typo in apscheduler in package requirements file 2020-12-22 12:33:52 -08:00
JonnyWong16
877bf7060e
Missing = sign in package requirements file 2020-12-22 12:31:22 -08:00
JonnyWong16
9326d03a57
Update PyInstaller to 4.1
* APScheduler needs to be installed from PyPI due to the way it retrieves it's own version number using pkg_resources.get_distribution
2020-12-22 12:29:43 -08:00
JonnyWong16
4787f42d2e
Add args to Windows and MacOS auto startup 2020-12-21 13:39:53 -08:00
JonnyWong16
56a9ccd818
Make Windows registry key unique to allow more than one instance 2020-12-21 13:39:29 -08:00
JonnyWong16
1019fecc9e
v2.6.4 2020-12-20 08:59:41 -08:00
JonnyWong16
1855f93c1c
Revert Snap data folder
* Fixes Tautulli/Tautulli-Issues#294
2020-12-20 08:58:02 -08:00
JonnyWong16
52e6a44aa4
Put Discord notification after release 2020-12-19 16:18:29 -08:00
JonnyWong16
0b77808af6
Fix release changelog 2020-12-19 16:18:13 -08:00
JonnyWong16
9233ed5c53
Revert "Also publish snap to beta for full release"
This reverts commit 366823cee9.
2020-12-19 15:56:09 -08:00
JonnyWong16
ee68c0f622
Fix release installer path 2020-12-19 15:42:23 -08:00
JonnyWong16
366823cee9
Also publish snap to beta for full release 2020-12-19 15:30:02 -08:00
JonnyWong16
40e1eb9a49
Revert "Build snap based on branch instead of tag"
This reverts commit 2e5dd05a6c.
2020-12-19 15:22:30 -08:00
JonnyWong16
1af419a860
v2.6.3 2020-12-19 15:09:56 -08:00
JonnyWong16
397f18c435
Disable updater if using Python 2 2020-12-19 14:59:05 -08:00
JonnyWong16
2e5dd05a6c
Build snap based on branch instead of tag 2020-12-19 12:11:03 -08:00
JonnyWong16
a9fb8ddfb8
Separate Discord notification jobs 2020-12-18 14:31:15 -08:00
JonnyWong16
562c726787
Merge pull request #1385 from elpollodiablo/master
Change http_handler to use requests instead of urllib3
2020-12-18 14:11:53 -08:00
JonnyWong16
5f82c1dc17
Add python3-pycryptodome to snap package 2020-12-17 20:48:23 -08:00
JonnyWong16
222800bdb6
Update README with Snap badges 2020-12-17 20:27:41 -08:00
JonnyWong16
5dd3636571
Fix typo in Snap architecture 2020-12-17 19:02:00 -08:00
JonnyWong16
2296a9fbb3
Merge pull request #1375 from capruro/master
Snap Package integration
2020-12-17 18:53:25 -08:00
JonnyWong16
63b5a7c036
Update workflows 2020-12-17 18:46:02 -08:00
JonnyWong16
b74ca2670e
Update Publish Snap workflow 2020-12-17 18:44:29 -08:00
JonnyWong16
393f4e0e58
Add multi-architecture build to Publish Snap workflow 2020-12-17 18:38:04 -08:00
JonnyWong16
3a9ca29e99
Add pull request to workflows 2020-12-17 18:28:50 -08:00
JonnyWong16
32995fef24
Update snapcraft.yml 2020-12-17 17:47:28 -08:00
JonnyWong16
a73c99fc64
Disable updated for Snap package 2020-12-17 17:47:28 -08:00
JonnyWong16
a5834470ba
Update Publish Docker workflow 2020-12-17 17:41:12 -08:00
JonnyWong16
da3bc127dc
Add TAUTULLI_SNAP environment variable 2020-12-17 12:48:12 -08:00
JonnyWong16
0dddc4d58f
Fix typo in Publish Snap workflow 2020-12-16 17:56:39 -08:00
JonnyWong16
a4d5d9157b
Add snap to .dockerignore 2020-12-16 17:49:17 -08:00
JonnyWong16
c70d5d4398
Add Publish Snap GitHub workflow 2020-12-16 17:49:17 -08:00
JonnyWong16
7c08b07ef5
Update snapcraft.yaml 2020-12-16 17:49:17 -08:00
capruro
e426b5dd35
add PyOpenSSL package 2020-12-16 17:46:50 -08:00
capruro
2fdf619582
Delete .editorconfig
NOT required to be implemented :)
2020-12-16 17:46:50 -08:00
Marcello Franco
d9eed14b7a
Initial commit 2020-12-16 17:46:40 -08:00
JonnyWong16
8230ffb8a4
Update readme installer build badges 2020-12-16 00:01:00 -08:00
JonnyWong16
7098930b19
Update build installer workflow with matrix 2020-12-15 23:54:30 -08:00
JonnyWong16
56244245a4
Fix export accessible and exists for media info level 9 2020-12-15 22:49:51 -08:00
JonnyWong16
dd2f12fa8e
Fix typo in notifier error log message 2020-12-15 22:49:51 -08:00
JonnyWong16
9598247a0d
Merge pull request #1384 from krowvin/patch-1
Update reference link to CherryPy auth tool
2020-12-15 22:48:46 -08:00
JonnyWong16
230ee90b1c
Remove link to web.archive.org for CherryPy auth tool 2020-12-15 22:47:11 -08:00
JonnyWong16
e705bedc91
Clean up http_handler using requests
* Restore ThreadPool for multiple requests
* Use a requests.Session()
* Update requests.exceptions
2020-12-15 22:38:43 -08:00
JonnyWong16
b5ebe7590c
Create pull_request_template.md 2020-12-12 12:16:46 -08:00
Philip Poten
6d0831ceaa replace urllib3 with requests, remove unused session logic 2020-12-12 16:03:18 +01:00
JonnyWong16
19e00ee2f2
Set template icon for macOS menu bar 2020-12-06 11:13:21 -08:00
JonnyWong16
80723d224e
Add username to masked session info for guests 2020-12-05 18:44:06 -08:00
JonnyWong16
0c82bb023a
v2.6.2 2020-12-05 10:33:13 -08:00
JonnyWong16
0a86f24095
Fix plexapi.library.Collections.children()
* Fixes Tautulli/Tautulli-Issues#290
2020-12-04 19:16:40 -08:00
JonnyWong16
b41249cfa8
Put update status in tray menu 2020-12-04 18:48:39 -08:00
JonnyWong16
6659802689
Remove tray update icon 2020-12-04 18:30:56 -08:00
JonnyWong16
964c503223
Add flat white logo and icon 2020-12-04 17:54:15 -08:00
JonnyWong16
15568bf20a
Pin macOS requirement pyobjc-core==6.2.2 2020-12-04 13:28:51 -08:00
JonnyWong16
d10cd324bb
Pin requirements dependencies versions 2020-12-02 20:17:39 -08:00
JonnyWong16
2a22ab8c33
Remove LSBackgroundOnly from macOS app plist file 2020-11-27 21:43:48 -08:00
JonnyWong16
ca736cdae2
Remove accessible and exists from media info export level 2
* Only reload export object with checkFiles=True if accessible and exists are requested.
2020-11-27 21:31:21 -08:00
JonnyWong16
d589c57dd2
Update plexapi 3.6.0-tautulli 2020-11-27 21:07:30 -08:00
JonnyWong16
9b0caf2a47
Fix export custom child fields failing without included parent field 2020-11-27 20:33:04 -08:00
JonnyWong16
f8b00bbd67
codecID only for video streams and remove dialogNorm from audio streams 2020-11-25 22:13:49 -08:00
JonnyWong16
91a8c0e7a0
Add transient to subtitle stream export 2020-11-25 21:46:24 -08:00
JonnyWong16
2089172384
Add streamIdentifier to audio stream export 2020-11-25 21:27:58 -08:00
JonnyWong16
1ab87e5334
Enable high resolution in macOS app 2020-11-21 21:04:22 -08:00
JonnyWong16
b5e6861032
Update certifi 2020.11.08 2020-11-21 15:05:58 -08:00
JonnyWong16
189930918a
Fix entering / in Public Tautulli Domain setting 2020-11-15 11:29:11 -08:00
krowvin
ff1bd0a4b8
Update webauth.py
Link is broken. Added two alternate links to the same information.
2020-11-12 17:03:04 -06:00
JonnyWong16
e544d0dd07
Improve login rate limit 2020-11-09 09:43:09 -08:00
JonnyWong16
3e0b240154
Add rate limiting to login page 2020-11-08 15:36:40 -08:00
JonnyWong16
199119cafb
Reword notification settings help text 2020-11-08 13:17:14 -08:00
JonnyWong16
89ab665923
Add user new device notification setting for initial stream only 2020-11-08 13:16:49 -08:00
JonnyWong16
dfb60de6d2
Add machine_id to get_history API response 2020-11-08 12:34:03 -08:00
JonnyWong16
da8d41868d
v2.6.1 2020-11-03 17:51:38 -08:00
JonnyWong16
e9db43ebf6
Remove tqdm 2020-11-02 23:06:59 -08:00
JonnyWong16
c0453eae47
Fix unique img_hash in database 2020-11-02 19:49:33 -08:00
JonnyWong16
a8863a5aeb
Remove cherrypy engine log filter 2020-11-02 18:39:50 -08:00
JonnyWong16
a8adad7dbb
v2.6.0 2020-10-31 17:05:51 -07:00
JonnyWong16
4cfa5ac10b
Remove encoding from Growl message body 2020-10-30 21:37:30 -07:00
JonnyWong16
55090ddeaa
Clean up start.sh 2020-10-30 21:30:28 -07:00
JonnyWong16
14346b0e69
Improve Docker exec user 2020-10-30 21:27:39 -07:00
JonnyWong16
ac24acf9ce
Publish Docker image to GitHub Container Registry 2020-10-29 21:44:27 -07:00
JonnyWong16
4cde62fde9
Update Android platform icon 2020-10-27 18:34:21 -07:00
JonnyWong16
7489bc8d98
Merge pull request #1383 from zheileman/apple-data-detectors
Fix styling of Apple data-detectors in newsletters
2020-10-25 14:00:15 -07:00
JonnyWong16
cde9287d85
Update favicon to circle logo 2020-10-25 13:42:00 -07:00
JonnyWong16
558023e18e
Improve startup speed by refreshing on a separate thread 2020-10-25 13:07:42 -07:00
JonnyWong16
8157ee7811
Cache GitHub update check on startup
* Fixes Tautulli/Tautulli-Issues#184
2020-10-25 11:39:48 -07:00
JonnyWong16
d746d2913f
Fix mobile device table migration 2020-10-25 10:51:32 -07:00
JonnyWong16
0136fc6436
Update plexapi.LibrarySection subclasses 2020-10-23 23:29:53 -07:00
JonnyWong16
7ce280cb92
Fix ratings on info page for new Plex Movie agent 2020-10-23 17:51:48 -07:00
JonnyWong16
0209fa87aa
Update rating notification parameters for new Plex Movie agent 2020-10-23 17:46:11 -07:00
JonnyWong16
62cc2f769f
Fix docker build args 2020-10-21 19:37:14 -07:00
JonnyWong16
a49d44c880
Add logger message for missing server identifier when refreshing users 2020-10-21 19:33:38 -07:00
JonnyWong16
dab288380a
Change jquery .width to .css for activity progress bar
* For some reason jquery 3.5 isn't accepting `.width(progress + '%')`
2020-10-21 14:26:05 -07:00
Jesus Laiz
2ac5c35065 Fix styling of Apple data-detectors in newsletters
The existing style was not properly targetting the links Apple inject when (wrongly, in this case) detecting phone numbers in newsletters.

This has no effect in any other platform or device.
The numbers are still clickable, couldn't fine a way to disable the functionality completely (tried the `format-detection` meta tag with no luck), but at least the styles are not changed anymore.

I tested this on iPhone and iPad and you can see how it looks before and after the change below.
2020-10-21 11:47:04 +01:00
JonnyWong16
ec9e2fe0f0
Patch plexapi.library.Collections to PlexPartialObject 2020-10-20 15:49:29 -07:00
JonnyWong16
ecbe79b5b9
Add intro markers to exporter 2020-10-19 09:23:50 -07:00
JonnyWong16
c4ac03738b
Add plexapi.media.Marker to plexapi.video.Episode 2020-10-19 09:21:40 -07:00
JonnyWong16
352dbd9bc8
Update brand logo colours 2020-10-17 21:25:17 -07:00
JonnyWong16
393b395df0
Add delete_synced_item to the API 2020-10-16 19:49:34 -07:00
JonnyWong16
1a96da04a1
Add sync_id parameter to get_metadata 2020-10-16 14:03:02 -07:00
JonnyWong16
615b98955a
v2.6.0-beta 2020-10-16 13:27:04 -07:00
JonnyWong16
11b2b67f9d
Remove set-env from release workflow 2020-10-16 13:18:52 -07:00
JonnyWong16
0e44255e6a
Export photo locations 2020-10-16 12:31:34 -07:00
JonnyWong16
a649d2ec12
Add locations for plexapi.photo.Photo and plexapi.video.Clip 2020-10-16 12:31:18 -07:00
JonnyWong16
8a953e789c
Add all locations to m3u8 playlists 2020-10-16 11:47:44 -07:00
JonnyWong16
317d32eb0c
Merge pull request #1381 from MichaIng/patch-1
Avoid daemon forking with systemd
2020-10-16 11:40:14 -07:00
JonnyWong16
b2ddedc0ae
Update API register device doc string 2020-10-15 22:47:56 -07:00
JonnyWong16
620d2cf730
Merge pull request #1382 from dotsam/margin-fix-better
Fix margins on dashboard cards
2020-10-15 22:47:21 -07:00
JonnyWong16
2578592cc7
Move ratingKey, title, and titleSort to front of csv headers 2020-10-15 22:10:42 -07:00
JonnyWong16
44c643d7da
Add progress percent to export table 2020-10-15 21:56:20 -07:00
JonnyWong16
39d6edd581
Fix memory leak in exporter 2020-10-15 21:19:42 -07:00
JonnyWong16
5a14b5bc35
Add all Plex server and Tautulli info to register device response 2020-10-15 11:16:15 -07:00
JonnyWong16
82d9719eee
Fix default library export type 2020-10-15 10:56:28 -07:00
JonnyWong16
401b75a76b
Update docker build workflow 2020-10-15 10:15:08 -07:00
JonnyWong16
ab75628cf7
Make export threads advanced config setting 2020-10-14 23:48:58 -07:00
JonnyWong16
57d08e231c
Fix typo in plexapi includeBandwidths 2020-10-14 23:25:41 -07:00
JonnyWong16
f6b800c372
Remove horizontal rule in exporter docs 2020-10-14 20:01:28 -07:00
JonnyWong16
26773ac67f
Reword export individual files in export modal 2020-10-14 20:01:10 -07:00
JonnyWong16
5b63cb38ae
Timestamp required for checking if export exists 2020-10-14 14:13:55 -07:00
JonnyWong16
30b655a32a
Refactor saving xml and m3u8 files 2020-10-14 14:02:08 -07:00
JonnyWong16
f3fa9601c0
Rework exporter to allow exporting individual files from library 2020-10-14 12:48:08 -07:00
JonnyWong16
034ad05383
Add some more metadata to m3u8 exports 2020-10-13 18:48:21 -07:00
JonnyWong16
7b936fd664
Add include_activity parameter to get_history API 2020-10-13 16:26:35 -07:00
JonnyWong16
a120f52e0d
Add grandparentTitle to m3u8 export 2020-10-13 09:15:45 -07:00
Sam Edwards
58f2d22ef4
Swap left/right margin on cards and make cards fit better on mobile 2020-10-12 23:55:13 -07:00
JonnyWong16
962777284a
Add collectionSort value for custom sort 2020-10-12 21:32:16 -07:00
JonnyWong16
d4c8066209
Cast plexapi.Collections.collectionMode and collectionSort to int 2020-10-12 21:31:46 -07:00
JonnyWong16
9a9db88efd
Add Dolby vision to export attributes 2020-10-12 21:13:29 -07:00
JonnyWong16
f5ad9cfe14
Add Dolby vision attributes to plexapi.media.VideoStream 2020-10-12 21:13:10 -07:00
JonnyWong16
d268a7aa23
Add back in tautulli_version to register device 2020-10-12 14:33:43 -07:00
JonnyWong16
1896239bd3
Add link to exporter guide in export modal 2020-10-12 13:08:53 -07:00
JonnyWong16
07c71750d5
Move API docs to the wiki 2020-10-12 12:53:16 -07:00
JonnyWong16
d5171109f5
Add anchor to children / item in exporter docs 2020-10-12 12:09:49 -07:00
JonnyWong16
36aa795c52
Add min_version parameter to register_device API command 2020-10-12 11:56:55 -07:00
JonnyWong16
7914f56ec3
Always close mobile device QR modal on successful registration 2020-10-12 11:54:36 -07:00
JonnyWong16
a39c6c1047
Improve sorting of json and xml export attributes 2020-10-11 16:03:16 -07:00
JonnyWong16
270e07341a
Add m3u8 to export API docs 2020-10-11 14:53:09 -07:00
JonnyWong16
da7c66f414
Add stat_id and stats_start options to get_home_stats API 2020-10-11 14:31:34 -07:00
JonnyWong16
d97b87d9cc
Allow deleting mobile device using the registered device_id 2020-10-11 13:55:50 -07:00
JonnyWong16
bee3361ace
Return Tautulli version in register device API 2020-10-11 13:54:24 -07:00
JonnyWong16
276ea4dd98
Only build tables for exporter docs 2020-10-10 10:06:25 -07:00
JonnyWong16
dd45b47032
Filter out Cherrypy engine serving log message 2020-10-10 10:05:06 -07:00
JonnyWong16
1fd4ec3ca3
Add moment-duration-format.js plugin for graphs 2020-10-10 09:49:29 -07:00
JonnyWong16
1e807af2d4
Fix graphs tab not saving 2020-10-10 09:48:55 -07:00
JonnyWong16
88a5db05b7
Move file format to top of export modal 2020-10-09 01:24:21 -07:00
JonnyWong16
e6c8bd0c13
Add auto-generation of exporter docs 2020-10-09 00:49:17 -07:00
JonnyWong16
3be9c84f2b
Add attribute sort helper function 2020-10-08 19:53:57 -07:00
JonnyWong16
881f37f731
Change default sig of human duration function 2020-10-08 19:53:32 -07:00
JonnyWong16
4d37f2bab2
Add none to export level 0 description 2020-10-08 16:14:48 -07:00
JonnyWong16
3217c2da0b
Enable export of season/album artwork if selected 2020-10-08 13:33:51 -07:00
JonnyWong16
280ae04b3d
Set art to None for plexapi.video.Season/Episode 2020-10-08 13:32:25 -07:00
JonnyWong16
d5705a52e9
Use collection.title if collection.sortTitle is None 2020-10-08 12:41:47 -07:00
JonnyWong16
43ab2f22a8
Update wording on image export levels 2020-10-08 11:57:41 -07:00
JonnyWong16
8bb40036bc
Update API docs for export thumb_level and art_level 2020-10-08 11:21:58 -07:00
JonnyWong16
8ee934404f
Reword image levels in export modal 2020-10-08 11:21:39 -07:00
JonnyWong16
aa9dbafa28
Check images exported after export 2020-10-08 11:13:00 -07:00
JonnyWong16
2b8fea8bf8
Allow addition custom export image fields 2020-10-08 11:12:09 -07:00
JonnyWong16
985f4293b3
Export images based on level 2020-10-08 10:12:28 -07:00
JonnyWong16
22b162b3c4
Cast plexapi.media.Poster selected to bool 2020-10-08 10:12:28 -07:00
JonnyWong16
7f3d8cfb8d
Change thumb_level and art_level to int 2020-10-08 10:12:28 -07:00
JonnyWong16
9a7627e35e
Rename include_thumb/art to thumb/art_level 2020-10-08 09:14:37 -07:00
JonnyWong16
f141c67ceb
Load key before _details_key for plexapi.audio.Artist 2020-10-07 22:01:01 -07:00
JonnyWong16
e4372644e1
Better csv fields sorting 2020-10-07 20:42:04 -07:00
JonnyWong16
8552b00be4
Always try to delete export images folder 2020-10-07 20:42:04 -07:00
JonnyWong16
978fea5dde
Hide collections tab for music libraries 2020-10-07 18:50:22 -07:00
JonnyWong16
b3eeaeeda5
Don't return the main child attribute as a custom field 2020-10-07 18:29:16 -07:00
JonnyWong16
0f2ac5104e
Fix parsing custom fields 2020-10-07 18:25:48 -07:00
JonnyWong16
f7766fff14
Log cherrypy errors 2020-10-07 00:06:23 -07:00
JonnyWong16
b7c2e42190
Fix overflow in track list/playlist 2020-10-06 21:24:35 -07:00
JonnyWong16
56472f8dd5
Fix loading custom fields for show/artist 2020-10-06 21:18:11 -07:00
JonnyWong16
969934b8c0
Update bootstrap.min.css 2020-10-04 19:42:30 -07:00
JonnyWong16
62f153acd2
Update jquery on other pages 2020-10-04 19:37:17 -07:00
JonnyWong16
b53f16645c
Set Patreon image width 2020-10-04 16:52:37 -07:00
JonnyWong16
6c2786dd78
Add noreferrer to all external links 2020-10-04 16:52:37 -07:00
JonnyWong16
64a9b0e622
Update bootstrap to v3.3.7
* Partially addresses Tautulli/Tautulli-Issues#127. Updating to bootstrap 4 requires a major rewrite.
2020-10-04 16:30:11 -07:00
JonnyWong16
3d05a74ef4
Update moment.js to 2.29.0
* Addresses Tautulli/Tautulli-Issues#127
2020-10-04 16:17:04 -07:00
JonnyWong16
3a1c92944f
Update navigation tabs to work with jquery update 2020-10-04 16:10:51 -07:00
JonnyWong16
6b34b82f52
Update jquery to 3.5.1
* Fixes Tautulli/Tautulli-Issues#280
* Addresses Tautulli/Tautulli-Issues#127
2020-10-04 16:07:55 -07:00
JonnyWong16
322c090d8a
Automatically show HTTP root in Public Tautulli Domain input box 2020-10-04 14:15:06 -07:00
JonnyWong16
4bb49f9836
Add jquery InputAffix 2020-10-04 14:14:20 -07:00
JonnyWong16
20566168a1
Improve photoalbum export 2020-10-04 13:01:05 -07:00
JonnyWong16
03bf4a9ef8
Add default stream state icon 2020-10-04 12:11:05 -07:00
JonnyWong16
842a76aae1
Update dict_to_xml helper function 2020-10-04 01:35:11 -07:00
JonnyWong16
e3214946a3
Fix exporter for photo albums and clips 2020-10-04 01:21:44 -07:00
JonnyWong16
36f877c7ff
Update plexapi.video.Clip and plexapi.photo.Photoalbum 2020-10-04 01:18:05 -07:00
JonnyWong16
6e41b7ef3d
Hide tab bar on info page for guests 2020-10-03 11:29:28 -07:00
JonnyWong16
1fc9a9bcea
Add downloads badge to readme 2020-10-03 10:57:42 -07:00
JonnyWong16
3a439cb81c
Update API docs 2020-10-03 10:29:50 -07:00
JonnyWong16
e8b0de0320
Improve image export help text on export modal 2020-10-03 10:27:40 -07:00
JonnyWong16
4d033bb379
Add custom fields for manually exporting season/episode images 2020-10-03 10:04:43 -07:00
JonnyWong16
fffd1ffda3
Fix missing select columns button for user IP address table 2020-10-02 23:41:16 -07:00
JonnyWong16
151f23fd92
Move common buttons to nav bar on info page 2020-10-02 23:34:30 -07:00
JonnyWong16
25572d6a5b
Change key for plexapi.LibrarySection.collection 2020-10-02 23:25:50 -07:00
JonnyWong16
e27efb3946
Add kwargs to plexapi playlists fetchItems 2020-10-02 23:25:23 -07:00
JonnyWong16
ca69293d8b
Fix footer text on collections and playlists tables 2020-10-02 23:19:36 -07:00
JonnyWong16
f7fa773ec7
Add thumb popover to collections and playlists tables 2020-10-02 22:03:33 -07:00
JonnyWong16
f84c4ca73c
Add thumb popover to lists on info page 2020-10-02 21:58:13 -07:00
JonnyWong16
f9d828ea67
Fix import statement 2020-10-02 21:35:23 -07:00
JonnyWong16
739c977cd7
Merge branch 'v2.5-export' into nightly 2020-10-02 20:45:11 -07:00
JonnyWong16
14b98a32e0
v2.5.6 2020-10-02 20:35:06 -07:00
JonnyWong16
34c9ede9c9
Add m3u8 export file format 2020-10-02 19:42:24 -07:00
JonnyWong16
be9f06795d
Fix loading playlists for user not on Plex server 2020-10-02 13:05:14 -07:00
JonnyWong16
ea9904bd56
Add playlist export for users 2020-10-02 12:54:07 -07:00
JonnyWong16
501f08dd5e
Add Playlist tab to user page 2020-10-02 11:57:13 -07:00
JonnyWong16
a985cec9c2
Fix loading synced items for guest access 2020-10-02 11:16:49 -07:00
JonnyWong16
c8b0ff22f6
Update guest access for collection and playlist changes 2020-10-02 11:11:15 -07:00
JonnyWong16
3cc8c1f8c5
Fix loading Live TV library page 2020-10-02 10:27:59 -07:00
JonnyWong16
5e8b946571
Improve nav pills css 2020-10-02 10:27:45 -07:00
JonnyWong16
dd4c0d24b7
Add tabs for history and export on info pages 2020-10-02 10:14:00 -07:00
JonnyWong16
fc39f1521d
Change library and user tabs to nav pills 2020-10-02 10:13:41 -07:00
JonnyWong16
60cadb1e11
Go to export tab after exporting 2020-10-02 09:56:30 -07:00
JonnyWong16
28c745c19c
Patch DataTables ColVis to fix dropdown extending past bottom of page 2020-10-02 00:22:19 -07:00
JonnyWong16
900b524672
Add hidden Custom Fields column to export table 2020-10-01 21:42:15 -07:00
JonnyWong16
627129dd95
Improve XML export 2020-10-01 21:13:07 -07:00
JonnyWong16
8d18e98ca7
Fix pms_image_proxy for composites 2020-10-01 20:22:52 -07:00
JonnyWong16
0ba755e463
Make collection titles searchable in table 2020-10-01 19:43:10 -07:00
JonnyWong16
72215a9f44
Update library export API docs 2020-10-01 16:15:00 -07:00
JonnyWong16
2803a6095b
Add export for all collections and all playlists 2020-10-01 14:40:28 -07:00
JonnyWong16
d1172f4975
Add playlist method to plexapi.library.LibrarySection 2020-10-01 14:40:12 -07:00
JonnyWong16
478c4540b1
Add browsing photo info pages 2020-10-01 11:46:11 -07:00
JonnyWong16
cc1076e122
Add photo playlist items on info page 2020-10-01 10:38:32 -07:00
JonnyWong16
15e928ecf2
Add items suffix to collections and playlist table 2020-10-01 09:57:01 -07:00
JonnyWong16
2c360b6472
Fix searching in collections and playlist table 2020-09-30 22:41:28 -07:00
JonnyWong16
f5c99f712a
Add get_collections_table and get_playlists_table to API docs 2020-09-30 22:10:06 -07:00
JonnyWong16
f151bb1451
Add datatables processing to collections and playlists tables 2020-09-30 22:09:19 -07:00
JonnyWong16
1061c334ae
Improve look of collections and playlists tables 2020-09-30 21:01:14 -07:00
JonnyWong16
c5ea50d480
Improve playlist view on info page 2020-09-30 15:54:18 -07:00
JonnyWong16
84207effab
Initial collections and playlists table to library page 2020-09-30 15:44:23 -07:00
JonnyWong16
b568af0a90
Add playlist info page 2020-09-30 14:00:57 -07:00
JonnyWong16
11f2f8ff81
Don't convert requiredBandwidths to list 2020-09-30 11:18:12 -07:00
JonnyWong16
454235dd9a
Add XML export format 2020-09-30 00:04:27 -07:00
JonnyWong16
ad8dee3c47
Export locations attribute is media info 2020-09-29 23:21:32 -07:00
JonnyWong16
5dc0d5536d
Also add username hover to most active card 2020-09-29 21:00:47 -07:00
JonnyWong16
86699ece8e
Change custom fields to input instead of select 2020-09-29 20:22:16 -07:00
JonnyWong16
e3eca5af46
Change friendly name hover title text to username 2020-09-29 20:07:23 -07:00
JonnyWong16
e9f464e34d
Add get_export_fields to API docs 2020-09-29 19:41:53 -07:00
JonnyWong16
97775e2a3b
Add custom fields for collections and playlists 2020-09-29 19:40:53 -07:00
JonnyWong16
54433c43e6
Disable custom fields for selected export levels 2020-09-29 19:03:40 -07:00
JonnyWong16
3376908710
Add selectize disable-options plugin
* Modified to add a `disableField` option
2020-09-29 19:02:47 -07:00
JonnyWong16
284f77b9ae
Add custom fields tree for shows and artists 2020-09-29 19:01:21 -07:00
JonnyWong16
2fe49f316f
Fix typo in export table footer 2020-09-29 00:40:52 -07:00
JonnyWong16
1428a2485f
Delay library.section.all() to speed up export return 2020-09-29 00:28:28 -07:00
JonnyWong16
3a1b4e34aa
Don't show export table fetching message when auto-refreshing 2020-09-29 00:18:24 -07:00
JonnyWong16
26fb9a6803
Add option for custom fields to the export modal 2020-09-28 23:47:32 -07:00
JonnyWong16
31e6f4282d
Move selectize.js to base.html 2020-09-28 20:48:00 -07:00
JonnyWong16
6bc7de7a6d
Separate export poster and art 2020-09-28 20:47:28 -07:00
JonnyWong16
d9ece291b7
Fix 1px off dropdown menus 2020-09-28 18:23:07 -07:00
JonnyWong16
0203a1d4dc
Use relative image path for export 2020-09-28 12:21:22 -07:00
JonnyWong16
221d6e136a
Added remote access down notification threshold setting 2020-09-27 19:31:26 -07:00
JonnyWong16
ad6e314343
Don't floor newsletter start date 2020-09-27 17:44:11 -07:00
JonnyWong16
9fc4dbc6d6
Fix parsing custom fields for root media type 2020-09-27 17:17:38 -07:00
JonnyWong16
5dade92221
Add image export for collections and playlists 2020-09-27 17:11:08 -07:00
JonnyWong16
4e29960238
Save metadata and media info export level to database 2020-09-27 16:56:40 -07:00
JonnyWong16
3973c57020
Fix refresh export table button on info page 2020-09-27 16:55:50 -07:00
JonnyWong16
dd1dc00430
Rename API command to get_exports_table 2020-09-27 15:40:11 -07:00
JonnyWong16
9a7d6ea7d7
Hide rating key column on media export table 2020-09-27 15:39:39 -07:00
JonnyWong16
02d4a3b9fe
Improve exporter API error messages 2020-09-27 15:30:10 -07:00
JonnyWong16
0a60d5f2b2
Add custom export level 0 2020-09-27 15:10:08 -07:00
JonnyWong16
13ff8f3a84
Refactor movie export levels 2020-09-27 14:39:22 -07:00
JonnyWong16
3efee000ce
Add external guids to movie export 2020-09-27 14:32:10 -07:00
JonnyWong16
5915937975
Add collection labels to exporter 2020-09-27 14:28:09 -07:00
JonnyWong16
c7621a9e36
Add Guid tags to plexapi.video.Movie 2020-09-27 14:27:02 -07:00
JonnyWong16
28e2463c4f
Add labels to plexapi.library.Collections 2020-09-27 14:26:32 -07:00
JonnyWong16
7016d3feea
Remove extra export metadata button on collection page 2020-09-27 14:10:01 -07:00
JonnyWong16
44b4c10bf9
Update exporter API docs 2020-09-27 14:01:51 -07:00
JonnyWong16
be82c8f6d9
Add export table to info page 2020-09-27 13:59:11 -07:00
JonnyWong16
acebf96d2f
Skip blank custom fields 2020-09-27 13:57:56 -07:00
JonnyWong16
27c5061d17
Add log message for processing custom fields 2020-09-27 13:30:10 -07:00
JonnyWong16
fcd034da00
Set export include_images if custom fields includes images 2020-09-27 13:27:37 -07:00
JonnyWong16
4ee9dbab41
Add ability to export custom fields 2020-09-27 13:26:04 -07:00
JonnyWong16
112811190e
Fix exporting collections 2020-09-27 11:52:24 -07:00
JonnyWong16
746295aa16
Only export images for supported media types 2020-09-27 11:51:27 -07:00
JonnyWong16
693c0ba658
Refactor export get_any_hdr and get_image 2020-09-27 11:41:35 -07:00
JonnyWong16
e9f37d578e
Refactor exporter 2020-09-27 11:27:16 -07:00
JonnyWong16
8f4da14611
Add collection export levels 2020-09-27 00:08:55 -07:00
JonnyWong16
063b7ce7cc
Add note for export image media types 2020-09-26 23:09:18 -07:00
JonnyWong16
b7243271f3
Add photo album and photo export levels 2020-09-26 23:08:59 -07:00
JonnyWong16
395ab97191
Add titleSort to plexapi.photo.Photoalbum and plexapi.photo.Photo 2020-09-26 23:02:15 -07:00
JonnyWong16
76da200794
Add fields to plexapi.photo.Photoalbum and plexapi.photo.Photo 2020-09-26 22:53:39 -07:00
JonnyWong16
47695debdd
Add artist, album, track export levels
* Refactor child levels
2020-09-26 22:48:47 -07:00
JonnyWong16
a5a2ba9d85
Export child images 2020-09-26 22:48:02 -07:00
JonnyWong16
3fa601db3e
Add fields to plexapi.audio.Tracks 2020-09-26 22:40:37 -07:00
JonnyWong16
b60dcb2a23
Check path exists for adding exported image file size 2020-09-26 22:38:48 -07:00
JonnyWong16
1e173c6eeb
Add working export sub media types 2020-09-26 21:42:51 -07:00
JonnyWong16
adb11db317
Use string format for export preview 2020-09-26 20:44:02 -07:00
JonnyWong16
068cb51635
Add zip file download for export with images 2020-09-26 20:36:51 -07:00
JonnyWong16
b1eab8bb0d
Add include images to exporter 2020-09-26 19:26:24 -07:00
JonnyWong16
2a4b48d0fa
Clean up Telegram send poster 2020-09-26 19:03:24 -07:00
JonnyWong16
a8e0502b41
Merge pull request #1377 from JohnnyKing94/master
Added Silent Notification option for Telegram Agent
2020-09-26 18:44:58 -07:00
JonnyWong16
ccf0e0dae7
Add default thumb and art to Live TV library 2020-09-26 18:32:13 -07:00
JonnyWong16
bfa4d3dfec
Add library name to fix metadata modal 2020-09-26 18:03:29 -07:00
JonnyWong16
93997c11dc
Add playback error notification trigger 2020-09-21 18:31:19 -07:00
JonnyWong16
7ce92d5f17
Add error state icon to activity card and history table 2020-09-21 18:30:41 -07:00
JonnyWong16
9740010368
Add container_decision to notification parameters 2020-09-21 18:06:40 -07:00
JonnyWong16
e4e0b765b6
Rename container transcoding to converting on activity cards 2020-09-21 17:57:01 -07:00
MichaIng
51d1dccb42
Avoid daemon forking with systemd
systemd units allow to run processes in foreground while daemonization is done on systemd service level when using Type=simple (default). This allows systemd to reliably track the service state, signals and could catch outputs, i.e. it is possible to remove "--quiet" to have Tautulli logging to systemd journal (journalctl) additionally or alternatively to log files.

In case of Type=forking, a PID file is required to allow system reliably determine the service state, which would be an alternative, but has no real advantage. The solution with "GuessMainPID=no" allows systemd to correctly determine the service active state, but e.g. when it is killed, it is seen as "Succeeded." since systemd cannot track the exit code or signal.
2020-09-21 23:58:30 +02:00
JonnyWong16
6f362ee2ad
Rename export level options 2020-09-20 21:34:33 -07:00
JonnyWong16
f77bbda5ac
Delete exported images folder 2020-09-20 21:31:48 -07:00
JonnyWong16
dceeaa77c5
Add checkbox to export images 2020-09-20 21:22:03 -07:00
JonnyWong16
d7c96d46e0
Refactor export get all metadata attrs 2020-09-20 21:21:37 -07:00
JonnyWong16
b9f5251188
Export art and thumb images 2020-09-20 21:04:57 -07:00
JonnyWong16
75cdc2c5e8
Add art and thumb url to plexapi collections 2020-09-20 21:03:05 -07:00
JonnyWong16
7eedb14834
Refactor exporter into Export class 2020-09-20 20:34:31 -07:00
JonnyWong16
ca06154805
Separate metadata and media export levels 2020-09-20 13:02:02 -07:00
JonnyWong16
35cdef1340
Add hdr attribute to media export 2020-09-20 12:27:42 -07:00
JonnyWong16
d609c0daeb
Add export metadata button to collections 2020-09-20 11:23:19 -07:00
JonnyWong16
db0b157d43
Add admin auth to export modal 2020-09-20 11:23:19 -07:00
JonnyWong16
906aedd2f1
Add movie export levels 2020-09-20 11:23:19 -07:00
JonnyWong16
07a9bdbde3
Add more stream export attributes 2020-09-20 11:23:19 -07:00
JonnyWong16
588b1b1bc3
Add more stream attributes to plexapi 2020-09-20 11:23:19 -07:00
JonnyWong16
eb63f89b1f
Add helper functions for export levels 2020-09-20 11:23:19 -07:00
JonnyWong16
fb81d1b6f3
Add human duration and file size to export attributes 2020-09-20 11:23:19 -07:00
JonnyWong16
b897212050
Update human_file_size helper function 2020-09-20 11:23:19 -07:00
JonnyWong16
3f6612fe9a
Update human_duration helper function 2020-09-20 11:23:19 -07:00
JonnyWong16
bf1a59c5c0
Remove traceback for export 2020-09-20 11:23:19 -07:00
JonnyWong16
6fb3a3a3c8
Update export json and csv for Python 2 2020-09-20 11:23:19 -07:00
JonnyWong16
ed454b2a4a
Add backports.csv 1.0.7 2020-09-20 11:23:19 -07:00
JonnyWong16
27f828e619
Message to view export on library page 2020-09-20 11:23:19 -07:00
JonnyWong16
bde0ce20d8
Fix export modal file format not working on library page 2020-09-20 11:23:19 -07:00
JonnyWong16
28c6163a31
Exporter check rating key first 2020-09-20 11:23:19 -07:00
JonnyWong16
14bb377794
Add link to export filename to view in browser 2020-09-20 11:23:19 -07:00
JonnyWong16
61c692ad4e
Cancel processing exports on startup 2020-09-20 11:23:19 -07:00
JonnyWong16
42856e5ac8
Fix export modal selected file format 2020-09-20 11:23:19 -07:00
JonnyWong16
e82ad09a8d
Rename row_id to exporr_id 2020-09-20 11:23:19 -07:00
JonnyWong16
40fbc55ab3
Add file size to export table 2020-09-20 11:23:19 -07:00
JonnyWong16
a27a5b023b
Add file format to export modal 2020-09-20 11:23:19 -07:00
JonnyWong16
a7eb563c2e
Move export thread so table can be refreshed 2020-09-20 11:23:19 -07:00
JonnyWong16
43fefcf748
Add export modal and buttons to library and info page 2020-09-20 11:23:19 -07:00
JonnyWong16
621fb95227
Auto-refresh export table if an item is processing 2020-09-20 11:23:19 -07:00
JonnyWong16
d3704fcee6
Add ability for custom calculated attributes for exporting 2020-09-20 11:23:19 -07:00
JonnyWong16
55100dfb7a
Fix select columns button not showing for export table 2020-09-20 11:23:19 -07:00
JonnyWong16
010fefcbbc
Link rating key in export table to info page 2020-09-20 11:23:19 -07:00
JonnyWong16
7627f025ed
Change button colours on export table 2020-09-20 11:23:19 -07:00
JonnyWong16
e256d2080d
Make export work on Python 2 and set failed state 2020-09-20 11:23:19 -07:00
JonnyWong16
58292067f0
Fix export csv missing dict keys 2020-09-20 11:23:19 -07:00
JonnyWong16
d5e91801d6
Fix downloading export file 2020-09-20 11:23:19 -07:00
JonnyWong16
91d545f480
Disable export delete button if still processing 2020-09-20 11:23:19 -07:00
JonnyWong16
9c2599acbe
No export section_id for playlists 2020-09-20 11:23:19 -07:00
JonnyWong16
06341ee632
Fix export doc strings 2020-09-20 11:23:19 -07:00
JonnyWong16
bcc693e4c7
Add error message for failed export download 2020-09-20 11:23:19 -07:00
JonnyWong16
8b8afacaea
Add function to delete exported files 2020-09-20 11:23:19 -07:00
JonnyWong16
deb49d7ff9
Add function to download exported files 2020-09-20 11:23:19 -07:00
JonnyWong16
6334ffa197
Add export directory 2020-09-20 11:23:19 -07:00
JonnyWong16
b872cce2a4
Check exported file exists 2020-09-20 11:23:19 -07:00
JonnyWong16
de2e2ee962
Add file_format to exports table 2020-09-20 11:23:19 -07:00
JonnyWong16
5468676811
Add table to list exported items 2020-09-20 11:23:19 -07:00
JonnyWong16
c102020698
Add metadata export function 2020-09-20 11:23:19 -07:00
JonnyWong16
0ff363b6ee
Add export helper functions 2020-09-20 11:23:19 -07:00
JonnyWong16
c324cf69ed
Merge custom plexapi 3.6.0-tautulli 2020-09-20 11:23:19 -07:00
Gianfranco
721cf5c930 Renamed 'silent_message' to 'silent_notification.'
Signed-off-by: Gianfranco <gianfry94@hotmail.it>
2020-09-14 20:46:22 +02:00
Gianfranco
f07bcca96a Wording changes
Signed-off-by: Gianfranco <gianfry94@hotmail.it>
2020-09-14 20:26:27 +02:00
JonnyWong16
056d0d81ac
Improve activity monitor session start log message 2020-09-14 09:19:33 -07:00
JonnyWong16
38ccd37867
Fix QR code not showing up for localhost address 2020-09-14 08:51:22 -07:00
Gianfranco
21799116c5 Reworked the Telegram Agent code to include the "silent_message" option. Both cases are now managed and the alerts are being respected.
Signed-off-by: Gianfranco <gianfry94@hotmail.it>
2020-09-14 12:46:45 +02:00
JonnyWong16
60bdf1d1ce
Schedule database pragma optimize 2020-09-12 14:18:31 -07:00
JonnyWong16
02658759ea
Fix purge library from the edit modal 2020-09-10 08:35:26 -07:00
JonnyWong16
68946ceede
Add uninstall before installing to Windows installer 2020-09-06 19:03:47 -07:00
JonnyWong16
9184ae4608
v2.5.5 2020-09-06 14:43:16 -07:00
JonnyWong16
de64b5ddfa
Revert "Add negative margin to sections with fixed cards"
This reverts commit 668c9e6045.

* Revert #1378
2020-09-06 14:18:25 -07:00
JonnyWong16
b3ffbbf3ea
Patch osxnotify for Python 3 compatibility
* Fixes Tautulli/Tautulli-Issues#276
2020-09-06 14:14:08 -07:00
JonnyWong16
aa80fdf738
Merge pull request #1380 from mvanbaak/issue_277_update_ipaddr
Upgrade ipaddr from 2.1.11 to 2.2.0. Its now python 3 compatible

* Fixes Tautulli/Tautulli-Issues#277
2020-09-06 13:59:13 -07:00
JonnyWong16
9ad95f51d4
Fix whois lookup failing in some instances 2020-09-06 13:57:42 -07:00
JonnyWong16
0902a61341
Update profilehooks to 1.12.0
* Fixes Tautulli/Tautulli-Issues#275
2020-09-06 13:45:01 -07:00
JonnyWong16
55ffd54e5b
Filter out background theme music sessions 2020-09-04 18:29:37 -07:00
JonnyWong16
e014bfa63e
Log selected Plex server 2020-09-04 18:27:28 -07:00
JonnyWong16
687672e9c1
Fix plural seasons in recently added 2020-09-04 08:01:51 -07:00
Michiel van Baak
137889dc9c Upgrade ipaddr from 2.1.11 to 2.2.0. Its now python 3 compatible 2020-09-03 16:46:37 +02:00
JonnyWong16
f24f4a4250
Fix checking pid file on startup 2020-08-29 12:35:04 -07:00
JonnyWong16
95fc108d57
Merge pull request #1378 from dotsam/margin-fix
Add negative margin to sections with fixed cards
2020-08-29 12:31:58 -07:00
JonnyWong16
95f48ba9f6
Return empty results for API instead of null error
* Fixes Tautulli/Tautulli-Issues#274
2020-08-26 18:56:49 -07:00
JonnyWong16
d80cf232c8
Add multi-column sorting to datatables API commands 2020-08-26 18:32:06 -07:00
JonnyWong16
ab3ec875a3
Return custom library art for datatable 2020-08-26 17:53:50 -07:00
Sam Edwards
668c9e6045
Add negative margin to sections with fixed cards 2020-08-23 23:14:45 -07:00
JonnyWong16
67b452a461
Fix user and library recently played sorting order 2020-08-23 18:17:41 -07:00
Gianfranco
81ee44b60f
Added "silent_message" option for Telegram Agent
Added a new checkbox in the notification telegram config in order to send new messages silently. In this way the telegram users will receive a notification with no sound.
2020-08-21 22:49:26 +02:00
JonnyWong16
9b3bfd14db
Check external guids for notification parameters 2020-08-21 11:58:07 -07:00
JonnyWong16
e00c8fb186
Add external guids to metadata 2020-08-21 11:57:43 -07:00
JonnyWong16
a0919e246d
Use pyinstaller==3.6 for package builds 2020-08-21 11:10:14 -07:00
JonnyWong16
003f684f8a
Override thumb for clips using the art rating_key 2020-08-21 10:53:05 -07:00
JonnyWong16
69d55c60c3
Add icon and thumb for clips on history table 2020-08-21 10:53:05 -07:00
JonnyWong16
560094dcf6
Add logger message for generating newsletter 2020-08-21 10:53:05 -07:00
JonnyWong16
4edd6ce911
Add scheduled task to optimize database 2020-08-21 10:52:26 -07:00
JonnyWong16
f76bd2af8e
Merge pull request #1376 from nwithan8/patch-1
Spelling error
2020-08-11 14:32:21 -07:00
Nate Harris
7747503fee
Spelling error 2020-08-09 22:40:47 -04:00
JonnyWong16
1e1a8ddfb0
Fix get_logs API command encoding error
* Fixes Tautulli/Tautulli-Issues#269
2020-08-08 21:37:09 -07:00
JonnyWong16
9bcd18f1b6
Remove revealed characters in masked log 2020-08-08 21:31:50 -07:00
JonnyWong16
50b6f9a8f2
Blacklist password parameter in get_apikey command 2020-08-08 21:26:01 -07:00
JonnyWong16
b4ba88b3e5
Fix get_apikey API command with a hashed password 2020-08-08 21:19:39 -07:00
JonnyWong16
ba9acd6e23
Add auth to some admin endpoints 2020-08-05 21:21:19 -07:00
JonnyWong16
dd9513313b
Don't highlight links in scheduler table 2020-08-05 20:56:44 -07:00
JonnyWong16
288a1c86ab
Replace white with "not white" 2020-08-05 20:54:12 -07:00
JonnyWong16
8e28cb10fa
Rename terminate session to terminate stream 2020-08-05 09:02:18 -07:00
JonnyWong16
3d35a525d3
Make sure json response is encoded to utf-8 2020-08-03 21:45:11 -07:00
JonnyWong16
f7153d0f3b
Fix Local user icon not showing in library user stats 2020-08-03 11:45:43 -07:00
JonnyWong16
4285b55c15
Update timestamp helper functions 2020-08-03 10:29:45 -07:00
JonnyWong16
b54576f08f
Fix download API commands not returning the file
* Fixes Tautulli/Tautulli-Issues#268
2020-08-02 22:09:40 -07:00
JonnyWong16
6b4db681ff
Fix get_synced_items API command returning error with empty result
* Fixes Tautulli/Tautulli-Issues#267
2020-08-02 22:03:35 -07:00
JonnyWong16
f582f781f3
Update helpers.now function 2020-08-02 13:48:10 -07:00
JonnyWong16
9baecb0a41
Change webstart failure error message 2020-08-02 10:29:57 -07:00
JonnyWong16
91a18e1a92
Add get_server_info API command 2020-08-02 10:18:57 -07:00
JonnyWong16
acfbb0e96d
Add import_config to API docs 2020-08-02 10:18:25 -07:00
JonnyWong16
c52292962d
Remove mock 2020-07-31 22:06:23 -07:00
JonnyWong16
6e53743716
Update plexapi to v3.6.0 2020-07-31 22:06:07 -07:00
JonnyWong16
873194b402
Add hidden import pkg_resources.py2_warn to Windows installer 2020-07-31 15:14:31 -07:00
JonnyWong16
21dec5feb3
v2.5.4 2020-07-31 14:24:08 -07:00
JonnyWong16
bee4106af0
Change direct stream icon 2020-07-31 14:23:01 -07:00
JonnyWong16
bbb6e46515
Replace sys.stderr with logger 2020-07-27 18:47:08 -07:00
JonnyWong16
570ebb4f73
Add plex_id to notification parameters 2020-07-27 18:38:04 -07:00
JonnyWong16
d93204af4e
Lookup TVmaze using title 2020-07-27 18:30:00 -07:00
JonnyWong16
702f116db9
Lookup The Movie Database using title and year 2020-07-27 18:20:12 -07:00
JonnyWong16
0c8607b3ec
Fix typo in QR modal 2020-07-25 13:28:39 -07:00
JonnyWong16
3a2cc6efc7
Trim address when generating the QR code 2020-07-25 13:28:39 -07:00
JonnyWong16
1b37ff1655
Mobile device registration temporarily assume device_id is onesignal_id 2020-07-25 13:28:34 -07:00
JonnyWong16
769934c8a5
Add server_id to Andoird App notification data 2020-07-25 13:21:52 -07:00
JonnyWong16
7f1a4ec34a
Add return PMS name and server ID from device registration 2020-07-25 13:21:52 -07:00
JonnyWong16
27438f7915
Don't allow apikey when using an app 2020-07-25 13:21:51 -07:00
JonnyWong16
8651bef9c1
Mask onesignal_id from API logs 2020-07-25 13:21:51 -07:00
JonnyWong16
36324d10dc
Add onesignal_id to register device API 2020-07-25 13:21:46 -07:00
JonnyWong16
0272c35047
Fix parsing request responst message 2020-07-25 11:59:24 -07:00
JonnyWong16
70c0f912e2
Add themoviedb rating image 2020-07-24 09:12:11 -07:00
JonnyWong16
59a6acc088
Fix encoding issue with websocket logging 2020-07-23 17:44:17 -07:00
JonnyWong16
10b0726727
Remove support for .exe from script notifications 2020-07-23 17:33:43 -07:00
JonnyWong16
8f1360d7c2
Check for valid script extension when using a prefix override
* Also removes php, ruby, and perl overrides
2020-07-23 17:33:36 -07:00
JonnyWong16
e0e5ac9ecc
Check for a valid script and script extension 2020-07-22 18:55:14 -07:00
JonnyWong16
c814f219a2
Prevent simultaneous importing of database/config 2020-07-22 18:33:47 -07:00
JonnyWong16
9095fc0c7a
Catch config.ParseError 2020-07-22 18:27:23 -07:00
JonnyWong16
a675202537
Browse path starting from from current value 2020-07-18 15:19:42 -07:00
JonnyWong16
b52ab4885b
Add browser button for script folder 2020-07-18 12:13:42 -07:00
JonnyWong16
43e26c9b56
Add Plex logs folder to config not imported note 2020-07-16 19:38:20 -07:00
JonnyWong16
703a7feed2
Update help text for SSL certificates/key in PEM format 2020-07-16 19:29:11 -07:00
JonnyWong16
7b69ed4cec
Add browse function to settings with a folder or file 2020-07-16 19:27:14 -07:00
JonnyWong16
fcca7f969e
Add filter extension as data property 2020-07-16 19:26:24 -07:00
JonnyWong16
ec34ea2116
Trigger change and unbind after selecting in file browser 2020-07-16 19:05:18 -07:00
JonnyWong16
3dc36c3b92
Refactor browse path function 2020-07-16 18:19:43 -07:00
JonnyWong16
f0d4fd5523
Add placeholder text for database/config import 2020-07-16 18:19:20 -07:00
JonnyWong16
7fe6c72fe2
Do not import PMS logs folder from config 2020-07-16 18:01:47 -07:00
JonnyWong16
d216d0f27f
Reword import help text 2020-07-16 00:02:13 -07:00
JonnyWong16
43a7758acd
Cleanup database import modal 2020-07-15 23:53:01 -07:00
JonnyWong16
3043956dec
Add config import to settings page 2020-07-15 23:51:48 -07:00
JonnyWong16
06665fdd06
Add fucntion to import a config file 2020-07-15 23:26:22 -07:00
JonnyWong16
beff5caaac
Clean shutdown page 2020-07-15 22:53:46 -07:00
JonnyWong16
3859412b2c
Fix database import API docs 2020-07-15 22:10:17 -07:00
JonnyWong16
f7ec476fc0
Remove more unused config keys 2020-07-15 21:25:34 -07:00
JonnyWong16
b97d32671d
Remove unused library update functions 2020-07-15 21:21:17 -07:00
JonnyWong16
01c56ef280
Remove helper bool check in database import status 2020-07-15 21:06:28 -07:00
JonnyWong16
b9422312f3
Remove unused check recently added pinger 2020-07-15 21:05:49 -07:00
JonnyWong16
9a0f83c3e7
Remove old config updates 2020-07-15 21:04:30 -07:00
JonnyWong16
fbfedb2e62
Remove unused config keys 2020-07-15 21:04:22 -07:00
JonnyWong16
4f8a462041
Update chown instructions in systemd script 2020-07-13 19:08:20 -07:00
JonnyWong16
141d043a6a
FreeBSD/FreeNAS python is python3 2020-07-13 19:08:19 -07:00
JonnyWong16
c1266fed12
Update API docs for database import 2020-07-13 19:08:14 -07:00
JonnyWong16
4a4be9798d
Adjust user IP table column widths 2020-07-12 12:54:56 -07:00
JonnyWong16
172692ccca
Fix user IP table showing first played instead of last played 2020-07-12 12:54:42 -07:00
JonnyWong16
50e7c0469f
Merge pull request #1374 from dotsam/ip-first-streamed
Add first_seen to user IP Table
2020-07-12 12:41:46 -07:00
JonnyWong16
44f74e3590
Mask device token and device id from API logs 2020-07-12 10:35:52 -07:00
Sam Edwards
63656b73c2
Add first_seen to user ips and add title attr with full date/time 2020-07-11 15:23:26 -07:00
JonnyWong16
40ecf56904
Fix Cloudinary upload for non-ASCII characters on Python 2 2020-07-10 21:57:53 -07:00
JonnyWong16
b4a10adec2
Merge branch 'v2.5-monitor-remote-access' into nightly 2020-07-10 17:09:58 -07:00
JonnyWong16
1698622d63
v2.5.3 2020-07-10 17:07:18 -07:00
JonnyWong16
fa27271647
Change shebang on contrib scripts 2020-07-10 17:02:23 -07:00
JonnyWong16
d837811c68
Improve start script 2020-07-09 17:13:16 -07:00
JonnyWong16
ad195f0969
Fix deleteing more than 1000 history entries at the same time 2020-07-08 12:27:20 -07:00
JonnyWong16
4a8748e322
Live TV library not being recreated after server identifier is changed
* Fixes Tautulli/Tautulli-Issues#261
2020-07-07 18:14:00 -07:00
JonnyWong16
0f016c83ea
Fix ipwhois data location for macOS package
* Fixes Tautulli/Tautulli-Issues#260
2020-07-07 17:25:46 -07:00
JonnyWong16
061ae44da4
Fix indentation in macOS postinstall script 2020-07-07 17:05:15 -07:00
JonnyWong16
a8b90bf100
Reduce macOS build requirement to pyobjc-framework-Cocoa 2020-07-07 17:05:10 -07:00
JonnyWong16
eb3cd49bc4
Add hidden import pkg_resources.py2_warn to macos.spec
* Fixes build on macOS 10.13 (High Sierra)
2020-07-06 20:57:37 -07:00
JonnyWong16
416d869288
Add python version to Google Analytics 2020-07-06 18:13:33 -07:00
JonnyWong16
a116c26c25
Run python scripts with the same sys.executable as Tautulli 2020-07-06 11:32:16 -07:00
JonnyWong16
cc4ec53dac
Full path to python3 interpreter in FreeBSD startup script 2020-07-06 10:08:36 -07:00
JonnyWong16
63164c7ff5
Quote command in systemd script 2020-07-06 09:37:37 -07:00
JonnyWong16
9815c014e8
Add python interpreter to init-scripts 2020-07-06 09:30:35 -07:00
JonnyWong16
69675151bf
Remove monitor remote access settings
* Tautulli/Tautulli-Issues#251
2020-07-05 20:40:44 -07:00
JonnyWong16
99e395ddfa
Update scheduled tasks table
* Tautulli/Tautulli-Issues#251
2020-07-05 20:39:31 -07:00
JonnyWong16
7fe1e542df
Remove check remote access scheduled task
* Tautulli/Tautulli-Issues#251
2020-07-05 20:38:54 -07:00
JonnyWong16
938134081b
Add remote access monitoring using websockets
* Fixes Tautulli/Tautulli-Issues#251
2020-07-05 20:36:44 -07:00
JonnyWong16
3fd2234a92
Remove refresh reachability 2020-07-05 19:20:52 -07:00
JonnyWong16
41843dc573
Rename some column headers 2020-07-04 12:22:40 -07:00
JonnyWong16
cc6bd528a5
Add architecture to release assets 2020-07-04 11:28:22 -07:00
JonnyWong16
2625ef5fb9
Use Popen to restart on macOS 2020-07-03 19:48:27 -07:00
JonnyWong16
dbd2d28877
Set macOS menu bar icon thread to daemon 2020-07-03 19:47:57 -07:00
JonnyWong16
f70f814c70
Shutdown tray icons last 2020-07-03 19:47:11 -07:00
JonnyWong16
6710e42134
Hide macOS dock icon for pkg install 2020-07-03 19:46:27 -07:00
JonnyWong16
78c5b45e43
Also fix e562ec9 for Python 2 2020-07-03 11:24:47 -07:00
JonnyWong16
e562ec96fa
Fix encoding when reading a newsletter file 2020-07-02 20:46:42 -07:00
JonnyWong16
9b5e01c319
Fix logger for email notification exception 2020-07-02 12:45:45 -07:00
JonnyWong16
0097532f4a
Fix startup script 2020-07-02 12:33:32 -07:00
JonnyWong16
91935c9018
Add hidden import cheroot.ssl.builtin for pyinstaller 2020-07-02 09:20:58 -07:00
JonnyWong16
83df807f7e
Fix typo in eb3db20 2020-07-02 09:15:13 -07:00
JonnyWong16
eb3db20340
Add hidden import chroot.ssl for pyinstaller 2020-07-02 09:11:15 -07:00
JonnyWong16
6dab6194ea
Replace which with command -v in startup script 2020-07-01 22:44:05 -07:00
2596 changed files with 264729 additions and 120545 deletions

View file

@ -5,6 +5,7 @@ contrib
init-scripts
package
pylintrc
snap
*.md
!CHANGELOG*.md
start.bat

2
.github/FUNDING.yml vendored
View file

@ -1,3 +1,3 @@
github: JonnyWong16
patreon: Tautulli
custom: ["https://bit.ly/2InPp15"]
custom: ["https://bit.ly/2InPp15", "https://bit.ly/2WTq83m"]

103
.github/ISSUE_TEMPLATE/BUG-REPORT.yml vendored Normal file
View file

@ -0,0 +1,103 @@
name: Bug Report
description: Please do not use bug reports for support issues.
labels: ['status:awaiting-triage', 'type:bug']
body:
- type: markdown
attributes:
value: |
**THIS IS NOT THE PLACE TO ASK FOR SUPPORT!** Please use [Discord](https://tautulli.com/discord) for support issues.
- type: textarea
id: description
attributes:
label: Describe the Bug
description: A clear and concise description of the bug.
validations:
required: true
- type: textarea
id: steps
attributes:
label: Steps to Reproduce
description: List each action required in order to reproduce the issue.
placeholder: |
1. Go to '...'
2. Click on '...'
3. Scroll down to '...'
4. See error
- type: textarea
id: expected
attributes:
label: Expected Behavior
description: A clear and concise description of what you expected to happen.
- type: textarea
id: screenshots
attributes:
label: Screenshots
description: Provide screenshots to help explain your problem.
- type: textarea
id: relevant
attributes:
label: Relevant Settings
description: Include all settings/configuration that are relevant to your issue. For example, Plex Media Server, newsletter, or notification settings.
placeholder: |
- eg. Plex Media Server IP address/port/checkboxes/proxy/etc.
- eg. Notification agent configuration/triggers/conditions/text/delay/grouping/etc.
- eg. Newsletter agent configuration/checkboxes/template/etc.
- Other settings
- type: input
id: version
attributes:
label: Tautulli Version
description: Check Tautulli Settings > Help & Info page.
placeholder: eg. v2.7.5
validations:
required: true
- type: input
id: branch
attributes:
label: Git Branch
description: Check Tautulli Settings > Help & Info page.
placeholder: eg. master
validations:
required: true
- type: input
id: hash
attributes:
label: Git Commit Hash
description: Check Tautulli Settings > Help & Info page.
placeholder: eg. 2cc5bf812fe05e0666aeaeb37ed550c59816fb4c
validations:
required: true
- type: input
id: platform
attributes:
label: Platform and Version
description: Check Tautulli Settings > Help & Info page.
placeholder: eg. Windows 10
validations:
required: true
- type: input
id: python
attributes:
label: Python Version
description: Check Tautulli Settings > Help & Info page.
placeholder: eg. 3.8.10
validations:
required: true
- type: input
id: browser
attributes:
label: Browser and Version
placeholder: eg. Chrome 88
validations:
required: true
- type: input
id: logs
attributes:
label: Link to Logs
description: Include a link to your **FULL** logs (not just a few lines) on [Gist](http://gist.github.com).
validations:
required: true
- type: markdown
attributes:
value: |
Make sure to close your issue when it's solved! If you found the solution yourself please comment so that others benefit from it.

View file

@ -0,0 +1,31 @@
name: Feature Request
description: Suggest a new feature for Tautulli.
labels: ['status:awaiting-triage', 'type:enhancement']
body:
- type: markdown
attributes:
value: |
Thanks for taking the time to help improve Tautulli!
- type: textarea
id: problem
attributes:
label: Is your feature request related to a problem?
description: If so, please provide clear and concise description of the problem.
placeholder: eg. I'm always frustrated when '...'
- type: textarea
id: feature
attributes:
label: What is your feature request?
description: A clear and concise description of the feature.
validations:
required: true
- type: textarea
id: workaround
attributes:
label: Are there any workarounds?
description: A clear and concise description of any alternative solutions or features you've considered.
- type: textarea
id: additional
attributes:
label: Additional Context
description: Add any other context or screenshots about the feature request here.

8
.github/ISSUE_TEMPLATE/config.yml vendored Normal file
View file

@ -0,0 +1,8 @@
blank_issues_enabled: false
contact_links:
- name: Tautulli Wiki
url: https://github.com/Tautulli/Tautulli/wiki
about: Please check the wiki to see if your question has already been answered.
- name: Discord
url: https://tautulli.com/discord
about: Please use Discord to ask for support.

4
.github/codeql-config.yml vendored Normal file
View file

@ -0,0 +1,4 @@
name: CodeQL Config
paths-ignore:
- lib

15
.github/dependabot.yml vendored Normal file
View file

@ -0,0 +1,15 @@
version: 2
updates:
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "daily"
target-branch: "nightly"
open-pull-requests-limit: 20
- package-ecosystem: "pip"
directory: "/"
schedule:
interval: "daily"
target-branch: "nightly"
open-pull-requests-limit: 20

48
.github/label-actions.yml vendored Normal file
View file

@ -0,0 +1,48 @@
# Configuration for Label Actions - https://github.com/dessant/label-actions
added:
comment: >
This feature has been added and will be available in the next release of Tautulli.
This issue will be automatically closed once the update is available.
fixed:
comment: >
This bug has been fixed and will be available in the next release of Tautulli.
This issue will be automatically closed once the update is available.
invalid:duplicate:
comment: >
:wave: @{issue-author}, this appears to be a duplicate of a pre-existing issue.
close: true
lock: true
unlabel: 'status:awaiting-triage'
-invalid:duplicate:
reopen: true
unlock: true
invalid:support:
comment: >
:wave: @{issue-author}, we use the issue tracker exclusively for bug reports.
However, this issue appears to be a support request. Please use our
[Discord Server](https://tautulli.com/discord) to get help with Tautulli. Thanks.
close: true
lock: true
lock-reason: 'off-topic'
unlabel: 'status:awaiting-triage'
-invalid:support:
reopen: true
unlock: true
invalid:template-incomplete:
issues:
comment: >
:wave: @{issue-author}, please edit your issue to complete the template with
all the required info. Your issue will be automatically closed in 5 days if
the template is not completed. Thanks.
prs:
comment: >
:wave: @{issue-author}, please edit your PR to complete the template with
all the required info. Your PR will be automatically closed in 5 days if
the template is not completed. Thanks.

26
.github/pull_request_template.md vendored Normal file
View file

@ -0,0 +1,26 @@
## Description
Please include a summary of the changes.
### Screenshot
Include screenshots if the changes are UI-related.
### Issues Fixed or Closed
- Fixes #(issue)
## Type of Change
Please delete options that are not relevant.
- [ ] Bug fix (non-breaking change which fixes an issue)
- [ ] New feature (non-breaking change which adds functionality)
- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected)
## Checklist
- [ ] My code follows the style guidelines of this project
- [ ] I have performed a self-review of my own code
- [ ] I have commented my code, particularly in hard-to-understand areas
- [ ] I have added or updated the docstring for new or existing methods

38
.github/workflows/codeql.yml vendored Normal file
View file

@ -0,0 +1,38 @@
name: CodeQL
on:
push:
branches: [nightly]
pull_request:
branches: [nightly]
schedule:
- cron: '05 10 * * 1'
jobs:
codeql-analysis:
name: CodeQL Analysis
runs-on: ubuntu-latest
permissions:
actions: read
contents: read
security-events: write
strategy:
fail-fast: false
matrix:
language: ['javascript', 'python']
steps:
- name: Checkout Code
uses: actions/checkout@v4
- name: Initialize CodeQL
uses: github/codeql-action/init@v3
with:
config-file: ./.github/codeql-config.yml
languages: ${{ matrix.language }}
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v3
with:
category: "/language:${{matrix.language}}"

48
.github/workflows/issues-stale.yml vendored Normal file
View file

@ -0,0 +1,48 @@
name: Stale Issues / PRs
on:
schedule:
- cron: '00 19 * * *'
jobs:
stale:
name: Check Issues / PRs
runs-on: ubuntu-latest
steps:
- name: Stale
uses: actions/stale@v9
with:
stale-issue-message: >
This issue is stale because it has been open for 30 days with no activity.
Remove the stale label or comment, otherwise this will be closed in 5 days.
close-issue-message: >
This issue was closed because it has been stalled for 5 days with no activity.
stale-issue-label: 'stale'
exempt-issue-labels: 'added,fixed,type:enhancement,status:awaiting-triage,status:in-progress'
stale-pr-message: >
This PR is stale because it has been open for 30 days with no activity.
Remove the stale label or comment, otherwise this will be closed in 5 days.
close-pr-message: >
This PR was closed because it has been stalled for 5 days with no activity.
stale-pr-label: 'stale'
exempt-pr-labels: 'status:in-progress,status:in-review,dependencies'
days-before-stale: 30
days-before-close: 5
- name: Invalid Template
uses: actions/stale@v9
with:
stale-issue-message: >
Invalid issues template.
close-issue-message: >
This issue was closed because the the template was not completed after 5 days.
stale-issue-label: 'invalid:template-incomplete'
stale-pr-message: >
Invalid PR template.
close-pr-message: >
This PR was closed because the the template was not completed after 5 days.
stale-pr-label: 'invalid:template-incomplete'
exempt-pr-labels: 'status:in-progress,status:in-review,dependencies'
only-labels: 'invalid:template-incomplete'
days-before-stale: 0
days-before-close: 5

15
.github/workflows/issues.yml vendored Normal file
View file

@ -0,0 +1,15 @@
name: Issues
on:
issues:
types: [labeled, unlabeled]
jobs:
label:
name: Label Issues
runs-on: ubuntu-latest
steps:
- name: Label Issues
uses: dessant/label-actions@v4
with:
github-token: ${{ github.token }}

View file

@ -1,95 +1,108 @@
name: Publish Docker
on:
workflow_dispatch: ~
push:
branches: [master, beta, nightly, python3]
branches: [master, beta, nightly]
tags: [v*]
jobs:
build:
build-docker:
name: Build Docker Image
runs-on: ubuntu-latest
if: ${{ !contains(github.event.head_commit.message, '[skip ci]') }}
steps:
- name: Checkout Code
uses: actions/checkout@v2
uses: actions/checkout@v4
- name: Prepare
id: prepare
run: |
if [[ $GITHUB_REF == refs/tags/* ]]; then
echo ::set-output name=tag::${GITHUB_REF#refs/tags/}
echo "tag=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT
elif [[ $GITHUB_REF == refs/heads/master ]]; then
echo ::set-output name=tag::latest
echo "tag=latest" >> $GITHUB_OUTPUT
else
echo ::set-output name=tag::${GITHUB_REF#refs/heads/}
echo "tag=${GITHUB_REF#refs/heads/}" >> $GITHUB_OUTPUT
fi
if [[ $GITHUB_REF == refs/tags/* ]]; then
echo ::set-output name=branch::master
if [[ $GITHUB_REF == refs/tags/*-beta ]]; then
echo "branch=beta" >> $GITHUB_OUTPUT
elif [[ $GITHUB_REF == refs/tags/* ]]; then
echo "branch=master" >> $GITHUB_OUTPUT
else
echo ::set-output name=branch::${GITHUB_REF#refs/heads/}
echo "branch=${GITHUB_REF#refs/heads/}" >> $GITHUB_OUTPUT
fi
echo ::set-output name=commit::${GITHUB_SHA}
echo ::set-output name=build_date::$(date -u +'%Y-%m-%dT%H:%M:%SZ')
echo ::set-output name=docker_platforms::linux/amd64,linux/arm64,linux/arm
echo ::set-output name=docker_image::${{ secrets.DOCKER_REPO }}/tautulli
echo "commit=${GITHUB_SHA}" >> $GITHUB_OUTPUT
echo "docker_platforms=linux/amd64,linux/arm64/v8,linux/arm/v7,linux/arm/v6" >> $GITHUB_OUTPUT
echo "docker_image=${{ secrets.DOCKER_REPO }}/tautulli" >> $GITHUB_OUTPUT
- name: Set Up QEMU
uses: docker/setup-qemu-action@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
id: buildx
uses: crazy-max/ghaction-docker-buildx@v3
with:
buildx-version: latest
version: latest
- name: Cache Docker Layers
id: cache
uses: actions/cache@v2
uses: actions/cache@v4
with:
path: /tmp/.buildx-cache
key: ${{ runner.os }}-buildx-${{ github.sha }}
restore-keys: |
${{ runner.os }}-buildx-
- name: Docker Buildx (no push)
run: |
docker buildx build \
--cache-from "type=local,src=/tmp/.buildx-cache" \
--cache-to "type=local,dest=/tmp/.buildx-cache" \
--platform ${{ steps.prepare.outputs.docker_platforms }} \
--output "type=image,push=false" \
--build-arg "TAG=${{ steps.prepare.outputs.tag }}" \
--build-arg "BRANCH=${{ steps.prepare.outputs.branch }}" \
--build-arg "COMMIT=${{ steps.prepare.outputs.commit }}" \
--build-arg "BUILD_DATE=${{ steps.prepare.outputs.build_date }}" \
--tag "${{ steps.prepare.outputs.docker_image }}:${{ steps.prepare.outputs.tag }}" \
--file Dockerfile .
- name: Docker Login
- name: Login to DockerHub
uses: docker/login-action@v3
if: success()
env:
DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }}
run: |
echo "${DOCKER_PASSWORD}" | docker login --username "${{ secrets.DOCKER_USERNAME }}" --password-stdin
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_TOKEN }}
- name: Docker Buildx (push)
- name: Login to GitHub Container Registry
uses: docker/login-action@v3
if: success()
run: |
docker buildx build \
--cache-from "type=local,src=/tmp/.buildx-cache" \
--platform ${{ steps.prepare.outputs.docker_platforms }} \
--output "type=image,push=true" \
--build-arg "TAG=${{ steps.prepare.outputs.tag }}" \
--build-arg "BRANCH=${{ steps.prepare.outputs.branch }}" \
--build-arg "COMMIT=${{ steps.prepare.outputs.commit }}" \
--build-arg "BUILD_DATE=${{ steps.prepare.outputs.build_date }}" \
--tag "${{ steps.prepare.outputs.docker_image }}:${{ steps.prepare.outputs.tag }}" \
--file Dockerfile .
with:
registry: ghcr.io
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.GHCR_TOKEN }}
- name: Clear
if: always()
run: |
rm -f ${HOME}/.docker/config.json
- name: Extract Docker Metadata
id: metadata
uses: docker/metadata-action@v5
with:
images: ${{ steps.prepare.outputs.docker_image }}
- name: Docker Build and Push
uses: docker/build-push-action@v6
if: success()
with:
context: .
file: ./Dockerfile
push: true
platforms: ${{ steps.prepare.outputs.docker_platforms }}
build-args: |
TAG=${{ steps.prepare.outputs.tag }}
BRANCH=${{ steps.prepare.outputs.branch }}
COMMIT=${{ steps.prepare.outputs.commit }}
tags: |
${{ steps.prepare.outputs.docker_image }}:${{ steps.prepare.outputs.tag }}
ghcr.io/${{ steps.prepare.outputs.docker_image }}:${{ steps.prepare.outputs.tag }}
labels: ${{ steps.metadata.outputs.labels }}
cache-from: type=local,src=/tmp/.buildx-cache
cache-to: type=local,dest=/tmp/.buildx-cache
discord:
name: Discord Notification
needs: build-docker
if: always() && !contains(github.event.head_commit.message, '[skip ci]')
runs-on: ubuntu-latest
steps:
- name: Post Status to Discord
uses: sarisia/actions-status-discord@v1
if: always()
with:
webhook: ${{ secrets.DISCORD_WEBHOOK }}
status: ${{ job.status }}
status: ${{ needs.build-docker.result == 'success' && 'success' || contains(needs.*.result, 'failure') && 'failure' || 'cancelled' }}
title: ${{ github.workflow }}
nofail: true

178
.github/workflows/publish-installers.yml vendored Normal file
View file

@ -0,0 +1,178 @@
name: Publish Installers
on:
workflow_dispatch: ~
push:
branches: [master, beta, nightly]
tags: [v*]
env:
PYTHON_VERSION: '3.11'
jobs:
build-installer:
name: Build ${{ matrix.os_upper }} Installer
runs-on: ${{ matrix.os }}-${{ matrix.os_version }}
if: ${{ !contains(github.event.head_commit.message, '[skip ci]') }}
strategy:
fail-fast: false
matrix:
include:
- os: 'windows'
os_upper: 'Windows'
os_version: 'latest'
arch: 'x64'
ext: 'exe'
- os: 'macos'
os_upper: 'MacOS'
os_version: '14'
arch: 'universal'
ext: 'pkg'
steps:
- name: Checkout Code
uses: actions/checkout@v4
- name: Set Release Version
id: get_version
shell: bash
run: |
if [[ $GITHUB_REF == refs/tags/* ]]; then
echo "VERSION=${GITHUB_REF#refs/tags/v}" >> $GITHUB_ENV
VERSION_NSIS=${GITHUB_REF#refs/tags/v}.1
echo "VERSION_NSIS=${VERSION_NSIS/%-beta.1/.0}" >> $GITHUB_OUTPUT
echo "VERSION=${GITHUB_REF#refs/tags/v}" >> $GITHUB_OUTPUT
echo "RELEASE_VERSION=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT
else
echo "VERSION=0.0.0" >> $GITHUB_ENV
echo "VERSION_NSIS=0.0.0.0" >> $GITHUB_OUTPUT
echo "VERSION=0.0.0" >> $GITHUB_OUTPUT
echo "RELEASE_VERSION=${GITHUB_SHA::7}" >> $GITHUB_OUTPUT
fi
if [[ $GITHUB_REF == refs/tags/*-beta ]]; then
echo "beta" > branch.txt
elif [[ $GITHUB_REF == refs/tags/* ]]; then
echo "master" > branch.txt
else
echo ${GITHUB_REF#refs/heads/} > branch.txt
fi
echo $GITHUB_SHA > version.txt
- name: Set Up Python
uses: actions/setup-python@v5
with:
python-version: ${{ env.PYTHON_VERSION }}
cache: pip
cache-dependency-path: '**/requirements*.txt'
- name: Install Dependencies
run: |
python -m pip install --upgrade pip
pip install -r package/requirements-package.txt --no-binary cffi
- name: Build Package
run: |
pyinstaller -y ./package/Tautulli-${{ matrix.os }}.spec
- name: Create Windows Installer
uses: joncloud/makensis-action@v4.1
if: matrix.os == 'windows'
with:
script-file: ./package/Tautulli.nsi
arguments: >
/DVERSION=${{ steps.get_version.outputs.VERSION_NSIS }}
/DINSTALLER_NAME=..\Tautulli-${{ matrix.os }}-${{ steps.get_version.outputs.RELEASE_VERSION }}-${{ matrix.arch }}.${{ matrix.ext }}
additional-plugin-paths: package/nsis-plugins
- name: Create MacOS Installer
if: matrix.os == 'macos'
run: |
sudo pkgbuild \
--install-location /Applications \
--version ${{ steps.get_version.outputs.VERSION }} \
--component ./dist/Tautulli.app \
--scripts ./package/macos-scripts \
Tautulli-${{ matrix.os }}-${{ steps.get_version.outputs.RELEASE_VERSION }}-${{ matrix.arch }}.${{ matrix.ext }}
- name: Upload Installer
uses: actions/upload-artifact@v4
with:
name: Tautulli-${{ matrix.os }}-installer
path: Tautulli-${{ matrix.os }}-${{ steps.get_version.outputs.RELEASE_VERSION }}-${{ matrix.arch }}.${{ matrix.ext }}
virus-total:
name: VirusTotal Scan
needs: build-installer
if: needs.build-installer.result == 'success' && !contains(github.event.head_commit.message, '[skip ci]')
runs-on: ubuntu-latest
steps:
- name: Download Installers
if: needs.build-installer.result == 'success'
uses: actions/download-artifact@v4
- name: Upload to VirusTotal
uses: crazy-max/ghaction-virustotal@v4
with:
vt_api_key: ${{ secrets.VT_API_KEY }}
files: |
Tautulli-windows-installer/Tautulli-windows-*-x64.exe
Tautulli-macos-installer/Tautulli-macos-*-universal.pkg
release:
name: Release Installers
needs: build-installer
if: always() && startsWith(github.ref, 'refs/tags/') && !contains(github.event.head_commit.message, '[skip ci]')
runs-on: ubuntu-latest
steps:
- name: Checkout Code
uses: actions/checkout@v4
- name: Set Release Version
id: get_version
run: |
echo "RELEASE_VERSION=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT
- name: Download Installers
if: needs.build-installer.result == 'success'
uses: actions/download-artifact@v4
- name: Get Changelog
id: get_changelog
run: |
CHANGELOG="$( sed -n '/^## /{p; :loop n; p; /^## /q; b loop}' CHANGELOG.md \
| sed '$d' | sed '$d' | sed '$d' )"
EOF=$(dd if=/dev/urandom bs=15 count=1 status=none | base64)
echo "CHANGELOG<<$EOF" >> $GITHUB_OUTPUT
echo "$CHANGELOG" >> $GITHUB_OUTPUT
echo "$EOF" >> $GITHUB_OUTPUT
- name: Create Release
uses: softprops/action-gh-release@v2
id: create_release
env:
GITHUB_TOKEN: ${{ secrets.GHACTIONS_TOKEN }}
with:
tag_name: ${{ steps.get_version.outputs.RELEASE_VERSION }}
name: Tautulli ${{ steps.get_version.outputs.RELEASE_VERSION }}
body: |
## Changelog
##${{ steps.get_changelog.outputs.CHANGELOG }}
prerelease: ${{ endsWith(steps.get_version.outputs.RELEASE_VERSION, '-beta') }}
files: |
Tautulli-windows-installer/Tautulli-windows-${{ steps.get_version.outputs.RELEASE_VERSION }}-x64.exe
Tautulli-macos-installer/Tautulli-macos-${{ steps.get_version.outputs.RELEASE_VERSION }}-universal.pkg
discord:
name: Discord Notification
needs: [build-installer, release]
if: always() && !contains(github.event.head_commit.message, '[skip ci]')
runs-on: ubuntu-latest
steps:
- name: Post Status to Discord
uses: sarisia/actions-status-discord@v1
with:
webhook: ${{ secrets.DISCORD_WEBHOOK }}
status: ${{ needs.build-installer.result == 'success' && 'success' || contains(needs.*.result, 'failure') && 'failure' || 'cancelled' }}
title: ${{ github.workflow }}
nofail: true

View file

@ -1,204 +0,0 @@
name: Publish Release
on:
push:
branches: [master, beta, nightly, python3]
tags: [v*]
jobs:
build-windows:
runs-on: windows-latest
steps:
- name: Checkout Code
uses: actions/checkout@v2
- name: Set Release Version
id: get_version
shell: bash
run: |
if [[ $GITHUB_REF == refs/tags/* ]]; then
VERSION_NSIS=${GITHUB_REF#refs/tags/v}.1
echo ::set-output name=VERSION_NSIS::${VERSION_NSIS/%-beta.1/.0}
echo ::set-output name=VERSION::${GITHUB_REF#refs/tags/v}
echo ::set-output name=RELEASE_VERSION::${GITHUB_REF#refs/tags/}
else
echo ::set-output name=VERSION_NSIS::0.0.0.0
echo ::set-output name=VERSION::0.0.0
echo ::set-output name=RELEASE_VERSION::${GITHUB_SHA::7}
fi
echo $GITHUB_SHA > version.txt
- name: Set Up Python
uses: actions/setup-python@v2
with:
python-version: 3.8
- name: Cache Dependencies
id: cache_dependencies
uses: actions/cache@v2
with:
path: ~\AppData\Local\pip\Cache
key: ${{ runner.os }}-pip-${{ hashFiles('package/requirements-windows.txt') }}
restore-keys: ${{ runner.os }}-pip-
- name: Install Dependencies
run: |
python -m pip install --upgrade pip
pip install -r package/requirements-windows.txt
- name: Build Package
run: |
pyinstaller -y ./package/Tautulli-windows.spec
- name: Create Installer
uses: joncloud/makensis-action@v1.2
with:
script-file: ./package/Tautulli.nsi
arguments: /DVERSION=${{ steps.get_version.outputs.VERSION_NSIS }} /DINSTALLER_NAME=..\Tautulli-windows-${{ steps.get_version.outputs.RELEASE_VERSION }}.exe
include-more-plugins: true
include-custom-plugins-path: package/nsis-plugins
- name: Upload Installer
uses: actions/upload-artifact@v2
with:
name: Tautulli-windows-installer
path: Tautulli-windows-${{ steps.get_version.outputs.RELEASE_VERSION }}.exe
- name: Post Status to Discord
uses: sarisia/actions-status-discord@v1
if: always()
with:
webhook: ${{ secrets.DISCORD_WEBHOOK }}
status: ${{ job.status }}
title: Build Windows Installer
nofail: true
build-macos:
runs-on: macos-latest
steps:
- name: Checkout Code
uses: actions/checkout@v2
- name: Set Release Version
id: get_version
shell: bash
run: |
if [[ $GITHUB_REF == refs/tags/* ]]; then
echo ::set-env name=VERSION::${GITHUB_REF#refs/tags/v}
echo ::set-output name=VERSION::${GITHUB_REF#refs/tags/v}
echo ::set-output name=RELEASE_VERSION::${GITHUB_REF#refs/tags/}
else
echo ::set-env name=VERSION::0.0.0
echo ::set-output name=VERSION::0.0.0
echo ::set-output name=RELEASE_VERSION::${GITHUB_SHA::7}
fi
echo $GITHUB_SHA > version.txt
- name: Set Up Python
uses: actions/setup-python@v2
with:
python-version: 3.8
- name: Cache Dependencies
id: cache_dependencies
uses: actions/cache@v2
with:
path: ~/Library/Caches/pip
key: ${{ runner.os }}-pip-${{ hashFiles('package/requirements-macos.txt') }}
restore-keys: ${{ runner.os }}-pip-
- name: Install Dependencies
run: |
python -m pip install --upgrade pip
pip install -r package/requirements-macos.txt
- name: Build Package
run: |
pyinstaller -y ./package/Tautulli-macos.spec
- name: Create Installer
run: |
sudo pkgbuild --install-location /Applications --version ${{ steps.get_version.outputs.VERSION }} --component ./dist/Tautulli.app --scripts ./package/macos-scripts Tautulli-macos-${{ steps.get_version.outputs.RELEASE_VERSION }}.pkg
- name: Upload Installer
uses: actions/upload-artifact@v2
with:
name: Tautulli-macos-installer
path: Tautulli-macos-${{ steps.get_version.outputs.RELEASE_VERSION }}.pkg
- name: Post Status to Discord
uses: sarisia/actions-status-discord@v1
if: always()
with:
webhook: ${{ secrets.DISCORD_WEBHOOK }}
status: ${{ job.status }}
title: Build MacOS Installer
nofail: true
release:
needs: [build-windows, build-macos]
if: startsWith(github.ref, 'refs/tags/') && always()
runs-on: ubuntu-latest
steps:
- name: Get Build Job Status
uses: technote-space/workflow-conclusion-action@v1
- name: Checkout Code
uses: actions/checkout@v2
- name: Set Release Version
id: get_version
run: |
echo ::set-output name=RELEASE_VERSION::${GITHUB_REF#refs/tags/}
- name: Download Windows Installer
if: env.WORKFLOW_CONCLUSION == 'success'
uses: actions/download-artifact@v2
with:
name: Tautulli-windows-installer
- name: Download MacOS Installer
if: env.WORKFLOW_CONCLUSION == 'success'
uses: actions/download-artifact@v2
with:
name: Tautulli-macos-installer
- name: Get Changelog
id: get_changelog
run: echo ::set-output name=CHANGELOG::"$( sed -n '/^## /{p; :loop n; p; /^## /q; b loop}' CHANGELOG.md | sed '$d' | sed '$d' | sed '$d' | sed ':a;N;$!ba;s/\n/%0A/g' )"
- name: Create Release
id: create_release
uses: actions/create-release@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
tag_name: ${{ steps.get_version.outputs.RELEASE_VERSION }}
release_name: Tautulli ${{ steps.get_version.outputs.RELEASE_VERSION }}
body: |
## Changelog
##${{ steps.get_changelog.outputs.CHANGELOG }}
draft: false
prerelease: ${{ endsWith(steps.get_version.outputs.RELEASE_VERSION, '-beta') }}
- name: Upload Windows Installer
if: env.WORKFLOW_CONCLUSION == 'success'
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ steps.create_release.outputs.upload_url }}
asset_path: ./Tautulli-windows-${{ steps.get_version.outputs.RELEASE_VERSION }}.exe
asset_name: Tautulli-windows-${{ steps.get_version.outputs.RELEASE_VERSION }}.exe
asset_content_type: application/vnd.microsoft.portable-executable
- name: Upload MacOS Installer
if: env.WORKFLOW_CONCLUSION == 'success'
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ steps.create_release.outputs.upload_url }}
asset_path: ./Tautulli-macos-${{ steps.get_version.outputs.RELEASE_VERSION }}.pkg
asset_name: Tautulli-macos-${{ steps.get_version.outputs.RELEASE_VERSION }}.pkg
asset_content_type: application/vnd.apple.installer+xml

78
.github/workflows/publish-snap.yml vendored Normal file
View file

@ -0,0 +1,78 @@
name: Publish Snap
on:
workflow_dispatch: ~
push:
branches: [master, beta, nightly]
tags: [v*]
jobs:
build-snap:
name: Build Snap Package (${{ matrix.architecture }})
runs-on: ubuntu-latest
if: ${{ !contains(github.event.head_commit.message, '[skip ci]') }}
strategy:
fail-fast: false
matrix:
architecture:
- amd64
- arm64
- armhf
steps:
- name: Checkout Code
uses: actions/checkout@v4
- name: Prepare
id: prepare
run: |
git fetch --prune --unshallow --tags
if [[ $GITHUB_REF == refs/tags/*-beta || $GITHUB_REF == refs/heads/beta ]]; then
echo "RELEASE=beta" >> $GITHUB_OUTPUT
elif [[ $GITHUB_REF == refs/tags/* || $GITHUB_REF == refs/heads/master ]]; then
echo "RELEASE=stable" >> $GITHUB_OUTPUT
else
echo "RELEASE=edge" >> $GITHUB_OUTPUT
fi
- name: Set Up QEMU
uses: docker/setup-qemu-action@v3
- name: Build Snap Package
uses: diddlesnaps/snapcraft-multiarch-action@master
id: build
with:
architecture: ${{ matrix.architecture }}
- name: Upload Snap Package
uses: actions/upload-artifact@v4
with:
name: Tautulli-snap-package-${{ matrix.architecture }}
path: ${{ steps.build.outputs.snap }}
- name: Review Snap Package
uses: diddlesnaps/snapcraft-review-tools-action@master
with:
snap: ${{ steps.build.outputs.snap }}
- name: Publish Snap Package
uses: snapcore/action-publish@v1
if: startsWith(github.ref, 'refs/tags/') || github.ref == 'refs/heads/nightly'
env:
SNAPCRAFT_STORE_CREDENTIALS: ${{ secrets.SNAP_LOGIN }}
with:
snap: ${{ steps.build.outputs.snap }}
release: ${{ steps.prepare.outputs.RELEASE }}
discord:
name: Discord Notification
needs: build-snap
if: always() && !contains(github.event.head_commit.message, '[skip ci]')
runs-on: ubuntu-latest
steps:
- name: Post Status to Discord
uses: sarisia/actions-status-discord@v1
with:
webhook: ${{ secrets.DISCORD_WEBHOOK }}
status: ${{ needs.build-snap.result == 'success' && 'success' || contains(needs.*.result, 'failure') && 'failure' || 'cancelled' }}
title: ${{ github.workflow }}
nofail: true

27
.github/workflows/pull-requests.yml vendored Normal file
View file

@ -0,0 +1,27 @@
name: Pull Requests
on:
pull_request_target:
types: [opened, synchronize, edited, reopened]
jobs:
check-branch:
name: Check Pull Request
runs-on: ubuntu-latest
steps:
- name: Checkout Code
uses: actions/checkout@v4
- name: Comment on Pull Request
uses: mshick/add-pr-comment@v2
if: github.base_ref != 'nightly'
with:
message: Pull requests must be made to the `nightly` branch. Thanks.
repo-token: ${{ secrets.GITHUB_TOKEN }}
- name: Fail Workflow
if: github.base_ref != 'nightly'
run: |
echo Base: "$GITHUB_BASE_REF"
echo Head: "$GITHUB_HEAD_REF"
exit 1

44
.github/workflows/submit-winget.yml vendored Normal file
View file

@ -0,0 +1,44 @@
name: Submit winget
on:
workflow_dispatch: ~
release:
types: [published]
jobs:
winget:
name: Submit Winget Package
runs-on: windows-latest
if: ${{ !github.event.release.prerelease }}
steps:
- name: Sync Winget Fork
run: gh repo sync ${{ secrets.WINGET_USERNAME }}/winget-pkgs -b master
env:
GH_TOKEN: ${{ secrets.WINGET_TOKEN }}
- name: Submit package to Windows Package Manager Community Repository
run: |
$wingetPackage = "Tautulli.Tautulli"
$gitToken = "${{ secrets.WINGET_TOKEN }}"
$github = Invoke-RestMethod -uri "https://api.github.com/repos/Tautulli/Tautulli/releases/latest"
$installerUrl = $github | Select -ExpandProperty assets -First 1 | Where-Object -Property name -match "Tautulli-windows-.*-x64.exe" | Select -ExpandProperty browser_download_url
$version = "$($github.tag_name.Trim('v')).1"
# getting latest wingetcreate file
iwr https://aka.ms/wingetcreate/latest -OutFile wingetcreate.exe
.\wingetcreate.exe update $wingetPackage -s -v $version -u $installerUrl -t $gitToken
virus-total:
name: VirusTotal Scan
runs-on: ubuntu-latest
steps:
- name: Upload to VirusTotal
uses: crazy-max/ghaction-virustotal@v4
with:
vt_api_key: ${{ secrets.VT_API_KEY }}
github_token: ${{ secrets.GHACTIONS_TOKEN }}
update_release_body: true
files: |
.exe$
.pkg$

23
.gitignore vendored
View file

@ -1,6 +1,7 @@
# Compiled source #
###################
__pycache__
*.pyc
*.py~
*.pyproj
@ -14,13 +15,22 @@
*.ini
release.lock
version.lock
lib/*.dist-info
lib/*.egg-info
lib/*.pth
lib/*/*.pyd
lib/_distutils_hack
lib/pkg_resources
lib/setuptools
logs/*
backups/*
cache/*
exports/*
newsletters/*
*.mmdb
version.txt
branch.txt
.TEST
# HTTPS Cert/Key #
##################
@ -43,6 +53,9 @@ Thumbs.db
#Ignore files generated by PyCharm
*.idea/*
#Ignore files generated by VSCode
*.vscode/*
#Ignore files generated by vi
*.swp
@ -63,7 +76,6 @@ Thumbs.db
*.bak
*.cache
*.ilk
*.log
[Bb]in
[Dd]ebug*/
*.lib
@ -80,3 +92,12 @@ _ReSharper*/
#Ignore files generated by pyinstaller
/build
/dist
#snapcraft specifics
/parts/
/stage/
/prime/
*.snap
.snapcraft
*_source.tar.bz2
snap/.snapcraft

2894
API.md

File diff suppressed because it is too large Load diff

View file

@ -1,5 +1,971 @@
# Changelog
## v2.15.3 (2025-08-03)
* Exporter:
* New: Added hearingImpaired for subtitles and visualImpaired for audio attributes to exporter fields.
* Graphs:
* Fix: Remove duplicate "Total" entry in graph tooltips. (Thanks @zdimension) (#2534)
* UI:
* Fix: Failing to retrieve collections / playlists with over 1000 items.
* Fix: Scrollbar not showing on macosx and webkit browsers. (#2221)
* Fix: Incorrect rounding of minutes in global stats play duration.
* Fix: Disable browser autocomplete for notification agent and newsletter agent configurations. (#2557)
* API:
* New: Added ability to return svg files using pms_image_proxy API command.
* Other:
* New: Added ability to set config values using environment variables. (Thanks @komuw) (#2309, #2543)
## v2.15.2 (2025-04-12)
* Activity:
* New: Added link to library by clicking media type icon.
* New: Added stream count to tab title on homepage. (#2517)
* History:
* Fix: Check stream watched status before stream stopped status. (#2506)
* Notifications:
* Fix: ntfy notifications failing to send if provider link is blank.
* Fix: Check Pushover notification attachment is under 5MB limit. (#2396)
* Fix: Track URLs redirecting to the correct media page. (#2513)
* New: Added audio profile notification parameters.
* New: Added PATCH method for Webhook notifications.
* Graphs:
* New: Added Total line to daily streams graph. (Thanks @zdimension) (#2497)
* UI:
* Fix: Do not redirect API requests to the login page. (#2490)
* Change: Swap source and stream columns in stream info modal.
* Other:
* Fix: Various typos. (Thanks @luzpaz) (#2520)
* Fix: CherryPy CORS response header not being set correctly. (#2279)
## v2.15.1 (2025-01-11)
* Activity:
* Fix: Detection of HDR transcodes. (Thanks @cdecker08) (#2412, #2466)
* Newsletters:
* Fix: Disable basic authentication for /newsletter and /image endpoints. (#2472)
* Exporter:
* New: Added logos to season and episode exports.
* Other:
* Fix: Docker container https health check.
## v2.15.0 (2024-11-24)
* Notes:
* Support for Python 3.8 has been dropped. The minimum Python version is now 3.9.
* Notifications:
* New: Allow Telegram blockquote and tg-emoji HTML tags. (Thanks @MythodeaLoL) (#2427)
* New: Added Plex slug and Plex Watch URL notification parameters. (#2420)
* Change: Update OneSignal API calls to use the new API endpoint for Tautulli Remote App notifications.
* Newsletters:
* Fix: Dumping custom dates in raw newsletter json.
* History:
* Fix: Unable to fix match for artists. (#2429)
* Exporter:
* New: Added movie and episode hasVoiceActivity attribute to exporter fields.
* New: Added subtitle canAutoSync attribute to exporter fields.
* New: Added logos to the exporter fields.
* UI:
* New: Add friendly name to the top bar of config modals. (Thanks @peagravel) (#2432)
* API:
* New: Added plex slugs to metadata in the get_metadata API command.
* Other:
* Fix: Tautulli failing to start with Python 3.13. (#2426)
## v2.14.6 (2024-10-12)
* Newsletters:
* Fix: Allow formatting newsletter date parameters.
* Change: Support apscheduler compatible cron expressions.
* UI:
* Fix: Round runtime before converting to human duration.
* Fix: Make recently added/watched rows touch scrollable.
* Other:
* Fix: Auto-updater not running.
## v2.14.5 (2024-09-20)
* Activity:
* Fix: Display of 2k resolution on activity card.
* Notifications:
* Fix: ntfy notifications with special characters failing to send.
* Other:
* Fix: Memory leak with database closing. (#2404)
## v2.14.4 (2024-08-10)
* Notifications:
* Fix: Update Slack notification info card.
* New: Added ntfy notification agent. (Thanks @nwithan8) (#2356, #2000)
* UI:
* Fix: macOS platform capitalization.
* Other:
* Fix: Remove deprecated getdefaultlocale. (Thanks @teodorstelian) (#2364, #2345)
## v2.14.3 (2024-06-19)
* Graphs:
* Fix: History table not loading when clicking on the graphs in some instances.
* UI:
* Fix: Scheduled tasks table not loading when certain tasks are disabled.
* Removed: Unnecessary Remote Server checkbox from the settings page.
* Other:
* Fix: Webserver not restarting after the setup wizard.
* Fix: Workaround webserver crashing in some instances.
## v2.14.2 (2024-05-18)
* History:
* Fix: Live TV activity not logging to history.
* Fix: Incorrect grouping of live TV history.
* Notifications:
* Fix: Pushover configuration settings refreshing after entering a token.
* Fix: Plex remote access down notifications not triggering.
* Fix: Deleting all images from Cloudinary only deleting 1000 images.
* New: Added platform version and product version notification parameters. (#2244)
* New: Added LAN streams and WAN streams notification parameters. (#2276)
* New: Added Dolby Vision notification parameters. (#2240)
* New: Added live TV channel notification parameters.
* Change: Improved Tautulli Remote App notification encryption method.
* Note: Requires Tautulli Remote App version 3.2.4.
* Exporter:
* New: Added slug attribute to exporter fields.
* New: Added track genres to exporter fields.
* New: Added playlist source URI to exporter fields.
* New: Added artProvider and thumbProvider to exporter fields.
* UI:
* Fix: Mask deleted usernames in the logs.
* Fix: Live TV watch stats not showing on the media info page.
* Fix: Users without access to Plex server not showing as inactive.
* Removed: Deprecated synced item pages.
* Removed: Anonymous redirect settings. Links now use browser no-referrer policy instead.
* API:
* New: Added Dolby Vision info to the get_metadata API command.
* New: Added before and after parameters to the get_home_stats API command. (#2231)
* Packages:
* New: Universal binary for macOS for Apple silicon.
* New: Bump Snap package to core22.
* Other:
* Change: Login cookie expires changed to max-age.
* Change: Improved key generation for login password. It is recommended to reenter your HTTP Password in the settings after upgrading.
* Removed: Python 2 compatibility code. (#2098, #2226) (Thanks @zdimension)
## v2.13.4 (2023-12-07)
* UI:
* Fix: Tautulli configuration settings page not loading when system language is None.
* Fix: Login cookie expiring too quickly.
## v2.13.3 (2023-12-03)
* Notifications:
* New: Added duration_time notification parameter.
* New: Added file_size_bytes notification parameter.
* New: Added time formats notification text modifiers.
* New: Added support for thetvdb_url for movies.
* UI:
* Fix: Activity card overflowing due to screen scaling. (#2033)
* Fix: Stream duration on activity card not being updated on track changes in some cases. (#2206)
## v2.13.2 (2023-10-26)
* History:
* New: Added quarter values icons for history watch status. (#2179, #2156) (Thanks @herby2212)
* Graphs:
* New: Added concurrent streams per day graph. (#2046) (Thanks @herby2212)
* Exporter:
* New: Added metadata directory to exporter fields.
* Removed: Banner exporter fields for tv shows.
* UI:
* New: Added last triggered time to notification agents and newsletter agent lists.
* Other:
* New: Added X-Plex-Language header override to config file.
## v2.13.1 (2023-08-25)
* Notes:
* Support for Python 3.7 has been dropped. The minimum Python version is now 3.8.
* Other:
* Fix: Tautulli failing to start on some systems.
## v2.13.0 (2023-08-25)
* Notes:
* Support for Python 3.7 has been dropped. The minimum Python version is now 3.8.
* Notifications:
* Fix: Improved watched notification trigger description. (#2104)
* New: Added notification image option for iOS Tautulli Remote app.
* Exporter:
* New: Added track chapter export fields.
* New: Added on-demand subtitle export fields.
## v2.12.5 (2023-07-13)
* Activity:
* New: Added d3d11va to list of hardware decoders.
* History:
* Fix: Incorrect grouping of play history.
* New: Added button in settings to regroup play history.
* Notifications:
* Fix: Incorrect concurrent streams notifications by IP addresss for IPv6 addresses (#2096) (Thanks @pooley182)
* UI:
* Fix: Occasional UI crashing on Python 3.11.
* New: Added multiselect user filters to History and Graphs pages. (#2090) (Thanks @zdimension)
* API:
* New: Added regroup_history API command.
* Change: Updated graph API commands to accept a comma separated list of user IDs.
## v2.12.4 (2023-05-23)
* History:
* Fix: Set view offset equal to duration if a stream is stopped within the last 10 sec.
* Other:
* Fix: Database import may fail for some older databases.
* Fix: Double-quoted strings for newer versions of SQLite. (#2015, #2057)
* API:
* Change: Return the ID for async API calls (export_metadata, notify, notify_newsletter).
## v2.12.3 (2023-04-14)
* Activity:
* Fix: Incorrect subtitle decision shown when subtitles are transcoded.
* History:
* Fix: Incorrect order when sorting by the duration column in the history tables.
* Notifications:
* Fix: Logging error when running scripts that use PlexAPI.
* UI:
* Fix: Calculate file sizes setting causing the media info table to fail to load.
* Fix: Incorrect artwork and thumbnail shown for Live TV on the Most Active Libraries statistics card.
* API:
* Change: Renamed duration to play_duration in the get_history API response. (Note: duration kept for backwards compatibility.)
## v2.12.2 (2023-03-16)
* Other:
* Fix: Tautulli not starting on FreeBSD jails.
## v2.12.1 (2023-03-14)
* Activity:
* Fix: Stop checking for deprecated sync items sessions.
* Change: Do not show audio language on activity cards for music.
* Other:
* Fix: Tautulli not starting on macOS.
## v2.12.0 (2023-03-13)
* Notifications:
* New: Added support for Telegram group topics. (#1980)
* New: Added anidb_id and anidb_url notification parameters. (#1973)
* New: Added notification triggers for Intro Marker, Commercial Marker, and Credits Marker.
* New: Added various intro, commercial, and credits marker notification parameters.
* New: Allow setting a custom Pushover notification sound. (#2005)
* Change: Notification images are now uploaded directly to Discord without the need for a 3rd party image hosting service.
* Change: Automatically strip whitespace from notification condition values.
* Change: Trigger watched notifications based on the video watched completion behaviour setting.
* Exporter:
* Fix: Unable to run exporter when using the Snap package. (#2007)
* New: Added credits marker, and audio/subtitle settings to export fields.
* UI:
* Fix: Incorrect styling and missing content for collection media info pages.
* New: Added edition details field on movie media info pages. (#1957) (Thanks @herby2212)
* New: Added setting to change the video watched completion behaviour.
* New: Added watch time and user statistics to collection and playlist media info pages. (#1982, #2012) (Thanks @herby2212)
* New: Added history table to collection and playlist media info pages.
* New: Dynamically change watched status in the UI based on video watched completion behaviour setting.
* New: Added hidden setting to override server name.
* Change: Move track artist to a details field instead of in the title on track media info pages.
* API:
* New: Added section_id and user_id parameters to get_home_stats API command. (#1944)
* New: Added marker info to get_metadata API command results.
* New: Added media_type parameter to get_item_watch_time_stats and get_item_user_stats API commands. (#1982) (Thanks @herby2212)
* New: Added last_refreshed timestamp to get_library_media_info API command response.
* Other:
* Change: Migrate analytics to Google Analytics 4.
## v2.11.1 (2022-12-22)
* Activity:
* Fix: Use source language instead of stream language on activity cards.
* Notifications:
* Fix: Blank start time notification parameters causing recently added notifications to fail. (#1940)
* Other:
* Fix: Tautulli failing to start when using python 3.7.
* Fix: Snap install failing to start. (#1941)
* Fix: Update check crashing when git is missing. (#1943) (Thanks @Minituff)
## v2.11.0 (2022-12-22)
* Activity:
* New: Added audio and subtitle language to activity cards. (#1831, #1900) (Thanks @fscorrupt)
* History:
* New: Log subtitle language and subtitle forced to database. (#1826)
* Notifications:
* Fix: Validating condition operators would fail with a blank parameter.
* New: Added start time and stop time notification parameters. (#1931)
* New: Added session_key to LunaSea notification payload. (#1929) (Thanks @JagandeepBrar)
* Newsletters:
* Fix: Allow CSS to support light and dark themes.
* Exporter:
* New: Added editionTitle to movie exporter fields.
* Change: m3u8 export changed to .m3u file extension. File is still encoded using UTF-8.
* UI:
* Fix: Link watch statistics to media page using metadata from history. (#1882)
* New: Show subtitle language and subtitle forced flag in stream data modal.
* Other:
* Fix: Mask more user and metadata fields for guest access. (#1913)
* Change: Disable TLS 1.0 and 1.1 for the webserver. Minimum TLS version is 1.2. (#1870)
* Change: Use system language for requests to Plex Media Server.
## v2.10.5 (2022-11-07)
* Notifications:
* New: Added edition_title notification parameter. (#1838)
* Change: Track notifications link to MusicBrainz track instead of album.
* Newsletters:
* New: Added months time frame for newsletters. (#1876)
* UI:
* Fix: Broken link on library statistic cards. (#1852)
* Fix: Check for IPv6 host when generating QR code for app registration.
* Fix: Missing padding on condition operator dropdown on small screens.
* Other:
* Fix: Launching browser when webserver is bound to IPv6.
* New: Tautulli can be installed via the Windows Package Manager (winget).
* Change: Separate stdout and stderr console logging. (#1874)
* API:
* Fix: API not returning 400 response code.
* New: Added edition_title to get_metadata API response.
* New: Added collections to get_children_metadata API response.
* New: Added user_thumb to get_history API response.
* New: Validate custom notification conditions before saving notification agents. (#1846)
* Change: Fallback to parent_thumb for seasons in get_metadata API response.
## v2.10.4 (2022-09-05)
* Activity:
* New: Added tooltip for quality profile on activity cards.
* Notifications:
* New: Added "does not begin with" and "does not end with" condition operators.
* UI:
* Fix: Album count showing 0 on library statistics.
* Fix: Library statistics not showing up for libraries without any history.
## v2.10.3 (2022-08-09)
* Notifications:
* New: Added JSON support for MQTT notifications. (#1763)
* New: Added show year notification parameter.
* Exporter:
* New: Added guids to artist, album, and track metadata export fields.
* New: Added languageTag to stream media info export fields.
* UI:
* Fix: Long channel identifier overflowing activity card. (#1802)
* Change: Use the last played item's artwork for library statistics cards.
* Other:
* Fix: Username log filter causing database to lock up. (#1705)
* Change: Username log filter only applies to usernames longer than 3 characters. (#1806)
* API:
* New: Added parent_year and grandparent_year to get_metadata_details API command.
* New: Added last played metadata to top_libraries and top_users in get_home_stats API command.
* New: Allow fallback to another PMS image in pms_image_proxy API command.
## v2.10.2 (2022-07-03)
* Activity:
* Fix: Incorrect audio stream info shown on the activity card when playing a secondary audio track.
* UI:
* Fix: Usernames not showing on the home statistics cards.
* Fix: Do not save a user's friendly name if it is the same as the username.
* Change: Update library icons to the latest Plex style.
## v2.10.1 (2022-06-01)
* Notifications:
* New: Added support for MusicBrainz (mbid://) guids in notification parameters without MusicBrainz lookup enabled. Requires Plex Media Server 1.27.0 or newer with refreshed Plex Music agent metadata.
* Mobile App:
* Fix: OneSignal validation failing when registering a device.
* API:
* New: Added grandparent_guids and parent_guids to get_metadata API command.
* Change: Updated continent in get_geoip_lookup API command.
* Change: Removed server_token from from get_users API command.
* Change: shared_libraries changed to a list instead of a string for get_users API command.
## v2.10.0 (2022-05-23)
* Activity:
* Fix: Detection of Dolby Vision missing for PMS 1.26.1.
* Notifications:
* Fix: Parsing of filename notification parameter incorrect for Windows PMS.
* Exporter:
* New: Added additional theme and label export fields.
* UI:
* Fix: Slow loading of collections and playlists tables.
* Change: Update default user thumbnail image to match Plex Web.
* API:
* Change: Values for get_users_table and get_libraries_table return an integer instead of "Checked".
## v2.9.7 (2022-04-11)
* UI:
* Fix: Managed user missing the username in the Users table.
## v2.9.6 (2022-04-10)
* Activity:
* New: Improved display of dynamic range on the activity cards. (Thanks @herby2212)
* Notifications:
* Change: Make include summary option apply to all media types for Discord and Slack notifications.
* UI:
* Fix: Validating Plex login in the setup wizard. (#1697)
* New: Added hidden username, email, and full name columns to users table.
* Other:
* Fix: Apply pms_timeout setting to websocket connection.
* Fix: Importing of Plex username instead of the full name. (#1710)
## v2.9.5 (2022-03-26)
* Note:
* Updated Snap packages are currently unavailable due to an upstream issue.
* Activity:
* Change: Improve calculation for transcode progress bar percentage on the activity cards.
* History:
* Fix: Live TV history filter not working. (#1691)
* Newsletter:
* Fix: Newsletter not showing different album types. (#1559)
* UI:
* Fix: Display season summary on the media info page if available with a fallback to show summary. (#1657)
* Change: Colour active filter buttons to improve contrast. (#1663)
* API:
* New: Added transcode offset keys to get_activity command.
* Other:
* Fix: Reschedule backup task after changing backup interval. (#1662)
* Fix: Dynamic anonymous redirect setting not being enabled by default after the setup wizard.
* Fix: Usernames with special characters not being filtered in the logs.
## v2.9.4 (2022-02-12)
* UI:
* Fix: Setup wizard appearing when restarting after saving settings.
* Other:
* Fix: Stop Tautulli from starting multiple instances on Windows after a clean reinstall. Check the startup items in Windows Task Manager if it is still occurring.
## v2.9.3 (2022-02-09)
* UI:
* Fix: Setup wizard looping.
* Other:
* Fix: Logger username masking preventing Tautulli from starting on new installs.
## v2.9.2 (2022-02-08)
* Notification:
* New: Added support for additional Telegram HTML tags.
* Removed: Revert Telegram defaulting to MarkdownV2 and only support HTML. (#1635)
* Other:
* Fix: The Local user being masked in the logs.
## v2.9.1 (2022-02-07)
* Other:
* Fix: Incorrect changelog version number and date.
## v2.9.0 (2022-02-07)
* Notification:
* New: Added track disc number notification parameter.
* Change: Default Telegram messages to MarkdownV2 when HTML is disabled. (#1635)
* Exporter:
* Fix: Images not being included in export zip file download.
* UI:
* Fix: Favicon missing from the newsletter authentication page.
* Fix: IPv6 details not being shown in IP address modal. (#1629)
* Fix: PWA not respecting device rotation settings. (#1633)
* New: Added intermediary login page to the Plex XML shortcuts.
* New: Added setting to mask usernames in logs (enabled by default).
* New: Added location, secure connection, and Plex Relay details to IP address modal.
* Change: Remove Plex token from the settings page.
* Change: Increase verifying server timeout to 30 seconds.
* API:
* New: Added get_tautulli_info API command.
* New: Added location, secure, and relayed to get_history API response.
* Change: Null pms_token and jwt_token in the response of the get_settings API command. (#1616)
* Other:
* Fix: Better validation of config when saving settings.
* Fix: Correct section_id and prevent rating_key collisions when updating metadata. (#1640)
* Change: Proxy Plex token check and Plex downloads json through the Tautulli server.
* Change: Remove tokens from downloaded database and config files.
* Change: Do not import pms_token or jwt_secret when importing a config file.
## v2.8.1 (2022-01-04)
* API:
* New: Added grouping and query_days parameters to the get_item_watch_time_stats API command.
* New: Added grouping parameter to the get_item_user_stats API command.
* New: Added total_time to the get_library_user_stats, get_user_player_stats, and get_item_user_stats API command responses.
* Removed: media_type parameter no longer required for the get_item_watch_time_stats, and get_item_user_stats API commands. The media type is determined automatically.
* Other:
* Fix: Clean .pyc files automatically after updating.
* New: Allow Snap package to access /media and /mnt locations. Refer to the FAQ for instructions on how to enable access.
## v2.8.0 (2021-12-15)
* History:
* Fix: Live TV history filter not working correctly when combined with other filters.
* Fix: Direct Stream history filter not remembering the state when reloading the page.
* Fix: History table not loading when no filters are selected.
* New: Added watch time and user stats to media info pages. (Thanks @herby2212) (#1417, #1471)
* Notifications:
* New: Added Microsoft Teams notification agent. (#1514)
* New: Added Gotify notification agent. (#1584)
* New: Add warning message that passwords are not copied when duplicating a notification or newsletter agent. (#1540)
* Newsletters:
* Fix: Different album types not shown on newsletter. (#1559)
* Exporter:
* New: Added album formats, subformats, and sonic analysis export fields.
* UI:
* Fix: Docker config volume message overlapping modal windows. (#1567)
* Fix: Different album types not shown on artist media info page.
* New: Added show more/less toggle for summaries on media info pages. (#1546)
* Change: Do not save datatable page or search states when reloading the page. (#1532)
* Change: Improve the Plex log reader.
* API:
* New: Added before and after parameters to the get_history API command.
* Other:
* Fix: Updated Python dependencies. (#1499)
* Fix: Some websocket connections not respecting the verify SSL setting. (Thanks @nmaggioni) (#1541)
* New: Support for Python 3.10. (#1522)
* New: Added dynamic anonymous redirect service setting. (#1526)
## v2.7.7 (2021-10-14)
* Notifications:
* Fix: Colons and exclamation marks being replaced outside of expressions.
* New: Added LunaSea notification agent. Note: Requires a future LunaSea app update to function.
* Newsletters:
* Fix: Star rating not showing on newsletter with the new Plex metadata agents. (#1511)
* UI:
* Fix: Sorting of mobile devices table with uppercase and lowercase device names.
* Fix: Various dropdown menus with centered text to left-aligned text.
* Other:
* Fix: Plex.tv account token not changing when fetching a new token.
* New: Added check and warning message for missing Docker container volume mount.
## v2.7.6 (2021-08-31)
* Notifications:
* Fix: Unable to parse colons (:) and exclamation marks (!) in notification text eval strings.
* Exporter:
* Fix: Unable to export playlists and collections from a library. (#1484)
* New: Added new episode export fields.
* Mobile App:
* Fix: Unable to scan QR code with dark mode enabled.
* New: Tautulli Remote App is out of beta for iOS and can be downloaded in the App Store.
* Other:
* New: Update PlexAPI to 4.6.3.
* New: Added popup alert message for Windows and macOS when Tautulli fails to start.
## v2.7.5 (2021-07-15)
* History:
* Fix: Guest users were unable to view history.
* Fix: Most Active Library statistics was counting deleted libraries.
* Newsletters:
* Fix: Incorrect padding on the newsletter configuration modal.
* Mobile App:
* New: Tautulli Remote App is out of beta on Android. The iOS app is available for beta testing on TestFlight.
* API:
* New: Added mobile device platform and version to device registration.
* Other:
* Fix: Unable to remove authentication.
* Change: Improve API key and device token security on Python 3.
* Remove: Basic Authentication setting.
## v2.7.4 (2021-06-19)
* Activity:
* Fix: Incorrect quality profile shown on the activity card.
* Notifications:
* New: Added ability to evaluate Python expressions in notification parameters.
* New: Added tilde (~) to represent blank notification condition values.
* Exporter:
* Fix: Blank fields missing from csv and json exports.
* New: Added some new exporter fields.
* Graphs:
* Fix: Play counts and durations not matching the homepage statistics.
* UI:
* New: Show search bar in the collapsed menu on the mobile layout. (#1446)
* Change: Do not show seconds for total played duration on Users and Libraries tables.
* Other:
* Fix: Check the Tautulli data folder is writable on startup. (#1441)
* New: Update PlexAPI to 4.6.1.
* Change: Always hash HTTP password in config file.
## v2.7.3 (2021-05-22)
* Activity:
* Fix: Incorrect quality profile being shown when transcoding to a higher bitrate.
* Notifications:
* New: Added notification parameters for duration values in seconds. (#1434)
* New: Added setting to allow repeat Tautulli update notifications. By default the Tautulli update notification will only notify once.
* New: Added setting to allow repeat Plex Media Server update notifications. By default the Plex Media Server update notification will only notify once.
* New: Added setting to configure the Tautulli update check interval.
* UI:
* Fix: Prevent accidentally closing modals when dragging the mouse outside the window.
* Fix: Recently added queue modal not loading. (#1429)
* New: Show collections tab in music libraries. (#1421)
* New: Added method to logout of active Tautulli sessions from the login logs.
* API:
* Fix: Update edit_user and edit_library doc strings for required parameters. (#1432)
* Other:
* New: Added advanced hidden setting for CherryPy thread pool size. (Thanks @psaab #1425)
## v2.7.2 (2021-04-24)
* UI:
* New: Show smart collections in the library collections tab.
## v2.7.1 (2021-04-22)
* Notifications:
* Fix: Recently added single episode being sent as a show notification. (#1420)
* Newsletters:
* Change: Ignore items with incorrect added at dates in the future.
* Exporter:
* Fix: Exporting not working for libraries, collections, and playlists. (#1408)
* UI:
* Fix: Collections and playlist tabs not loading on library and user pages. (#1408)
* Fix: Header overlapping graphs tabs on mobile layout.
* Change: Rename "Plays by Period" graph tab to "Media Type".
* Removed: Clear logs button removed from main Tautulli logs.
## v2.7.0 (2021-04-10)
* History:
* New: Added transcode decision filter added to history tables.
* New: History table filters changed to allow multiple selections.
* Notifications:
* Fix: Recently added notifications failing due to metadata not being available yet on the Plex server. (#1392)
* New: Added separate SSL/TLS support for Email notifications.
* New: Added notification image type setting for Tautulli Remote App notifications.
* New: Added guid notification parameter.
* New: Added a Plex server down notification threshold setting.
* Newsletters:
* Fix: Newsletters would fail if an episode was missing a season number.
* UI:
* Fix: Fixed spacing of rating images on the media info pages.
* Fix: Fixed refreshing cached image in the browser.
* Fix: Bootstrap tooltips logging javascript errors in some instances.
* Fix: Activity card progress bar not filling at 100%. (#1404)
* New: Added blurred background to the Most Active Users statistics card.
* New: Added transcode decision filter for all history tables.
* New: Added an error popup message if the Plex.tv token is no longer valid when visiting the settings page.
* New: Added Amazon Alexa platform logo.
* Change: Improved loading times for the homepage watch statistics.
* Change: Improved loading times for user and library watch time statistics.
* Change: Improved loading of the graph's history modal popup.
* Change: Automatically trim trailing slashes from the Tautulli Public Domain setting.
* Change: Renamed the Plex Media Server "Use SSL" setting to "Use Secure Connection".
* Change: Update Microsoft Edge platform logo.
* Change: Consider link local IP addresses as local addresses.
* Change: Reveal token fields if they are blank to make it easier to input new values.
* Mobile App:
* New: Accept disabled OneSignal ID during device registration.
* API:
* New: Added user fallback image option to the pms_image_proxy command.
* New: Added optional include_last_seen parameter to the get_user command.
* New: Added optional include_last_accessed parameter to the get_library command.
* New: Allow comma separated filter values for the get_history command.
* Other:
* Fix: Importing the newsletter table would fail when manually repairing a corrupted database.
* Fix: Make fix match in Tautulli for music case-insensitive.
* New: Update PlexAPI to 4.5.2.
* Change: Migrate section_id from the session_history_metadata database table to session_history.
* Change: Copy the database file to the cache folder when importing a database using the browse option.
* Change: Delete the cached database file after successfully importing.
## v2.6.10 (2021-03-17)
* Other:
* Fix: Configuration upgrade would fail if the Most Active User card was disabled. (#1395)
## v2.6.9 (2021-03-17)
* Notifications:
* New: Added tautulli_update_exe and tautulli_update_exe notification parameters for Tautulli update notifications.
* Exporter:
* New: Added new TV show export fields for the beta Plex TV agent.
* UI:
* Fix: Some popover images not showing up on hover. (#1391)
* Remove: HTTP Host setting removed from the UI. This setting may still be changed in the config file.
* New: Added a Most Active Libraries statistics card to the homepage. (Thanks @herby2212)
* New: Mask sensitive text fields in the settings. Settings can be revealed by clicking on the eye icon.
* Mobile App:
* Change: Make OneSignal validation asynchronous to help timeout issues when registering a device.
* API:
* Added top_libraries stat_id option to get_home_stats API commaand.
* Ohter:
* New: Updated PlexAPI to 4.4.1.
## v2.6.8 (2021-03-08)
* Mobile App:
* New: An all new Tautulli Remote App 2.0. Go to the Google Play link in the settings to download the new version.
* Fix: Registering the new app would fail if OneSignal is blocked.
## v2.6.7 (2021-03-07)
* History:
* New: Added audio language to detailed stream info. (Thanks @herby2212)
* Notifications:
* New: Added season_name notification parameter.
* New: Update notifications to support custom season titles.
* Newsletters:
* New: Update recently added newsletter template to support custom season titles.
* Exporter:
* New: Added originalTitle and bannerFile to TV show export fields.
* UI:
* New: Added TVDB rating image to info page for the new Plex TV agent.
* New: Update the UI to support custom season titles.
* API:
* Fix: Return rating key for collections/playlists in get_synced_items.
* Fix: Return error when delete_synced_item fails.
* New: Return sync_media_type for collections/playlist in get_synced_items.
* New: Update pms_image_proxy to support playlist composite images.
* Other:
* Remove: Auto-updater for the Windows exe installer due to it being flagged by antivirus software.
* New: Updated PlexAPI to 4.4.0.
## v2.6.6 (2021-02-06)
* Exporter:
* Fix: Exporting failed with long file paths on Windows.
* New: Updated various exporter fields.
* Change: Renamed collection children to collection items.
* UI:
* Fix: Client side login redirect changed to server side.
* Change: Renamed "Fix Metadata" button to "Fix Match".
* API:
* New: Added get_children_metadata API command.
* New: Return more metadata from the get_home_stats API command.
* Other:
* New: Updated PlexAPI to 4.3.1.
## v2.6.5 (2021-01-09)
* Other:
* Fix: Some IP addresses not being masked in the logs.
* New: Auto-updater for Windows exe installer.
* Change: Allow Snap package to access the user home directory.
* Change: Migrate Snap user data to a persistent location that is retained if Tautulli is reinstalled.
## v2.6.4 (2020-12-20)
* Other:
* Fix: Restore Snap data folder from previous installs.
## v2.6.3 (2020-12-19)
* Announcements:
* This is the last Tautulli version to support Python 2. Python 3 will be required to continue receiving updates. You can check your Python version on the settings page.
* Exporter:
* Fix: Accessible and exists attributes were blank for media info export level 9.
* UI:
* Fix: Guest usernames were not masked on mouse hover.
* Other:
* Fix: macOS menu bar icon for light and dark mode.
* New: Tautulli can officially be installed on Linux using a Snap package. See the installation wiki for details.
## v2.6.2 (2020-12-05)
* Notifications:
* Change: Send a notification of a user new device for the first time only. This can be toggled off in the settings.
* Exporter:
* Fix: Allow exporting child fields only without requiring the parent fields as well.
* Fix: Exporting individual collection would fail.
* Change: Remove accessible and exists fields from the default media info export levels. This prevents the Plex server from reading the media files unnecessarily.
* Other:
* Fix: Enable high resolution for the macOS system tray icon and menu.
* New: Added rate limiting for failed login attempts.
* Change: Use a white logo for the macOS system tray icon.
* API:
* New: Added machine_id to the get_history API response.
## v2.6.1 (2020-11-03)
* Other:
* Fix: High CPU/memory usage in some instances.
* Fix: Logger error preventing Tautulli from starting.
* Fix: Database issue with non-unique image hashes.
## v2.6.0 (2020-10-31)
* Exporter:
* New: New exporter feature that allows you to export the metadata and images for any library, collection, playlist, or media item to csv, json, xml, or m3u8. Refer to the Exporter Guide in the wiki for more details.
* UI:
* Fix: Margin on the homepage activity and statistic/library cards. (Thanks @dotsam)
* Fix: Movie ratings not showing on the info page for the new Plex Movie agent.
* New: Added ability to browse collections and playlists from the library and user pages.
* Change: Updated platform brand logos and colours.
* API:
* New: Added export_metadata, download_export, and delete_export API commands.
* New: Added get_collections_table, and get_playlists_table API commands.
* New: Added min_version parameter to the register_device API command.
* New: Added include_activity parameter to the get_history API command.
* New: Added sync_id parameter to the get_metadata API command.
* New: Added delete_synced_item API command.
* New: Added a stat_id and stats_start parameters to the get_home_stats API command.
* New: Allow deleting a mobile device using the registration device_id for the delete_mobile_device API command.
* Change: Return Plex server info and Tautulli info from the register_device command.
* Other:
* New: The Docker container is now also built for the arm32v6 architecture.
* New: The Docker container is also published to the GitHub Container Registry at ghcr.io/tautulli/tautulli.
* Change: Tautulli is now using a forked version of plexapi 3.6.0. This is to support the exporter feature while still maintaining Python 2 compatibility.
* Change: Updated systemd script to remove process forking. (Thanks @MichaIng)
* Change: Cache GitHub update check on startup.
## v2.5.6 (2020-10-02)
* Activity:
* Change: Renamed container "Transcode" to "Converting" on activity cards.
* Notifications:
* New: Added a silent notification option for Telegram. (Thanks @JohnnyKing94)
* New: Added container_decision notification parameter.
* New: Added notification trigger for Playback Error.
* New: Added remote access down notification threshold setting.
* Newsletter:
* Change: Stop flooring newsletter start date.
* UI:
* Fix: Unable to purge history from the library edit modal.
* Fix: QR code not showing up for localhost address when trying to register a device.
* New: Added library name to the fix metadata modal.
* API:
* New: Added default thumb and art to the Live TV library.
* Other:
* Fix: Synced items not loading for guest access.
* New: Schedule some more automatic database optimizations.
* Change: Added automatic uninstall before installing to the Windows installer.
## v2.5.5 (2020-09-06)
* Activity:
* Fix: Filter out TV show background theme music sessions.
* Notifications:
* New: Check Plex external guids for notification metadata provider links.
* UI:
* Fix: Incorrect sorting for user/library recently played items.
* API:
* Fix: get_synced_items API command returning error with empty result.
* Fix: Download API commands not returning the file.
* Fix: get_logs API command encoding error.
* Fix: get_user_player_stats API command returning error instead of empty result.
* New: Added get_server_info API command.
* New: Added external guids to get_metadata API command.
* New: Added support for multi-column sorting for datatable API commands.
* Change: get_activity API command return thumbnail override for clips.
* Change: get_libraries_table API command return custom library artwork.
* Other:
* Fix: Tautulli failed to run with a stale pid file.
* New: Added scheduled task to optimize the Tautulli database.
* Change: Update plexapi to 3.6.0.
* Change: Update some libraries for Python 3 compatibility.
## v2.5.4 (2020-07-31)
* Monitoring:
* Change: Montitoring remote access changed to use websockets. Refer to Tautulli/Tautulli-Issues#251 for details.
* Notifications:
* Fix: Uploading images to Cloudinary failed for titles with non-ASCII characters on Python 2.
* New: Added plex_id notification parameter.
* Remove: Running .exe files directly using script notifications is no longer supported.
* Remove: php, perl, and ruby prefix overrides for script notifications is no longer supported.
* Change: Stricter checking of file extensions for script notifications.
* Change: Fallback to The Movie Database lookup using title and year.
* Change: Fallback to TVmaze lookup using title.
* UI:
* New: Added ability to import a previous Tautullli configuration file in the settings.
* New: Added a browse button for settings which require a folder or file input.
* New: Added first streamed column to user IP addresses table. (Thanks @dotsam)
* New: Added The Movie Database rating image to media page.
* Change: Different icon to represent direct stream in the history tables.
* API:
* New: Updated API docs for importing a database and configuration file.
## v2.5.3 (2020-07-10)
* History:
* Fix: Unable to delete more than 1000 history entries at the same time.
* Notifications:
* Change: Python script notifications to run using the same Python interpreter as Tautulli.
* Newsletters:
* Fix: Unable to view newsletters with special characters.
* Other:
* Fix: Tautulli failing to start after enabling HTTPS when installed using the Windows / macOS installers.
* Fix: Startup script not working on macOS.
* Fix: Unable to hide dock icon on macOS with the pkg install. Refer to the FAQ regarding the Python rocket dock icon.
* Change: Added path to Python interpreter in system startup (daemon) scripts.
* Change: Added Python version to Google analytics.
## v2.5.2 (2020-07-01)
* Announcements:

View file

@ -9,12 +9,12 @@ All pull requests should be based on the `nightly` branch, to minimize cross mer
### Python Code
#### Compatibility
The code should work with Python 2.7.17 or Python 3.6+. Note that Tautulli runs on many different platforms.
The code should work with Python 3.8+. Note that Tautulli runs on many different platforms.
Re-use existing code. Do not hesitate to add logging in your code. You can the logger module `plexpy.logger.*` for this. Web requests are invoked via `plexpy.request.*` and derived ones. Use these methods to automatically add proper and meaningful error handling.
#### Code conventions
Although Tautulli did not adapt a code convention in the past, we try to follow the [PEP8](http://legacy.python.org/dev/peps/pep-0008/) conventions for future code. A short summary to remind you (copied from http://wiki.ros.org/PyStyleGuide):
Although Tautulli did not adopt a code convention in the past, we try to follow [PEP8](http://legacy.python.org/dev/peps/pep-0008/) conventions for future code. A short summary to remind you (copied from http://wiki.ros.org/PyStyleGuide):
* 4 space indentation
* 80 characters per line

View file

@ -1,4 +1,4 @@
FROM tautulli/tautulli-baseimage:python3
FROM ghcr.io/tautulli/tautulli-baseimage:python3
LABEL maintainer="Tautulli"
@ -9,15 +9,20 @@ ENV TAUTULLI_DOCKER=True
ENV TZ=UTC
WORKDIR /app
COPY . /app
RUN \
groupadd -g 1000 tautulli && \
useradd -u 1000 -g 1000 tautulli && \
echo ${BRANCH} > /app/branch.txt && \
echo ${COMMIT} > /app/version.txt
COPY . /app
RUN \
mkdir /config && \
touch /config/DOCKER
VOLUME /config
CMD [ "python", "Tautulli.py", "--datadir", "/config" ]
ENTRYPOINT [ "./start.sh" ]
VOLUME /config
EXPOSE 8181
HEALTHCHECK --start-period=90s CMD curl -ILfSs http://localhost:8181/status > /dev/null || curl -ILfkSs https://localhost:8181/status > /dev/null || exit 1
HEALTHCHECK --start-period=90s CMD curl -ILfks https://localhost:8181/status > /dev/null || curl -ILfs http://localhost:8181/status > /dev/null || exit 1

175
README.md
View file

@ -1,64 +1,163 @@
# Tautulli
A python based web application for monitoring, analytics and notifications for [Plex Media Server](https://plex.tv).
A python based web application for monitoring, analytics and notifications for
[Plex Media Server](https://plex.tv).
This project is based on code from [Headphones](https://github.com/rembo10/headphones) and [PlexWatchWeb](https://github.com/ecleese/plexWatchWeb).
This project is based on code from [Headphones](https://github.com/rembo10/headphones)
and [PlexWatchWeb](https://github.com/ecleese/plexWatchWeb).
## Features
* Responsive web design viewable on desktop, tablet and mobile web browsers.
* Themed to complement Plex/Web.
* Easy configuration setup (no separate web server required).
* Monitor current Plex Media Server activity.
* Fully customizable notifications for stream activity and recently added media.
* Top statistics on home page with configurable duration and measurement metric.
* Global watching history with search/filtering & dynamic column sorting.
* Full user list with general information and comparison stats.
* Individual user information including devices IP addresses.
* Complete library statistics and media file information.
* Rich analytics presented using Highcharts graphing.
* Beautiful content information pages.
* Full sync list data on all users syncing items from your library.
* And many more!!
- Responsive web design viewable on desktop, tablet and mobile web browsers.
- Themed to complement Plex/Web.
- Easy configuration setup (no separate web server required).
- Monitor current Plex Media Server activity.
- Fully customizable notifications for stream activity and recently added media.
- Top statistics on home page with configurable duration and measurement metric.
- Global watching history with search/filtering & dynamic column sorting.
- Full user list with general information and comparison stats.
- Individual user information including devices IP addresses.
- Complete library statistics and media file information.
- Rich analytics presented using Highcharts graphing.
- Beautiful content information pages.
- Full sync list data on all users syncing items from your library.
- And many more!!
## Preview
* [Full preview gallery available on our website](https://tautulli.com)
[Full preview gallery available on our website][Tautulli]
![Tautulli Homepage](https://tautulli.com/images/screenshots/activity-compressed.jpg?v=2)
## Installation & Support
## Installation
[![Python](https://img.shields.io/badge/python-2.7.17,%203.6,%203.7,%203.8-blue?style=flat-square)](https://python.org/downloads)
[![Docker Pulls](https://img.shields.io/docker/pulls/tautulli/tautulli?style=flat-square)](https://hub.docker.com/r/tautulli/tautulli)
[![Docker Stars](https://img.shields.io/docker/stars/tautulli/tautulli?style=flat-square)](https://hub.docker.com/r/tautulli/tautulli)
[![Python][badge-python]][Python]
[![Docker Pulls][badge-docker-pulls]][DockerHub]
[![Docker Stars][badge-docker-stars]][DockerHub]
[![Downloads][badge-downloads]][Releases Latest]
[badge-python]: https://img.shields.io/badge/python->=3.9-blue?style=flat-square
[badge-docker-pulls]: https://img.shields.io/docker/pulls/tautulli/tautulli?style=flat-square
[badge-docker-stars]: https://img.shields.io/docker/stars/tautulli/tautulli?style=flat-square
[badge-downloads]: https://img.shields.io/github/downloads/Tautulli/Tautulli/total?style=flat-square
| Status | Branch: `master` | Branch: `beta` | Branch: `nightly` |
| --- | --- | --- | --- |
| Release | [![Release@master](https://img.shields.io/github/v/release/Tautulli/Tautulli?style=flat-square)](https://github.com/Tautulli/Tautulli/releases/latest) <br> [![Release Date@master](https://img.shields.io/github/release-date/Tautulli/Tautulli?style=flat-square&color=blue)](https://github.com/Tautulli/Tautulli/releases/latest) | [![Release@beta](https://img.shields.io/github/v/release/Tautulli/Tautulli?include_prereleases&style=flat-square)](https://github.com/Tautulli/Tautulli/releases) <br> [![Commits@beta](https://img.shields.io/github/commits-since/Tautulli/Tautulli/latest/beta?style=flat-square&color=blue)](https://github.com/Tautulli/Tautulli/commits/beta) | [![Last Commits@nightly](https://img.shields.io/github/last-commit/Tautulli/Tautulli/nightly?style=flat-square&color=blue)](https://github.com/Tautulli/Tautulli/commits/nightly) <br> [![Commits@nightly](https://img.shields.io/github/commits-since/Tautulli/Tautulli/latest/nightly?style=flat-square&color=blue)](https://github.com/Tautulli/Tautulli/commits/nightly) |
| Docker | [![Docker@master](https://img.shields.io/badge/docker-latest-blue?style=flat-square)](https://hub.docker.com/r/tautulli/tautulli) <br> [![Docker Build@master](https://img.shields.io/github/workflow/status/Tautulli/Tautulli/Publish%20Docker/master?style=flat-square)](https://github.com/Tautulli/Tautulli/actions?query=workflow%3A"Publish+Docker"+branch%3Amaster) | [![Docker@beta](https://img.shields.io/badge/docker-beta-blue?style=flat-square)](https://hub.docker.com/r/tautulli/tautulli) <br> [![Docker Build@beta](https://img.shields.io/github/workflow/status/Tautulli/Tautulli/Publish%20Docker/beta?style=flat-square)](https://github.com/Tautulli/Tautulli/actions?query=workflow%3A"Publish+Docker"+branch%3Abeta) | [![Docker@nightly](https://img.shields.io/badge/docker-nightly-blue?style=flat-square)](https://hub.docker.com/r/tautulli/tautulli) <br> [![Docker Build@nightly](https://img.shields.io/github/workflow/status/Tautulli/Tautulli/Publish%20Docker/nightly?style=flat-square)](https://github.com/Tautulli/Tautulli/actions?query=workflow%3A"Publish+Docker"+branch%3Anightly) |
| Installer | [![Windows@master](https://img.shields.io/github/v/release/Tautulli/Tautulli?label=windows&style=flat-square)](https://github.com/Tautulli/Tautulli/releases/latest) <br> [![MacOS@master](https://img.shields.io/github/v/release/Tautulli/Tautulli?label=macos&style=flat-square)](https://github.com/Tautulli/Tautulli/releases/latest) <br> [![Installer Build@master](https://img.shields.io/github/workflow/status/Tautulli/Tautulli/Publish%20Release/master?style=flat-square)](https://github.com/Tautulli/Tautulli/actions?query=workflow%3A"Publish+Release"+branch%3Amaster) | [![Windows@beta](https://img.shields.io/github/v/release/Tautulli/Tautulli?label=windows&include_prereleases&style=flat-square)](https://github.com/Tautulli/Tautulli/releases) <br> [![MacOS@beta](https://img.shields.io/github/v/release/Tautulli/Tautulli?label=macos&include_prereleases&style=flat-square)](https://github.com/Tautulli/Tautulli/releases) <br> [![Installer Build@beta](https://img.shields.io/github/workflow/status/Tautulli/Tautulli/Publish%20Release/beta?style=flat-square)](https://github.com/Tautulli/Tautulli/actions?query=workflow%3A"Publish+Release"+branch%3Abeta) | [![Installer Build@nightly](https://img.shields.io/github/workflow/status/Tautulli/Tautulli/Publish%20Release/nightly?style=flat-square)](https://github.com/Tautulli/Tautulli/actions?query=workflow%3A"Publish+Release"+branch%3Anightly) |
| Release | [![Release@master][badge-release-master]][Releases Latest] <br> [![Release Date@master][badge-release-master-date]][Releases Latest] | [![Release@beta][badge-release-beta]][Releases] <br> [![Commits@beta][badge-release-beta-commits]][Commits Beta] | [![Last Commits@nightly][badge-release-nightly-last-commit]][commits Nightly] <br> [![Commits@nightly][badge-release-nightly-commits]][Commits Nightly] |
| Docker | [![Docker@master][badge-docker-master]][DockerHub] <br> [![Docker Build@master][badge-docker-master-ci]][Publish Docker Master] | [![Docker@beta][badge-docker-beta]][DockerHub] <br> [![Docker Build@beta][badge-docker-beta-ci]][Publish Docker Beta] | [![Docker@nightly][badge-docker-nightly]][DockerHub] <br> [![Docker Build@nightly][badge-docker-nightly-ci]][Publish Docker Nightly] |
| Snap | [![Snap@master][badge-snap-master]][Snapcraft] <br> [![Snap Build@master][badge-snap-master-ci]][Publish Snap Master] | [![Snap@beta][badge-snap-beta]][Snapcraft] <br> [![Snap Build@beta][badge-snap-beta-ci]][Publish Snap Beta] | [![Snap@nightly][badge-snap-nightly]][Snapcraft] <br> [![Snap Build@nightly][badge-snap-nightly-ci]][Publish Snap Nightly] |
| Installer | [![Windows@master][badge-installer-master-win]][Releases Latest] <br> [![MacOS@master][badge-installer-master-macos]][Releases Latest] <br> [![Installer Build@master][badge-installer-master-ci]][Publish Installer Master] | [![Windows@beta][badge-installer-beta-win]][Releases] <br> [![MacOS@beta][badge-installer-beta-macos]][Releases] <br> [![Installer Build@beta][badge-installer-beta-ci]][Publish Installer Beta] | [![Installer Build@nightly][badge-installer-nightly-ci]][Publish Installer Nightly] |
[![Wiki](https://img.shields.io/badge/github-wiki-black?style=flat-square)](https://github.com/Tautulli/Tautulli-Wiki/wiki)
[![Discord](https://img.shields.io/discord/183396325142822912?label=discord&style=flat-square&color=7289DA)](https://tautulli.com/discord)
[![Reddit](https://img.shields.io/reddit/subreddit-subscribers/tautulli?label=reddit&style=flat-square&color=FF5700)](https://www.reddit.com/r/Tautulli/)
[![Plex Forums](https://img.shields.io/badge/plex%20forums-discussion-E5A00D?style=flat-square)](https://forums.plex.tv/t/tautulli-monitor-your-plex-media-server/225242)
Read the [Installation Guides][Installation] for instructions on how to install Tautulli.
* Read the [Installation Guides](https://github.com/Tautulli/Tautulli-Wiki/wiki/Installation) for instructions to install Tautulli.
* The [Frequently Asked Questions](https://github.com/Tautulli/Tautulli-Wiki/wiki/Frequently-Asked-Questions) in the wiki can help you with common problems.
* Support is available on [Discord](https://tautulli.com/discord), [Reddit](https://www.reddit.com/r/Tautulli), or the [Plex Forums](https://forums.plex.tv/t/tautulli-monitor-your-plex-media-server/225242).
[badge-release-master]: https://img.shields.io/github/v/release/Tautulli/Tautulli?style=flat-square
[badge-release-master-date]: https://img.shields.io/github/release-date/Tautulli/Tautulli?style=flat-square&color=blue
[badge-release-beta]: https://img.shields.io/github/v/release/Tautulli/Tautulli?include_prereleases&style=flat-square
[badge-release-beta-commits]: https://img.shields.io/github/commits-since/Tautulli/Tautulli/latest/beta?style=flat-square&color=blue
[badge-release-nightly-last-commit]: https://img.shields.io/github/last-commit/Tautulli/Tautulli/nightly?style=flat-square&color=blue
[badge-release-nightly-commits]: https://img.shields.io/github/commits-since/Tautulli/Tautulli/latest/nightly?style=flat-square&color=blue
[badge-docker-master]: https://img.shields.io/badge/docker-latest-blue?style=flat-square
[badge-docker-master-ci]: https://img.shields.io/github/actions/workflow/status/Tautulli/Tautulli/.github/workflows/publish-docker.yml?style=flat-square&branch=master
[badge-docker-beta]: https://img.shields.io/badge/docker-beta-blue?style=flat-square
[badge-docker-beta-ci]: https://img.shields.io/github/actions/workflow/status/Tautulli/Tautulli/.github/workflows/publish-docker.yml?style=flat-square&branch=beta
[badge-docker-nightly]: https://img.shields.io/badge/docker-nightly-blue?style=flat-square
[badge-docker-nightly-ci]: https://img.shields.io/github/actions/workflow/status/Tautulli/Tautulli/.github/workflows/publish-docker.yml?style=flat-square&branch=nightly
[badge-snap-master]: https://img.shields.io/badge/snap-stable-blue?style=flat-square
[badge-snap-master-ci]: https://img.shields.io/github/actions/workflow/status/Tautulli/Tautulli/.github/workflows/publish-snap.yml?style=flat-square&branch=master
[badge-snap-beta]: https://img.shields.io/badge/snap-beta-blue?style=flat-square
[badge-snap-beta-ci]: https://img.shields.io/github/actions/workflow/status/Tautulli/Tautulli/.github/workflows/publish-snap.yml?style=flat-square&branch=beta
[badge-snap-nightly]: https://img.shields.io/badge/snap-edge-blue?style=flat-square
[badge-snap-nightly-ci]: https://img.shields.io/github/actions/workflow/status/Tautulli/Tautulli/.github/workflows/publish-snap.yml?style=flat-square&branch=nightly
[badge-installer-master-win]: https://img.shields.io/github/v/release/Tautulli/Tautulli?label=windows&style=flat-square
[badge-installer-master-macos]: https://img.shields.io/github/v/release/Tautulli/Tautulli?label=macos&style=flat-square
[badge-installer-master-ci]: https://img.shields.io/github/actions/workflow/status/Tautulli/Tautulli/.github/workflows/publish-installers.yml?style=flat-square&branch=master
[badge-installer-beta-win]: https://img.shields.io/github/v/release/Tautulli/Tautulli?label=windows&include_prereleases&style=flat-square
[badge-installer-beta-macos]: https://img.shields.io/github/v/release/Tautulli/Tautulli?label=macos&include_prereleases&style=flat-square
[badge-installer-beta-ci]: https://img.shields.io/github/actions/workflow/status/Tautulli/Tautulli/.github/workflows/publish-installers.yml?style=flat-square&branch=beta
[badge-installer-nightly-ci]: https://img.shields.io/github/actions/workflow/status/Tautulli/Tautulli/.github/workflows/publish-installers.yml?style=flat-square&branch=nightly
## Issues & Feature Requests
## Support
[![Issues](https://img.shields.io/badge/github-issues-red?style=flat-square)](https://github.com/Tautulli/Tautulli-Issues)
[![Feathub](https://img.shields.io/badge/feathub-requests-lightgrey?style=flat-square)](https://feathub.com/Tautulli/Tautulli)
[![Wiki][badge-wiki]][Wiki]
[![Discord][badge-discord]][Discord]
[![Reddit][badge-reddit]][Reddit]
[![Plex Forums][badge-forums]][Plex Forums]
[![Issues][badge-issues]][Issues]
* Please see the [Issues Repository](https://github.com/Tautulli/Tautulli-Issues).
[badge-wiki]: https://img.shields.io/badge/github-wiki-black?style=flat-square
[badge-discord]: https://img.shields.io/discord/183396325142822912?label=discord&style=flat-square&color=7289DA
[badge-reddit]: https://img.shields.io/reddit/subreddit-subscribers/tautulli?label=reddit&style=flat-square&color=FF5700
[badge-forums]: https://img.shields.io/badge/plex%20forums-discussion-E5A00D?style=flat-square
[badge-issues]: https://img.shields.io/badge/github-issues-black?style=flat-square
If you think you've found a bug in Tautulli make sure you have read the [FAQ][]
first to make sure it hasn't been covered by one of the questions there. If your
problem isn't answered in the FAQ try the following first:
- Update to the latest version of Tautulli.
- Turning your device off and on again.
- Analyzing your logs, you just might find the solution yourself!
- Using the **search** function to see if this issue has already been reported/solved.
- Checking the [Wiki][] for [Installation][] instructions and reading the [FAQs][FAQ].
- For basic questions try asking on [Discord][], [Reddit][],
or the [Plex Forums][] first before opening an issue.
**If nothing has worked:**
1. Please check the [issues tracker][Issues] to see if someone else has already reported the bug.
2. If this is a new bug, open a [bug report][Issue New] on the issues tracker.
3. Provide a clear title to easily help identify your problem.
4. Use proper [Markdown syntax][] to structure your post (i.e. code/log in code blocks).
5. Make sure to fill out the required information on the issue template.
6. Close your issue when it's solved! If you found the solution yourself please
comment so that others benefit from it.
## Feature Requests
1. Pleases check the [issues tracker][Issues] to see if someone else has already requested the feature.
If a similar idea has already been requested, _give it a thumbs up_. **Do not comment
with `+1` or something similar as it creates unnecessary spam.**
2. If this is a new feature request, open a [feature request][Issue New] on the issues tracker.
## License
[![License](https://img.shields.io/github/license/Tautulli/Tautulli?style=flat-square)](https://github.com/Tautulli/Tautulli/blob/master/LICENSE)
[![License][badge-license]][License]
This is free software under the GPL v3 open source license. Feel free to do with it what you wish, but any modification must be open sourced. A copy of the license is included.
[badge-license]: https://img.shields.io/github/license/Tautulli/Tautulli?style=flat-square
This software includes Highsoft software libraries which you may freely distribute for non-commercial use. Commerical users must licence this software, for more information visit https://shop.highsoft.com/faq/non-commercial#non-commercial-redistribution.
This is free software under the GPL v3 open source license. Feel free to do with it what you wish,
but any modification must be open sourced. A copy of the license is included.
This software includes Highsoft software libraries which you may freely distribute for
non-commercial use. Commercial users must licence this software, for more information visit
https://shop.highsoft.com/faq/non-commercial#non-commercial-redistribution.
[Python]: https://python.org/downloads
[DockerHub]: https://hub.docker.com/r/tautulli/tautulli
[Releases]: https://github.com/Tautulli/Tautulli/releases
[Releases Latest]: https://github.com/Tautulli/Tautulli/releases/latest
[License]: https://github.com/Tautulli/Tautulli/blob/master/LICENSE
[FAQ]: https://github.com/Tautulli/Tautulli/wiki/Frequently-Asked-Questions
[Installation]: https://github.com/Tautulli/Tautulli/wiki/Installation
[Issues]: https://github.com/Tautulli/Tautulli/issues
[Issue New]: https://github.com/Tautulli/Tautulli/issues/new/choose
[Markdown syntax]: https://help.github.com/articles/github-flavored-markdown
[Tautulli]: http://tautulli.com
[Wiki]: https://github.com/Tautulli/Tautulli/wiki
[Discord]: https://tautulli.com/discord
[Reddit]: https://reddit.com/r/Tautulli
[Plex Forums]: https://forums.plex.tv/t/tautulli-monitor-your-plex-media-server/225242
[Snapcraft]: https://snapcraft.io/tautulli
[Commits Beta]: https://github.com/Tautulli/Tautulli/commits/beta
[Commits Nightly]: https://github.com/Tautulli/Tautulli/commits/nightly
[Publish Docker Master]: https://github.com/Tautulli/Tautulli/actions?query=workflow%3A"Publish+Docker"+branch%3Amaster
[Publish Docker Beta]: https://github.com/Tautulli/Tautulli/actions?query=workflow%3A"Publish+Docker"+branch%3Abeta
[Publish Docker Nightly]: https://github.com/Tautulli/Tautulli/actions?query=workflow%3A"Publish+Docker"+branch%3Anightly
[Publish Snap Master]: https://github.com/Tautulli/Tautulli/actions?query=workflow%3A"Publish+Snap"+branch%3Amaster
[Publish Snap Beta]: https://github.com/Tautulli/Tautulli/actions?query=workflow%3A"Publish+Snap"+branch%3Abeta
[Publish Snap Nightly]: https://github.com/Tautulli/Tautulli/actions?query=workflow%3A"Publish+Snap"+branch%3Anightly
[Publish Installer Master]: https://github.com/Tautulli/Tautulli/actions?query=workflow%3A"Publish+Installers"+branch%3Amaster
[Publish Installer Beta]: https://github.com/Tautulli/Tautulli/actions?query=workflow%3A"Publish+Installers"+branch%3Abeta
[Publish Installer Nightly]: https://github.com/Tautulli/Tautulli/actions?query=workflow%3A"Publish+Installers"+branch%3Anightly

View file

@ -23,17 +23,18 @@ import sys
# Ensure lib added to path, before any other imports
sys.path.insert(0, os.path.join(os.path.dirname(os.path.abspath(__file__)), 'lib'))
from future.builtins import str
import appdirs
import argparse
import datetime
import locale
import platformdirs
import pytz
import signal
import shutil
import time
import threading
import tzlocal
import ctypes
import plexpy
from plexpy import common, config, database, helpers, logger, webstart
@ -69,8 +70,26 @@ def main():
plexpy.SYS_ENCODING = None
try:
locale.setlocale(locale.LC_ALL, "")
plexpy.SYS_LANGUAGE, plexpy.SYS_ENCODING = locale.getdefaultlocale()
# Attempt to get the system's locale settings
language_code, encoding = locale.getlocale()
# Special handling for Windows platform
if sys.platform == 'win32':
# Get the user's current language settings on Windows
windll = ctypes.windll.kernel32
lang_id = windll.GetUserDefaultLCID()
# Map Windows language ID to locale identifier
language_code = locale.windows_locale.get(lang_id, '')
# Get the preferred encoding
encoding = locale.getpreferredencoding()
# Assign values to application-specific variable
plexpy.SYS_LANGUAGE = language_code
plexpy.SYS_ENCODING = encoding
except (locale.Error, IOError):
pass
@ -110,7 +129,7 @@ def main():
if args.quiet:
plexpy.QUIET = True
# Do an intial setup of the logger.
# Do an initial setup of the logger.
# Require verbose for pre-initilization to see critical errors
logger.initLogger(console=not plexpy.QUIET, log_dir=False, verbose=True)
@ -124,6 +143,9 @@ def main():
if helpers.bool_true(os.getenv('TAUTULLI_DOCKER', False)):
plexpy.DOCKER = True
plexpy.DOCKER_MOUNT = not os.path.isfile('/config/DOCKER')
if helpers.bool_true(os.getenv('TAUTULLI_SNAP', False)):
plexpy.SNAP = True
if args.dev:
plexpy.DEV = True
@ -131,8 +153,7 @@ def main():
if args.daemon:
if sys.platform == 'win32':
sys.stderr.write(
"Daemonizing not supported under Windows, starting normally\n")
logger.warn("Daemonizing not supported under Windows, starting normally")
else:
plexpy.DAEMON = True
plexpy.QUIET = True
@ -150,11 +171,13 @@ def main():
try:
with open(plexpy.PIDFILE, 'r') as fp:
pid = int(fp.read())
os.kill(pid, 0)
except IOError as e:
raise SystemExit("Unable to read PID file: %s", e)
try:
os.kill(pid, 0)
except OSError:
logger.warn("PID file '%s' already exists, but PID %d is " \
logger.warn("PID file '%s' already exists, but PID %d is "
"not running. Ignoring PID file." %
(plexpy.PIDFILE, pid))
else:
@ -181,10 +204,19 @@ def main():
if args.datadir:
plexpy.DATA_DIR = args.datadir
elif plexpy.FROZEN:
plexpy.DATA_DIR = appdirs.user_data_dir("Tautulli", False)
plexpy.DATA_DIR = platformdirs.user_data_dir("Tautulli", False)
else:
plexpy.DATA_DIR = plexpy.PROG_DIR
# Migrate Snap data dir
if plexpy.SNAP:
snap_common = os.environ['SNAP_COMMON']
old_data_dir = os.path.join(snap_common, 'Tautulli')
if os.path.exists(old_data_dir) and os.listdir(old_data_dir):
plexpy.SNAP_MIGRATE = True
logger.info("Migrating Snap user data.")
shutil.move(old_data_dir, plexpy.DATA_DIR)
if args.config:
config_file = args.config
else:
@ -199,9 +231,18 @@ def main():
'Could not create data directory: ' + plexpy.DATA_DIR + '. Exiting....')
# Make sure the DATA_DIR is writeable
if not os.access(plexpy.DATA_DIR, os.W_OK):
test_file = os.path.join(plexpy.DATA_DIR, '.TEST')
try:
with open(test_file, 'w'):
pass
except IOError:
raise SystemExit(
'Cannot write to the data directory: ' + plexpy.DATA_DIR + '. Exiting...')
finally:
try:
os.remove(test_file)
except OSError:
pass
# Put the database in the DATA_DIR
plexpy.DB_FILE = os.path.join(plexpy.DATA_DIR, database.FILENAME)
@ -223,23 +264,13 @@ def main():
# Start the background threads
plexpy.start()
# Force the http port if neccessary
# Force the http port if necessary
if args.port:
plexpy.HTTP_PORT = args.port
logger.info('Using forced web server port: %i', plexpy.HTTP_PORT)
else:
plexpy.HTTP_PORT = int(plexpy.CONFIG.HTTP_PORT)
# Check if pyOpenSSL is installed. It is required for certificate generation
# and for CherryPy.
if plexpy.CONFIG.ENABLE_HTTPS:
try:
import OpenSSL
except ImportError:
logger.warn("The pyOpenSSL module is missing. Install this "
"module to enable HTTPS. HTTPS will be disabled.")
plexpy.CONFIG.ENABLE_HTTPS = False
# Try to start the server. Will exit here is address is already in use.
webstart.start()
@ -265,7 +296,10 @@ def main():
if plexpy.CONFIG.SYS_TRAY_ICON:
# MacOS menu bar icon must be run on the main thread and is blocking
# Start the rest of Tautulli on a new thread
threading.Thread(target=wait).start()
thread = threading.Thread(target=wait)
thread.daemon = True
thread.start()
plexpy.MAC_SYS_TRAY_ICON = macos.MacOSSystemTray()
plexpy.MAC_SYS_TRAY_ICON.start()
else:

11
contrib/clean_pyc.bat Executable file
View file

@ -0,0 +1,11 @@
@echo off
:: Display information
echo This script will remove *.pyc files. These files are generated by Python, but they can cause conflicts after an upgrade. It's safe to remove them, because they will be regenerated.
echo Press enter to continue, or CTRL + C to quit.
pause
cd ..\
:: Remove *.pyc files
del /S *.pyc
:: Remove __pycache__ folders
for /d /r . %%d in (__pycache__) do @if exist "%%d" rd /s /q "%%d"

View file

@ -1,9 +1,11 @@
#!/bin/bash
#!/usr/bin/env bash
# Display information
echo "This script will remove *.pyc files. These files are generated by Python, but they can cause conflicts after an upgrade. It's safe to remove them, because they will be regenerated."
echo "Press enter to continue, or CTRL + C to quit."
read
# Remove the *.pyc
find "`dirname $0`/.." -type f -name "*.pyc" -exec rm -rf {} \;
# Remove *.pyc files
find "`dirname $0`/.." -type f -name "*.pyc" -exec rm -rf {} \;
# Remove __pycache__ folders
find "`dirname $0`/.." -type d -name "__pycache__" -exec rm -rf {} \;

View file

@ -1,4 +1,4 @@
#!/bin/bash
#!/usr/bin/env bash
# Parameter check
if [ -z "$1" ]; then

View file

@ -5,7 +5,7 @@
<h4 class="modal-title">Import ${app} Database</h4>
</div>
<div class="modal-body" id="modal-text">
<form id="import_database" enctype="multipart/form-data" method="post" name="import_database">
<form id="import_database_form" enctype="multipart/form-data" method="post" name="import_database_form">
<input type="hidden" id="import_app" name="import_app" value="${app.lower()}" />
% if app in ('PlexWatch', 'Plexivity'):
<p class="help-block">
@ -28,11 +28,11 @@
<span class="btn btn-form">Upload</span>
<input type="file" style="display: none;" id="import_database_file" name="import_database_file" required>
</label>
<input id="import_database_file_name" type="text" class="form-control" disabled>
<input id="import_database_file_name" type="text" class="form-control" placeholder="tautulli.db" disabled>
</div>
</div>
</div>
<p class="help-block">Upload the ${app} database you wish to import.</p>
<p class="help-block">Upload the ${app} database file you wish to import (max file size is 1GB).</p>
</div>
<div class="form-group">
<label for="import_database_path">Option 2: Browse for a Database File</label>
@ -40,13 +40,13 @@
<div class="col-xs-12">
<div class="input-group">
<span class="input-group-btn">
<button class="btn btn-form" type="button" id="import_database_path_browse">Browse</button>
<button class="btn btn-form" type="button" id="import_database_path_browse" data-toggle="browse" data-description="Database File" data-filter=".db" data-target="#import_database_path">Browse</button>
</span>
<input type="text" class="form-control" id="import_database_path" name="import_database_path" value="" required disabled>
<input type="text" class="form-control" id="import_database_path" name="import_database_path" value="" placeholder="tautulli.db" required disabled>
</div>
</div>
</div>
<p class="help-block">Browse for the ${app} database you wish to import.</p>
<p class="help-block">Browse for the ${app} database file you wish to import.</p>
</div>
% if app == 'Tautulli':
<div class="form-group">
@ -64,7 +64,6 @@
<li><strong>Merge</strong> will add all history and remove any duplicates from the imported database into the current database.</li>
<li><strong>Overwrite</strong> will replace all history in the current database with the imported database.</li>
</ul>
<p class="help-block">Note: Libraries, users, notification agents, newsletter agents, and registered mobile devices will also be imported</p>
</div>
<div class="checkbox">
<label>
@ -72,6 +71,15 @@
</label>
<p class="help-block">Automatically create a backup of the current database before importing.</p>
</div>
<div class="form-group">
<label>Import Notes</label>
<p class="help-block">The following data will also be imported:</p>
<ul class="help-block" style="padding-inline-start: 15px;">
<li>Libraries and Users</li>
<li>Notification / Newsletter Agents</li>
<li>Registered Mobile Devices</li>
</ul>
</div>
% else:
<div class="form-group">
<label for="import_table_name">Table Name</label>
@ -106,19 +114,9 @@
</div>
</div>
<script>
$('#import_database_path_browse').click(function () {
$('#browse-path-type').text('Databse File');
$('#browse-path-modal').modal('show');
browsePath(null, null, '.db');
});
$('#select-browse-file').click(function () {
$('#browse-path-modal').modal('hide');
$("#import_database_path").val($('#browse-path').val());
});
$('#import_database_file').change(function() {
$("#import_database_file").change(function() {
if ($(this)[0].files[0]) {
$('#import_database_file_name').val($(this)[0].files[0].name);
$("#import_database_file_name").val($(this)[0].files[0].name);
}
});
@ -126,7 +124,7 @@
$(this).prop('disabled', true);
var app = $("#import_app").val();
var database_file = $('#import_database_file')[0].files[0];
var database_file = $("#import_database_file")[0].files[0];
var database_path = $("#import_database_path").val();
var method = $("#import_method").val();
var backup = $("#import_backup_db").is(':checked');

View file

@ -13,8 +13,11 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="">
<meta name="author" content="">
<link href="${http_root}css/bootstrap3/bootstrap.css" rel="stylesheet">
<meta name="referrer" content="no-referrer">
<link href="${http_root}css/bootstrap3/bootstrap.min.css" rel="stylesheet">
<link href="${http_root}css/pnotify.custom.min.css" rel="stylesheet" />
<link href="${http_root}css/selectize.bootstrap3.css" rel="stylesheet" />
<link href="${http_root}css/selectize.min.css" rel="stylesheet" />
<link href="${http_root}css/tautulli.css${cache_param}" rel="stylesheet">
<link href="${http_root}css/opensans.min.css" rel="stylesheet">
<link href="${http_root}css/font-awesome.all.min.css" rel="stylesheet">
@ -22,21 +25,21 @@
${next.headIncludes()}
<!-- Favicons -->
<link rel="icon" type="image/png" sizes="32x32" href="${http_root}images/favicon/favicon-32x32.png?v=2.0.5">
<link rel="icon" type="image/png" sizes="16x16" href="${http_root}images/favicon/favicon-16x16.png?v=2.0.5">
<link rel="shortcut icon" href="${http_root}images/favicon/favicon.ico?v=2.0.5">
<link rel="icon" type="image/png" sizes="32x32" href="${http_root}images/favicon/favicon-32x32.png?v=2.6.0">
<link rel="icon" type="image/png" sizes="16x16" href="${http_root}images/favicon/favicon-16x16.png?v=2.6.0">
<link rel="shortcut icon" href="${http_root}images/favicon/favicon.ico?v=2.6.0">
<!-- ICONS -->
<!-- Android -->
<link rel="manifest" href="${http_root}images/favicon/manifest.json?v=2.0.5" crossorigin="use-credentials">
<link rel="manifest" href="${http_root}images/favicon/manifest.json?v=2.9.0" crossorigin="use-credentials">
<meta name="theme-color" content="#282a2d">
<!-- Apple -->
<link rel="apple-touch-icon" sizes="180x180" href="${http_root}images/favicon/apple-touch-icon.png?v=2.0.5">
<link rel="mask-icon" href="${http_root}images/favicon/safari-pinned-tab.svg?v=2.0.5" color="#282a2d">
<link rel="apple-touch-icon" sizes="180x180" href="${http_root}images/favicon/apple-touch-icon.png?v=2.6.0">
<link rel="mask-icon" href="${http_root}images/favicon/safari-pinned-tab.svg?v=2.6.0" color="#282a2d">
<meta name="apple-mobile-web-app-title" content="Tautulli">
<!-- Microsoft -->
<meta name="application-name" content="Tautulli">
<meta name="msapplication-config" content="${http_root}images/favicon/browserconfig.xml?v=2.0.5">
<meta name="msapplication-config" content="${http_root}images/favicon/browserconfig.xml?v=2.6.0">
</head>
<body class="content">
@ -48,17 +51,19 @@
% if plexpy.UPDATE_AVAILABLE is None:
You are running an unknown version of Tautulli.<br />
% elif plexpy.UPDATE_AVAILABLE == 'release':
A <a href="${anon_url('https://github.com/%s/%s/releases/tag/%s' % (plexpy.CONFIG.GIT_USER, plexpy.CONFIG.GIT_REPO, plexpy.LATEST_RELEASE))}" target="_blank">
A <a href="${anon_url('https://github.com/%s/%s/releases/tag/%s' % (plexpy.CONFIG.GIT_USER, plexpy.CONFIG.GIT_REPO, plexpy.LATEST_RELEASE))}" target="_blank" rel="noreferrer">
new release (${plexpy.LATEST_RELEASE})</a> of Tautulli is available!<br />
% elif plexpy.UPDATE_AVAILABLE == 'commit':
A <a href="${anon_url('https://github.com/%s/%s/compare/%s...%s' % (plexpy.CONFIG.GIT_USER, plexpy.CONFIG.GIT_REPO, plexpy.CURRENT_VERSION, plexpy.LATEST_VERSION))}" target="_blank">
A <a href="${anon_url('https://github.com/%s/%s/compare/%s...%s' % (plexpy.CONFIG.GIT_USER, plexpy.CONFIG.GIT_REPO, plexpy.CURRENT_VERSION, plexpy.LATEST_VERSION))}" target="_blank" rel="noreferrer">
newer version</a> of Tautulli is available!<br />
You are ${plexpy.COMMITS_BEHIND} commit${'s' if plexpy.COMMITS_BEHIND > 1 else ''} behind.<br />
% endif
% if plexpy.INSTALL_TYPE == 'docker':
Update your Docker container or <a href="#" id="updateDismiss">Dismiss</a>
% elif plexpy.INSTALL_TYPE == 'snap':
Update your Snap package or <a href="#" id="updateDismiss">Dismiss</a>
% elif plexpy.INSTALL_TYPE in ('windows', 'macos'):
<a href="${anon_url('https://github.com/%s/%s/releases/tag/%s' % (plexpy.CONFIG.GIT_USER, plexpy.CONFIG.GIT_REPO, plexpy.LATEST_RELEASE))}" target="_blank">Download</a> and install the latest version or <a href="#" id="updateDismiss">Dismiss</a>
<a href="${anon_url('https://github.com/%s/%s/releases/tag/%s' % (plexpy.CONFIG.GIT_USER, plexpy.CONFIG.GIT_REPO, plexpy.LATEST_RELEASE))}" target="_blank" rel="noreferrer">Download</a> and install the latest version or <a href="#" id="updateDismiss">Dismiss</a>
% else:
<a href="update">Update</a> or <a href="#" id="updateDismiss">Dismiss</a>
% endif
@ -82,7 +87,7 @@
</div>
<div class="collapse navbar-collapse navbar-right" id="navbar-collapse-1">
<ul class="nav navbar-nav">
<li class="hidden-sm hidden-xs">
<li>
<form action="search" method="post" class="form" id="search_form">
<div class="input-group">
<span class="input-textbox">
@ -119,11 +124,6 @@
% else:
<li><a href="graphs">Graphs</a></li>
% endif
% if title == "Synced Items":
<li class="active"><a href="sync">Synced Items</a></li>
% else:
<li><a href="sync">Synced Items</a></li>
% endif
% if title == "Settings":
<li class="dropdown active">
% else:
@ -136,7 +136,7 @@
<li><a href="settings"><i class="fa fa-fw fa-cogs"></i> Settings</a></li>
<li role="separator" class="divider"></li>
<li><a href="logs"><i class="fa fa-fw fa-list-alt"></i> View Logs</a></li>
<li><a href="${anon_url('https://github.com/%s/%s-Wiki/wiki/Frequently-Asked-Questions' % (plexpy.CONFIG.GIT_USER, plexpy.CONFIG.GIT_REPO))}" target="_blank"><i class="fa fa-fw fa-question-circle"></i> FAQ</a></li>
<li><a href="${anon_url('https://github.com/%s/%s/wiki/Frequently-Asked-Questions' % (plexpy.CONFIG.GIT_USER, plexpy.CONFIG.GIT_REPO))}" target="_blank" rel="noreferrer"><i class="fa fa-fw fa-question-circle"></i> FAQ</a></li>
<li><a href="support"><i class="fa fa-fw fa-comment"></i> Support</a></li>
<li role="separator" class="divider"></li>
<li><a href="#" data-target="#donate-modal" data-toggle="modal"><i class="fa fa-fw fa-heart"></i> Donate</a></li>
@ -202,7 +202,7 @@ ${next.modalIncludes()}
</div>
</div>
<div class="modal-footer">
<span id="incorrect-login" style="padding-right: 25px; display: none;">Incorrect username or password.</span>
<span id="sign-in-alert" style="padding-right: 25px; display: none;"></span>
<button id="sign-in" type="submit" class="btn btn-bright login-button"><i class="fa fa-sign-in"></i>&nbsp; Sign In</button>
</div>
<input type="hidden" id="admin_login" name="admin_login" value="1" />
@ -232,31 +232,70 @@ ${next.modalIncludes()}
<ul id="donation_type" class="nav nav-pills" role="tablist" style="display: flex; justify-content: center; margin: 10px 0;">
<li class="active"><a href="#github-donation" role="tab" data-toggle="tab">GitHub</a></li>
<li><a href="#patreon-donation" role="tab" data-toggle="tab">Patreon</a></li>
<li><a href="#stripe-donation" role="tab" data-toggle="tab">Stripe</a></li>
<li><a href="#paypal-donation" role="tab" data-toggle="tab">PayPal</a></li>
<li><a href="#crypto-donation" role="tab" data-toggle="tab" id="crypto-donation-tab">Crypto</a></li>
</ul>
<div class="tab-content">
<div role="tabpanel" class="tab-pane active" id="github-donation" style="text-align: center">
<p>
Click the button below to continue to GitHub.
</p>
<a href="${anon_url('https://github.com/sponsors/JonnyWong16')}" target="_blank" class="btn btn-sm btn-default" style="font-weight: 600;">
<i class="fa fa-heart fa-sm" style="color: #ea4aaa;"></i>&nbsp; Sponsor
</a>
<p>
<a href="${anon_url('https://github.com/sponsors/JonnyWong16')}" target="_blank" rel="noreferrer" class="btn btn-sm btn-default" style="font-weight: 600;">
<i class="fa fa-heart fa-sm" style="color: #ea4aaa;"></i>&nbsp; Sponsor
</a>
</p>
<p class="small-muted">(GitHub does not have a fee)</p>
</div>
<div role="tabpanel" class="tab-pane" id="patreon-donation" style="text-align: center">
<p>
Click the button below to continue to Patreon.
</p>
<a href="${anon_url('https://www.patreon.com/join/tautulli')}" target="_blank">
<img src="images/become_a_patron_button.png" alt="Become a Patron" height="40">
</a>
<p>
<a href="${anon_url('https://www.patreon.com/join/tautulli')}" target="_blank" rel="noreferrer">
<img src="images/become_a_patron_button.png" alt="Become a Patron" width="170" height="40">
</a>
</p>
<p class="small-muted">(Patreon has a fee)</p>
</div>
<div role="tabpanel" class="tab-pane" id="stripe-donation" style="text-align: center">
<p>
Click the button below to continue to Stripe.
</p>
<p>
<a href="${anon_url('https://donate.stripe.com/5kA7vnb7dczVbxC9AA')}" target="_blank" rel="noreferrer">
<img src="images/Stripe_wordmark_-_white_small_28px.png" alt="Stripe" style="background-color: #7068fe; border-radius: 3px; padding: 3px;">
</a>
</p>
<p class="small-muted">(Stripe has a fee)</p>
</div>
<div role="tabpanel" class="tab-pane" id="paypal-donation" style="text-align: center">
<p>
Click the button below to continue to PayPal.
</p>
<a href="${anon_url('https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=6XPPKTDSX9QFL&lc=US&item_name=Tautulli&currency_code=USD&bn=PP%2dDonationsBF%3abtn_donate_LG%2egif%3aNonHosted')}" target="_blank">
<img src="images/gold-rect-paypal-34px.png" alt="PayPal">
<p>
<a href="${anon_url('https://www.paypal.com/donate/?hosted_button_id=CUHSQ99KAKC5Q')}" target="_blank" rel="noreferrer">
<img src="images/gold-rect-paypal-34px.png" alt="PayPal">
</a>
</p>
<p class="small-muted">(PayPal has a fee)</p>
</div>
<div role="tabpanel" class="tab-pane" id="crypto-donation" style="text-align: center">
<p>
Select a cryptocurrency.
</p>
<select class="form-control" id="crypto-select"></select>
<div id="crypto-qrcode"></div>
<div id="crypto-address" class="form-group">
<label>Address:</label>
<span class="inline-pre" id="crypto-address-value"></span>
</div>
<p>
Or click the button below to continue to Coinbase.
</p>
<a href="${anon_url('https://commerce.coinbase.com/checkout/8a9fa08c-8a38-409e-9220-868124c4ba0c')}" target="_blank" rel="noreferrer" class="donate-with-crypto">
<span>Donate with Crypto</span>
</a>
</div>
</div>
@ -288,15 +327,20 @@ ${next.modalIncludes()}
</div>
</div>
<script src="${http_root}js/jquery-2.1.4.min.js"></script>
<script src="${http_root}js/jquery-3.6.0.min.js"></script>
<script src="${http_root}js/bootstrap.min.js"></script>
<script src="${http_root}js/bootstrap-hover-dropdown.min.js"></script>
<script src="${http_root}js/moment-with-locales.min.js"></script>
<script src="${http_root}js/moment-duration-format.min.js"></script>
<script src="${http_root}js/pnotify.custom.min.js"></script>
<script src="${http_root}js/platform.min.js"></script>
<script src="${http_root}js/ipaddr.min.js"></script>
<script src="${http_root}js/script.js${cache_param}"></script>
<script src="${http_root}js/selectize.min.js"></script>
<script src="${http_root}js/jquery.tripleclick.min.js"></script>
<script src="${http_root}js/blurhash_pure_js_port.min.js"></script>
<script src="${http_root}js/script.js${cache_param}"></script>
<script src="${http_root}js/ajaxNotifications.js"></script>
<script src="${http_root}js/kjua.min.js"></script>
<script>
% if _session['user_group'] == 'admin':
$('body').on('click', '#updateDismiss', function() {
@ -325,15 +369,17 @@ ${next.modalIncludes()}
if (result.update === null) {
msg = 'You are running an unknown version of Tautulli.<br />';
} else if (result.update === true && result.release === true) {
msg = 'A <a href="' + result.release_url + '" target="_blank">new release (' + result.latest_release + ')</a> of Tautulli is available!<br />';
msg = 'A <a href="' + result.release_url + '" target="_blank" rel="noreferrer">new release (' + result.latest_release + ')</a> of Tautulli is available!<br />';
} else if (result.update === true && result.release === false) {
msg = 'A <a href="' + result.compare_url + '" target="_blank">newer version</a> of Tautulli is available!<br />' +
msg = 'A <a href="' + result.compare_url + '" target="_blank" rel="noreferrer">newer version</a> of Tautulli is available!<br />' +
'You are '+ result.commits_behind + ' commit' + (result.commits_behind > 1 ? 's' : '') + ' behind.<br />';
}
if (result.install_type === 'docker') {
msg += 'Update your Docker container or <a href="#" id="updateDismiss">Dismiss</a>';
} else if (result.install_type === 'snap') {
msg += 'Update your Snap package or <a href="#" id="updateDismiss">Dismiss</a>';
} else if (result.install_type === 'windows' || result.install_type === 'macos') {
msg += '<a href="' + result.release_url + '" target="_blank">Download</a> and install the latest version or <a href="#" id="updateDismiss">Dismiss</a>'
msg += '<a href="' + result.release_url + '" target="_blank" rel="noreferrer">Download</a> and install the latest version or <a href="#" id="updateDismiss">Dismiss</a>'
} else {
msg += '<a href="update">Update</a> or <a href="#" id="updateDismiss">Dismiss</a>';
}
@ -368,6 +414,42 @@ ${next.modalIncludes()}
checkUpdate(function () { $('#nav-update').html('<i class="fa fa-fw fa-arrow-alt-circle-up"></i> Check for Updates'); });
});
$('#crypto-donation-tab').one('shown.bs.tab', function (e) {
$.ajax({
url: 'https://tautulli.com/donate/crypto-addresses.json',
type: 'GET',
dataType: 'json',
cache: false,
async: true,
success: function (data) {
$('#crypto-select').empty().append('<option selected disabled>Select Cryptocurrency</option>');
$.each(data, function (index, crypto) {
$('<option/>', {
text: crypto.name + ' (' + crypto.symbol + ')',
value: crypto.address
}).appendTo('#crypto-select');
});
},
error: function () {
$('#crypto-select').empty().append('<option selected disabled>Error: Unable to load addresses</option>');
}
});
});
$('#crypto-select').change(function() {
var address = $(this).val();
$('#crypto-qrcode').empty().kjua({
text: address,
render: 'canvas',
ecLevel: 'H',
size: 256,
fill: '#000',
back: '#eee'
}).show();
$('#crypto-address-value').text(address);
$('#crypto-address').show();
})
% endif
$('.dropdown-toggle').click(function (e) {
@ -376,8 +458,22 @@ ${next.modalIncludes()}
}
});
function displaySearch() {
if ($(this).width() < 768) {
$('#search_button').removeClass('btn-inactive');
$('#query').css({ right: 0, width: '100%' })
} else if ($('#query').val().trim() == '') {
$('#search_button').addClass('btn-inactive');
$('#query').css({ right: '-200px', width: '0' })
}
}
displaySearch();
$(window).resize(function() {
displaySearch();
});
$('#search_form').submit(function (e) {
if ($('#query').hasClass('active') && $('#query').val().trim() != '') {
if ($('#query').val().trim() != '') {
$.ajax({
type: 'post',
url: 'search',
@ -385,14 +481,16 @@ ${next.modalIncludes()}
})
} else {
e.preventDefault();
$('#search_button').removeClass('btn-inactive');
$('#query').clearQueue().val('').animate({ right: '0', width: '200px' }).addClass('active').focus();
if ($(window).width() >= 768) {
$('#search_button').removeClass('btn-inactive');
$('#query').clearQueue().val('').animate({ right: '0', width: '200px' }).addClass('active').focus();
}
}
})
$('#query').on('blur', function (e) {
if ($(this).val().trim() == '') {
if ($(this).val().trim() == '' && $(window).width() >= 768) {
$(this).delay(200).animate({ right: '-200px', width: '0' }, function () {
$('#search_button').addClass('btn-inactive');
displaySearch();
}).removeClass('active');
}
});
@ -441,12 +539,16 @@ ${next.modalIncludes()}
data: $(this).serialize(),
dataType: 'json',
statusCode: {
200: function() {
200: function(xhr, status) {
window.location = "${http_root}";
},
401: function() {
$('#incorrect-login').show();
$('#username').focus();
401: function(xhr, status) {
$('#sign-in-alert').text('Incorrect username or password.').show();
$('#username').focus();
},
429: function(xhr, status) {
var retry = Math.ceil(xhr.getResponseHeader('Retry-After') / 60)
$('#sign-in-alert').text('Too many login attempts. Try again in ' + retry + ' minute(s).').show();
}
},
complete: function() {

View file

@ -0,0 +1,138 @@
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true"><i class="fa fa-remove"></i></button>
<h4 class="modal-title">${title}</h4>
</div>
<div class="modal-body" id="modal-text">
<form id="import_config_form" enctype="multipart/form-data" method="post" name="import_config_form">
<div class="form-group">
<label for="import_config_file">Option 1: Upload a Configuration File</label>
<div class="row">
<div class="col-xs-12">
<div class="input-group">
<label for="import_config_file" class="input-group-btn">
<span class="btn btn-form">Upload</span>
<input type="file" style="display: none;" id="import_config_file" name="import_config_file" required>
</label>
<input id="import_config_file_name" type="text" class="form-control" placeholder="config.ini" disabled>
</div>
</div>
</div>
<p class="help-block">Upload the Tautulli configuration file you wish to import.</p>
</div>
<div class="form-group">
<label for="import_config_path">Option 2: Browse for a Configuration File</label>
<div class="row">
<div class="col-xs-12">
<div class="input-group">
<span class="input-group-btn">
<button class="btn btn-form" type="button" id="import_config_path_browse" data-toggle="browse" data-description="Configuration File" data-filter=".ini" data-target="#import_config_path">Browse</button>
</span>
<input type="text" class="form-control" id="import_config_path" name="import_config_path" value="" placeholder="config.ini" required disabled>
</div>
</div>
</div>
<p class="help-block">Browse for the Tautulli configuration file you wish to import.</p>
</div>
<div class="checkbox">
<label>
<input type="checkbox" name="import_backup_config" id="import_backup_config" value="1" checked> Backup Current Configuration
</label>
<p class="help-block">Automatically create a backup of the current configuration before importing.</p>
</div>
<div class="form-group">
<label>Import Notes</label>
<p class="help-block">The following settings will <em>not</em> be imported:</p>
<ul class="help-block" style="padding-inline-start: 15px;">
<li>Git Path, Log / Backup / Cache Directory, Plex Logs Folder</li>
<li>Custom Newsletter Templates Folder, Newsletter Output Directory</li>
<li>HTTP Host / Port / Root / Username / Password</li>
<li>Enable HTTPS, HTTPS Certificate / Certificate Chain / Key</li>
</ul>
</div>
</form>
</div>
<div class="modal-footer">
<div>
<span id="status-message" style="padding-right: 25px;"></span>
<input type="button" id="import_config" class="btn btn-bright" value="Import">
</div>
</div>
</div>
</div>
<script>
$("#import_config_file").change(function() {
if ($(this)[0].files[0]) {
$("#import_config_file_name").val($(this)[0].files[0].name);
}
});
$("#import_config").click(function() {
$(this).prop('disabled', true);
var config_file = $("#import_config_file")[0].files[0];
var config_path = $("#import_config_path").val();
var backup = $("#import_backup_config").is(':checked');
var content_type;
var process_data;
var data;
if (config_file) {
content_type = false;
process_data = false;
data = new FormData();
data.append('config_file', config_file);
data.append('backup', backup);
} else {
content_type = 'application/x-www-form-urlencoded; charset=UTF-8';
process_data = true;
data = {
config_path: config_path,
backup: backup
}
}
if (config_file) {
$("#status-message").html('<i class="fa fa-fw fa-spin fa-refresh"></i>&nbsp; Uploading config file...');
} else {
$("#status-message").html('<i class="fa fa-fw fa-spin fa-refresh"></i>');
}
$.ajax({
url: 'import_config',
type: 'POST',
data: data,
cache: false,
async: true,
contentType: content_type,
processData: process_data,
success: function(data) {
var msg;
if (data.result === 'success') {
msg = "<i class='fa fa-check'></i>&nbsp; " + data.message;
window.location.href = 'restart_import_config';
} else {
msg = "<i class='fa fa-exclamation-triangle'></i>&nbsp; " + data.message;
}
$("#status-message").html(msg);
$("#import_config_file").val(null);
$("#import_config_file_name").val('');
$("#import_config_path").val('');
},
error: function (xhr) {
var msg = "<i class='fa fa-exclamation-triangle'></i>&nbsp; Error (" + xhr.status + "): ";
if (xhr.status === 413) {
msg += "file is too large to upload"
} else {
msg += 'try again'
}
$("#status-message").html(msg);
},
complete: function(xhr) {
$("#import_config").prop('disabled', false);
}
});
});
</script>

View file

@ -11,6 +11,7 @@ DOCUMENTATION :: END
<%!
import os
import sqlite3
import sys
import plexpy
from plexpy import common, logger
@ -22,11 +23,11 @@ DOCUMENTATION :: END
% if plexpy.CURRENT_VERSION:
<tr>
<td>Git Branch:</td>
<td><a class="no-highlight" href="${anon_url('https://github.com/%s/%s/tree/%s' % (plexpy.CONFIG.GIT_USER, plexpy.CONFIG.GIT_REPO, plexpy.CONFIG.GIT_BRANCH))}" target="_blank">${plexpy.CONFIG.GIT_BRANCH}</a></td>
<td><a class="no-highlight" href="${anon_url('https://github.com/%s/%s/tree/%s' % (plexpy.CONFIG.GIT_USER, plexpy.CONFIG.GIT_REPO, plexpy.CONFIG.GIT_BRANCH))}" target="_blank" rel="noreferrer">${plexpy.CONFIG.GIT_BRANCH}</a></td>
</tr>
<tr>
<td>Git Commit Hash:</td>
<td><a class="no-highlight" href="${anon_url('https://github.com/%s/%s/commit/%s' % (plexpy.CONFIG.GIT_USER, plexpy.CONFIG.GIT_REPO, plexpy.CURRENT_VERSION))}" target="_blank">${plexpy.CURRENT_VERSION}</a></td>
<td><a class="no-highlight" href="${anon_url('https://github.com/%s/%s/commit/%s' % (plexpy.CONFIG.GIT_USER, plexpy.CONFIG.GIT_REPO, plexpy.CURRENT_VERSION))}" target="_blank" rel="noreferrer">${plexpy.CURRENT_VERSION}</a></td>
</tr>
% endif
<tr>
@ -49,6 +50,10 @@ DOCUMENTATION :: END
<td>Cache Directory:</td>
<td>${plexpy.CONFIG.CACHE_DIR}</td>
</tr>
<tr>
<td>Export Directory:</td>
<td>${plexpy.CONFIG.EXPORT_DIR}</td>
</tr>
<tr>
<td>Newsletter Directory:</td>
<td>${plexpy.CONFIG.NEWSLETTER_DIR}</td>
@ -65,28 +70,36 @@ DOCUMENTATION :: END
</tr>
<tr>
<td>System Timezone:</td>
<td>${plexpy.SYS_TIMEZONE.zone} (${'UTC{}'.format(plexpy.SYS_UTC_OFFSET)})
<td>${str(plexpy.SYS_TIMEZONE)} (${'UTC{}'.format(plexpy.SYS_UTC_OFFSET)})
</tr>
<tr>
<td>System Language:</td>
<td>${plexpy.SYS_LANGUAGE}${' (override {})'.format(plexpy.CONFIG.PMS_LANGUAGE) if plexpy.CONFIG.PMS_LANGUAGE else ''}</td>
</tr>
<tr>
<td>Python Version:</td>
<td>${sys.version}</td>
</tr>
<tr>
<td>SQLite Version:</td>
<td>${sqlite3.sqlite_version}</td>
</tr>
<tr>
<td class="top-line">Resources:</td>
<td class="top-line">
<a class="no-highlight" href="${anon_url('https://tautulli.com')}" target="_blank">Tautulli Website</a> |
<a class="no-highlight" href="${anon_url('https://github.com/%s/%s' % (plexpy.CONFIG.GIT_USER, plexpy.CONFIG.GIT_REPO))}" target="_blank">GitHub Source</a> |
<a class="no-highlight guidelines-modal-link" href="${anon_url('https://github.com/%s/%s-Issues' % (plexpy.CONFIG.GIT_USER, plexpy.CONFIG.GIT_REPO))}" data-id="issue">GitHub Issues</a> |
<a class="no-highlight" href="${anon_url('https://github.com/%s/%s-Wiki' % (plexpy.CONFIG.GIT_USER, plexpy.CONFIG.GIT_REPO))}" target="_blank">GitHub Wiki</a> |
<a class="no-highlight guidelines-modal-link" href="${anon_url('http://feathub.com/%s/%s' % (plexpy.CONFIG.GIT_USER, plexpy.CONFIG.GIT_REPO))}" data-id="feature request">FeatHub Feature Requests</a>
<a class="no-highlight" href="${anon_url('https://tautulli.com')}" target="_blank" rel="noreferrer">Tautulli Website</a> |
<a class="no-highlight" href="${anon_url('https://github.com/%s/%s' % (plexpy.CONFIG.GIT_USER, plexpy.CONFIG.GIT_REPO))}" target="_blank" rel="noreferrer">Source</a> |
<a class="no-highlight" href="${anon_url('https://github.com/%s/%s/wiki' % (plexpy.CONFIG.GIT_USER, plexpy.CONFIG.GIT_REPO))}" target="_blank" rel="noreferrer">Wiki</a> |
<a class="no-highlight guidelines-modal-link" href="${anon_url('https://github.com/%s/%s/issues' % (plexpy.CONFIG.GIT_USER, plexpy.CONFIG.GIT_REPO))}" rel="noreferrer" data-id="issue">Bug Reports</a> |
<a class="no-highlight guidelines-modal-link" href="${anon_url('https://github.com/%s/%s/issues' % (plexpy.CONFIG.GIT_USER, plexpy.CONFIG.GIT_REPO))}" rel="noreferrer" data-id="feature request">Feature Requests</a>
</td>
</tr>
<tr>
<td>Support:</td>
<td>
<a class="no-highlight support-modal-link" href="${anon_url('https://tautulli.com/discord')}" target="_blank">Tautulli Discord Server</a> |
<a class="no-highlight support-modal-link" href="${anon_url('https://www.reddit.com/r/Tautulli')}" target="_blank">Tautulli Subreddit</a> |
<a class="no-highlight support-modal-link" href="${anon_url('https://forums.plex.tv/t/tautulli-monitor-your-plex-media-server/225242')}" target="_blank">Plex Forums</a>
<a class="no-highlight support-modal-link" href="${anon_url('https://tautulli.com/discord')}" target="_blank" rel="noreferrer">Tautulli Discord Server</a> |
<a class="no-highlight support-modal-link" href="${anon_url('https://www.reddit.com/r/Tautulli')}" target="_blank" rel="noreferrer">Tautulli Subreddit</a> |
<a class="no-highlight support-modal-link" href="${anon_url('https://forums.plex.tv/t/tautulli-monitor-your-plex-media-server/225242')}" target="_blank" rel="noreferrer">Plex Forums</a>
</td>
</tr>
</tbody>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -1,371 +0,0 @@
div.dataTables_length label {
font-weight: normal;
text-align: left;
white-space: nowrap;
}
div.dataTables_length select {
width: 75px;
display: inline-block;
}
div.dataTables_filter {
text-align: right;
}
div.dataTables_filter label {
font-weight: normal;
white-space: nowrap;
text-align: left;
}
div.dataTables_filter input {
margin-left: 0.5em;
display: inline-block;
width: auto;
}
div.dataTables_info {
padding-top: 8px;
white-space: nowrap;
}
div.dataTables_paginate {
margin: 0;
white-space: nowrap;
text-align: right;
}
div.dataTables_paginate ul.pagination {
margin: 2px 0;
white-space: nowrap;
}
@media screen and (max-width: 767px) {
div.dataTables_wrapper > div.row > div,
div.dataTables_length,
div.dataTables_filter,
div.dataTables_info,
div.dataTables_paginate {
text-align: center;
}
div.DTTT {
margin-bottom: 0.5em;
}
}
table.dataTable td,
table.dataTable th {
-webkit-box-sizing: content-box;
-moz-box-sizing: content-box;
box-sizing: content-box;
}
table.dataTable {
clear: both;
margin-top: 6px !important;
margin-bottom: 6px !important;
max-width: none !important;
}
table.dataTable thead .sorting,
table.dataTable thead .sorting_asc,
table.dataTable thead .sorting_desc,
table.dataTable thead .sorting_asc_disabled,
table.dataTable thead .sorting_desc_disabled {
cursor: pointer;
position: relative;
}
table.dataTable thead .sorting:after,
table.dataTable thead .sorting_asc:after,
table.dataTable thead .sorting_desc:after {
position: absolute;
top: 8px;
right: 8px;
display: block;
font-family: 'Glyphicons Halflings';
opacity: 0.5;
}
table.dataTable thead .sorting:after {
opacity: 0.2;
content: "\e150"; /* sort */
}
table.dataTable thead .sorting_asc:after {
content: "\e155"; /* sort-by-attributes */
}
table.dataTable thead .sorting_desc:after {
content: "\e156"; /* sort-by-attributes-alt */
}
div.dataTables_scrollBody table.dataTable thead .sorting:after,
div.dataTables_scrollBody table.dataTable thead .sorting_asc:after,
div.dataTables_scrollBody table.dataTable thead .sorting_desc:after {
display: none;
}
table.dataTable thead .sorting_asc_disabled:after,
table.dataTable thead .sorting_desc_disabled:after {
color: #eee;
}
table.dataTable thead > tr > th {
padding-right: 30px;
}
table.dataTable th:active {
outline: none;
}
/* Condensed */
table.dataTable.table-condensed thead > tr > th {
padding-right: 20px;
}
table.dataTable.table-condensed thead .sorting:after,
table.dataTable.table-condensed thead .sorting_asc:after,
table.dataTable.table-condensed thead .sorting_desc:after {
top: 6px;
right: 6px;
}
/* Scrolling */
div.dataTables_scrollHead table {
margin-bottom: 0 !important;
border-bottom-left-radius: 0;
border-bottom-right-radius: 0;
}
div.dataTables_scrollHead table thead tr:last-child th:first-child,
div.dataTables_scrollHead table thead tr:last-child td:first-child {
border-bottom-left-radius: 0 !important;
border-bottom-right-radius: 0 !important;
}
div.dataTables_scrollBody table {
border-top: none;
margin-top: 0 !important;
margin-bottom: 0 !important;
}
div.dataTables_scrollBody tbody tr:first-child th,
div.dataTables_scrollBody tbody tr:first-child td {
border-top: none;
}
div.dataTables_scrollFoot table {
margin-top: 0 !important;
border-top: none;
}
/* Frustratingly the border-collapse:collapse used by Bootstrap makes the column
width calculations when using scrolling impossible to align columns. We have
to use separate
*/
table.table-bordered.dataTable {
border-collapse: separate !important;
}
table.table-bordered thead th,
table.table-bordered thead td {
border-left-width: 0;
border-top-width: 0;
}
table.table-bordered tbody th,
table.table-bordered tbody td {
border-left-width: 0;
border-bottom-width: 0;
}
table.table-bordered tfoot th,
table.table-bordered tfoot td {
border-left-width: 0;
border-bottom-width: 0;
}
table.table-bordered th:last-child,
table.table-bordered td:last-child {
border-right-width: 0;
}
div.dataTables_scrollHead table.table-bordered {
border-bottom-width: 0;
}
/*
* TableTools styles
*/
.table.dataTable tbody tr.active td,
.table.dataTable tbody tr.active th {
background-color: #08C;
color: white;
}
.table.dataTable tbody tr.active:hover td,
.table.dataTable tbody tr.active:hover th {
background-color: #0075b0 !important;
}
.table.dataTable tbody tr.active th > a,
.table.dataTable tbody tr.active td > a {
color: white;
}
.table-striped.dataTable tbody tr.active:nth-child(odd) td,
.table-striped.dataTable tbody tr.active:nth-child(odd) th {
background-color: #017ebc;
}
table.DTTT_selectable tbody tr {
cursor: pointer;
}
div.DTTT .btn:hover {
text-decoration: none !important;
}
ul.DTTT_dropdown.dropdown-menu {
z-index: 2003;
}
ul.DTTT_dropdown.dropdown-menu a {
color: #333 !important; /* needed only when demo_page.css is included */
}
ul.DTTT_dropdown.dropdown-menu li {
position: relative;
}
ul.DTTT_dropdown.dropdown-menu li:hover a {
background-color: #0088cc;
color: white !important;
}
div.DTTT_collection_background {
z-index: 2002;
}
/* TableTools information display */
div.DTTT_print_info {
position: fixed;
top: 50%;
left: 50%;
width: 400px;
height: 150px;
margin-left: -200px;
margin-top: -75px;
text-align: center;
color: #333;
padding: 10px 30px;
opacity: 0.95;
background-color: white;
border: 1px solid rgba(0, 0, 0, 0.2);
border-radius: 6px;
-webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.5);
box-shadow: 0 3px 7px rgba(0, 0, 0, 0.5);
}
div.DTTT_print_info h6 {
font-weight: normal;
font-size: 28px;
line-height: 28px;
margin: 1em;
}
div.DTTT_print_info p {
font-size: 14px;
line-height: 20px;
}
div.dataTables_processing {
position: absolute;
top: 50%;
left: 50%;
width: 100%;
height: 60px;
margin-left: -50%;
margin-top: -25px;
padding-top: 20px;
padding-bottom: 20px;
text-align: center;
font-size: 1.2em;
background-color: white;
background: -webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255,255,255,0)), color-stop(25%, rgba(255,255,255,0.9)), color-stop(75%, rgba(255,255,255,0.9)), color-stop(100%, rgba(255,255,255,0)));
background: -webkit-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);
background: -moz-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);
background: -ms-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);
background: -o-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);
background: linear-gradient(to right, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);
}
/*
* FixedColumns styles
*/
div.DTFC_LeftHeadWrapper table,
div.DTFC_LeftFootWrapper table,
div.DTFC_RightHeadWrapper table,
div.DTFC_RightFootWrapper table,
table.DTFC_Cloned tr.even {
background-color: white;
margin-bottom: 0;
}
div.DTFC_RightHeadWrapper table ,
div.DTFC_LeftHeadWrapper table {
border-bottom: none !important;
margin-bottom: 0 !important;
border-top-right-radius: 0 !important;
border-bottom-left-radius: 0 !important;
border-bottom-right-radius: 0 !important;
}
div.DTFC_RightHeadWrapper table thead tr:last-child th:first-child,
div.DTFC_RightHeadWrapper table thead tr:last-child td:first-child,
div.DTFC_LeftHeadWrapper table thead tr:last-child th:first-child,
div.DTFC_LeftHeadWrapper table thead tr:last-child td:first-child {
border-bottom-left-radius: 0 !important;
border-bottom-right-radius: 0 !important;
}
div.DTFC_RightBodyWrapper table,
div.DTFC_LeftBodyWrapper table {
border-top: none;
margin: 0 !important;
}
div.DTFC_RightBodyWrapper tbody tr:first-child th,
div.DTFC_RightBodyWrapper tbody tr:first-child td,
div.DTFC_LeftBodyWrapper tbody tr:first-child th,
div.DTFC_LeftBodyWrapper tbody tr:first-child td {
border-top: none;
}
div.DTFC_RightFootWrapper table,
div.DTFC_LeftFootWrapper table {
border-top: none;
margin-top: 0 !important;
}
div.DTFC_LeftBodyWrapper table.dataTable thead .sorting:after,
div.DTFC_LeftBodyWrapper table.dataTable thead .sorting_asc:after,
div.DTFC_LeftBodyWrapper table.dataTable thead .sorting_desc:after,
div.DTFC_RightBodyWrapper table.dataTable thead .sorting:after,
div.DTFC_RightBodyWrapper table.dataTable thead .sorting_asc:after,
div.DTFC_RightBodyWrapper table.dataTable thead .sorting_desc:after {
display: none;
}
/*
* FixedHeader styles
*/
div.FixedHeader_Cloned table {
margin: 0 !important
}

File diff suppressed because one or more lines are too long

View file

@ -71,7 +71,7 @@ ul.ColVis_collection {
list-style: none;
width: 150px;
padding: 8px 8px 4px 8px;
margin: 10px 0px 0px 0px;
margin: 10px 0px 10px 0px;
background-color: #444;
overflow: hidden;
z-index: 2002;

File diff suppressed because it is too large Load diff

View file

@ -62,7 +62,7 @@ DOCUMENTATION :: END
% if session is not None:
<%
from collections import defaultdict
from plexpy.helpers import cast_to_int, page
from plexpy.helpers import cast_to_int, get_percent, page, short_season
from plexpy.common import VIDEO_RESOLUTION_OVERRIDES, AUDIO_CODEC_OVERRIDES, EXTRA_TYPES
import plexpy
%>
@ -74,6 +74,8 @@ DOCUMENTATION :: END
parent_href = page('info', data['parent_rating_key'])
grandparent_href = page('info', data['grandparent_rating_key'])
user_href = page('user', data['user_id']) if data['user_id'] else '#'
library_href = page('library', data['section_id']) if data['section_id'] else '#'
season = short_season(data['parent_title'])
%>
<div class="dashboard-activity-instance" id="activity-instance-${sk}" data-key="${sk}" data-id="${data['session_id']}"
data-rating_key="${data['rating_key']}" data-parent_rating_key="${data['parent_rating_key']}" data-grandparent_rating_key="${data['grandparent_rating_key']}"
@ -118,9 +120,7 @@ DOCUMENTATION :: END
<div id="poster-${sk}" class="dashboard-activity-cover" style="background-image: url(${page('pms_image_proxy', data['parent_thumb'], data['parent_rating_key'], 300, 300, fallback='cover', refresh=True)});"></div>
</a>
% elif data['media_type'] in ('photo', 'clip'):
% if data['extra_type']:
<div id="poster-${sk}" class="dashboard-activity-poster" style="background-image: url(${page('pms_image_proxy', data['art'].replace('/art', '/thumb') or data['thumb'], data['rating_key'], 300, 450, fallback='poster', refresh=True)});"></div>
% elif data['parent_thumb']:
% if data['parent_thumb']:
<div id="poster-${sk}" class="dashboard-activity-poster" style="background-image: url(${page('pms_image_proxy', data['parent_thumb'], data['parent_rating_key'], 300, 450, fallback='poster', refresh=True)});"></div>
% else:
<div id="poster-${sk}" class="dashboard-activity-poster" style="background-image: url(${page('pms_image_proxy', data['thumb'], data['rating_key'], 300, 450, fallback='poster', refresh=True)});"></div>
@ -161,7 +161,8 @@ DOCUMENTATION :: END
</li>
<li class="dashboard-activity-info-item">
<div class="sub-heading">Quality</div>
<div class="sub-value platform-right" id="stream_quality-${sk}">
<div class="sub-value platform-right">
<span id="stream_quality-${sk}">
% if data['media_type'] != 'photo' and data['quality_profile'] != 'Unknown':
<%
br = cast_to_int(data['stream_bitrate']) or ''
@ -175,6 +176,8 @@ DOCUMENTATION :: END
% else:
${data['quality_profile']}
% endif
</span>
<span data-toggle="tooltip" title="Quality profile is only an estimate based on bitrate and may be incorrect"><i class="fa fa-exclamation-circle"></i></span>
</div>
</li>
% if data['optimized_version'] == 1:
@ -220,7 +223,7 @@ DOCUMENTATION :: END
<div class="sub-heading">Container</div>
<div class="sub-value" id="transcode_container-${sk}">
% if data['stream_container_decision'] == 'transcode':
Transcode (${data['container'].upper()} <i class="fa fa-long-arrow-right"></i> ${data['stream_container'].upper()})
Converting (${data['container'].upper()} <i class="fa fa-long-arrow-right"></i> ${data['stream_container'].upper()})
% else:
Direct Play (${data['stream_container'].upper()})
% endif
@ -232,11 +235,14 @@ DOCUMENTATION :: END
<div class="sub-value" id="video_decision-${sk}">
% if data['media_type'] in ('movie', 'episode', 'clip') and data['stream_video_decision']:
<%
if data['video_dynamic_range'] == 'HDR':
if data['video_dynamic_range'] != 'SDR':
video_dynamic_range = ' ' + data['video_dynamic_range']
else:
video_dynamic_range = ''
if data['stream_video_dynamic_range'] != 'SDR' or video_dynamic_range:
stream_video_dynamic_range = ' ' + data['stream_video_dynamic_range']
else:
video_dynamic_range = stream_video_dynamic_range = ''
stream_video_dynamic_range = ''
%>
% if data['stream_video_decision'] == 'transcode':
<%
@ -260,12 +266,15 @@ DOCUMENTATION :: END
<div class="sub-heading">Audio</div>
<div class="sub-value" id="audio_decision-${sk}">
% if data['stream_audio_decision']:
<%
audio_language = (data['audio_language'] or 'Unknown') + ' - ' if data['media_type'] != 'track' else ''
%>
% if data['stream_audio_decision'] == 'transcode':
Transcode (${AUDIO_CODEC_OVERRIDES.get(data['audio_codec'], data['audio_codec'].upper())} ${data['audio_channel_layout'].split('(')[0].capitalize()} <i class="fa fa-long-arrow-right"></i> ${AUDIO_CODEC_OVERRIDES.get(data['stream_audio_codec'], data['stream_audio_codec'].upper())} ${data['stream_audio_channel_layout'].split('(')[0].capitalize()})
Transcode (${audio_language}${AUDIO_CODEC_OVERRIDES.get(data['audio_codec'], data['audio_codec'].upper())} ${data['audio_channel_layout'].split('(')[0].capitalize()} <i class="fa fa-long-arrow-right"></i> ${AUDIO_CODEC_OVERRIDES.get(data['stream_audio_codec'], data['stream_audio_codec'].upper())} ${data['stream_audio_channel_layout'].split('(')[0].capitalize()})
% elif data['stream_audio_decision'] == 'copy':
Direct Stream (${AUDIO_CODEC_OVERRIDES.get(data['stream_audio_codec'], data['stream_audio_codec'].upper())} ${data['stream_audio_channel_layout'].split('(')[0].capitalize()})
Direct Stream (${audio_language}${AUDIO_CODEC_OVERRIDES.get(data['stream_audio_codec'], data['stream_audio_codec'].upper())} ${data['stream_audio_channel_layout'].split('(')[0].capitalize()})
% else:
Direct Play (${AUDIO_CODEC_OVERRIDES.get(data['stream_audio_codec'], data['stream_audio_codec'].upper())} ${data['stream_audio_channel_layout'].split('(')[0].capitalize()})
Direct Play (${audio_language}${AUDIO_CODEC_OVERRIDES.get(data['stream_audio_codec'], data['stream_audio_codec'].upper())} ${data['stream_audio_channel_layout'].split('(')[0].capitalize()})
% endif
% endif
</div>
@ -280,13 +289,13 @@ DOCUMENTATION :: END
subtitle_codec = 'None' if data['stream_subtitle_codec'] and data['stream_subtitle_transient'] else data['subtitle_codec'].upper()
%>
% if data['stream_subtitle_decision'] == 'transcode':
Transcode (${subtitle_codec} <i class="fa fa-long-arrow-right"></i> ${data['stream_subtitle_codec'].upper()})
Transcode (${data['subtitle_language'] or 'Unknown'} - ${subtitle_codec} <i class="fa fa-long-arrow-right"></i> ${data['stream_subtitle_codec'].upper()})
% elif data['stream_subtitle_decision'] == 'copy':
Direct Stream (${subtitle_codec})
Direct Stream (${data['subtitle_language'] or 'Unknown'} - ${subtitle_codec})
% elif data['stream_subtitle_decision'] == 'burn':
Burn (${subtitle_codec})
Burn (${data['subtitle_language'] or 'Unknown'} - ${subtitle_codec})
% else:
Direct Play (${subtitle_codec if data['synced_version'] else data['stream_subtitle_codec'].upper()})
Direct Play (${data['subtitle_language'] or 'Unknown'} - ${subtitle_codec if data['synced_version'] else data['stream_subtitle_codec'].upper()})
% endif
% else:
None
@ -316,7 +325,8 @@ DOCUMENTATION :: END
% if data['relayed']:
<span data-toggle="tooltip" title="Plex Relay"><i class="fa fa-exclamation-circle"></i></span>
% else:
<a href="#" class="external_ip-modal" data-toggle="modal" data-target="#ip-info-modal" data-ip="${data['ip_address']}">
<a href="#" class="external_ip-modal" data-toggle="modal" data-target="#ip-info-modal"
data-ip="${data['ip_address']}" data-location="${data['location']}" data-secure="${data['secure']}" data-relayed="${data['relayed']}">
<span id="external_ip-${sk}" class="external-ip-tooltip" data-toggle="tooltip" title="Lookup External IP" style="display: none;"><i class="fa fa-map-marker"></i></span>
</a>
<script>
@ -360,7 +370,7 @@ DOCUMENTATION :: END
% if data['media_type'] != 'photo':
<div class="dashboard-activity-info-time">
% if data['live']:
<br /><span class="thumb-tooltip" data-toggle="popover" data-img="${data['channel_thumb']}" data-height="40" data-width="40">${data['channel_call_sign']} ${data['channel_identifier']}</span>
<br /><span class="thumb-tooltip dashboard-activity-info-channel" data-toggle="popover" data-img="${data['channel_thumb']}" data-height="40" data-width="40">${data['channel_title'] or (data['channel_vcn'] + ' ' + data['channel_call_sign'])}</span>
% elif data['view_offset']:
ETA:
<span id="stream-eta-${sk}">
@ -392,15 +402,16 @@ DOCUMENTATION :: END
% if data['live']:
<div id="progress-bar-${sk}" class="progress-bar" style="width: 100%" data-state="live" data-toggle="tooltip" title="Stream Progress Live">Live</div>
% else:
<div id="buffer-bar-${sk}" class="buffer-bar" style="width: ${data['transcode_progress']}%" data-toggle="tooltip" title="Transcoder Progress ${data['transcode_progress']}%">${data['transcode_progress']}%</div>
<% transcode_progress = get_percent(data['transcode_max_offset_available'] * 1000, data['duration']) or data['transcode_progress'] %>
<div id="buffer-bar-${sk}" class="buffer-bar" style="width: ${transcode_progress}%" data-toggle="tooltip" title="Transcoder Progress ${transcode_progress}%">${transcode_progress}%</div>
<div id="progress-bar-${sk}" class="progress-bar" style="width: ${data['progress_percent']}%" data-last_view_offset="${data['view_offset']}" data-view_offset="${data['view_offset']}" data-stream_duration="${data['stream_duration']}" data-state="${data['state']}" data-toggle="tooltip" title="Stream Progress ${data['progress_percent']}%">${data['progress_percent']}%</div>
% endif
</div>
</div>
</div>
<div class="dashboard-activity-metadata-wrapper">
<a href="${user_href}" title="${data['friendly_name']}">
<div class="dashboard-activity-metadata-user-thumb" style="background-image: url(${data['user_thumb']});"></div>
<a href="${user_href}" title="${data['username']}">
<div class="dashboard-activity-metadata-user-thumb" style="background-image: url(${page('pms_image_proxy', data['user_thumb'], None, 80, 80, fallback='user')});"></div>
</a>
<div class="dashboard-activity-metadata-title-container">
<div id="play-state-${sk}" class="dashboard-activity-metadata-play_state-icon" title="${data['state'].capitalize()}">
@ -410,6 +421,10 @@ DOCUMENTATION :: END
<i class="fa fa-fw fa-pause"></i>&nbsp;
% elif data['state'] == 'buffering':
<i class="fa fa-fw fa-spinner"></i>&nbsp;
% elif data['state'] == 'error':
<i class="fa fa-fw fa-exclamation-triangle"></i>&nbsp;
% else:
<i class="fa fa-fw fa-question-circle"></i>&nbsp;
% endif
</div>
<div class="dashboard-activity-metadata-title">
@ -449,21 +464,27 @@ DOCUMENTATION :: END
<div class="dashboard-activity-metadata-subtitle-container">
% if data['live']:
<div id="media-type-${sk}" class="dashboard-activity-metadata-media_type-icon" title="Live TV">
<i class="fa fa-fw fa-broadcast-tower"></i>&nbsp;
<a href="${library_href}">
<i class="fa fa-fw fa-broadcast-tower"></i>
</a>&nbsp;
</div>
% elif data['channel_stream'] == 0:
<div id="media-type-${sk}" class="dashboard-activity-metadata-media_type-icon" title="${data['media_type'].capitalize()}">
% if data['media_type'] == 'movie':
<i class="fa fa-fw fa-film"></i>&nbsp;
% elif data['media_type'] == 'episode':
<i class="fa fa-fw fa-television"></i>&nbsp;
% elif data['media_type'] == 'track':
<i class="fa fa-fw fa-music"></i>&nbsp;
% elif data['media_type'] == 'photo':
<i class="fa fa-fw fa-picture-o"></i>&nbsp;
% elif data['media_type'] == 'clip':
<i class="fa fa-fw fa-video-camera"></i>&nbsp;
% endif
<a href="${library_href}">
% if data['media_type'] == 'movie':
<i class="fa fa-fw fa-film"></i>
% elif data['media_type'] == 'episode':
<i class="fa fa-fw fa-television"></i>
% elif data['media_type'] == 'track':
<i class="fa fa-fw fa-music"></i>
% elif data['media_type'] == 'photo':
<i class="fa fa-fw fa-picture-o"></i>
% elif data['media_type'] == 'clip':
<i class="fa fa-fw fa-video-camera"></i>
% else:
<i class="fa fa-fw fa-question-circle"></i>
% endif
</a>&nbsp;
</div>
% else:
<div id="media-type-${sk}" class="dashboard-activity-metadata-media_type-icon" title="Channel">
@ -476,7 +497,7 @@ DOCUMENTATION :: END
<span title="${data['year']}" class="sub-heading">${data['year']}</span>
% elif data['media_type'] == 'episode':
% if data['media_index']:
<a href="${href}" title="Season ${data['parent_media_index']}" class="sub-heading">S${data['parent_media_index']}</a>
<a href="${href}" title="${data['parent_title']}" class="sub-heading">${season}</a>
&middot; <a href="${href}" title="Episode ${data['media_index']}" class="sub-heading">E${data['media_index']}</a>
% else:
<a href="${href}" title="${data['originally_available_at']}" class="sub-heading">${data['originally_available_at']}</a>
@ -488,7 +509,7 @@ DOCUMENTATION :: END
% if data['media_type'] == 'movie':
<span title="${data['year']}" class="sub-heading">${data['year']}</span>
% elif data['media_type'] == 'episode':
<a href="${parent_href}" title="Season ${data['parent_media_index']}" class="sub-heading">S${data['parent_media_index']}</a>
<a href="${parent_href}" title="${data['parent_title']}" class="sub-heading">${season}</a>
&middot; <a href="${href}" title="Episode ${data['media_index']}" class="sub-heading">E${data['media_index']}</a>
% elif data['media_type'] == 'track':
<a id="metadata-parent_title-${sk}" href="${parent_href}" title="${data['parent_title']}" class="sub-heading">${data['parent_title']}</a>
@ -505,7 +526,7 @@ DOCUMENTATION :: END
% elif data['channel_title']:
<span title="${data['channel_title']}" class="sub-heading">${data['channel_title']}</span>
% if data['media_type'] == 'episode' and data['parent_media_index'] and data['media_index']:
(<span title="Season ${data['parent_media_index']}" class="sub-heading">S${data['parent_media_index']}</span>
(<span title="${data['parent_title']}" class="sub-heading">${season}</span>
&middot; <span title="Episode ${data['media_index']}" class="sub-heading">E${data['media_index']}</span>)
% elif data['media_type'] == 'episode' and data['originally_available_at']:
(<span title="${data['originally_available_at']}" class="sub-heading">${data['originally_available_at']}</span>)
@ -513,7 +534,7 @@ DOCUMENTATION :: END
% else:
<span title="Channel" class="sub-heading">Channel</span>
% if data['media_type'] == 'episode' and data['parent_media_index'] and data['media_index']:
(<span title="Season ${data['parent_media_index']}" class="sub-heading">S${data['parent_media_index']}</span>
(<span title="${data['parent_title']}" class="sub-heading">${season}</span>
&middot; <span title="Episode ${data['media_index']}" class="sub-heading">E${data['media_index']}</span>)
% elif data['media_type'] == 'episode' and data['originally_available_at']:
(<span title="${data['originally_available_at']}" class="sub-heading">${data['originally_available_at']}</span>)
@ -521,9 +542,9 @@ DOCUMENTATION :: END
% endif
</div>
<div class="dashboard-activity-metadata-user">
<a href="${user_href}" title="${data['friendly_name']}">${data['friendly_name']}</a>
<a href="${user_href}" title="${data['username']}">${data['friendly_name']}</a>
</div>
</div>
</div>
</div>
% endif
% endif

View file

@ -115,21 +115,13 @@ DOCUMENTATION :: END
var msg = 'Are you REALLY sure you want to purge all history for the <strong>${data["section_name"]}</strong> library?<br>' +
'This is permanent and cannot be undone!';
var url = 'delete_all_library_history';
confirmAjaxCall(url, msg, { section_id: '${data["section_id"]}' }, null, function () { location.reload(); });
confirmAjaxCall(url, msg, { server_id: '${server_id}', section_id: '${data["section_id"]}' }, null, function () { location.reload(); });
});
$('#undelete-library').click(function () {
var msg = 'Are you sure you want to undelete this user?';
var msg = 'Are you sure you want to undelete this library?';
var url = 'undelete_library';
confirmAjaxCall(url, msg, { section_id: '${data["section_id"]}' }, null, function () { location.reload(); });
});
$(document).ready(function() {
// Move #confirm-modal to parent container
if (!($('#edit-library-modal').next().is('#confirm-modal-purge'))) {
$('#confirm-modal-purge').appendTo($('#edit-library-modal').parent());
}
$('#edit-library-modal > #confirm-modal-purge').remove();
});
</script>
% endif

View file

@ -134,13 +134,5 @@ DOCUMENTATION :: END
var url = 'undelete_user';
confirmAjaxCall(url, msg, { user_id: '${data["user_id"]}' }, null, function () { location.reload(); });
});
$(document).ready(function() {
// Move #confirm-modal-purge to parent container
if (!($('#edit-user-modal').next().is('#confirm-modal-purge'))) {
$('#confirm-modal-purge').appendTo($('#edit-user-modal').parent());
}
$('#edit-user-modal > #confirm-modal-purge').remove();
});
</script>
% endif

View file

@ -0,0 +1,310 @@
<%doc>
USAGE DOCUMENTATION :: PLEASE LEAVE THIS AT THE TOP OF THIS FILE
For Mako templating syntax documentation please visit: http://docs.makotemplates.org/en/latest/
Filename: export_modal.html
Version: 0.1
Variable names: data [list]
data :: Usable parameters
== Global keys ==
DOCUMENTATION :: END
</%doc>
<%
import plexpy
from plexpy import exporter
from plexpy.helpers import anon_url
export = exporter.Export()
thumb_media_types = ', '.join([export.PLURAL_MEDIA_TYPES[k] for k, v in export.MEDIA_TYPES.items() if v[0]])
art_media_types = ', '.join([export.PLURAL_MEDIA_TYPES[k] for k, v in export.MEDIA_TYPES.items() if v[1]])
logo_media_types = ', '.join([export.PLURAL_MEDIA_TYPES[k] for k, v in export.MEDIA_TYPES.items() if v[2]])
%>
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
<h4 class="modal-title" id="info-modal-title">
${title}
</h4>
</div>
<div class="modal-body">
<form method="post" class="form" id="export_metadata_form">
<input type="hidden" id="export_section_id" name="export_section_id" value="${section_id or ''}" />
<input type="hidden" id="export_user_id" name="export_user_id" value="${user_id or ''}" />
<input type="hidden" id="export_rating_key" name="export_rating_key" value="${rating_key or ''}" />
<input type="hidden" id="export_media_type" name="export_media_type" value="${media_type or ''}" />
<input type="hidden" id="export_sub_media_type" name="export_sub_media_type" value="${sub_media_type or ''}" />
<input type="hidden" id="export_export_type" name="export_export_type" value="${export_type or ''}" />
<div class="form-group">
<label>Instructions</label>
<p class="help-block">
Please see the <a href="${anon_url('https://github.com/%s/%s/wiki/Exporter-Guide' % (plexpy.CONFIG.GIT_USER, plexpy.CONFIG.GIT_REPO))}" target="_blank" rel="noreferrer">Exporter Guide</a> for more details about each option.
</p>
</div>
<div class="form-group">
<label for="export_file_format">Data File Format</label>
<div class="row">
<div class="col-md-12">
<select class="form-control" id="export_file_format" name="export_file_format">
% for format in file_formats:
<option value="${format}">${format.upper()}</option>
% endfor
</select>
</div>
</div>
<p class="help-block">Select the export data file format.</p>
</div>
% if not rating_key:
<div class="checkbox">
<label>
<input type="checkbox" id="export_individual_files" name="export_individual_files" value="1"> Export Individual Files
</label>
<p class="help-block">Enable to export one file for each ${media_type} instead of a single file containing all ${media_type}s.</p>
</div>
% endif
<div class="form-group">
<label for="export_metadata_level">Metadata Export Level</label>
<div class="row">
<div class="col-md-12">
<select class="form-control" id="export_metadata_level" name="export_metadata_level">
<option value="0">Level 0 - None / Custom</option>
<option value="1" selected>Level 1 - Basic Metadata</option>
<option value="2">Level 2 - Extended Metadata</option>
<option value="3">Level 3 - Advanced Metadata</option>
<option value="9">Level 9 - All Metadata</option>
</select>
</div>
</div>
<p class="help-block">Select the metadata export level. Higher levels include all fields from the lower levels.</p>
</div>
<div class="form-group">
<label for="export_custom_metadata_fields">Custom Metadata Fields</label>
<div class="row">
<div class="col-md-12">
<input type="text" class="form-control" id="export_custom_metadata_fields" name="export_custom_metadata_fields" data-field_type="Metadata">
</div>
</div>
<p class="help-block">Add additional fields to the selected metadata export level.</p>
</div>
<div class="form-group">
<label for="export_media_info_level">Media Info Export Level</label>
<div class="row">
<div class="col-md-12">
<select class="form-control" id="export_media_info_level" name="export_media_info_level">
<option value="0">Level 0 - None / Custom</option>
<option value="1" selected>Level 1 - Basic Media Info</option>
<option value="2">Level 2 - Extended Media Info</option>
<option value="3">Level 3 - Advanced Media Info</option>
<option value="9">Level 9 - All Media Info</option>
</select>
</div>
</div>
<p class="help-block">Select the media info export level. Higher levels include all fields from the lower levels.</p>
</div>
<div class="form-group">
<label for="export_custom_media_info_fields">Custom Media Info Fields</label>
<div class="row">
<div class="col-md-12">
<input type="text" class="form-control" id="export_custom_media_info_fields" name="export_custom_media_info_fields" data-field_type="Media Info">
</div>
</div>
<p class="help-block">Add additional fields to the selected media info export level.</p>
</div>
<div class="form-group">
<label for="export_thumb_level">Poster and Cover Image Export Level</label>
<div class="row">
<div class="col-md-12">
<select class="form-control" id="export_thumb_level" name="export_thumb_level">
<option value="0" selected>Level 0 - None / Custom</option>
<option value="1">Level 1 - Uploaded and Selected Posters and Covers Only</option>
<option value="2">Level 2 - Selected and Locked Posters and Covers Only</option>
<option value="9">Level 9 - All Selected Posters and Covers</option>
</select>
</div>
</div>
<p class="help-block">
Select the level to export poster and cover image files.<br>Note: Only applies to ${thumb_media_types}.
</p>
</div>
<div class="form-group">
<label for="export_art_level">Background Artwork Image Export Level</label>
<div class="row">
<div class="col-md-12">
<select class="form-control" id="export_art_level" name="export_art_level">
<option value="0" selected>Level 0 - None / Custom</option>
<option value="1">Level 1 - Uploaded and Selected Artwork Only</option>
<option value="2">Level 2 - Selected and Locked Artwork Only</option>
<option value="9">Level 9 - All Selected Artwork</option>
</select>
</div>
</div>
<p class="help-block">
Select the level to export background artwork image files.<br>Note: Only applies to ${art_media_types}.
</p>
</div>
<div class="form-group">
<label for="export_logo_level">Logo Image Export Level</label>
<div class="row">
<div class="col-md-12">
<select class="form-control" id="export_logo_level" name="export_logo_level">
<option value="0" selected>Level 0 - None / Custom</option>
<option value="1">Level 1 - Uploaded and Selected Logos Only</option>
<option value="2">Level 2 - Selected and Locked Logos Only</option>
<option value="9">Level 9 - All Selected Logos</option>
</select>
</div>
</div>
<p class="help-block">
Select the level to export logo image files.<br>Note: Only applies to ${logo_media_types}.
</p>
</div>
<p class="help-block">
Warning: Exporting images may take a long time! Images will be saved to a folder alongside the data file.
</p>
</form>
</div>
<div class="modal-footer">
<div>
<input type="button" class="btn btn-bright btn-ok" data-dismiss="modal" id="export_metadata" value="Export">
</div>
</div>
</div>
</div>
<script src="${http_root}js/selectize.plugin.disable-options.js"></script>
<script>
$('#export_metadata_form').submit(function(e) {
e.preventDefault();
})
var optgroups = (function () {
var optgroups = [];
for (var i = 0; i <= 9; i++) {
optgroups.push({$order: i+1, value: i});
}
return optgroups
})()
var $export_custom_fields = $('#export_custom_metadata_fields, #export_custom_media_info_fields').selectize({
plugins: {
'remove_button': {},
'disable_options': {
disableField: 'level'
}
},
maxItems: null,
valueField: 'field',
labelField: 'field',
sortField: 'field',
searchField: ['field'],
optgroupField: 'level',
optgroups: optgroups,
lockOptgroupOrder: true,
render: {
optgroup_header: function(data, escape) {
return '<div class="optgroup-header">' + escape(this.$input.data('field_type') + ' Level: ' + data.value) + '</div>';
},
option: function (item, escape) {
return '<div data-field="' + escape(item.field) + '" data-level="' + escape(item.level) + '">' + escape(item.field) +'</div>';
}
}
});
var export_custom_metadata_fields = $export_custom_fields[0].selectize;
var export_custom_media_info_fields = $export_custom_fields[1].selectize;
function setDisabledFields() {
var metadata_export_level = $('#export_metadata_level option:selected').val();
var media_info_export_level = $('#export_media_info_level option:selected').val();
export_custom_metadata_fields.setDisabledOptions([...Array(parseInt(metadata_export_level) + 1).keys()]);
export_custom_media_info_fields.setDisabledOptions([...Array(parseInt(media_info_export_level) + 1).keys()]);
}
$('#export_metadata_level, #export_media_info_level').on('change', setDisabledFields);
function getExportFields() {
$.ajax({
url: 'get_export_fields',
async: true,
data: {
media_type: $('#export_media_type').val(),
sub_media_type: $('#export_sub_media_type').val()
},
success: function (result) {
if (result) {
export_custom_metadata_fields.addOption(result.metadata_fields);
export_custom_media_info_fields.addOption(result.media_info_fields);
setDisabledFields();
}
}
})
}
getExportFields();
$('#export_file_format').on('change', function() {
if ($(this).val() === 'm3u') {
$('#export_metadata_level').prop('disabled', true);
$('#export_media_info_level').prop('disabled', true);
$("#export_thumb_level").prop('disabled', true);
$("#export_art_level").prop('disabled', true);
$("#export_logo_level").prop('disabled', true);
export_custom_metadata_fields.disable();
export_custom_media_info_fields.disable();
} else {
$('#export_metadata_level').prop('disabled', false);
$('#export_media_info_level').prop('disabled', false);
$("#export_thumb_level").prop('disabled', false);
$("#export_art_level").prop('disabled', false);
$("#export_logo_level").prop('disabled', false);
export_custom_metadata_fields.enable();
export_custom_media_info_fields.enable();
}
})
$("#export_metadata").click(function() {
var section_id = $('#export_section_id').val();
var user_id = $('#export_user_id').val();
var rating_key = $('#export_rating_key').val();
var metadata_export_level = $('#export_metadata_level option:selected').val();
var media_info_export_level = $('#export_media_info_level option:selected').val();
var file_format = $('#export_file_format option:selected').val();
var thumb_level = $("#export_thumb_level option:selected").val();
var art_level = $("#export_art_level option:selected").val();
var logo_level = $("#export_logo_level option:selected").val();
var custom_fields = [
$('#export_custom_metadata_fields').val(),
$('#export_custom_media_info_fields').val()
].filter(Boolean).join(',');
var export_type = $('#export_export_type').val()
var individual_files = $('#export_individual_files').is(':checked')
$.ajax({
url: 'export_metadata',
data: {
section_id: section_id,
user_id: user_id,
rating_key: rating_key,
metadata_level: metadata_export_level,
media_info_level: media_info_export_level,
file_format: file_format,
thumb_level: thumb_level,
art_level: art_level,
logo_level: logo_level,
custom_fields: custom_fields,
export_type: export_type,
individual_files: individual_files
},
async: true,
success: function (data) {
if (data.result === 'success') {
$("#nav-tabs-export").click();
redrawExportTable();
showMsg('<i class="fa fa-check"></i> ' + data.message, false, true, 5000);
} else {
showMsg('<i class="fa fa-exclamation-circle"></i> ' + data.message, false, true, 5000, true);
}
}
});
});
</script>

View file

@ -1,7 +1,8 @@
<%inherit file="base.html"/>
<%def name="headIncludes()">
<link rel="stylesheet" href="${http_root}css/dataTables.bootstrap.css">
<link rel="stylesheet" href="${http_root}css/bootstrap-select.min.css">
<link rel="stylesheet" href="${http_root}css/dataTables.bootstrap.min.css">
<link rel="stylesheet" href="${http_root}css/tautulli-dataTables.css">
</%def>
@ -14,17 +15,15 @@
<div class="button-bar">
<div class="btn-group" id="user-selection">
<label>
<select name="graph-user" id="graph-user" class="btn" style="color: inherit;">
<option value="">All Users</option>
<option disabled>&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;</option>
<select name="graph-user" id="graph-user" multiple>
</select>
</label>
</div>
<div class="btn-group" style="margin-right: 2px;" data-toggle="buttons" id="yaxis-selection">
<label class="btn btn-dark">
<label class="btn btn-dark btn-filter">
<input type="radio" name="yaxis-options" id="yaxis-plays" value="plays" autocomplete="off"> Play Count
</label>
<label class="btn btn-dark">
<label class="btn btn-dark btn-filter">
<input type="radio" name="yaxis-options" id="yaxis-duration" value="duration" autocomplete="off"> Play Duration
</label>
</div>
@ -40,17 +39,17 @@
</div>
</div>
</div>
<div class='table-card-back'>
<ul class="nav nav-pills" role="tablist" id="graph-tabs">
<li role="presentation"><a href="#tabs-1" aria-controls="tabs-1" data-toggle="tab" role="tab">Plays by Period</a></li>
<li role="presentation"><a href="#tabs-2" aria-controls="tabs-2" data-toggle="tab" role="tab">Stream Info</a></li>
<li role="presentation"><a href="#tabs-3" aria-controls="tabs-3" data-toggle="tab" role="tab">Play Totals</a></li>
<div class="table-card-back">
<ul class="nav nav-list nav-pills" role="tablist" id="graph-tabs">
<li role="presentation"><a id="nav-tabs-plays" href="#tabs-plays" aria-controls="tabs-plays" data-toggle="tab" role="tab">Media Type</a></li>
<li role="presentation"><a id="nav-tabs-stream" href="#tabs-stream" aria-controls="tabs-stream" data-toggle="tab" role="tab">Stream Type</a></li>
<li role="presentation"><a id="nav-tabs-total" href="#tabs-total" aria-controls="tabs-total" data-toggle="tab" role="tab">Play Totals</a></li>
</ul>
<div class="tab-content">
<div role="tabpanel" class="tab-pane" id="tabs-1">
<div role="tabpanel" class="tab-pane" id="tabs-plays">
<div class="row">
<div class="col-md-12">
<h4><i class="fa fa-history"></i> Daily <span class="yaxis-text">Play count</span> <small>Last <span class="days">30</span> days</small></h4>
<h4><i class="fa fa-history"></i> Daily <span class="yaxis-text" style="text-transform: lowercase;">play count</span> by media type <small>Last <span class="days">30</span> days</small></h4>
<p class="help-block">
The total play count or duration of tv, movies, and music played per day. Click a graph point to open up a list of items played for that specific date.
</p>
@ -123,10 +122,10 @@
</div>
</div>
</div>
<div role="tabpanel" class="tab-pane" id="tabs-2">
<div role="tabpanel" class="tab-pane" id="tabs-stream">
<div class="row">
<div class="col-md-12">
<h4><i class="fa fa-video-camera"></i> Daily Stream type breakdown <small>Last <span class="days">30</span> days</small></h4>
<h4><i class="fa fa-video-camera"></i> Daily <span class="yaxis-text" style="text-transform: lowercase;">play count</span> by stream type <small>Last <span class="days">30</span> days</small></h4>
<p class="help-block">
The total play count or duration of tv, movies, and music by the transcode decision. Click a graph point to open up a list of items played for that specific date.
</p>
@ -138,6 +137,20 @@
</div>
</div>
</div>
<div class="row" id="concurrent-graph">
<div class="col-md-12">
<h4><i class="fa fa-video-camera"></i> Daily concurrent stream count</span> by stream type <small>Last <span class="days">30</span> days</small></h4>
<p class="help-block">
The total count of concurrent streams of tv, movies, and music by the transcode decision.
</p>
<div class="graphs-instance">
<div class="watch-chart" id="graph_concurrent_streams_by_stream_type">
<div class="graphs-load"><i class="fa fa-refresh fa-spin"></i> Loading chart...</div>
<br>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-md-6">
<h4><i class="fa fa-expand-arrows-alt"></i> <span class="yaxis-text">Play count</span> by source resolution <small>Last <span class="days">30</span> days</small></h4>
@ -195,10 +208,10 @@
</div>
</div>
</div>
<div role="tabpanel" class="tab-pane" id="tabs-3">
<div role="tabpanel" class="tab-pane" id="tabs-total">
<div class="row">
<div class="col-md-12">
<h4><i class="fa fa-calendar"></i> Plays by month <small>Last <span class="months">12</span> months</small></h4>
<h4><i class="fa fa-calendar"></i> Total <span class="yaxis-text" style="text-transform: lowercase;">play count</span> by month <small>Last <span class="months">12</span> months</small></h4>
<p class="help-block">
The combined total of tv, movies, and music by month.
</p>
@ -225,9 +238,8 @@
</%def>
<%def name="javascriptIncludes()">
<script src="${http_root}js/moment-with-locale.js"></script>
<script src="${http_root}js/moment-duration-format.js"></script>
<script src="${http_root}js/highcharts/js/highcharts.js"></script>
<script src="${http_root}js/bootstrap-select.min.js"></script>
<script src="${http_root}js/highcharts.min.js"></script>
<script src="${http_root}js/jquery.dataTables.min.js"></script>
<script src="${http_root}js/dataTables.bootstrap.min.js"></script>
<script src="${http_root}js/dataTables.bootstrap.pagination.js"></script>
@ -289,6 +301,10 @@
return obj;
}, {});
if (!("Total" in chart_visibility)) {
chart_visibility["Total"] = false;
}
return data_series.map(function(s) {
var obj = Object.assign({}, s);
obj.visible = (chart_visibility[s.name] !== false);
@ -314,7 +330,9 @@
'Live TV': '#19A0D7',
'Direct Play': '#E5A00D',
'Direct Stream': '#FFFFFF',
'Transcode': '#F06464'
'Transcode': '#F06464',
'Max. Concurrent Streams': '#96C83C',
'Total': '#96C83C'
};
var series_colors = [];
$.each(data_series, function(index, series) {
@ -329,6 +347,7 @@
<script src="${http_root}js/graphs/plays_by_platform.js${cache_param}"></script>
<script src="${http_root}js/graphs/plays_by_user.js${cache_param}"></script>
<script src="${http_root}js/graphs/plays_by_stream_type.js${cache_param}"></script>
<script src="${http_root}js/graphs/concurrent_streams_by_stream_type.js${cache_param}"></script>
<script src="${http_root}js/graphs/plays_by_source_resolution.js${cache_param}"></script>
<script src="${http_root}js/graphs/plays_by_stream_resolution.js${cache_param}"></script>
<script src="${http_root}js/graphs/plays_by_platform_by_stream_type.js${cache_param}"></script>
@ -341,18 +360,37 @@
var yaxis = getLocalStorage('graph_type', 'plays');
var current_day_range = getLocalStorage('graph_days', 30);
var current_month_range = getLocalStorage('graph_months', 12);
var current_tab = '#' + getLocalStorage('graph_tab', 'tabs-1');
var current_tab = '#' + getLocalStorage('graph_tab', 'tabs-plays');
// Update tab values from upgrading
switch (current_tab) {
case '#tabs-1':
current_tab = '#tabs-plays'
break
case '#tabs-2':
current_tab = '#tabs-stream'
break
case '#tabs-3':
current_tab = '#tabs-total'
break
default:
break
}
if (window.location.hash === '#concurrent-graph') {
current_tab = '#tabs-stream';
}
$('#yaxis-' + yaxis).prop('checked', true);
$('#yaxis-' + yaxis).closest('label').addClass('active');
$('#graph-days').val(current_day_range);
$('#graph-months').val(current_month_range);
$('#graph-tabs a[href="' + current_tab + '"]').closest('li').addClass('active');
$(current_tab).addClass('active');
$('#nav-' + current_tab.replace('#', '')).tab('show').trigger('show.bs.tab');
//$(current_tab).addClass('active');
$('.days').html(current_day_range);
$('.months').html(current_month_range);
$('.days').text(current_day_range);
$('.months').text(current_month_range);
// Load user ids and names (for the selector)
$.ajax({
@ -360,14 +398,35 @@
type: 'get',
dataType: "json",
success: function (data) {
var select = $('#graph-user');
let select = $('#graph-user');
let by_id = {};
data.sort(function(a, b) {
return a.friendly_name.localeCompare(b.friendly_name);
});
data.forEach(function(item) {
select.append('<option value="' + item.user_id + '">' +
item.friendly_name + '</option>');
by_id[item.user_id] = item.friendly_name;
});
select.selectpicker({
countSelectedText: function(sel, total) {
if (sel === 0 || sel === total) {
return 'All users';
} else if (sel > 1) {
return sel + ' users';
} else {
return select.val().map(function(id) {
return by_id[id];
}).join(', ');
}
},
style: 'btn-dark',
actionsBox: true,
selectedTextFormat: 'count',
noneSelectedText: 'All users'
});
select.selectpicker('render');
select.selectpicker('selectAll');
}
});
@ -469,7 +528,7 @@
}
});
$('#graph-tabs a[href="#tabs-1"]').tab('show')
$('#nav-tabs-plays').tab('show');
}
function loadGraphsTab2(time_range, yaxis) {
@ -506,6 +565,33 @@
}
});
$.ajax({
url: "get_concurrent_streams_by_stream_type",
type: 'get',
data: { time_range: time_range, user_id: selected_user_id },
dataType: "json",
success: function(data) {
var dateArray = [];
$.each(data.categories, function (i, day) {
dateArray.push(moment(day, 'YYYY-MM-DD').valueOf());
// Highlight the weekend
if ((moment(day, 'YYYY-MM-DD').format('ddd') == 'Sat') ||
(moment(day, 'YYYY-MM-DD').format('ddd') == 'Sun')) {
hc_plays_by_day_options.xAxis.plotBands.push({
from: i-0.5,
to: i+0.5,
color: 'rgba(80,80,80,0.3)'
});
}
});
hc_concurrent_streams_by_stream_type_options.yAxis.min = 0;
hc_concurrent_streams_by_stream_type_options.xAxis.categories = dateArray;
hc_concurrent_streams_by_stream_type_options.series = getGraphVisibility(hc_concurrent_streams_by_stream_type_options.chart.renderTo, data.series);
hc_concurrent_streams_by_stream_type_options.colors = getGraphColors(data.series);
var hc_plays_by_stream_type = new Highcharts.Chart(hc_concurrent_streams_by_stream_type_options);
}
});
$.ajax({
url: "get_plays_by_source_resolution",
type: 'get',
@ -562,7 +648,7 @@
}
});
$('#graph-tabs a[href="#tabs-2"]').tab('show')
$('#nav-tabs-stream').tab('show');
}
function loadGraphsTab3(time_range, yaxis) {
@ -586,16 +672,11 @@
}
});
$('#graph-tabs a[href="#tabs-3"]').tab('show')
$('#nav-tabs-total').tab('show');
}
// Set initial state
if (current_tab === '#tabs-1') { loadGraphsTab1(current_day_range, yaxis); }
if (current_tab === '#tabs-2') { loadGraphsTab2(current_day_range, yaxis); }
if (current_tab === '#tabs-3') { loadGraphsTab3(current_month_range, yaxis); }
// Tab1 opened
$('#graph-tabs a[href="#tabs-1"]').on('shown.bs.tab', function (e) {
$('#nav-tabs-plays').on('shown.bs.tab', function (e) {
e.preventDefault();
current_tab = $(this).attr('href');
setLocalStorage('graph_tab', current_tab.replace('#',''));
@ -603,7 +684,7 @@
});
// Tab2 opened
$('#graph-tabs a[href="#tabs-2"]').on('shown.bs.tab', function (e) {
$('#nav-tabs-stream').on('shown.bs.tab', function (e) {
e.preventDefault();
current_tab = $(this).attr('href');
setLocalStorage('graph_tab', current_tab.replace('#',''));
@ -611,7 +692,7 @@
});
// Tab3 opened
$('#graph-tabs a[href="#tabs-3"]').on('shown.bs.tab', function (e) {
$('#nav-tabs-total').on('shown.bs.tab', function (e) {
e.preventDefault();
current_tab = $(this).attr('href');
setLocalStorage('graph_tab', current_tab.replace('#',''));
@ -624,9 +705,9 @@
forceMinMax($(this));
current_day_range = $(this).val();
setLocalStorage('graph_days', current_day_range);
if (current_tab === '#tabs-1') { loadGraphsTab1(current_day_range, yaxis); }
if (current_tab === '#tabs-2') { loadGraphsTab2(current_day_range, yaxis); }
$('.days').html(current_day_range);
if (current_tab === '#tabs-plays') { loadGraphsTab1(current_day_range, yaxis); }
if (current_tab === '#tabs-stream') { loadGraphsTab2(current_day_range, yaxis); }
$('.days').text(current_day_range);
});
// Month range changed
@ -635,25 +716,36 @@
forceMinMax($(this));
current_month_range = $(this).val();
setLocalStorage('graph_months', current_month_range);
if (current_tab === '#tabs-3') { loadGraphsTab3(current_month_range, yaxis); }
$('.months').html(current_month_range);
if (current_tab === '#tabs-total') { loadGraphsTab3(current_month_range, yaxis); }
$('.months').text(current_month_range);
});
let graph_user_last_id = undefined;
// User changed
$('#graph-user').on('change', function() {
selected_user_id = $(this).val() || null;
if (current_tab === '#tabs-1') { loadGraphsTab1(current_day_range, yaxis); }
if (current_tab === '#tabs-2') { loadGraphsTab2(current_day_range, yaxis); }
if (current_tab === '#tabs-3') { loadGraphsTab3(current_month_range, yaxis); }
let val = $(this).val();
if (val.length === 0 || val.length === $(this).children().length) {
selected_user_id = null; // if all users are selected, just send an empty list
} else {
selected_user_id = val.join(",");
}
if (selected_user_id === graph_user_last_id) {
return;
}
graph_user_last_id = selected_user_id;
if (current_tab === '#tabs-plays') { loadGraphsTab1(current_day_range, yaxis); }
if (current_tab === '#tabs-stream') { loadGraphsTab2(current_day_range, yaxis); }
if (current_tab === '#tabs-total') { loadGraphsTab3(current_month_range, yaxis); }
});
// Y-axis changed
$('#yaxis-selection').on('change', function() {
yaxis = $('input[name=yaxis-options]:checked', '#yaxis-selection').val();
setLocalStorage('graph_type', yaxis);
if (current_tab === '#tabs-1') { loadGraphsTab1(current_day_range, yaxis); }
if (current_tab === '#tabs-2') { loadGraphsTab2(current_day_range, yaxis); }
if (current_tab === '#tabs-3') { loadGraphsTab3(current_month_range, yaxis); }
if (current_tab === '#tabs-plays') { loadGraphsTab1(current_day_range, yaxis); }
if (current_tab === '#tabs-stream') { loadGraphsTab2(current_day_range, yaxis); }
if (current_tab === '#tabs-total') { loadGraphsTab3(current_month_range, yaxis); }
});
function setGraphFormat(type) {
@ -668,6 +760,7 @@
if (this.points.length > 1) {
var total = 0;
$.each(this.points, function(i, point) {
if (point.series.name === 'Total') return;
s += '<br/>'+point.series.name+': '+point.y;
total += point.y;
});
@ -694,6 +787,7 @@
if (this.points.length > 1) {
var total = 0;
$.each(this.points, function(i, point) {
if (point.series.name === 'Total') return;
s += '<br/>'+point.series.name+': '+moment.duration(point.y, 'hours').format('D [days] H [hrs] m [mins]');
total += point.y;
});
@ -714,6 +808,7 @@
hc_plays_by_day_options.xAxis.plotBands = [];
hc_plays_by_stream_type_options.xAxis.plotBands = [];
hc_concurrent_streams_by_stream_type_options.xAxis.plotBands = [];
hc_plays_by_day_options.yAxis.labels.formatter = yaxis_format;
hc_plays_by_dayofweek_options.yAxis.labels.formatter = yaxis_format;

View file

@ -1,7 +1,8 @@
<%inherit file="base.html"/>
<%def name="headIncludes()">
<link rel="stylesheet" href="${http_root}css/dataTables.bootstrap.css">
<link rel="stylesheet" href="${http_root}css/bootstrap-select.min.css">
<link rel="stylesheet" href="${http_root}css/dataTables.bootstrap.min.css">
<link rel="stylesheet" href="${http_root}css/dataTables.colVis.css">
<link rel="stylesheet" href="${http_root}css/tautulli-dataTables.css">
</%def>
@ -21,38 +22,44 @@
</div>
<div class="button-bar">
% if _session['user_group'] == 'admin':
<div class="alert alert-danger alert-edit" role="alert" id="row-edit-mode-alert"><i class="fa fa-exclamation-triangle"></i>&nbspSelect rows to delete. Data is deleted upon exiting delete mode.</div>
<div class="alert alert-danger alert-edit" role="alert" id="row-edit-mode-alert"><i class="fa fa-exclamation-triangle"></i>&nbsp</div>
<div class="btn-group">
<button class="btn btn-danger btn-edit" data-toggle="button" aria-pressed="false" autocomplete="off" id="row-edit-mode">
<i class="fa fa-trash-o"></i> Delete mode
</button>&nbsp
</button>
</div>
% endif
% if _session['user_group'] == 'admin':
<div class="btn-group" id="user-selection">
<label>
<select name="history-user" id="history-user" class="btn" style="color: inherit;">
<option value="">All Users</option>
<option disabled>&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;</option>
<select name="history-user" id="history-user" multiple>
</select>
</label>
</div>
% endif
<div class="btn-group" data-toggle="buttons" id="media_type-selection">
<label class="btn btn-dark">
<input type="radio" name="media_type-filter" id="history-all" value="all" autocomplete="off"> All
<label class="btn btn-dark btn-filter">
<input type="checkbox" name="media_type-filter" id="history-media_type-movie" value="movie" autocomplete="off"><i class="fa fa-film"></i> Movies
</label>
<label class="btn btn-dark">
<input type="radio" name="media_type-filter" id="history-movie" value="movie" autocomplete="off"> Movies
<label class="btn btn-dark btn-filter">
<input type="checkbox" name="media_type-filter" id="history-media_type-episode" value="episode" autocomplete="off"><i class="fa fa-television"></i> TV Shows
</label>
<label class="btn btn-dark">
<input type="radio" name="media_type-filter" id="history-episode" value="episode" autocomplete="off"> TV Shows
<label class="btn btn-dark btn-filter">
<input type="checkbox" name="media_type-filter" id="history-media_type-track" value="track" autocomplete="off"><i class="fa fa-music"></i> Music
</label>
<label class="btn btn-dark">
<input type="radio" name="media_type-filter" id="history-track" value="track" autocomplete="off"> Music
<label class="btn btn-dark btn-filter">
<input type="checkbox" name="media_type-filter" id="history-media_type-live" value="live" autocomplete="off"><i class="fa fa-broadcast-tower"></i> Live TV
</label>
<label class="btn btn-dark">
<input type="radio" name="media_type-filter" id="history-live" value="live" autocomplete="off"> Live TV
</div>
<div class="btn-group" data-toggle="buttons" id="transcode_decision-selection">
<label class="btn btn-dark btn-filter">
<input type="checkbox" name="transcode_decision-filter" id="history-transcode_decision-direct_play" value="direct play" autocomplete="off"><i class="fa fa-play-circle"></i> Direct Play
</label>
<label class="btn btn-dark btn-filter">
<input type="checkbox" name="transcode_decision-filter" id="history-transcode_decision-copy" value="copy" autocomplete="off"><i class="fa fa-stream"></i> Direct Stream
</label>
<label class="btn btn-dark btn-filter">
<input type="checkbox" name="transcode_decision-filter" id="history-transcode_decision-transcode" value="transcode" autocomplete="off"><i class="fa fa-server"></i> Transcode
</label>
</div>
<div class="btn-group">
@ -76,7 +83,7 @@
<th align="left" id="started">Started</th>
<th align="left" id="paused_counter">Paused</th>
<th align="left" id="stopped">Stopped</th>
<th align="left" id="duration">Duration</th>
<th align="left" id="play_duration">Duration</th>
<th align="left" id="percent_complete"></th>
</tr>
</thead>
@ -113,11 +120,11 @@
</%def>
<%def name="javascriptIncludes()">
<script src="${http_root}js/bootstrap-select.min.js"></script>
<script src="${http_root}js/jquery.dataTables.min.js"></script>
<script src="${http_root}js/dataTables.colVis.js"></script>
<script src="${http_root}js/dataTables.bootstrap.min.js"></script>
<script src="${http_root}js/dataTables.bootstrap.pagination.js"></script>
<script src="${http_root}js/moment-with-locale.js"></script>
<script src="${http_root}js/tables/history_table.js${cache_param}"></script>
<script>
$(document).ready(function () {
@ -127,18 +134,41 @@
type: 'GET',
dataType: 'json',
success: function (data) {
var select = $('#history-user');
let select = $('#history-user');
let by_id = {};
data.sort(function (a, b) {
return a.friendly_name.localeCompare(b.friendly_name);
});
data.forEach(function (item) {
select.append('<option value="' + item.user_id + '">' +
item.friendly_name + '</option>');
by_id[item.user_id] = item.friendly_name;
});
select.selectpicker({
countSelectedText: function(sel, total) {
if (sel === 0 || sel === total) {
return 'All users';
} else if (sel > 1) {
return sel + ' users';
} else {
return select.val().map(function(id) {
return by_id[id];
}).join(', ');
}
},
style: 'btn-dark',
actionsBox: true,
selectedTextFormat: 'count',
noneSelectedText: 'All users'
});
select.selectpicker('render');
select.selectpicker('selectAll');
}
});
function loadHistoryTable(media_type, selected_user_id) {
let history_user_last_id = undefined;
function loadHistoryTable(media_type, transcode_decision, selected_user_id) {
history_table_options.ajax = {
url: 'get_history',
type: 'POST',
@ -146,6 +176,7 @@
return {
json_data: JSON.stringify(d),
media_type: media_type,
transcode_decision: transcode_decision,
user_id: selected_user_id
};
}
@ -162,32 +193,60 @@
$('#media_type-selection').on('change', function () {
$('#media_type-selection > label').removeClass('active');
selected_filter = $('input[name=media_type-filter]:checked', '#media_type-selection');
var selected_filter = $('input[name=media_type-filter]:checked', '#media_type-selection');
$(selected_filter).closest('label').addClass('active');
media_type = $(selected_filter).val();
media_type = $(selected_filter).map(function () { return $(this).val(); }).get().join(',');
setLocalStorage('history_media_type', media_type);
history_table.draw();
});
$('#transcode_decision-selection').on('change', function () {
$('#transcode_decision-selection > label').removeClass('active');
var selected_filter = $('input[name=transcode_decision-filter]:checked', '#transcode_decision-selection');
$(selected_filter).closest('label').addClass('active');
transcode_decision = $(selected_filter).map(function () { return $(this).val(); }).get().join(',');
setLocalStorage('history_transcode_decision', transcode_decision);
history_table.draw();
});
$('#history-user').on('change', function () {
selected_user_id = $(this).val() || null;
let val = $(this).val();
if (val.length === 0 || val.length === $(this).children().length) {
selected_user_id = null; // if all users are selected, just send an empty list
} else {
selected_user_id = val.join(",");
}
if (selected_user_id === history_user_last_id) {
return;
}
history_user_last_id = selected_user_id;
history_table.draw();
});
}
var media_type = getLocalStorage('history_media_type', 'all');
var selected_user_id = "${_session['user_group']}" == "admin" ? null : "${_session['user_id']}";
$('#history-' + media_type).prop('checked', true);
$('#history-' + media_type).closest('label').addClass('active');
var media_type = getLocalStorage('history_media_type', 'all');
$.each(media_type.split(','), function (i, item) {
var history_media_type = $('#history-media_type-' + item);
history_media_type.prop('checked', true);
history_media_type.closest('label').addClass('active');
});
loadHistoryTable(media_type, selected_user_id);
var transcode_decision = getLocalStorage('history_transcode_decision', 'all');
$.each(transcode_decision.split(','), function (i, item) {
var history_transcode_decision = $('#history-transcode_decision-' + item.replace(' ', '_'));
history_transcode_decision.prop('checked', true);
history_transcode_decision.closest('label').addClass('active');
});
loadHistoryTable(media_type, transcode_decision, selected_user_id);
% if _session['user_group'] == 'admin':
$('#row-edit-mode').on('click', function() {
$('#row-edit-mode-alert').fadeIn(200);
if ($(this).hasClass('active')) {
$(this).tooltip('destroy');
if (history_to_delete.length > 0) {
$('#deleteCount').text(history_to_delete.length);
$('#confirm-modal-delete').modal();
@ -212,6 +271,13 @@
});
} else {
$(this).tooltip({
container: '.body-container',
placement: 'bottom',
title: 'Select rows to delete. Data is deleted upon exiting delete mode.',
trigger: 'manual'
}).tooltip('show');
history_to_delete = [];
$('.delete-control').each(function() {
$(this).find('button.btn-danger').toggleClass('btn-warning').toggleClass('btn-danger');

View file

@ -32,7 +32,7 @@
<th align="left" id="started">Started</th>
<th align="left" id="paused_counter">Paused</th>
<th align="left" id="stopped">Stopped</th>
<th align="left" id="duration">Duration</th>
<th align="left" id="play_duration">Duration</th>
<th align="left" id="percent_complete"></th>
</tr>
</thead>
@ -46,8 +46,9 @@
<script src="${http_root}js/tables/history_table.js${cache_param}"></script>
<script>
$(document).ready(function() {
$('#date-header').html(moment('${data["start_date"]}','YYYY-MM-DD').format('ddd MMM Do YYYY'));
$('#date-header').html(moment('${data["start_date"]}','YYYY-MM-DD').format('ddd MMM Do YYYY'));
$('#history-modal').off('shown.bs.modal').on('shown.bs.modal', function() {
history_table_options.ajax = {
url: 'get_history',
data: function ( d ) {
@ -56,7 +57,8 @@
user_id: "${data['user_id']}",
start_date: "${data['start_date']}",
media_type: "${data.get('media_type') or 'all'}",
transcode_decision: "${data.get('transcode_decision')}"
transcode_decision: "${data.get('transcode_decision')}",
include_activity: false
};
}
};
@ -65,10 +67,6 @@
history_table.columns([0, 3, 4, 5, 9, 11, 12]).visible(false);
clearSearchButton('history_table_modal', history_table);
$('#history-modal').on('shown.bs.modal', function() {
history_table.columns.adjust().draw();
});
});
</script>
% else:

View file

@ -25,7 +25,7 @@ grandparent_thumb Returns location of the item's thumbnail. Use with pms_i
rating_key Returns the unique identifier for the media item.
title Returns the title for the associated stat.
== Only if 'stat_id' is 'top_tv' or 'top_movies' or 'top_music' or 'top_user' or 'top_platform' ==
== Only if 'stat_id' is 'top_tv' or 'top_movies' or 'top_music' or 'top_user' or 'top_platform' or 'top_libraries' ==
total_plays Returns the count for the associated stat.
total_duration Returns the total duration for the associated stat.
@ -58,6 +58,8 @@ DOCUMENTATION :: END
# Human readable duration
def hd(seconds):
m, s = divmod(cast_to_int(seconds), 60)
if s > 30:
m += 1
h, m = divmod(m, 60)
return str(h).zfill(1) + ':' + str(m).zfill(2)
%>
@ -74,6 +76,11 @@ DOCUMENTATION :: END
% if stat_id in ('top_movies', 'popular_movies', 'top_tv', 'popular_tv', 'top_music', 'popular_music', 'last_watched'):
<% fallback = 'art-live' if row0['live'] else 'art' %>
<div id="stats-background-${stat_id}" class="dashboard-stats-background" style="background-image: url(${page('pms_image_proxy', row0['art'], row0['rating_key'], 500, 280, 40, '282828', 3, fallback=fallback)});">
% elif stat_id == 'top_libraries':
<% fallback = 'art-live' if row0['live'] else row0['library_art'] %>
<div id="stats-background-${stat_id}" class="dashboard-stats-background" style="background-image: url(${page('pms_image_proxy', row0['art'] or row0['library_art'], None, 500, 280, 40, '282828', 3, fallback=fallback)});" data-library_art="${row0['library_art']}">
% elif stat_id == 'top_users':
<div id="stats-background-${stat_id}" class="dashboard-stats-background" data-blurhash="${page('pms_image_proxy', row0['user_thumb'] or 'interfaces/default/images/gravatar-default.png', None, 100, 100, 40, '282828', 0, fallback='user')}">
% elif stat_id == 'top_platforms':
<div id="stats-background-${stat_id}" class="dashboard-stats-background platform-${row0['platform_name']}-rgba no-image">
% else:
@ -96,16 +103,22 @@ DOCUMENTATION :: END
if row0['live']:
href = page('info', row0['rating_key'], row0['guid'], history=True, live=row0['live'])
else:
href = page('info', row0['rating_key'])
href = page('info', row0['rating_key'], history=True)
%>
<a id="stats-thumb-url-${stat_id}" href="${href}" title="${row0['title']}">
<div id="stats-thumb-${stat_id}" class="dashboard-stats-${fallback.split('-')[0]}" style="background-image: url(${page('pms_image_proxy', row0['thumb'], row0['rating_key'], 300, height, fallback=fallback)});"></div>
<div id="stats-thumb-${stat_id}" class="dashboard-stats-${fallback.split('-')[0]}" style="background-image: url(${page('pms_image_proxy', row0['thumb'], row0['grandparent_rating_key'] or row0['rating_key'], 300, height, fallback=fallback)});"></div>
</a>
</div>
% elif stat_id == 'top_libraries':
% if row0['library_thumb'].startswith('http'):
<div id="stats-thumb-${stat_id}" class="dashboard-stats-flat hidden-xs" style="background-image: url(${page('pms_image_proxy', row0['library_thumb'], None, 100, 100, fallback='cover')});"></div>
% else:
<div id="stats-thumb-${stat_id}" class="dashboard-stats-flat svg-icon library-${row0['section_type']} hidden-xs"></div>
% endif
% elif stat_id == 'top_users':
<% user_href = page('user', row0['user_id']) if row0['user_id'] else '#' %>
<a id="stats-thumb-url-${stat_id}" href="${user_href}" title="${row0['friendly_name']}" class="hidden-xs">
<div id="stats-thumb-${stat_id}" class="dashboard-stats-circle" style="background-image: url(${row0['user_thumb'] or 'images/gravatar-default.png'})"></div>
<a id="stats-thumb-url-${stat_id}" href="${user_href}" title="${row0['user']}" class="hidden-xs">
<div id="stats-thumb-${stat_id}" class="dashboard-stats-circle" style="background-image: url(${page('pms_image_proxy', row0['user_thumb'] or 'interfaces/default/images/gravatar-default.png', None, 100, 100, fallback='user')})"></div>
</a>
% elif stat_id == 'top_platforms':
<div id="stats-thumb-${stat_id}" class="dashboard-stats-flat svg-icon platform-${row0['platform_name']} transparent hidden-xs"></div>
@ -122,7 +135,7 @@ DOCUMENTATION :: END
% elif stat_id.startswith('popular'):
<span class="dashboard-stats-stats-units">users</span>
% elif stat_id == 'last_watched':
<span class="dashboard-stats-stats-units" id="last-watched-header-info">${row0['friendly_name']}</span>
<span class="dashboard-stats-stats-units" id="last-watched-header-info" title="${row0['user']}">${row0['friendly_name']}</span>
% elif stat_id == 'most_concurrent':
<span class="dashboard-stats-stats-units" id="most-concurrent-header-info">streams</span>
% endif
@ -132,10 +145,11 @@ DOCUMENTATION :: END
<ul class="list-unstyled dashboard-stats-info-list">
% for row in top_stat['rows']:
<li class="dashboard-stats-info-item ${'expanded' if loop.index == 0 else ''}" data-stat_id="${stat_id}"
data-rating_key="${row.get('rating_key')}" data-guid="${row.get('guid')}" data-title="${row.get('title')}"
data-art="${row.get('art')}" data-thumb="${row.get('thumb')}" data-platform="${row.get('platform_name')}"
data-user_id="${row.get('user_id')}" data-friendly_name="${row.get('friendly_name')}" data-user_thumb="${row.get('user_thumb')}"
data-last_watch="${row.get('last_watch')}" data-started="${row.get('started')}" data-live="${row.get('live')}">
data-rating_key="${row.get('rating_key')}" data-grandparent_rating_key="${row.get('grandparent_rating_key')}" data-guid="${row.get('guid')}" data-title="${row.get('title')}"
data-art="${row.get('art')}" data-thumb="${row.get('thumb')}" data-platform="${row.get('platform_name')}" data-library-type="${row.get('section_type')}"
data-user_id="${row.get('user_id')}" data-user="${row.get('user')}" data-friendly_name="${row.get('friendly_name')}" data-user_thumb="${row.get('user_thumb')}"
data-last_watch="${row.get('last_watch')}" data-started="${row.get('started')}" data-live="${row.get('live')}"
data-library_art="${row.get('library_art', '')}" data-library_thumb="${row.get('library_thumb', '')}">
<div class="sub-list">${loop.index + 1}</div>
<div class="sub-value">
% if stat_id in ('top_movies', 'popular_movies', 'top_tv', 'popular_tv', 'top_music', 'popular_music', 'last_watched'):
@ -145,20 +159,27 @@ DOCUMENTATION :: END
if row['live']:
href = page('info', row['rating_key'], row['guid'], history=True, live=row['live'])
else:
href = page('info', row['rating_key'])
href = page('info', row['rating_key'], history=True)
%>
<a href="${href}" title="${row['title']}">
${row['title']}
</a>
% elif stat_id == 'top_libraries':
<% library_href = page('library', row['section_id']) %>
<a href="${library_href}" title="${row['section_name']}">
${row['section_name']}
</a>
% elif stat_id == 'top_users':
<% user_href = page('user', row['user_id']) if row['user_id'] else '#' %>
<a href="${user_href}" title="${row['friendly_name']}">
<a href="${user_href}" title="${row['user']}">
${row['friendly_name']}
</a>
% elif stat_id == 'top_platforms':
${row['platform']}
% elif stat_id == 'most_concurrent':
${row['title']}
<a href="graphs#concurrent-graph" title="${row['title']}">
${row['title']}
</a>
% endif
</div>
<div class="sub-count">

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View file

@ -0,0 +1,46 @@
<svg id="livetype" xmlns="http://www.w3.org/2000/svg" width="119.66407" height="40" viewBox="0 0 119.66407 40">
<title>Download_on_the_App_Store_Badge_US-UK_RGB_blk_4SVG_092917</title>
<g>
<g>
<g>
<path d="M110.13477,0H9.53468c-.3667,0-.729,0-1.09473.002-.30615.002-.60986.00781-.91895.0127A13.21476,13.21476,0,0,0,5.5171.19141a6.66509,6.66509,0,0,0-1.90088.627A6.43779,6.43779,0,0,0,1.99757,1.99707,6.25844,6.25844,0,0,0,.81935,3.61816a6.60119,6.60119,0,0,0-.625,1.90332,12.993,12.993,0,0,0-.1792,2.002C.00587,7.83008.00489,8.1377,0,8.44434V31.5586c.00489.3105.00587.6113.01515.9219a12.99232,12.99232,0,0,0,.1792,2.0019,6.58756,6.58756,0,0,0,.625,1.9043A6.20778,6.20778,0,0,0,1.99757,38.001a6.27445,6.27445,0,0,0,1.61865,1.1787,6.70082,6.70082,0,0,0,1.90088.6308,13.45514,13.45514,0,0,0,2.0039.1768c.30909.0068.6128.0107.91895.0107C8.80567,40,9.168,40,9.53468,40H110.13477c.3594,0,.7246,0,1.084-.002.3047,0,.6172-.0039.9219-.0107a13.279,13.279,0,0,0,2-.1768,6.80432,6.80432,0,0,0,1.9082-.6308,6.27742,6.27742,0,0,0,1.6172-1.1787,6.39482,6.39482,0,0,0,1.1816-1.6143,6.60413,6.60413,0,0,0,.6191-1.9043,13.50643,13.50643,0,0,0,.1856-2.0019c.0039-.3106.0039-.6114.0039-.9219.0078-.3633.0078-.7246.0078-1.0938V9.53613c0-.36621,0-.72949-.0078-1.09179,0-.30664,0-.61426-.0039-.9209a13.5071,13.5071,0,0,0-.1856-2.002,6.6177,6.6177,0,0,0-.6191-1.90332,6.46619,6.46619,0,0,0-2.7988-2.7998,6.76754,6.76754,0,0,0-1.9082-.627,13.04394,13.04394,0,0,0-2-.17676c-.3047-.00488-.6172-.01074-.9219-.01269-.3594-.002-.7246-.002-1.084-.002Z" style="fill: #a6a6a6"/>
<path d="M8.44483,39.125c-.30468,0-.602-.0039-.90429-.0107a12.68714,12.68714,0,0,1-1.86914-.1631,5.88381,5.88381,0,0,1-1.65674-.5479,5.40573,5.40573,0,0,1-1.397-1.0166,5.32082,5.32082,0,0,1-1.02051-1.3965,5.72186,5.72186,0,0,1-.543-1.6572,12.41351,12.41351,0,0,1-.1665-1.875c-.00634-.2109-.01464-.9131-.01464-.9131V8.44434S.88185,7.75293.8877,7.5498a12.37039,12.37039,0,0,1,.16553-1.87207,5.7555,5.7555,0,0,1,.54346-1.6621A5.37349,5.37349,0,0,1,2.61183,2.61768,5.56543,5.56543,0,0,1,4.01417,1.59521a5.82309,5.82309,0,0,1,1.65332-.54394A12.58589,12.58589,0,0,1,7.543.88721L8.44532.875H111.21387l.9131.0127a12.38493,12.38493,0,0,1,1.8584.16259,5.93833,5.93833,0,0,1,1.6709.54785,5.59374,5.59374,0,0,1,2.415,2.41993,5.76267,5.76267,0,0,1,.5352,1.64892,12.995,12.995,0,0,1,.1738,1.88721c.0029.2832.0029.5874.0029.89014.0079.375.0079.73193.0079,1.09179V30.4648c0,.3633,0,.7178-.0079,1.0752,0,.3252,0,.6231-.0039.9297a12.73126,12.73126,0,0,1-.1709,1.8535,5.739,5.739,0,0,1-.54,1.67,5.48029,5.48029,0,0,1-1.0156,1.3857,5.4129,5.4129,0,0,1-1.3994,1.0225,5.86168,5.86168,0,0,1-1.668.5498,12.54218,12.54218,0,0,1-1.8692.1631c-.2929.0068-.5996.0107-.8974.0107l-1.084.002Z"/>
</g>
<g id="_Group_" data-name="&lt;Group&gt;">
<g id="_Group_2" data-name="&lt;Group&gt;">
<g id="_Group_3" data-name="&lt;Group&gt;">
<path id="_Path_" data-name="&lt;Path&gt;" d="M24.76888,20.30068a4.94881,4.94881,0,0,1,2.35656-4.15206,5.06566,5.06566,0,0,0-3.99116-2.15768c-1.67924-.17626-3.30719,1.00483-4.1629,1.00483-.87227,0-2.18977-.98733-3.6085-.95814a5.31529,5.31529,0,0,0-4.47292,2.72787c-1.934,3.34842-.49141,8.26947,1.3612,10.97608.9269,1.32535,2.01018,2.8058,3.42763,2.7533,1.38706-.05753,1.9051-.88448,3.5794-.88448,1.65876,0,2.14479.88448,3.591.8511,1.48838-.02416,2.42613-1.33124,3.32051-2.66914a10.962,10.962,0,0,0,1.51842-3.09251A4.78205,4.78205,0,0,1,24.76888,20.30068Z" style="fill: #fff"/>
<path id="_Path_2" data-name="&lt;Path&gt;" d="M22.03725,12.21089a4.87248,4.87248,0,0,0,1.11452-3.49062,4.95746,4.95746,0,0,0-3.20758,1.65961,4.63634,4.63634,0,0,0-1.14371,3.36139A4.09905,4.09905,0,0,0,22.03725,12.21089Z" style="fill: #fff"/>
</g>
</g>
<g>
<path d="M42.30227,27.13965h-4.7334l-1.13672,3.35645H34.42727l4.4834-12.418h2.083l4.4834,12.418H43.438ZM38.0591,25.59082h3.752l-1.84961-5.44727h-.05176Z" style="fill: #fff"/>
<path d="M55.15969,25.96973c0,2.81348-1.50586,4.62109-3.77832,4.62109a3.0693,3.0693,0,0,1-2.84863-1.584h-.043v4.48438h-1.8584V21.44238H48.4302v1.50586h.03418a3.21162,3.21162,0,0,1,2.88281-1.60059C53.645,21.34766,55.15969,23.16406,55.15969,25.96973Zm-1.91016,0c0-1.833-.94727-3.03809-2.39258-3.03809-1.41992,0-2.375,1.23047-2.375,3.03809,0,1.82422.95508,3.0459,2.375,3.0459C52.30227,29.01563,53.24953,27.81934,53.24953,25.96973Z" style="fill: #fff"/>
<path d="M65.12453,25.96973c0,2.81348-1.50586,4.62109-3.77832,4.62109a3.0693,3.0693,0,0,1-2.84863-1.584h-.043v4.48438h-1.8584V21.44238H58.395v1.50586h.03418A3.21162,3.21162,0,0,1,61.312,21.34766C63.60988,21.34766,65.12453,23.16406,65.12453,25.96973Zm-1.91016,0c0-1.833-.94727-3.03809-2.39258-3.03809-1.41992,0-2.375,1.23047-2.375,3.03809,0,1.82422.95508,3.0459,2.375,3.0459C62.26711,29.01563,63.21438,27.81934,63.21438,25.96973Z" style="fill: #fff"/>
<path d="M71.71047,27.03613c.1377,1.23145,1.334,2.04,2.96875,2.04,1.56641,0,2.69336-.80859,2.69336-1.91895,0-.96387-.67969-1.541-2.28906-1.93652l-1.60937-.3877c-2.28027-.55078-3.33887-1.61719-3.33887-3.34766,0-2.14258,1.86719-3.61426,4.51855-3.61426,2.624,0,4.42285,1.47168,4.4834,3.61426h-1.876c-.1123-1.23926-1.13672-1.9873-2.63379-1.9873s-2.52148.75684-2.52148,1.8584c0,.87793.6543,1.39453,2.25488,1.79l1.36816.33594c2.54785.60254,3.60645,1.626,3.60645,3.44238,0,2.32324-1.85059,3.77832-4.79395,3.77832-2.75391,0-4.61328-1.4209-4.7334-3.667Z" style="fill: #fff"/>
<path d="M83.34621,19.2998v2.14258h1.72168v1.47168H83.34621v4.99121c0,.77539.34473,1.13672,1.10156,1.13672a5.80752,5.80752,0,0,0,.61133-.043v1.46289a5.10351,5.10351,0,0,1-1.03223.08594c-1.833,0-2.54785-.68848-2.54785-2.44434V22.91406H80.16262V21.44238H81.479V19.2998Z" style="fill: #fff"/>
<path d="M86.065,25.96973c0-2.84863,1.67773-4.63867,4.29395-4.63867,2.625,0,4.29492,1.79,4.29492,4.63867,0,2.85645-1.66113,4.63867-4.29492,4.63867C87.72609,30.6084,86.065,28.82617,86.065,25.96973Zm6.69531,0c0-1.9541-.89551-3.10742-2.40137-3.10742s-2.40039,1.16211-2.40039,3.10742c0,1.96191.89453,3.10645,2.40039,3.10645S92.76027,27.93164,92.76027,25.96973Z" style="fill: #fff"/>
<path d="M96.18606,21.44238h1.77246v1.541h.043a2.1594,2.1594,0,0,1,2.17773-1.63574,2.86616,2.86616,0,0,1,.63672.06934v1.73828a2.59794,2.59794,0,0,0-.835-.1123,1.87264,1.87264,0,0,0-1.93652,2.083v5.37012h-1.8584Z" style="fill: #fff"/>
<path d="M109.3843,27.83691c-.25,1.64355-1.85059,2.77148-3.89844,2.77148-2.63379,0-4.26855-1.76465-4.26855-4.5957,0-2.83984,1.64355-4.68164,4.19043-4.68164,2.50488,0,4.08008,1.7207,4.08008,4.46582v.63672h-6.39453v.1123a2.358,2.358,0,0,0,2.43555,2.56445,2.04834,2.04834,0,0,0,2.09082-1.27344Zm-6.28223-2.70215h4.52637a2.1773,2.1773,0,0,0-2.2207-2.29785A2.292,2.292,0,0,0,103.10207,25.13477Z" style="fill: #fff"/>
</g>
</g>
</g>
<g id="_Group_4" data-name="&lt;Group&gt;">
<g>
<path d="M37.82619,8.731a2.63964,2.63964,0,0,1,2.80762,2.96484c0,1.90625-1.03027,3.002-2.80762,3.002H35.67092V8.731Zm-1.22852,5.123h1.125a1.87588,1.87588,0,0,0,1.96777-2.146,1.881,1.881,0,0,0-1.96777-2.13379h-1.125Z" style="fill: #fff"/>
<path d="M41.68068,12.44434a2.13323,2.13323,0,1,1,4.24707,0,2.13358,2.13358,0,1,1-4.24707,0Zm3.333,0c0-.97607-.43848-1.54687-1.208-1.54687-.77246,0-1.207.5708-1.207,1.54688,0,.98389.43457,1.55029,1.207,1.55029C44.57522,13.99463,45.01369,13.42432,45.01369,12.44434Z" style="fill: #fff"/>
<path d="M51.57326,14.69775h-.92187l-.93066-3.31641h-.07031l-.92676,3.31641h-.91309l-1.24121-4.50293h.90137l.80664,3.436h.06641l.92578-3.436h.85254l.92578,3.436h.07031l.80273-3.436h.88867Z" style="fill: #fff"/>
<path d="M53.85354,10.19482H54.709v.71533h.06641a1.348,1.348,0,0,1,1.34375-.80225,1.46456,1.46456,0,0,1,1.55859,1.6748v2.915h-.88867V12.00586c0-.72363-.31445-1.0835-.97168-1.0835a1.03294,1.03294,0,0,0-1.0752,1.14111v2.63428h-.88867Z" style="fill: #fff"/>
<path d="M59.09377,8.437h.88867v6.26074h-.88867Z" style="fill: #fff"/>
<path d="M61.21779,12.44434a2.13346,2.13346,0,1,1,4.24756,0,2.1338,2.1338,0,1,1-4.24756,0Zm3.333,0c0-.97607-.43848-1.54687-1.208-1.54687-.77246,0-1.207.5708-1.207,1.54688,0,.98389.43457,1.55029,1.207,1.55029C64.11232,13.99463,64.5508,13.42432,64.5508,12.44434Z" style="fill: #fff"/>
<path d="M66.4009,13.42432c0-.81055.60352-1.27783,1.6748-1.34424l1.21973-.07031v-.38867c0-.47559-.31445-.74414-.92187-.74414-.49609,0-.83984.18213-.93848.50049h-.86035c.09082-.77344.81836-1.26953,1.83984-1.26953,1.12891,0,1.76563.562,1.76563,1.51318v3.07666h-.85547v-.63281h-.07031a1.515,1.515,0,0,1-1.35254.707A1.36026,1.36026,0,0,1,66.4009,13.42432Zm2.89453-.38477v-.37646l-1.09961.07031c-.62012.0415-.90137.25244-.90137.64941,0,.40527.35156.64111.835.64111A1.0615,1.0615,0,0,0,69.29543,13.03955Z" style="fill: #fff"/>
<path d="M71.34816,12.44434c0-1.42285.73145-2.32422,1.86914-2.32422a1.484,1.484,0,0,1,1.38086.79h.06641V8.437h.88867v6.26074h-.85156v-.71143h-.07031a1.56284,1.56284,0,0,1-1.41406.78564C72.0718,14.772,71.34816,13.87061,71.34816,12.44434Zm.918,0c0,.95508.4502,1.52979,1.20313,1.52979.749,0,1.21191-.583,1.21191-1.52588,0-.93848-.46777-1.52979-1.21191-1.52979C72.72121,10.91846,72.26613,11.49707,72.26613,12.44434Z" style="fill: #fff"/>
<path d="M79.23,12.44434a2.13323,2.13323,0,1,1,4.24707,0,2.13358,2.13358,0,1,1-4.24707,0Zm3.333,0c0-.97607-.43848-1.54687-1.208-1.54687-.77246,0-1.207.5708-1.207,1.54688,0,.98389.43457,1.55029,1.207,1.55029C82.12453,13.99463,82.563,13.42432,82.563,12.44434Z" style="fill: #fff"/>
<path d="M84.66945,10.19482h.85547v.71533h.06641a1.348,1.348,0,0,1,1.34375-.80225,1.46456,1.46456,0,0,1,1.55859,1.6748v2.915H87.605V12.00586c0-.72363-.31445-1.0835-.97168-1.0835a1.03294,1.03294,0,0,0-1.0752,1.14111v2.63428h-.88867Z" style="fill: #fff"/>
<path d="M93.51516,9.07373v1.1416h.97559v.74854h-.97559V13.2793c0,.47168.19434.67822.63672.67822a2.96657,2.96657,0,0,0,.33887-.02051v.74023a2.9155,2.9155,0,0,1-.4834.04541c-.98828,0-1.38184-.34766-1.38184-1.21582v-2.543h-.71484v-.74854h.71484V9.07373Z" style="fill: #fff"/>
<path d="M95.70461,8.437h.88086v2.48145h.07031a1.3856,1.3856,0,0,1,1.373-.80664,1.48339,1.48339,0,0,1,1.55078,1.67871v2.90723H98.69v-2.688c0-.71924-.335-1.0835-.96289-1.0835a1.05194,1.05194,0,0,0-1.13379,1.1416v2.62988h-.88867Z" style="fill: #fff"/>
<path d="M104.76125,13.48193a1.828,1.828,0,0,1-1.95117,1.30273A2.04531,2.04531,0,0,1,100.73,12.46045a2.07685,2.07685,0,0,1,2.07617-2.35254c1.25293,0,2.00879.856,2.00879,2.27V12.688h-3.17969v.0498a1.1902,1.1902,0,0,0,1.19922,1.29,1.07934,1.07934,0,0,0,1.07129-.5459Zm-3.126-1.45117h2.27441a1.08647,1.08647,0,0,0-1.1084-1.1665A1.15162,1.15162,0,0,0,101.63527,12.03076Z" style="fill: #fff"/>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 11 KiB

View file

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="120px" height="120px" viewBox="0 0 120 120" enable-background="new 0 0 120 120" xml:space="preserve">
<g>
<path fill="#BEBEBE" d="M31.161,105.119c4.747-3.413,10.392-5.561,16.939-6.444c2.645,1.983,6.611,2.976,11.9,2.976
c5.288,0,9.255-0.992,11.9-2.976c6.546,0.884,12.192,3.031,16.938,6.444c-8.325,5.336-18.223,8.431-28.838,8.431
C49.385,113.55,39.487,110.455,31.161,105.119z"/>
<path fill="#D6D6D6" d="M48.1,98.675l2.737-8.553C42.241,84.96,36.2,72.758,36.2,58.526c0-7.478,1.669-14.397,4.498-20.029
c3.436,1.059,7.504,1.669,11.864,1.669c10.86,0,19.907-3.795,21.903-8.822c5.676,6.256,9.334,16.104,9.334,27.182
c0,14.232-6.041,26.434-14.637,31.596l2.737,8.553c-2.646,1.983-6.612,2.976-11.9,2.976c-5.248,0-9.194-0.977-11.838-2.929
L48.1,98.675z"/>
<path fill="#A6A6A6" d="M38.763,73.994C33.496,68.09,30.25,60,30.25,51.075C30.25,33.002,43.57,18.35,60,18.35
c16.431,0,29.75,14.65,29.75,32.724c0,8.925-3.247,17.016-8.514,22.92c1.64-4.647,2.563-9.901,2.563-15.468
c0-11.078-3.658-20.925-9.334-27.182c-1.996,5.027-11.043,8.822-21.903,8.822c-4.36,0-8.428-0.611-11.864-1.669
C37.868,44.128,36.2,51.048,36.2,58.526C36.2,64.093,37.124,69.348,38.763,73.994z"/>
<path fill="#D6D6D6" d="M60,113.55c29.575,0,53.55-23.974,53.55-53.55c0-29.575-23.975-53.55-53.55-53.55
C30.425,6.45,6.45,30.425,6.45,60C6.45,89.576,30.425,113.55,60,113.55z M60,119.5C27.138,119.5,0.5,92.86,0.5,60
S27.138,0.5,60,0.5c32.86,0,59.5,26.64,59.5,59.499C119.5,92.86,92.86,119.5,60,119.5z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.8 KiB

After

Width:  |  Height:  |  Size: 21 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

After

Width:  |  Height:  |  Size: 4.5 KiB

Before After
Before After

View file

@ -2,7 +2,7 @@
<browserconfig>
<msapplication>
<tile>
<square150x150logo src="mstile-150x150.png?v=2.0.5"/>
<square150x150logo src="mstile-150x150.png?v=2.6.0"/>
<TileColor>#282a2d</TileColor>
</tile>
</msapplication>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 553 B

After

Width:  |  Height:  |  Size: 997 B

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 971 B

After

Width:  |  Height:  |  Size: 1.7 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Before After
Before After

View file

@ -6,18 +6,17 @@
"scope": "../../",
"icons": [
{
"src": "android-chrome-192x192.png?v=2.0.5",
"src": "android-chrome-192x192.png?v=2.6.0",
"sizes": "192x192",
"type": "image/png"
},
{
"src": "android-chrome-256x256.png?v=2.0.5",
"src": "android-chrome-256x256.png?v=2.6.0",
"sizes": "256x256",
"type": "image/png"
}
],
"theme_color": "#282a2d",
"background_color": "#282a2d",
"display": "standalone",
"orientation": "any"
"display": "standalone"
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 10 KiB

Before After
Before After

View file

@ -1 +1,32 @@
<svg version="1" xmlns="http://www.w3.org/2000/svg" width="700.000000pt" height="700.000000pt" viewBox="0 0 700.000000 700.000000" preserveAspectRatio="xMidYMid meet"><g transform="translate(0.000000,700.000000) scale(0.100000,-0.100000)" fill="#000000" stroke="none"><path d="M5695 6555 c-135 -34 -244 -94 -342 -189 -40 -39 -73 -76 -73 -83 0 -7 -4 -13 -10 -13 -14 0 -87 -156 -106 -225 -22 -83 -26 -234 -8 -320 17 -79 86 -230 133 -288 l30 -39 -48 -71 c-39 -57 -159 -228 -251 -357 -69 -97 -398 -564 -416 -590 -13 -19 -60 -87 -105 -150 -45 -63 -107 -151 -138 -195 -30 -44 -59 -84 -63 -90 -7 -9 -251 -354 -346 -490 -92 -131 -173 -245 -175 -245 -1 0 -34 9 -72 21 -130 38 -325 31 -454 -18 -168 -63 -313 -196 -385 -354 -39 -87 -65 -183 -68 -256 0 -24 -3 -43 -4 -43 -2 0 -43 46 -91 102 -49 57 -100 117 -115 133 -14 17 -128 149 -253 295 -125 146 -251 292 -279 324 -56 65 -77 89 -108 126 -58 68 -152 178 -172 200 -12 14 -50 57 -83 96 l-61 71 27 44 c58 93 91 217 92 342 2 161 -38 294 -125 412 -133 181 -316 279 -542 292 -470 27 -833 -434 -699 -887 74 -251 275 -437 530 -490 132 -28 334 -6 421 45 l42 24 173 -197 c96 -108 186 -210 200 -227 15 -16 163 -187 330 -380 458 -529 491 -567 526 -605 18 -19 31 -35 30 -36 -6 -5 -265 -161 -277 -167 -8 -4 -34 -20 -58 -35 -194 -124 -634 -382 -651 -382 -12 0 -46 20 -75 44 -60 49 -180 112 -242 127 -21 5 -48 12 -59 15 -11 4 -65 9 -121 11 -81 4 -117 1 -182 -15 -261 -66 -462 -270 -528 -537 -10 -40 -11 -217 -2 -258 5 -23 11 -51 14 -61 29 -145 147 -312 284 -403 123 -82 224 -114 370 -118 83 -3 124 2 240 29 36 9 133 57 187 94 60 41 111 91 153 152 14 19 28 37 32 40 19 15 71 140 89 217 17 73 20 107 16 198 -4 61 -7 121 -9 134 -3 28 -46 0 482 321 179 108 379 228 444 265 104 59 120 65 133 52 13 -13 12 -22 -10 -78 -49 -123 -58 -165 -62 -262 -7 -149 25 -286 89 -383 47 -72 91 -128 125 -158 19 -17 39 -36 45 -42 27 -25 136 -94 150 -94 8 0 17 -4 20 -9 3 -5 16 -11 28 -14 13 -3 50 -12 83 -21 74 -19 278 -15 345 7 198 65 358 196 435 358 16 34 20 36 49 28 17 -4 49 -10 71 -14 22 -3 99 -16 170 -30 72 -13 144 -26 160 -29 28 -5 101 -18 170 -31 17 -3 80 -14 140 -25 61 -11 124 -22 140 -25 17 -4 49 -9 72 -12 40 -5 42 -7 48 -47 14 -98 29 -147 73 -235 36 -75 61 -110 121 -171 154 -154 280 -210 480 -213 134 -2 180 5 273 40 212 83 371 262 427 481 24 93 25 255 2 342 -64 241 -245 428 -481 501 -62 18 -97 23 -200 22 -107 0 -136 -4 -205 -26 -44 -15 -109 -43 -145 -64 -83 -48 -208 -171 -250 -245 -17 -32 -35 -60 -38 -61 -4 -2 -46 4 -93 13 -48 10 -104 20 -125 23 -22 3 -46 8 -54 11 -8 3 -33 7 -55 10 -38 5 -58 9 -122 21 -16 3 -53 10 -83 15 -30 6 -66 12 -79 15 -13 2 -103 19 -200 36 -169 30 -207 42 -196 60 10 16 -28 155 -62 224 -19 39 -54 96 -78 127 l-45 58 40 52 c96 125 143 266 143 433 1 164 -27 263 -108 391 -19 30 -35 57 -35 61 0 3 31 49 69 102 57 81 450 638 625 889 28 40 62 88 76 107 14 18 194 274 400 568 291 414 379 534 393 531 10 -2 27 -6 37 -9 78 -25 240 -29 338 -9 433 87 677 573 489 974 -93 200 -255 332 -478 389 -87 22 -227 25 -304 6z"/></g></svg>
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
width="350.000000pt" height="350.000000pt" viewBox="0 0 350.000000 350.000000"
preserveAspectRatio="xMidYMid meet">
<metadata>
Created by potrace 1.11, written by Peter Selinger 2001-2013
</metadata>
<g transform="translate(0.000000,350.000000) scale(0.100000,-0.100000)"
fill="#000000" stroke="none">
<path d="M1566 3489 c-433 -46 -867 -274 -1141 -601 -404 -481 -526 -1100
-334 -1688 91 -278 283 -569 498 -756 676 -589 1646 -589 2322 0 215 187 407
478 498 756 142 436 113 895 -84 1305 -320 666 -1027 1061 -1759 984z m1147
-604 c87 -36 146 -118 154 -214 10 -111 -39 -203 -137 -254 -49 -26 -63 -28
-131 -25 l-76 3 -109 -154 c-60 -85 -190 -269 -290 -409 l-181 -255 26 -46
c22 -38 26 -59 26 -121 0 -63 -5 -84 -29 -132 -27 -54 -28 -59 -13 -76 22 -24
47 -86 47 -117 0 -14 6 -28 13 -30 6 -3 91 -16 187 -30 157 -23 175 -24 183
-10 38 68 115 118 199 130 103 15 220 -51 268 -151 26 -52 29 -154 6 -207 -19
-48 -82 -114 -129 -138 -151 -77 -346 22 -373 189 -7 46 15 39 -222 74 -142
20 -155 21 -163 6 -65 -116 -225 -163 -347 -102 -116 58 -167 187 -126 323 8
29 13 55 11 57 -3 3 -65 -33 -138 -79 -74 -46 -162 -100 -196 -120 l-62 -38 6
-47 c11 -100 -46 -207 -136 -254 -43 -23 -66 -28 -121 -28 -77 0 -124 16 -175
62 -48 41 -76 99 -82 167 -7 72 9 129 50 183 85 112 256 132 372 44 l31 -24
174 109 c96 60 180 111 185 113 6 2 -2 16 -16 32 -35 39 -412 468 -414 471 0
1 -21 -5 -45 -13 -57 -20 -142 -14 -196 14 -162 84 -197 288 -71 419 102 108
291 101 386 -14 62 -75 78 -185 40 -273 l-21 -49 23 -28 c13 -16 102 -118 198
-227 l175 -198 20 61 c26 78 64 125 124 155 63 31 117 39 177 26 49 -11 51
-11 72 17 21 26 533 749 548 773 4 6 -4 28 -17 48 -88 133 -44 307 94 376 61
31 163 36 221 11z"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 2.9 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

Before After
Before After

View file

@ -0,0 +1,113 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 23.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
<!ENTITY ns_extend "http://ns.adobe.com/Extensibility/1.0/">
<!ENTITY ns_ai "http://ns.adobe.com/AdobeIllustrator/10.0/">
<!ENTITY ns_graphs "http://ns.adobe.com/Graphs/1.0/">
<!ENTITY ns_vars "http://ns.adobe.com/Variables/1.0/">
<!ENTITY ns_imrep "http://ns.adobe.com/ImageReplacement/1.0/">
<!ENTITY ns_sfw "http://ns.adobe.com/SaveForWeb/1.0/">
<!ENTITY ns_custom "http://ns.adobe.com/GenericCustomNamespace/1.0/">
<!ENTITY ns_adobe_xpath "http://ns.adobe.com/XPath/1.0/">
]>
<svg version="1.1" id="Livello_1" xmlns:x="&ns_extend;" xmlns:i="&ns_ai;" xmlns:graph="&ns_graphs;"
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 5435.8 1604"
style="enable-background:new 0 0 5435.8 1604;" xml:space="preserve">
<style type="text/css">
.st0{fill-rule:evenodd;clip-rule:evenodd;}
.st1{fill-rule:evenodd;clip-rule:evenodd;fill:#A6A6A6;}
.st2{fill:#FFFFFF;}
.st3{fill-rule:evenodd;clip-rule:evenodd;fill:#FFFFFF;}
.st4{fill-rule:evenodd;clip-rule:evenodd;fill:url(#SVGID_1_);}
.st5{fill-rule:evenodd;clip-rule:evenodd;fill:url(#SVGID_2_);}
.st6{fill-rule:evenodd;clip-rule:evenodd;fill:url(#SVGID_3_);}
.st7{fill-rule:evenodd;clip-rule:evenodd;fill:url(#SVGID_4_);}
.st8{opacity:0.2;fill-rule:evenodd;clip-rule:evenodd;enable-background:new ;}
.st9{opacity:0.12;fill-rule:evenodd;clip-rule:evenodd;enable-background:new ;}
.st10{opacity:0.25;fill-rule:evenodd;clip-rule:evenodd;fill:#FFFFFF;enable-background:new ;}
</style>
<metadata>
<sfw xmlns="&ns_sfw;">
<slices></slices>
<sliceSourceBounds bottomLeftOrigin="true" height="1604" width="5435.8" x="-2656.9" y="-784"></sliceSourceBounds>
</sfw>
</metadata>
<path class="st0" d="M5234.4,1604h-5033C90.4,1604,0,1513.6,0,1403.5v-1203C0,90,90.4,0,201.4,0h5033c110.9,0,201.4,90,201.4,200.5
v1203C5435.8,1513.6,5345.3,1604,5234.4,1604z"/>
<path class="st1" d="M5234.4,32.1c93.1,0,169.3,75.7,169.3,168.4v1203c0,92.7-75.7,168.4-169.3,168.4h-5033
c-93.1,0-169.3-75.7-169.3-168.4v-1203c0-92.7,75.7-168.4,169.3-168.4C201.4,32.1,5234.4,32.1,5234.4,32.1z M5234.4,0h-5033
C90.4,0,0,90.4,0,200.5v1203C0,1514,90.4,1604,201.4,1604h5033c110.9,0,201.4-90,201.4-200.5v-1203C5435.8,90.4,5345.3,0,5234.4,0z"
/>
<path class="st2" d="M2863.6,530.6c-36.3,0-66.9-12.7-91.1-37.7c-24-24.3-37.4-57.8-36.8-92c0-36.5,12.4-67.4,36.8-91.9
c24.1-25,54.7-37.7,91-37.7c35.9,0,66.5,12.7,91.1,37.7c24.4,25.3,36.8,56.2,36.8,91.9c-0.4,36.6-12.8,67.5-36.8,91.9
C2930.5,518,2899.9,530.6,2863.6,530.6z M1783.5,530.6c-35.5,0-66.3-12.5-91.5-37.2c-25-24.6-37.7-55.7-37.7-92.4
s12.7-67.8,37.7-92.4c24.7-24.7,55.5-37.2,91.5-37.2c17.6,0,34.7,3.5,51.1,10.6c16.1,6.9,29.2,16.3,38.9,27.8l2.4,2.9l-27.1,26.6
l-2.8-3.3c-15.3-18.2-35.8-27.1-62.9-27.1c-24.2,0-45.3,8.6-62.7,25.6c-17.5,17.1-26.4,39.5-26.4,66.6s8.9,49.5,26.4,66.6
c17.4,17,38.5,25.6,62.7,25.6c25.8,0,47.5-8.6,64.4-25.6c10-10,16.2-24,18.4-41.7h-86.9v-37.4h124.2l0.5,3.4
c0.9,6.3,1.8,12.8,1.8,18.8c0,34.5-10.4,62.4-31,83C1851.1,518.2,1820.5,530.6,1783.5,530.6z M3219.6,525.3h-38.3L3064,337.6l1,33.8
v153.8h-38.3V276.7h43.7l1.2,1.9l110.3,176.8l-1-33.7V276.7h38.7V525.3z M2575.8,525.3H2537V314.1h-67.3v-37.4H2643v37.4h-67.3
V525.3z M2438.1,525.3h-38.7V276.7h38.7V525.3z M2220.6,525.3h-38.7V314.1h-67.3v-37.4h173.3v37.4h-67.3V525.3z M2090.1,524.9
h-148.4V276.7h148.4v37.4h-109.6v68.2h98.9v37h-98.9v68.2h109.6V524.9z M2800.9,467.2c17.3,17.3,38.3,26,62.7,26
c25.1,0,45.6-8.5,62.7-26c17-17,25.6-39.3,25.6-66.2s-8.6-49.3-25.5-66.2c-17.3-17.3-38.4-26-62.7-26c-25.1,0-45.6,8.5-62.6,26
c-17,17-25.6,39.3-25.6,66.2S2784,450.3,2800.9,467.2L2800.9,467.2z"/>
<path class="st3" d="M2732.1,872.4c-94.5,0-171.1,71.7-171.1,170.6c0,98,77.1,170.6,171.1,170.6c94.5,0,171.1-72.2,171.1-170.6
C2903.2,944.1,2826.6,872.4,2732.1,872.4z M2732.1,1146c-51.7,0-96.2-42.8-96.2-103.4c0-61.5,44.6-103.4,96.2-103.4
c51.7,0,96.2,41.9,96.2,103.4C2828.4,1103.6,2783.8,1146,2732.1,1146z M2358.8,872.4c-94.5,0-171.1,71.7-171.1,170.6
c0,98,77.1,170.6,171.1,170.6c94.5,0,171.1-72.2,171.1-170.6C2529.9,944.1,2453.2,872.4,2358.8,872.4z M2358.8,1146
c-51.7,0-96.2-42.8-96.2-103.4c0-61.5,44.6-103.4,96.2-103.4c51.7,0,96.2,41.9,96.2,103.4C2455,1103.6,2410.5,1146,2358.8,1146z
M1914.6,924.5v72.2h173.3c-5.3,40.5-18.7,70.4-39.2,90.9c-25.4,25.4-64.6,53-133.7,53c-106.5,0-189.8-86-189.8-192.5
s83.3-192.5,189.8-192.5c57.5,0,99.4,22.7,130.5,51.7l51.2-51.2c-43.2-41.4-100.7-73.1-181.3-73.1c-146.1,0-268.7,119-268.7,264.7
c0,146.1,122.5,264.7,268.7,264.7c78.9,0,138.1-25.8,184.9-74.4c47.7-47.7,62.8-115,62.8-169.3c0-16.9-1.3-32.1-4-45h-244.6
C1914.6,923.6,1914.6,924.5,1914.6,924.5z M3731.5,980.7c-14.3-38.3-57.5-108.7-146.1-108.7c-87.8,0-160.8,69.1-160.8,170.6
c0,95.8,72.2,170.6,169.3,170.6c78,0,123.4-47.7,142.1-75.7l-57.9-38.8c-19.2,28.5-45.9,47.2-83.8,47.2c-38.3,0-65.1-17.4-82.9-51.7
l228.1-94.5C3739.5,999.8,3731.5,980.7,3731.5,980.7z M3498.9,1037.7c-1.8-65.9,51.2-99.4,89.1-99.4c29.9,0,54.8,14.7,63.3,36.1
L3498.9,1037.7z M3313.6,1203h74.9V701.8h-74.9V1203z M3190.6,910.3h-2.7c-16.9-20.1-49-38.3-90-38.3
c-85.1,0-163.5,74.9-163.5,171.1c0,95.8,78,169.8,163.5,169.8c40.5,0,73.1-18.3,90-38.8h2.7v24.5c0,65.1-34.8,100.2-90.9,100.2
c-45.9,0-74.4-33-86-60.6l-65.1,27.2c18.7,45,68.6,100.7,151,100.7c87.8,0,162.2-51.7,162.2-177.8V882.2h-70.8v28.1
C3191.1,910.3,3190.6,910.3,3190.6,910.3z M3104.6,1146c-51.7,0-94.9-43.2-94.9-102.9c0-60.2,43.2-103.8,94.9-103.8
c51.2,0,90.9,44.1,90.9,103.8C3196,1102.8,3155.9,1146,3104.6,1146z M4082.2,701.8h-179.1V1203h74.9v-189.8h104.3
c82.9,0,164.4-60.1,164.4-155.5S4165.5,701.8,4082.2,701.8z M4084.4,943.2h-106.5v-172h106.5c56.1,0,87.8,46.3,87.8,86
C4172.2,896.5,4140.1,943.2,4084.4,943.2z M4546.9,871.5c-54.4,0-110.5,24.1-133.7,76.6l66.4,27.6c14.3-27.6,40.5-37,68.2-37
c38.8,0,78,23.2,78.9,64.6v5.3c-13.4-7.6-42.8-19.2-78-19.2c-71.7,0-144.4,39.2-144.4,112.7c0,67.3,58.8,110.5,124.3,110.5
c50.3,0,78-22.7,95.3-49h2.7v38.8h72.2v-192C4698.8,921,4632.4,871.5,4546.9,871.5z M4537.5,1146c-24.5,0-58.8-12-58.8-42.8
c0-38.8,42.8-53.5,79.3-53.5c33,0,48.6,7.1,68.2,16.9C4620.8,1111.6,4582.8,1145.6,4537.5,1146z M4962.2,882.2l-86,217.4h-2.7
l-89.1-217.4h-80.6l133.7,303.9l-76.2,168.9h78L5045,882.2C5045,882.2,4962.2,882.2,4962.2,882.2z M4288,1203h74.9V701.8H4288V1203z
"/>
<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="1682.1077" y1="1339.4783" x2="1624.2924" y2="1309.6345" gradientTransform="matrix(11.64 0 0 -22.55 -18705.5957 30554.3691)">
<stop offset="0" style="stop-color:#00A0FF"/>
<stop offset="6.569999e-03" style="stop-color:#00A1FF"/>
<stop offset="0.2601" style="stop-color:#00BEFF"/>
<stop offset="0.5122" style="stop-color:#00D2FF"/>
<stop offset="0.7604" style="stop-color:#00DFFF"/>
<stop offset="1" style="stop-color:#00E3FF"/>
</linearGradient>
<path class="st4" d="M418.4,302.1c-11.6,12.5-18.3,31.6-18.3,56.6v886.7c0,25,6.7,44.1,18.7,56.1l3.1,2.7l496.8-496.8v-11.1
L421.5,299.4C421.5,299.4,418.4,302.1,418.4,302.1z"/>
<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="1712.6624" y1="1274.8376" x2="1606.5613" y2="1274.8376" gradientTransform="matrix(9.145 0 0 -7.7 -14305.5381 10618.251)">
<stop offset="0" style="stop-color:#FFE000"/>
<stop offset="0.4087" style="stop-color:#FFBD00"/>
<stop offset="0.7754" style="stop-color:#FFA500"/>
<stop offset="1" style="stop-color:#FF9C00"/>
</linearGradient>
<path class="st5" d="M1084,973.5L918.3,807.8v-11.6L1084,630.5l3.6,2.2l196,111.4c56.1,31.6,56.1,83.8,0,115.8l-196,111.4
C1087.6,971.3,1084,973.5,1084,973.5z"/>
<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="1707.4414" y1="1290.0475" x2="1646.682" y2="1211.2225" gradientTransform="matrix(15.02 0 0 -11.5775 -24650.2285 15829.6484)">
<stop offset="0" style="stop-color:#FF3A44"/>
<stop offset="1" style="stop-color:#C31162"/>
</linearGradient>
<path class="st6" d="M1087.6,971.3L918.3,802l-499.9,499.9c18.3,19.6,49,21.8,83.3,2.7L1087.6,971.3"/>
<linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="1660.6357" y1="1365.6676" x2="1687.767" y2="1330.4501" gradientTransform="matrix(15.02 0 0 -11.5715 -24650.2285 15809.9922)">
<stop offset="0" style="stop-color:#32A071"/>
<stop offset="6.850000e-02" style="stop-color:#2DA771"/>
<stop offset="0.4762" style="stop-color:#15CF74"/>
<stop offset="0.8009" style="stop-color:#06E775"/>
<stop offset="1" style="stop-color:#00F076"/>
</linearGradient>
<path class="st7" d="M1087.6,632.7L501.7,299.9c-34.3-19.6-65.1-16.9-83.3,2.7L918.3,802L1087.6,632.7z"/>
<path class="st8" d="M1084,967.7l-581.9,330.6c-32.5,18.7-61.5,17.4-80.2,0.4l-3.1,3.1l3.1,2.7c18.7,16.9,47.7,18.3,80.2-0.4
L1088,971.3C1088,971.3,1084,967.7,1084,967.7z"/>
<path class="st9" d="M1283.6,854.1l-200.1,113.6l3.6,3.6l196-111.4c28.1-16,41.9-37,41.9-57.9C1323.3,821.2,1309,839.4,1283.6,854.1
z"/>
<path class="st10" d="M501.7,305.7l781.9,444.2c25.4,14.3,39.7,33,41.9,52.1c0-20.9-13.8-41.9-41.9-57.9L501.7,299.9
c-56.1-32.1-101.6-5.3-101.6,58.8v5.8C400.1,300.3,445.6,274,501.7,305.7z"/>
</svg>

After

Width:  |  Height:  |  Size: 9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.4 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

Before After
Before After

View file

@ -1,5 +1,11 @@
<!-- Generated by IcoMoon.io -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32">
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="32px" height="32px" viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
<title>artist</title>
<path fill="#fff" d="M9.201 24.681c0-6.699 0-13.358 0-20.035 7.594-1.505 15.157-3.004 22.768-4.513 0 0.172 0 0.319 0 0.465 0 7.067-0.026 14.135 0.021 21.202 0.010 1.498-0.59 2.57-1.716 3.423-1.999 1.512-4.26 2.145-6.751 1.88-0.504-0.054-1.020-0.205-1.481-0.418-1.502-0.695-1.856-2.122-0.908-3.48 0.826-1.184 1.99-1.924 3.302-2.433 1.362-0.528 2.774-0.843 4.252-0.719 0.324 0.027 0.646 0.084 0.994 0.13 0-4.345 0-8.679 0-13.050-6.062 1.204-12.099 2.404-18.16 3.608 0 0.196 0 0.345 0 0.495 0 5.174-0.006 10.349 0.004 15.523 0.003 1.409-0.802 2.302-1.854 3.056-0.889 0.637-1.859 1.114-2.906 1.426-1.524 0.453-3.067 0.627-4.619 0.169-0.952-0.281-1.789-0.736-2.010-1.83-0.136-0.673 0.098-1.269 0.459-1.822 0.772-1.183 1.947-1.853 3.193-2.388 1.662-0.714 3.394-1.043 5.207-0.698 0.048 0.009 0.099 0.005 0.206 0.010z"></path>
<path fill="#FFFFFF" d="M29.369,0.72H10.271C8.864,0.722,7.726,1.861,7.724,3.267v18.534c-0.771-0.459-1.649-0.703-2.546-0.709
c-2.813,0-5.094,2.281-5.094,5.094s2.281,5.094,5.094,5.094s5.093-2.281,5.093-5.094V10.907h19.099v10.894
c-0.771-0.459-1.649-0.703-2.546-0.709c-2.813,0-5.094,2.281-5.094,5.094s2.281,5.094,5.094,5.094s5.093-2.281,5.093-5.094V3.267
C31.914,1.861,30.775,0.722,29.369,0.72z M10.271,3.267h19.099V8.36H10.271V3.267z"/>
</svg>

Before

Width:  |  Height:  |  Size: 979 B

After

Width:  |  Height:  |  Size: 931 B

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.2 KiB

After

Width:  |  Height:  |  Size: 6.4 KiB

Before After
Before After

View file

@ -1,9 +1,36 @@
<!-- Generated by IcoMoon.io -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32">
<title>live</title>
<path fill="#fff" d="M9.636 10.115c-0.829 0.544-1.243 0.816-2.072 1.361-2.331-3.547-2.331-6.195 0-9.749 0.829 0.546 1.244 0.819 2.072 1.361-1.68 2.557-1.68 4.464 0 7.027z"></path>
<path fill="#fff" d="M4.374 11.662c-0.828 0.542-1.243 0.815-2.072 1.359-3.069-4.676-3.069-8.159 0-12.838 0.829 0.546 1.244 0.817 2.072 1.362-2.418 3.684-2.418 6.426 0 10.117z"></path>
<path fill="#fff" d="M22.365 10.115c0.826 0.544 1.242 0.816 2.070 1.361 2.334-3.547 2.334-6.195 0-9.749-0.828 0.546-1.244 0.819-2.070 1.361 1.677 2.557 1.677 4.464 0 7.027z"></path>
<path fill="#fff" d="M27.627 11.662c0.827 0.542 1.243 0.815 2.070 1.359 3.070-4.676 3.070-8.159 0-12.838-0.827 0.546-1.243 0.817-2.070 1.362 2.419 3.684 2.419 6.426 0 10.117z"></path>
<path fill="#fff" d="M25.211 31.982l2.611-0.95-8.172-22.45c0.32-0.589 0.502-1.263 0.502-1.979 0-2.293-1.859-4.152-4.152-4.152s-4.151 1.858-4.151 4.152c0 0.672 0.16 1.305 0.443 1.868l-8.212 22.561 2.612 0.95 1.952-5.362h14.616l1.951 5.362zM17.396 10.513l3.945 10.834-7.903-7.9 1.080-2.966c0.46 0.176 0.96 0.272 1.481 0.272 0.49 0.001 0.961-0.084 1.397-0.24zM12.39 16.329l7.51 7.512h-10.245l2.735-7.512z"></path>
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_2" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="32px" height="32px" viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
<g>
<polygon fill="none" points="12.252,15.364 9.287,23.717 20.6,23.709 "/>
<path fill="none" d="M13.122,12.92l8.846,8.846l-4.158-11.71c-0.558,0.271-1.175,0.437-1.839,0.437
c-0.66,0-1.276-0.164-1.833-0.434L13.122,12.92z"/>
<path fill="#FFFFFF" d="M19.663,8.28c0.33-0.601,0.529-1.277,0.529-2.008c0-2.333-1.892-4.223-4.222-4.223s-4.222,1.89-4.222,4.223
c0,0.733,0.203,1.412,0.532,2.013l-7.56,21.292c-0.248,0.697,0.047,1.434,0.656,1.654c0.608,0.215,1.305-0.177,1.549-0.865
l1.53-4.309l15.034-0.007l1.532,4.315c0.247,0.688,0.941,1.08,1.549,0.865c0.61-0.221,0.904-0.957,0.658-1.654L19.663,8.28z
M17.81,10.057l4.158,11.71l-8.846-8.846l1.016-2.861c0.557,0.27,1.173,0.434,1.833,0.434
C16.635,10.493,17.252,10.328,17.81,10.057z M12.252,15.364l8.347,8.345L9.287,23.717L12.252,15.364z"/>
<g>
<path fill="#FFFFFF" d="M3.638,1.458C3.189,0.996,2.563,0.875,2.279,1.211c-3.043,3.578-3.045,8.859-0.002,12.44
c0.284,0.335,0.913,0.214,1.362-0.25c0.452-0.462,0.628-1.022,0.424-1.264C1.76,9.428,1.762,5.433,4.064,2.726
C4.267,2.484,4.089,1.924,3.638,1.458z"/>
</g>
<g>
<path fill="#FFFFFF" d="M28.303,1.46c-0.45,0.464-0.626,1.021-0.421,1.261c2.303,2.71,2.3,6.707-0.003,9.412
c-0.205,0.24-0.025,0.802,0.424,1.266c0.448,0.466,1.075,0.586,1.361,0.25c3.044-3.578,3.046-8.86,0.003-12.441
C29.38,0.873,28.753,0.996,28.303,1.46z"/>
</g>
<g>
<path fill="#FFFFFF" d="M8.847,11.926c0.453-0.465,0.687-0.966,0.546-1.132C7.78,8.897,7.781,6.1,9.392,4.205
c0.141-0.167-0.094-0.672-0.545-1.138c-0.448-0.463-1.019-0.639-1.24-0.376c-2.351,2.766-2.353,6.848,0,9.616
C7.826,12.569,8.398,12.39,8.847,11.926z"/>
</g>
<g>
<path fill="#FFFFFF" d="M23.182,11.858c0.45,0.466,1.017,0.642,1.24,0.379c2.353-2.766,2.354-6.849,0.001-9.617
C24.199,2.362,23.63,2.54,23.18,3.004c-0.449,0.464-0.685,0.967-0.542,1.132c1.611,1.896,1.61,4.692-0.001,6.587
C22.495,10.888,22.73,11.393,23.182,11.858z"/>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 2.3 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

Before After
Before After

View file

@ -1,5 +1,17 @@
<!-- Generated by IcoMoon.io -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32">
<title>movie</title>
<path fill="#fff" d="M0 1.416c10.695 0 21.315 0 32 0 0 9.719 0 19.417 0 29.168-10.635 0-21.293 0-32 0 0-9.699 0-19.399 0-29.168zM9.202 15.129c4.535 0 9.065 0 13.609 0 0-3.798 0-7.579 0-11.355-4.563 0-9.075 0-13.609 0 0 3.801 0 7.551 0 11.355zM9.215 28.909c4.581 0 9.093 0 13.61 0 0-3.818 0-7.585 0-11.382-4.549 0-9.062 0-13.61 0 0 3.803 0 7.57 0 11.382zM6.813 5.983c0-0.753 0-1.467 0-2.209-1.138 0-2.235 0-3.33 0 0 0.766 0 1.48 0 2.209 1.131 0 2.21 0 3.33 0zM25.231 3.754c0 0.783 0 1.494 0 2.219 1.141 0 2.235 0 3.33 0 0-0.763 0-1.476 0-2.219-1.12 0-2.198 0-3.33 0zM25.233 12.938c0 0.777 0 1.492 0 2.19 1.149 0 2.248 0 3.335 0 0-0.754 0-1.452 0-2.19-1.116 0-2.197 0-3.335 0zM25.227 22.074c0 0.783 0 1.496 0 2.218 1.139 0 2.235 0 3.335 0 0-0.758 0-1.471 0-2.218-1.119 0-2.196 0-3.335 0zM3.472 26.689c0 0.768 0 1.481 0 2.221 1.133 0 2.226 0 3.34 0 0-0.763 0-1.475 0-2.221-1.119 0-2.197 0-3.34 0zM28.579 26.711c-1.112 0-2.225 0-3.353 0 0 0.749 0 1.462 0 2.202 1.137 0 2.233 0 3.353 0 0-0.748 0-1.447 0-2.202zM6.817 15.155c0-0.774 0-1.468 0-2.21-1.133 0-2.229 0-3.338 0 0 0.761 0 1.473 0 2.21 1.127 0 2.207 0 3.338 0zM3.463 19.73c1.165 0 2.242 0 3.346 0 0-0.759 0-1.469 0-2.189-1.143 0-2.239 0-3.346 0 0 0.748 0 1.446 0 2.189zM28.559 19.733c0-0.764 0-1.479 0-2.188-1.144 0-2.241 0-3.34 0 0 0.752 0 1.448 0 2.188 1.114 0 2.195 0 3.34 0zM6.791 24.304c0-0.798 0-1.511 0-2.215-1.145 0-2.225 0-3.312 0 0 0.766 0 1.481 0 2.215 1.129 0 2.211 0 3.312 0zM3.489 8.378c0 0.771 0 1.464 0 2.145 1.138 0 2.219 0 3.319 0 0-0.74 0-1.431 0-2.145-1.129 0-2.211 0-3.319 0zM28.554 10.538c0-0.775 0-1.464 0-2.137-1.146 0-2.242 0-3.319 0 0 0.747 0 1.438 0 2.137 1.131 0 2.21 0 3.319 0z"></path>
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="32px"
height="32px" viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
<g id="Layer_1">
<title>artist</title>
</g>
<g id="Layer_2">
<path fill="#FFFFFF" d="M29.508,0.241H2.492c-1.242,0-2.251,1.008-2.251,2.251v27.015c0,1.242,1.009,2.252,2.251,2.252h27.016
c1.242,0,2.251-1.01,2.251-2.252V2.493C31.759,1.25,30.75,0.241,29.508,0.241z M4.744,29.508H2.492v-3.002h2.252V29.508z
M4.744,24.255H2.492v-3.753h2.252V24.255z M4.744,18.252H2.492V14.5h2.252V18.252z M4.744,12.248H2.492V8.496h2.252V12.248z
M4.744,6.245H2.492V2.493h2.252V6.245z M25.005,29.508H6.995V16.75h18.01V29.508z M25.005,14.5H6.995V2.493h18.01V14.5z
M29.508,29.508h-2.252v-3.002h2.252V29.508z M29.508,24.255h-2.252v-3.753h2.252V24.255z M29.508,18.252h-2.252V14.5h2.252V18.252
z M29.508,12.248h-2.252V8.496h2.252V12.248z M29.508,6.245h-2.252V2.493h2.252V6.245z"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.3 KiB

After

Width:  |  Height:  |  Size: 4.5 KiB

Before After
Before After

View file

@ -1,6 +1,25 @@
<!-- Generated by IcoMoon.io -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32">
<title>photo</title>
<path fill="#fff" d="M25.208 2.266c0 1.514 0 2.976 0 4.513 2.281 0 4.505 0 6.792 0 0 7.681 0 15.287 0 22.955-10.643 0-21.3 0-32 0 0-7.626 0-15.236 0-22.913 2.258 0 4.486 0 6.792 0 0-1.546 0-3.029 0-4.555 6.152 0 12.226 0 18.415 0zM16.008 9.209c-5.026-0.004-9.12 4.079-9.123 9.099-0.004 4.961 4.099 9.069 9.074 9.085 5.022 0.016 9.124-4.047 9.159-9.070 0.035-4.985-4.087-9.109-9.109-9.114z"></path>
<path fill="#fff" d="M20.601 18.292c0.003 2.551-2.070 4.626-4.61 4.613-2.558-0.013-4.595-2.069-4.591-4.634 0.003-2.524 2.038-4.557 4.577-4.572 2.562-0.015 4.621 2.030 4.624 4.593z"></path>
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="32px"
height="32px" viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
<g id="Layer_2">
</g>
<g id="Layer_3">
<g>
<path fill="#FFFFFF" d="M30.807,8.975c-0.587-0.596-1.388-0.933-2.224-0.934h-5.158l-0.855-2.599
c-0.207-0.633-0.607-1.184-1.145-1.577c-0.536-0.389-1.18-0.6-1.84-0.6h-7.171c-0.661,0-1.306,0.211-1.84,0.602
C10.037,4.259,9.637,4.811,9.43,5.442L8.573,8.041H3.416C2.579,8.042,1.779,8.379,1.192,8.975c-0.591,0.6-0.923,1.408-0.923,2.25
V25.55c0,0.843,0.332,1.65,0.923,2.25c0.587,0.596,1.387,0.932,2.224,0.934h25.167c0.836-0.002,1.637-0.338,2.224-0.934
c0.591-0.6,0.923-1.407,0.923-2.25V11.225C31.729,10.383,31.397,9.574,30.807,8.975z M29.482,25.55
c0,0.258-0.103,0.497-0.273,0.672c-0.165,0.168-0.391,0.265-0.627,0.266H3.418c-0.237-0.001-0.462-0.098-0.628-0.266
c-0.176-0.181-0.274-0.422-0.273-0.674v-14.32c0-0.258,0.103-0.499,0.273-0.673c0.172-0.173,0.396-0.266,0.627-0.267h6.782
l1.365-4.144c0.063-0.189,0.181-0.351,0.334-0.463c0.152-0.11,0.332-0.169,0.514-0.169h7.175c0.182,0,0.361,0.059,0.514,0.169
c0.153,0.112,0.271,0.273,0.335,0.463l1.363,4.144h6.783c0.23,0,0.456,0.094,0.627,0.267c0.171,0.174,0.272,0.413,0.273,0.671
V25.55z"/>
<path fill="#FFFFFF" d="M16,10.7c-3.764,0-6.813,3.049-6.813,6.812c0,3.765,3.05,6.815,6.813,6.815
c3.763,0,6.813-3.051,6.813-6.815C22.813,13.749,19.763,10.7,16,10.7z M15.999,22.082c-2.523,0-4.568-2.045-4.568-4.568
s2.045-4.569,4.568-4.569c2.524,0,4.569,2.046,4.569,4.569S18.523,22.082,15.999,22.082z"/>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 746 B

After

Width:  |  Height:  |  Size: 1.8 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 875 B

Before After
Before After

View file

@ -1,12 +1,9 @@
<!-- Generated by IcoMoon.io -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32">
<title>playlist</title>
<path fill="#fff" d="M9.167 10.268c7.653 0 15.208 0 22.82 0 0 1.147 0 2.268 0 3.451-7.583 0-15.172 0-22.82 0 0-1.134 0-2.274 0-3.451z"></path>
<path fill="#fff" d="M9.14 21.73c0-1.152 0-2.257 0-3.424 7.609 0 15.212 0 22.86 0 0 1.132 0 2.252 0 3.424-7.607 0-15.191 0-22.86 0z"></path>
<path fill="#fff" d="M9.217 5.679c0-1.145 0-2.23 0-3.363 7.562 0 15.101 0 22.683 0 0 1.113 0 2.213 0 3.363-7.539 0-15.080 0-22.683 0z"></path>
<path fill="#fff" d="M9.225 29.708c0-1.132 0-2.214 0-3.336 7.558 0 15.086 0 22.668 0 0 1.086 0 2.186 0 3.336-7.526 0-15.071 0-22.668 0z"></path>
<path fill="#fff" d="M0.007 10.279c1.58 0 3.043 0 4.551 0 0 1.153 0 2.272 0 3.444-1.511 0-3.011 0-4.551 0 0-1.157 0-2.292 0-3.444z"></path>
<path fill="#fff" d="M4.527 2.292c0 1.183 0 2.284 0 3.424-1.496 0-2.957 0-4.479 0 0-1.142 0-2.276 0-3.424 1.51 0 2.971 0 4.479 0z"></path>
<path fill="#fff" d="M4.571 18.3c0 1.151 0 2.254 0 3.416-1.515 0-3.019 0-4.571 0 0-1.127 0-2.247 0-3.416 1.513 0 3.001 0 4.571 0z"></path>
<path fill="#fff" d="M4.54 26.352c0 1.137 0 2.218 0 3.354-1.494 0-2.975 0-4.506 0 0-1.094 0-2.192 0-3.354 1.489 0 2.965 0 4.506 0z"></path>
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_4" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="32px" height="32px" viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
<path fill="#FFFFFF" d="M0.27,2.892h2.621v2.622H0.27V2.892z M31.729,2.892H8.135v2.622h23.595V2.892z M31.729,10.757H8.135v2.622
h23.595V10.757z M8.135,18.622h23.595v2.621H8.135V18.622z M31.729,26.487H8.135v2.621h23.595V26.487z M2.891,10.757H0.27v2.622
h2.621V10.757z M0.27,18.622h2.621v2.621H0.27V18.622z M2.891,26.487H0.27v2.621h2.621V26.487z"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 819 B

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Before After
Before After

View file

@ -1,6 +1,12 @@
<!-- Generated by IcoMoon.io -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32">
<title>show</title>
<path fill="#fff" d="M0 26.565c0-8.38 0-16.706 0-25.089 10.661 0 21.307 0 32 0 0 8.343 0 16.686 0 25.089-10.637 0-21.283 0-32 0zM3.514 4.937c0 5.355 0 10.634 0 15.901 8.375 0 16.691 0 24.994 0 0-5.331 0-10.612 0-15.901-8.356 0-16.656 0-24.994 0z"></path>
<path fill="#fff" d="M6.874 30.524c0-0.553 0-1.056 0-1.602 6.084 0 12.136 0 18.25 0 0 0.509 0 1.029 0 1.602-6.050 0-12.12 0-18.25 0z"></path>
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="32px" height="32px" viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
<title>artist</title>
<g>
<path fill="#FFFFFF" d="M2.359,1.602h27.281c1.255,0,2.273,1.018,2.273,2.273v19.703c0,1.256-1.019,2.273-2.273,2.273H2.359
c-1.255,0-2.273-1.018-2.273-2.273V3.875C0.086,2.62,1.104,1.602,2.359,1.602z M2.359,23.578h27.281V3.875H2.359V23.578z"/>
<path fill="#FFFFFF" d="M25.094,30.398v-2.273H6.906v2.273H25.094z"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 555 B

After

Width:  |  Height:  |  Size: 816 B

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

Before After
Before After

View file

@ -1,5 +1,13 @@
<!-- Generated by IcoMoon.io -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32">
<title>video</title>
<path fill="#fff" d="M20.662 27.439c-6.971 0-13.797 0-20.662 0 0-7.639 0-15.235 0-22.878 6.846 0 13.672 0 20.588 0 0 2.962 0 5.932 0 9.091 3.87-2.316 7.591-4.542 11.412-6.828 0 6.153 0 12.176 0 18.33-3.769-2.257-7.494-4.488-11.338-6.789 0 3.070 0 6.035 0 9.075z"></path>
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="32px" height="32px" viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
<title>artist</title>
<path fill="#FFFFFF" d="M21.619,27.237H2.515c-1.241,0-2.247-1.006-2.247-2.247V7.011c0-1.242,1.006-2.248,2.247-2.248h19.104
c1.24,0,2.247,1.006,2.247,2.248v4.562l6.091-4.349c0.506-0.36,1.207-0.242,1.568,0.263c0.134,0.19,0.206,0.415,0.207,0.647v15.732
c-0.002,0.621-0.509,1.123-1.128,1.119c-0.232-0.001-0.458-0.075-0.647-0.209l-6.091-4.349v4.563
C23.866,26.231,22.859,27.237,21.619,27.237z M2.515,7.011V24.99h19.104v-6.742c0.003-0.621,0.509-1.122,1.129-1.118
c0.231,0,0.457,0.074,0.646,0.208l6.091,4.349V10.314l-6.091,4.349c-0.506,0.36-1.207,0.242-1.568-0.263
c-0.133-0.189-0.206-0.415-0.207-0.647V7.011H2.515z"/>
</svg>

Before

Width:  |  Height:  |  Size: 430 B

After

Width:  |  Height:  |  Size: 1.1 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 123 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 200 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

View file

@ -0,0 +1,5 @@
<!-- Generated by IcoMoon.io -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="64" height="64" viewBox="0 0 63 64">
<title>alexa</title>
<path fill="#fff" d="M31.554 1.104c-17.063 0-30.896 13.832-30.896 30.896s13.832 30.896 30.896 30.896 30.896-13.833 30.896-30.896c0-17.063-13.833-30.896-30.896-30.896zM27.506 62.329c0-0.037 0-0.072 0-0.107 0-1.945 0.006-3.89-0.002-5.835-0.006-1.199-0.443-2.224-1.318-3.051-0.459-0.435-1.009-0.711-1.604-0.917-2.669-0.926-5.071-2.316-7.189-4.188-3.006-2.658-5.122-5.897-6.335-9.723-0.313-0.989-0.542-1.997-0.711-3.022-0.185-1.121-0.27-2.25-0.271-3.384-0.001-0.766 0.037-1.532 0.115-2.297 0.283-2.765 1.070-5.374 2.361-7.833 0.836-1.592 1.861-3.053 3.069-4.386 1.705-1.883 3.682-3.414 5.929-4.597 1.777-0.935 3.651-1.605 5.617-2.009 0.649-0.133 1.305-0.237 1.962-0.317 0.94-0.114 1.886-0.13 2.834-0.124 0.691 0.004 1.381 0.042 2.066 0.123 3.624 0.428 6.949 1.663 9.929 3.778 3.997 2.836 6.73 6.604 8.208 11.276 0.313 0.988 0.539 1.999 0.691 3.026 0.092 0.623 0.184 1.247 0.2 1.877 0.021 0.801 0.060 1.603 0.035 2.403-0.021 0.671-0.111 1.34-0.191 2.007-0.148 1.243-0.435 2.456-0.804 3.652-0.745 2.415-1.861 4.653-3.247 6.76-0.863 1.312-1.823 2.551-2.855 3.735-1.409 1.618-2.945 3.108-4.572 4.503-2.165 1.857-4.47 3.523-6.883 5.042-2.011 1.266-4.080 2.43-6.226 3.452-0.143 0.068-0.288 0.135-0.441 0.206-0.123-0.015-0.246-0.031-0.369-0.048z"></path>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

View file

@ -1,8 +1,5 @@
<!-- Generated by IcoMoon.io -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="64" height="64" viewBox="0 0 64 64">
<title>android</title>
<path fill="#fff" d="M31.944 21.318c5.556 0 11.113 0 16.67 0 0.042 0 0.084-0 0.126 0.001 0.548 0.012 0.554 0.012 0.554 0.555 0.002 2.526 0.001 5.052 0.001 7.577 0 5.789 0.003 11.577-0.002 17.365-0.001 1.197-0.344 2.274-1.205 3.155-0.759 0.777-1.671 1.191-2.753 1.22-0.757 0.019-1.515 0.011-2.273 0.016-0.772 0.005-0.774 0.006-0.774 0.751-0.001 2.505-0.032 5.010 0.013 7.514 0.024 1.305-0.386 2.363-1.302 3.29-1.214 1.23-3.457 1.485-4.769 0.396-1.051-0.873-1.725-1.978-1.715-3.423 0.019-2.547 0.010-5.093 0.003-7.64-0.003-1.010 0.144-0.869-0.858-0.876-1.158-0.008-2.315-0.005-3.473-0.001-0.829 0.003-0.76-0.103-0.76 0.794-0.002 2.505-0.027 5.010 0.010 7.514 0.019 1.278-0.377 2.325-1.281 3.235-1.199 1.208-3.371 1.494-4.716 0.437-1.067-0.838-1.779-1.932-1.77-3.386 0.017-2.61 0.005-5.219 0.005-7.829 0-0.147-0.008-0.295 0-0.442 0.013-0.24-0.092-0.339-0.334-0.335-0.736 0.012-1.473 0.002-2.209 0.022-0.575 0.015-1.129-0.058-1.673-0.251-1.682-0.597-2.691-2.017-2.737-3.858-0.063-2.566-0.031-5.135-0.035-7.703-0.007-5.304-0.010-10.608-0.016-15.912-0.001-0.568-0.017-1.136-0.018-1.704-0-0.464 0.006-0.472 0.494-0.479 0.989-0.013 1.978-0.023 2.968-0.023 4.609-0.002 9.219-0.001 13.829-0.001-0.001 0.006-0.001 0.014-0.001 0.021z"></path>
<path fill="#fff" d="M31.944 19.89c-5.535 0-11.071 0.002-16.606-0.002-0.717-0-0.772 0.153-0.687-0.747 0.189-2.003 0.58-3.948 1.437-5.784 1.041-2.228 2.47-4.152 4.433-5.648 0.864-0.658 1.646-1.43 2.624-1.932 0.216-0.111 0.25-0.23 0.129-0.443-0.363-0.64-0.715-1.286-1.059-1.937-0.441-0.835-0.877-1.674-1.302-2.518-0.247-0.491-0.206-0.765 0.103-0.941 0.342-0.194 0.625-0.077 0.892 0.415 0.721 1.329 1.429 2.664 2.142 3.997 0.069 0.13 0.141 0.258 0.215 0.386 0.226 0.39 0.228 0.394 0.671 0.218 2.478-0.987 5.051-1.43 7.715-1.338 2.143 0.074 4.214 0.501 6.214 1.273 0.118 0.045 0.241 0.081 0.35 0.142 0.186 0.102 0.303 0.067 0.405-0.126 0.534-1.023 1.075-2.043 1.617-3.062 0.297-0.557 0.592-1.115 0.908-1.66 0.189-0.325 0.514-0.408 0.809-0.253 0.292 0.153 0.366 0.43 0.175 0.817-0.39 0.79-0.791 1.575-1.204 2.353-0.383 0.725-0.789 1.438-1.18 2.159-0.19 0.351-0.181 0.348 0.158 0.573 1.666 1.102 3.266 2.297 4.577 3.814 1.895 2.192 3.115 4.723 3.574 7.598 0.119 0.746 0.175 1.503 0.266 2.254 0.038 0.311-0.097 0.421-0.393 0.394-0.146-0.014-0.295-0.002-0.442-0.002-5.514 0-11.028 0-16.543 0zM25.561 12.038c-0.063-1.117-0.623-1.553-1.433-1.566-0.833-0.014-1.419 0.462-1.455 1.603-0.025 0.776 0.66 1.407 1.463 1.409 0.79 0.001 1.421-0.64 1.424-1.445zM39.872 13.483c0.788-0.007 1.497-0.676 1.439-1.441-0.076-0.997-0.486-1.549-1.506-1.576-0.841-0.022-1.403 0.67-1.386 1.605 0.016 0.816 0.635 1.418 1.453 1.411z"></path>
<path fill="#fff" d="M50.587 32.655c0-2.715-0.003-5.429 0.001-8.143 0.003-1.77 0.853-2.959 2.453-3.698 0.717-0.331 1.433-0.52 2.172-0.287 0.794 0.251 1.537 0.649 2.123 1.273 0.519 0.552 0.839 1.207 0.944 1.957 0.052 0.374 0.082 0.754 0.083 1.131 0.005 5.282-0.005 10.564 0.010 15.846 0.004 1.249-0.402 2.288-1.278 3.179-1.245 1.267-3.35 1.546-4.76 0.479-1.076-0.815-1.719-1.943-1.745-3.342-0.019-1.010-0.013-2.020-0.014-3.030-0.002-1.789-0.001-3.578-0.001-5.366 0.004-0 0.008-0 0.012-0z"></path>
<path fill="#fff" d="M13.369 32.464c0 2.335-0.001 4.669 0.001 7.004 0 0.63 0.047 1.263 0.002 1.889-0.072 1.003-0.541 1.811-1.23 2.554-0.931 1.004-2.059 1.18-3.323 1.058-1.55-0.15-3.156-2.028-3.181-3.665-0.004-0.231-0.015-0.462-0.014-0.694 0.003-5.406 0.007-10.812 0.011-16.218 0.001-1.655 0.863-2.749 2.268-3.501 0.683-0.366 1.397-0.602 2.158-0.402 1.622 0.427 3.305 1.697 3.292 3.834-0.016 2.713-0.004 5.427-0.004 8.141 0.007-0 0.013-0 0.020 0z"></path>
<path fill="#fff" d="M46.73 40.88c-0.003 0-0.007 0-0.010 0-1.475 0-2.67-1.195-2.67-2.67s1.195-2.67 2.67-2.67c1.475 0 2.67 1.195 2.67 2.67v0c0 0 0 0 0 0 0 1.471-1.19 2.664-2.659 2.67h-0.001zM17.27 40.88c-1.475 0-2.67-1.195-2.67-2.67s1.195-2.67 2.67-2.67c1.475 0 2.67 1.195 2.67 2.67v0c0 0.003 0 0.007 0 0.010 0 1.469-1.191 2.66-2.66 2.66-0.003 0-0.007 0-0.011 0h0.001zM47.68 24.83l5.32-9.23c0.095-0.159 0.151-0.351 0.151-0.557 0-0.405-0.219-0.76-0.546-0.951l-0.005-0.003c-0.16-0.095-0.354-0.152-0.56-0.152-0.407 0-0.764 0.22-0.957 0.547l-0.003 0.005-5.38 9.34c-4.027-1.851-8.738-2.93-13.7-2.93s-9.673 1.079-13.909 3.016l0.209-0.086-5.39-9.34c-0.204-0.28-0.531-0.46-0.9-0.46-0.613 0-1.11 0.497-1.11 1.11 0 0.167 0.037 0.325 0.103 0.467l-0.003-0.007 5.33 9.23c-9.153 5.047-15.453 14.286-16.323 25.059l-0.007 0.111h64c-0.875-10.883-7.171-20.121-16.158-25.088l-0.162-0.082z"></path>
</svg>

Before

Width:  |  Height:  |  Size: 3.7 KiB

After

Width:  |  Height:  |  Size: 1 KiB

Before After
Before After

View file

@ -1,5 +1,7 @@
<!-- Generated by IcoMoon.io -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="64" height="64" viewBox="0 0 64 64">
<title>msedge</title>
<path fill="#fff" d="M21.073 38.209c-0.063 2.074 0.41 3.878 1.361 5.565 1.431 2.539 3.621 4.206 6.229 5.371 3.352 1.497 6.879 2.013 10.532 1.868 4.829-0.191 9.256-1.752 13.531-3.861 0.668-0.33 1.331-0.671 1.997-1.004 0.184-0.092 0.374-0.172 0.644-0.295 0 0.318 0 0.548 0 0.778 0 3.985-0.008 7.969 0.011 11.954 0.002 0.47-0.132 0.709-0.566 0.911-5.329 2.487-10.902 3.954-16.794 4.255-4.831 0.247-9.489-0.409-13.88-2.461-6.848-3.201-11.624-8.311-13.585-15.697-2.89-10.885 1.409-23.494 13.815-28.952 0.206-0.091 0.42-0.163 0.673-0.201-2.549 2.79-3.7 6.149-4.253 9.84 7.489 0 14.89 0 22.367 0 0-0.389 0.036-0.749-0.006-1.099-0.178-1.456-0.27-2.934-0.592-4.358-0.931-4.115-3.56-6.582-7.654-7.478-3.562-0.78-7.126-0.593-10.644 0.252-8.642 2.075-15.514 6.803-20.709 13.995-0.258 0.357-0.49 0.731-0.735 1.097-0.047-0.014-0.094-0.028-0.141-0.041 0.121-0.78 0.22-1.564 0.365-2.339 1.101-5.872 3.411-11.181 7.371-15.71 3.93-4.494 8.775-7.555 14.584-8.928 7.073-1.672 13.991-1.091 20.551 2.144 7.579 3.739 12.387 9.819 14.642 17.935 0.768 2.763 1.141 5.587 1.131 8.459-0.008 2.408-0.002 4.816-0.002 7.223 0 0.23 0 0.461 0 0.774-13.427 0-26.797 0-40.242 0z"></path>
<path fill="#fff" d="M27.374 24.467c0.31-0.182 0.635-0.345 0.965-0.487l0.037-0.015c0.001-0 0.002-0.001 0.003-0.001 0.592-0.25 1.213-0.433 1.844-0.543 0.494-0.086 0.996-0.129 1.495-0.129 1.855 0 3.592 0.591 5.017 1.609-0.35-0.579-0.742-1.141-1.175-1.683-1.129-1.413-2.516-2.664-4.12-3.719-1.083-0.712-2.262-1.331-3.504-1.839-2.715-1.114-5.743-1.703-8.759-1.703-3.885 0-7.654 1.106-10.901 3.198-3.086 1.989-5.566 4.773-7.177 8.055-0.245 1.575-0.369 3.188-0.369 4.798 0 8.102 3.099 15.769 8.727 21.59 5.666 5.863 13.196 9.2 21.301 9.464-0.709-0.233-1.407-0.505-2.093-0.816-2.617-1.183-4.931-2.862-6.878-4.99-0.053-0.056-0.109-0.12-0.166-0.183-3.452-3.863-5.354-8.848-5.354-14.035 0-6.244 2.746-12.13 7.533-16.148 1.109-0.929 2.311-1.744 3.576-2.423z"></path>
<path fill="#fff" d="M62.724 28.806c0.085-0.731 0.129-1.499 0.129-2.285 0-0.728-0.048-1.455-0.142-2.162-0.194-1.445-0.74-3.421-1.391-5.034-1.995-4.943-5.351-9.205-9.707-12.326-5.929-4.249-11.855-6.062-19.813-6.062-13.874 0-25.737 8.96-29.688 21.849 1.488-1.908 3.295-3.562 5.352-4.888 3.489-2.248 7.538-3.437 11.711-3.437 3.209 0 6.434 0.628 9.327 1.815 1.33 0.545 2.595 1.209 3.759 1.973 1.736 1.141 3.24 2.499 4.468 4.035 1.923 2.408 3.107 5.161 3.52 8.182 0.091 0.507 0.137 1.025 0.139 1.539v0.028c0 1.95-0.623 3.794-1.801 5.334-0.247 0.323-0.521 0.634-0.814 0.922-0.014 0.051-0.032 0.165-0.032 0.424 0 0.411 0.18 0.794 0.497 1.058 0.131 0.077 0.265 0.151 0.399 0.221l0.024 0.013c0.017 0.010 0.033 0.019 0.050 0.027l0.035 0.017c2.312 1.216 4.927 1.833 7.773 1.833 4.039 0 7.64-1.020 10.414-2.948 3.289-2.287 5.293-5.789 5.793-10.128z"></path>
<path fill="#fff" d="M57.865 48.926l0.112-0.174c0.023-0.036 0.046-0.071 0.069-0.107 0.011-0.033 0.017-0.068 0.017-0.102 0-0.112-0.058-0.213-0.156-0.271-0.065-0.039-0.14-0.052-0.211-0.040-0.066 0.037-0.133 0.074-0.199 0.109l-0.024 0.013c-0.017 0.010-0.034 0.019-0.051 0.028-3.483 1.886-7.44 2.883-11.446 2.883-4.047 0-8.008-0.864-11.454-2.499-3.369-1.598-6.205-3.906-8.2-6.675-2.063-2.862-3.19-6.176-3.261-9.585-0.009-0.153-0.013-0.309-0.013-0.475 0-0.243 0.010-0.482 0.029-0.712l0.002-0.024c0.061-0.736 0.214-1.452 0.449-2.134-3.683 3.663-5.767 8.634-5.767 13.876 0 4.818 1.767 9.449 4.974 13.039 0.050 0.056 0.098 0.11 0.148 0.164 3.675 4.016 8.888 6.334 14.317 6.371 6.007-1.052 11.532-3.838 15.98-8.059 1.778-1.686 3.353-3.579 4.685-5.627z"></path>
</svg>

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

Before After
Before After

View file

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 190.24 81.52"><defs><linearGradient id="a" y1="40.76" x2="190.24" y2="40.76" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#90cea1"/><stop offset=".56" stop-color="#3cbec9"/><stop offset="1" stop-color="#00b3e5"/></linearGradient></defs><g data-name="Layer 2"><path d="M105.67 36.06h66.9a17.67 17.67 0 0017.67-17.66A17.67 17.67 0 00172.57.73h-66.9A17.67 17.67 0 0088 18.4a17.67 17.67 0 0017.67 17.66zm-88 45h76.9a17.67 17.67 0 0017.67-17.66 17.67 17.67 0 00-17.67-17.67h-76.9A17.67 17.67 0 000 63.4a17.67 17.67 0 0017.67 17.66zm-7.26-45.64h7.8V6.92h10.1V0h-28v6.9h10.1zm28.1 0h7.8V8.25h.1l9 27.15h6l9.3-27.15h.1V35.4h7.8V0H66.76l-8.2 23.1h-.1L50.31 0h-11.8zm113.92 20.25a15.07 15.07 0 00-4.52-5.52 18.57 18.57 0 00-6.68-3.08 33.54 33.54 0 00-8.07-1h-11.7v35.4h12.75a24.58 24.58 0 007.55-1.15 19.34 19.34 0 006.35-3.32 16.27 16.27 0 004.37-5.5 16.91 16.91 0 001.63-7.58 18.5 18.5 0 00-1.68-8.25zM145 68.6a8.8 8.8 0 01-2.64 3.4 10.7 10.7 0 01-4 1.82 21.57 21.57 0 01-5 .55h-4.05v-21h4.6a17 17 0 014.67.63 11.66 11.66 0 013.88 1.87A9.14 9.14 0 01145 59a9.87 9.87 0 011 4.52 11.89 11.89 0 01-1 5.08zm44.63-.13a8 8 0 00-1.58-2.62 8.38 8.38 0 00-2.42-1.85 10.31 10.31 0 00-3.17-1v-.1a9.22 9.22 0 004.42-2.82 7.43 7.43 0 001.68-5 8.42 8.42 0 00-1.15-4.65 8.09 8.09 0 00-3-2.72 12.56 12.56 0 00-4.18-1.3 32.84 32.84 0 00-4.62-.33h-13.2v35.4h14.5a22.41 22.41 0 004.72-.5 13.53 13.53 0 004.28-1.65 9.42 9.42 0 003.1-3 8.52 8.52 0 001.2-4.68 9.39 9.39 0 00-.55-3.18zm-19.42-15.75h5.3a10 10 0 011.85.18 6.18 6.18 0 011.7.57 3.39 3.39 0 011.22 1.13 3.22 3.22 0 01.48 1.82 3.63 3.63 0 01-.43 1.8 3.4 3.4 0 01-1.12 1.2 4.92 4.92 0 01-1.58.65 7.51 7.51 0 01-1.77.2h-5.65zm11.72 20a3.9 3.9 0 01-1.22 1.3 4.64 4.64 0 01-1.68.7 8.18 8.18 0 01-1.82.2h-7v-8h5.9a15.35 15.35 0 012 .15 8.47 8.47 0 012.05.55 4 4 0 011.57 1.18 3.11 3.11 0 01.63 2 3.71 3.71 0 01-.43 1.92z" fill="url(#a)" data-name="Layer 1"/></g></svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

View file

@ -0,0 +1 @@
<svg width="48" height="48" fill="none" xmlns="http://www.w3.org/2000/svg"><rect y="8" width="48" height="32" rx="2" fill="#333"/><path d="M5.708 12.19c-.375-.065-.75-.128-1.125-.19h-.509s-.269.139-.373.178c-1.334.496-1.835 1.26-1.671 2.693.724 6.411 1.453 12.822 2.201 19.238.214 1.845 1.126 2.564 2.98 2.36a92.817 92.817 0 003.233-.427c.427-.062.853-.123 1.28-.182 2.169-.3 4.337-.603 6.505-.905 2.168-.303 4.336-.605 6.505-.905.917-.13 1.552-.64 1.75-1.503.022-.093.047-.19.072-.287.172-.667.365-1.418-.275-1.919-3.327-2.588-3.332-7.64-.024-10.234.168-.129.347-.382.351-.58.03-.918.04-1.84-.02-2.757-.074-1.12-.743-1.81-1.874-1.964-2.444-.33-4.887-.657-7.331-.983-3.055-.409-6.11-.817-9.165-1.233-.842-.116-1.676-.259-2.51-.4zm17.102 5.026c.73 0 1.334.585 1.344 1.31.01.708-.59 1.333-1.309 1.363a1.341 1.341 0 01-1.363-1.29 1.306 1.306 0 011.328-1.383zM7.628 24.148H6.309v-.997h.258v.705h.268v-.62h.257v.62h.278v-.714h.258v1.006zm-.53.61h.53v-.288H6.309v.288h.52v.535h-.52v.288h1.319v-.288h-.53v-.535zm.53 1.448H6.577v-.402h-.268v1.091h.268v-.402h1.05v-.287z" fill="#227D3A"/><path d="M32.023 20.36v-3.545h2.613v13.298c-.64-.024-1.281-.04-1.92-.055-1.499-.037-2.992-.074-4.476-.213-1.26-.119-2.127-1.016-2.717-2.122-1.156-2.177-.704-5.047 1.175-6.476.664-.5 1.611-.718 2.469-.852.62-.1 1.258-.078 1.931-.056.3.01.608.02.925.02zm-.045 2.087c-.24 0-.473-.003-.7-.006a21.007 21.007 0 00-1.377.011c-1.324.075-2.142.962-2.261 2.395-.13 1.517.58 2.752 1.84 2.985.558.103 1.136.116 1.718.129.26.005.52.011.78.025v-5.539zm13.879 4.012c-.56 2.062-1.87 3.351-4.026 3.495-1.295.086-2.6.065-3.917.044a104.6 104.6 0 00-1.776-.019v-13.14h2.633v3.516l.858-.001a193.42 193.42 0 011.582 0c2.727.026 4.086 1.126 4.705 3.789l.002.005c.016.08.21 1.017-.061 2.31zm-7.026 1.507c.343-.025.693-.016 1.04-.008 1.166.03 2.293.058 2.981-1.207.6-1.1.65-2.355-.084-3.401-.717-1.016-1.725-.969-2.746-.92-.399.018-.8.037-1.186-.008-.005 1.885-.005 3.665-.005 5.544zM12.04 20.522c-.436-.002-.88-.004-1.333-.004 0-1.06-.015-2.94-.015-2.94v-.595s-1.87-.03-2.712-.03v3.417l-1.626.015s-.065 1.551-.065 2.236h1.726v2.25c-.003.894-.005 1.788.015 2.683.024 1.166.738 2.286 1.71 2.455.752.13 1.518.165 2.291.201.344.016.69.032 1.036.057V28.11c-.137 0-.27.001-.398.003-.29.003-.56.005-.831-.008-.556-.025-1.042-.303-1.066-.853a71.029 71.029 0 01-.027-3.284c.003-.45.007-.904.007-1.362.269 0 .53.002.787.004.6.005 1.174.01 1.746-.014.481-.02.704.174.873.61.64 1.666 1.304 3.327 1.983 4.978.072.174.135.363.2.554.187.556.38 1.126.767 1.37.436.272 1.11.192 1.745.117.152-.018.303-.035.447-.048.273-.024.654-.262.758-.5a625.204 625.204 0 003.207-7.381l.468-1.088a2.38 2.38 0 00.128-.43c.019-.08.04-.168.065-.264-.244 0-.478.002-.704.005-.502.006-.965.012-1.423-.015-.476-.025-.719.148-.888.59a178.161 178.161 0 01-1.542 3.872c-.172.43-.358.853-.559 1.312-.105.24-.214.49-.328.756l-.135-.308a9.371 9.371 0 01-.163-.381c-.18-.486-.364-.972-.546-1.458a215.63 215.63 0 01-1.368-3.704c-.178-.5-.426-.694-.971-.68-1.072.029-2.144.024-3.258.02z" fill="#fff"/></svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

View file

@ -24,17 +24,13 @@
</div>
<div id="currentActivity">
% if PLEX_SERVER_UP:
<div class="text-muted" id="dashboard-checking-activity"><i class="fa fa-refresh fa-spin"></i> Checking for activity...</div>
<div class="text-muted" id="dashboard-checking-activity"><i class="fa fa-refresh fa-spin"></i>&nbsp; Checking for activity...</div>
% elif config['pms_is_cloud']:
<div id="dashboard-no-activity" class="text-muted">Plex Cloud server is sleeping.</div>
% elif not config['first_run_complete']:
<div id="dashboard-no-activity" class="text-muted">The Tautulli setup wizard has not been completed. Please click <a href="welcome">here</a> to go to the setup wizard.</div>
% else:
<div id="dashboard-no-activity" class="text-muted">There was an error communicating with your Plex Server.
% if _session['user_group'] == 'admin':
Check the <a href="logs">logs</a> and verify your server connection in the <a href="settings#tab_tabs-plex_media_server">settings</a>.
% endif
</div>
<div class="text-muted" id="dashboard-checking-activity"><i class="fa fa-refresh fa-spin"></i>&nbsp; Tautulli is connecting to the Plex server...</div>
% endif
</div>
</div>
@ -46,10 +42,10 @@
<h3 class="pull-left">Watch Statistics</h3>
<div class="button-bar">
<div class="btn-group pull-left" data-toggle="buttons" id="watch-stats-toggles" style="margin-right: 3px">
<label class="btn btn-dark">
<label class="btn btn-dark btn-filter">
<input type="radio" class="watched-stats-toggle" name="watched-stats-type" id="watched-stats-plays" value="plays" autocomplete="off"> Play Count
</label>
<label class="btn btn-dark">
<label class="btn btn-dark btn-filter">
<input type="radio" class="watched-stats-toggle" name="watched-stats-type" id="watched-stats-duration" value="duration" autocomplete="off"> Play Duration
</label>
</div>
@ -65,7 +61,7 @@
<div class="row">
<div class="col-md-12">
<div id="home-stats" class="home-platforms">
<div class="text-muted"><i class="fa fa-refresh fa-spin"></i> Loading stats...</div>
<div class="text-muted"><i class="fa fa-refresh fa-spin"></i>&nbsp; Loading stats...</div>
<br>
</div>
</div>
@ -84,7 +80,7 @@
<div class="row">
<div class="col-md-12">
<div id="library-stats" class="library-platforms">
<div class="text-muted"><i class="fa fa-refresh fa-spin"></i> Loading stats...</div>
<div class="text-muted"><i class="fa fa-refresh fa-spin"></i>&nbsp; Loading stats...</div>
<br>
</div>
</div>
@ -96,27 +92,27 @@
<h3 class="pull-left"><span id="recently-added-xml">Recently Added</span></h3>
<ul class="nav nav-header nav-dashboard pull-right" style="margin-top: -3px;">
<li>
<a href="#" id="recently-added-page-left" class="paginate btn-gray disabled" data-id="+1"><i class="fa fa-lg fa-chevron-left"></i></a>
<a href="#" id="recently-added-page-left" class="paginate-added btn-gray disabled" data-id="-1"><i class="fa fa-lg fa-chevron-left"></i></a>
</li>
<li>
<a href="#" id="recently-added-page-right" class="paginate btn-gray disabled" data-id="-1"><i class="fa fa-lg fa-chevron-right"></i></a>
<a href="#" id="recently-added-page-right" class="paginate-added btn-gray disabled" data-id="+1"><i class="fa fa-lg fa-chevron-right"></i></a>
</li>
</ul>
<div class="button-bar">
<div class="btn-group pull-left" data-toggle="buttons" id="recently-added-toggles" style="margin-right: 3px">
<label class="btn btn-dark" id="recently-added-label-all">
<label class="btn btn-dark btn-filter" id="recently-added-label-all">
<input type="radio" name="recently-added-toggle" id="recently-added-toggle-all" value="all" autocomplete="off"> All
</label>
<label class="btn btn-dark" id="recently-added-label-movies">
<label class="btn btn-dark btn-filter" id="recently-added-label-movies">
<input type="radio" name="recently-added-toggle" id="recently-added-toggle-movie" value="movie" autocomplete="off"> Movies
</label>
<label class="btn btn-dark" id="recently-added-label-tv">
<label class="btn btn-dark btn-filter" id="recently-added-label-tv">
<input type="radio" name="recently-added-toggle" id="recently-added-toggle-show" value="show" autocomplete="off"> TV Shows
</label>
<label class="btn btn-dark" id="recently-added-label-music">
<label class="btn btn-dark btn-filter" id="recently-added-label-music">
<input type="radio" name="recently-added-toggle" id="recently-added-toggle-artist" value="artist" autocomplete="off"> Music
</label>
<label class="btn btn-dark" id="recently-added-label-other_video">
<label class="btn btn-dark btn-filter" id="recently-added-label-other_video">
<input type="radio" name="recently-added-toggle" id="recently-added-toggle-other_video" value="other_video" autocomplete="off"> Videos
</label>
</div>
@ -132,17 +128,12 @@
<div class="col-md-12">
<div id="recentlyAdded" style="margin-right: -15px;">
% if PLEX_SERVER_UP:
<div class="text-muted"><i class="fa fa-refresh fa-spin"></i> Looking for new items...</div>
<div id="dashboard-checking-recently-added" class="text-muted"><i class="fa fa-refresh fa-spin"></i>&nbsp; Looking for new items...</div>
% elif config['pms_is_cloud']:
<div class="text-muted">Plex Cloud server is sleeping.</div>
% else:
<div class="text-muted">There was an error communicating with your Plex Server.
% if _session['user_group'] == 'admin':
Check the <a href="logs">logs</a> and verify your server connection in the <a href="settings#tab_tabs-plex_media_server">settings</a>.
% endif
</div>
<div id="dashboard-no-recently-added" class="text-muted"><i class="fa fa-refresh fa-spin"></i>&nbsp; Tautulli is connecting to your Plex server...</div>
% endif
<br>
</div>
</div>
</div>
@ -179,10 +170,10 @@
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true"><i class="fa fa-remove"></i></button>
<h4 class="modal-title">Terminate Session</h4>
<h4 class="modal-title">Terminate Stream</h4>
</div>
<div class="modal-body" style="text-align: center;">
<p>Are you sure you want to terminate this session?</p>
<p>Are you sure you want to terminate this stream?</p>
<p>
<strong>
<span id="terminate-user"></span><br />
@ -229,8 +220,6 @@
</%def>
<%def name="javascriptIncludes()">
<% from plexpy import PLEX_SERVER_UP %>
<script src="${http_root}js/moment-with-locale.js"></script>
<script src="${http_root}js/jquery.scrollbar.min.js"></script>
<script src="${http_root}js/jquery.mousewheel.min.js"></script>
<script>
@ -260,8 +249,43 @@
}
});
}
% if _session['user_group'] == 'admin':
var msg_settings = ' Check the <a href="logs">logs</a> and verify your server connection in the <a href="settings#tab_tabs-plex_media_server">settings</a>.';
% else:
var msg_settings = '';
% endif
var error_msg = 'There was an error communicating with your Plex Server.' + msg_settings;
% if 'current_activity' in config['home_sections'] or 'recently_added' in config['home_sections']:
var server_status;
server_status = setInterval(function() {
$.getJSON('server_status', function (data) {
if (data.connected === true) {
clearInterval(server_status);
% if 'current_activity' in config['home_sections']:
$('#currentActivity').html('<div id="dashboard-checking-activity" class="text-muted"><i class="fa fa-refresh fa-spin"></i>&nbsp; Checking for activity...</div>');
activityConnected();
% endif
% if 'recently_added' in config['home_sections']:
$('#recentlyAdded').html('<div id="dashboard-checking-recently-added" class="text-muted"><i class="fa fa-refresh fa-spin"></i>&nbsp; Looking for new items...</div>');
recentlyAddedConnected();
% endif
} else if (data.connected === false) {
clearInterval(server_status);
% if 'current_activity' in config['home_sections']:
$('#currentActivity').html('<div id="dashboard-no-activity" class="text-muted">' + error_msg + '</div>');
% endif
% if 'recently_added' in config['home_sections']:
$('#recentlyAdded').html('<div id="dashboard-no-recently-added" class="text-muted">' + error_msg + '</div>');
% endif
}
});
}, 1000);
% endif
</script>
% if 'current_activity' in config['home_sections'] and PLEX_SERVER_UP:
% if 'current_activity' in config['home_sections']:
<script>
var defaultHandler = {
get: function(target, name) {
@ -272,7 +296,9 @@
var create_instances = [];
var activity_ready = true;
$('#currentActivityHeader-bandwidth-tooltip').tooltip({ container: 'body', placement: 'right', delay: 50 });
$('#currentActivityHeader-bandwidth-tooltip').tooltip({ container: 'body', placement: 'right', delay: 50 });
var title = document.title;
function getCurrentActivity() {
activity_ready = false;
@ -298,13 +324,8 @@
}
if (!(current_activity)) {
% if _session['user_group'] == 'admin':
var msg_settings = ' Check the <a href="logs">logs</a> and verify your server connection in the <a href="settings#tab_tabs-plex_media_server">settings</a>.';
% else:
var msg_settings = '';
% endif
$('#currentActivityHeader').hide();
$('#currentActivity').html('<div id="dashboard-no-activity" class="text-muted">There was an error communicating with your Plex Server.' + msg_settings + '</div>');
$('#currentActivity').html('<div id="dashboard-no-activity" class="text-muted">' + error_msg + '</div>');
return
}
@ -349,6 +370,8 @@
$('#currentActivityHeader').show();
document.title = stream_count + ' stream' + (stream_count > 1 ? 's' : '') + ' | ' + title;
sessions.forEach(function (session) {
var s = (typeof Proxy === "function") ? new Proxy(session, defaultHandler) : session;
var key = s.session_key;
@ -377,6 +400,9 @@
case 'buffering':
state_icon = '<i class="fa fa-fw fa-spinner"></i>&nbsp;';
break;
case 'error':
state_icon = '<i class="fa fa-fw fa-exclamation-triangle"></i>&nbsp;';
break;
default:
state_icon = '<i class="fa fa-fw fa-question-circle"></i>&nbsp;';
}
@ -431,7 +457,7 @@
var transcode_container = '';
if (s.stream_container_decision === 'transcode') {
transcode_container = 'Transcode (' + s.container.toUpperCase() + ' <i class="fa fa-long-arrow-right"></i> ' + s.stream_container.toUpperCase() + ')';
transcode_container = 'Converting (' + s.container.toUpperCase() + ' <i class="fa fa-long-arrow-right"></i> ' + s.stream_container.toUpperCase() + ')';
} else {
transcode_container = 'Direct Play (' + s.stream_container.toUpperCase() + ')';
}
@ -439,8 +465,8 @@
var video_decision = '';
if (['movie', 'episode', 'clip'].indexOf(s.media_type) > -1 && s.stream_video_decision) {
var v_bd = (s.video_dynamic_range === 'HDR') ? ' ' + s.video_dynamic_range : '';
var sv_bd = (s.video_dynamic_range === 'HDR') ? ' ' + s.stream_video_dynamic_range : '';
var v_bd = (s.video_dynamic_range !== 'SDR') ? ' ' + s.video_dynamic_range : '';
var sv_bd = (s.stream_video_dynamic_range !== 'SDR' || v_bd) ? ' ' + s.stream_video_dynamic_range : '';
var v_res= '';
switch (s.video_resolution.toLowerCase()) {
case 'sd':
@ -479,14 +505,15 @@
var audio_decision = '';
if (['movie', 'episode', 'clip', 'track'].indexOf(s.media_type) > -1 && s.stream_audio_decision) {
var audio_language = (s.media_type !== 'track') ? (s.audio_language || 'Unknown') + ' - ' : '';
var a_codec = (s.audio_codec === 'truehd') ? 'TrueHD' : s.audio_codec.toUpperCase();
var sa_codec = (s.stream_audio_codec === 'truehd') ? 'TrueHD' : s.stream_audio_codec.toUpperCase();
if (s.stream_audio_decision === 'transcode') {
audio_decision = 'Transcode (' + a_codec + ' ' + capitalizeFirstLetter(s.audio_channel_layout.split('(')[0]) + ' <i class="fa fa-long-arrow-right"></i> ' + sa_codec + ' ' + capitalizeFirstLetter(s.stream_audio_channel_layout.split('(')[0]) + ')';
audio_decision = 'Transcode (' + audio_language + a_codec + ' ' + capitalizeFirstLetter(s.audio_channel_layout.split('(')[0]) + ' <i class="fa fa-long-arrow-right"></i> ' + sa_codec + ' ' + capitalizeFirstLetter(s.stream_audio_channel_layout.split('(')[0]) + ')';
} else if (s.stream_audio_decision === 'copy') {
audio_decision = 'Direct Stream (' + sa_codec + ' ' + capitalizeFirstLetter(s.stream_audio_channel_layout.split('(')[0]) + ')';
audio_decision = 'Direct Stream (' + audio_language + sa_codec + ' ' + capitalizeFirstLetter(s.stream_audio_channel_layout.split('(')[0]) + ')';
} else {
audio_decision = 'Direct Play (' + sa_codec + ' ' + capitalizeFirstLetter(s.stream_audio_channel_layout.split('(')[0]) + ')';
audio_decision = 'Direct Play (' + audio_language + sa_codec + ' ' + capitalizeFirstLetter(s.stream_audio_channel_layout.split('(')[0]) + ')';
}
}
$('#audio_decision-' + key).html(audio_decision);
@ -495,13 +522,13 @@
if (['movie', 'episode', 'clip'].indexOf(s.media_type) > -1 && s.subtitles === 1) {
var subtitle_codec = (s.stream_subtitle_codec && s.stream_subtitle_transient) ? 'None' : s.subtitle_codec.toUpperCase();
if (s.stream_subtitle_decision === 'transcode') {
subtitle_decision = 'Transcode (' + subtitle_codec + ' <i class="fa fa-long-arrow-right"></i> ' + s.stream_subtitle_codec.toUpperCase() + ')';
subtitle_decision = 'Transcode ('+ (s.subtitle_language || 'Unknown')+ ' - ' + subtitle_codec + ' <i class="fa fa-long-arrow-right"></i> ' + s.stream_subtitle_codec.toUpperCase() + ')';
} else if (s.stream_subtitle_decision === 'copy') {
subtitle_decision = 'Direct Stream (' + subtitle_codec + ')';
subtitle_decision = 'Direct Stream ('+ (s.subtitle_language || 'Unknown')+ ' - ' + subtitle_codec + ')';
} else if (s.stream_subtitle_decision === 'burn') {
subtitle_decision = 'Burn (' + subtitle_codec + ')';
subtitle_decision = 'Burn ('+ (s.subtitle_language || 'Unknown')+ ' - ' + subtitle_codec + ')';
} else {
subtitle_decision = 'Direct Play (' + ((s.synced_version === '1') ? subtitle_codec : s.stream_subtitle_codec.toUpperCase()) + ')';
subtitle_decision = 'Direct Play ('+ (s.subtitle_language || 'Unknown')+ ' - ' + ((s.synced_version === '1') ? subtitle_codec : s.stream_subtitle_codec.toUpperCase()) + ')';
}
}
$('#subtitle_decision-' + key).html(subtitle_decision);
@ -539,15 +566,18 @@
// Update the stream progress times
$('#stream-eta-' + key).html(moment().add(parseInt(s.duration) - parseInt(s.view_offset), 'milliseconds').format(time_format));
$('#stream-duration-' + key).html(millisecondsToMinutes(parseInt(s.stream_duration), false));
var stream_view_offset = $('#stream-view-offset-' + key);
stream_view_offset.data('state', s.state);
if (stream_view_offset.data('last_view_offset') !== s.view_offset) {
stream_view_offset.data('last_view_offset', s.view_offset).data('view_offset', s.view_offset);
}
// Update the progress bars, percent - 3 because of 3px padding-right
$('#buffer-bar-' + key).width(parseInt(s.transcode_progress) - 3 + '%').html(s.transcode_progress + '%')
.attr('data-original-title', 'Transcoder Progress ' + s.transcode_progress + '%');
// Update the progress bars
var duration = parseInt(s.duration);
var transcode_progress = duration ? Math.round(s.transcode_max_offset_available * 1000 / duration * 100) : s.transcode_progress;
$('#buffer-bar-' + key).css({width: parseInt(transcode_progress) + '%'}).html(transcode_progress + '%')
.attr('data-original-title', 'Transcoder Progress ' + transcode_progress + '%');
if (s.live !== 1) {
var progress_bar = $('#progress-bar-' + key);
progress_bar.data('state', s.state);
@ -574,6 +604,8 @@
} else {
$('#currentActivityHeader').hide();
$('#currentActivity').html('<div id="dashboard-no-activity" class="text-muted">Nothing is currently being played.</div>');
document.title = title;
}
activity_ready = true;
@ -603,6 +635,7 @@
$('#activity-instance-' + session_key + ' [data-toggle=tooltip]').tooltip({ container: 'body', placement: 'right', delay: 50 });
$('#activity-instance-' + session_key + ' [data-toggle=popover]').popover({
html: true,
sanitize: false,
container: 'body',
trigger: 'hover',
placement: 'right',
@ -623,38 +656,43 @@
});
}
getCurrentActivity();
setInterval(function () {
if (!(create_instances.length) && activity_ready) {
getCurrentActivity();
}
}, ${config['home_refresh_interval'] * 1000});
function activityConnected() {
getCurrentActivity();
setInterval(function () {
if (!(create_instances.length) && activity_ready) {
getCurrentActivity();
}
}, ${config['home_refresh_interval'] * 1000});
setInterval(function(){
$('.progress_time_offset').each(function () {
if ($(this).data('state') === 'playing' && $(this).data('view_offset') >= 0) {
var view_offset = parseInt($(this).data('view_offset'));
var stream_duration = parseInt($(this).data('stream_duration'));
var timestamp = millisecondsToMinutes(Math.min(view_offset, stream_duration), false);
$(this).html(timestamp).data('view_offset', Math.min(view_offset + 1000, stream_duration))
}
});
$('.progress-bar').each(function () {
if ($(this).data('state') === 'playing' && $(this).data('view_offset') >= 0) {
var view_offset = parseInt($(this).data('view_offset'));
var stream_duration = parseInt($(this).data('stream_duration'));
var progress_percent = Math.floor(view_offset / stream_duration * 100);
progress_percent = (progress_percent >= 0) ? Math.min(progress_percent, 100) : 100;
$(this).width(progress_percent - 3 + '%').html(progress_percent + '%')
.attr('data-original-title', 'Stream Progress ' + progress_percent + '%')
.data('view_offset', Math.min(view_offset + 1000, stream_duration));
}
});
}, 1000);
setInterval(function(){
$('.progress_time_offset').each(function () {
if ($(this).data('state') === 'playing' && $(this).data('view_offset') >= 0) {
var view_offset = parseInt($(this).data('view_offset'));
var stream_duration = parseInt($(this).data('stream_duration'));
var timestamp = millisecondsToMinutes(Math.min(view_offset, stream_duration), false);
$(this).html(timestamp).data('view_offset', Math.min(view_offset + 1000, stream_duration))
}
});
$('.progress-bar').each(function () {
if ($(this).data('state') === 'playing' && $(this).data('view_offset') >= 0) {
var view_offset = parseInt($(this).data('view_offset'));
var stream_duration = parseInt($(this).data('stream_duration'));
var progress_percent = Math.floor(view_offset / stream_duration * 100);
progress_percent = (progress_percent >= 0) ? Math.min(progress_percent, 100) : 100;
$(this).css({width: progress_percent + '%'}).html(progress_percent + '%')
.attr('data-original-title', 'Stream Progress ' + progress_percent + '%')
.data('view_offset', Math.min(view_offset + 1000, stream_duration));
}
});
}, 1000);
}
$('#currentActivity').on('click', '.external_ip-modal', function () {
$.get('get_ip_address_details', {
ip_address: $(this).data('ip')
ip_address: $(this).data('ip'),
location: $(this).data('location'),
secure: $(this).data('secure'),
relayed: $(this).data('relayed')
}).then(function (jqXHR) {
$("#ip-info-modal").html(jqXHR);
});
@ -731,16 +769,21 @@
<script>
function statsCardCallback() {
$('.dashboard-stats-instance .dashboard-stats-info-scroller').scrollbar();
loadAllBlurHash();
function changeImages(elem) {
var stat_id = $(elem).data('stat_id');
var art = $(elem).data('art');
var thumb = $(elem).data('thumb');
var user_id = $(elem).data('user_id');
var library_type = $(elem).data('library-type');
var user_thumb = $(elem).data('user_thumb');
var rating_key = $(elem).data('rating_key');
var grandparent_rating_key = $(elem).data('grandparent_rating_key');
var guid = $(elem).data('guid');
var live = $(elem).data('live');
var library_art = $(elem).data('library_art');
var library_thumb = $(elem).data('library_thumb');
var [height, fallback_poster, fallback_art] = [450, 'poster', 'art'];
if ($.inArray(stat_id, ['top_music', 'popular_music']) > -1) {
[height, fallback_poster, fallback_art] = [300, 'cover', 'art'];
@ -751,12 +794,23 @@
if (stat_id === 'most_concurrent') {
return
} else if (stat_id === 'top_libraries') {
$('#stats-background-' + stat_id).css('background-image', 'url(' + page('pms_image_proxy', art || library_art, null, 500, 280, 40, '282828', 3, fallback_art) + ')');
$('#stats-thumb-' + stat_id).removeClass(function (index, className) {
return (className.match (/(^|\s)svg-icon library-\S+/g) || []).join(' ')});
if (library_thumb.startsWith('http')) {
$('#stats-thumb-' + stat_id).css('background-image', 'url(' + page('pms_image_proxy', library_thumb, null, 100, 100, null, null, null, 'cover') + ')');
} else {
$('#stats-thumb-' + stat_id).css('background-image', '')
.addClass('svg-icon library-' + library_type);
}
} else if (stat_id === 'top_users') {
$('#stats-thumb-' + stat_id).css('background-image', 'url(' + (user_thumb || 'images/gravatar-default.png') + ')');
loadBlurHash($('#stats-background-' + stat_id), page('pms_image_proxy', user_thumb || 'interfaces/default/images/gravatar-default.png', null, 100, 100, 40, '282828', 0, 'user'));
$('#stats-thumb-' + stat_id).css('background-image', 'url(' + page('pms_image_proxy', user_thumb || 'interfaces/default/images/gravatar-default.png', null, 100, 100, null, null, null, 'user') + ')');
if (user_id) {
href = page('user', user_id);
}
$('#stats-thumb-url-' + stat_id).attr('href', href).prop('title', $(elem).data('friendly_name'));
$('#stats-thumb-url-' + stat_id).attr('href', href).prop('title', $(elem).data('user'));
} else if (stat_id === 'top_platforms') {
$('#stats-thumb-' + stat_id).removeClass(function (index, className) {
return (className.match (/(^|\s)platform-\S+/g) || []).join(' ');
@ -772,13 +826,14 @@
href = page('info', rating_key);
}
}
var img_rating_key = grandparent_rating_key || rating_key;
$('#stats-thumb-url-' + stat_id).attr('href', href).prop('title', $(elem).data('title'));
$('#stats-background-' + stat_id).css('background-image', 'url(' + page('pms_image_proxy', art, rating_key, 500, 280, 40, '282828', 3, fallback_art) + ')');
$('#stats-thumb-' + stat_id).css('background-image', 'url(' + page('pms_image_proxy', thumb, rating_key, 300, height, null, null, null, fallback_poster) + ')');
$('#stats-thumb-' + stat_id + '-bg').css('background-image', 'url(' + page('pms_image_proxy', thumb, rating_key, 300, height, 60, '282828', 3, fallback_poster) + ')');
$('#library-stats-background-' + stat_id).css('background-image', 'url(' + page('pms_image_proxy', art, rating_key, 500, 280, 40, '282828', 3, fallback_art) + ')');
$('#stats-background-' + stat_id).css('background-image', 'url(' + page('pms_image_proxy', art, img_rating_key, 500, 280, 40, '282828', 3, fallback_art) + ')');
$('#stats-thumb-' + stat_id).css('background-image', 'url(' + page('pms_image_proxy', thumb, img_rating_key, 300, height, null, null, null, fallback_poster) + ')');
$('#stats-thumb-' + stat_id + '-bg').css('background-image', 'url(' + page('pms_image_proxy', thumb, img_rating_key, 300, height, 60, '282828', 3, fallback_poster) + ')');
$('#library-stats-background-' + stat_id).css('background-image', 'url(' + page('pms_image_proxy', art || library_art, img_rating_key, 500, 280, 40, '282828', 3, library_art || fallback_art) + ')');
if (thumb.startsWith('http')) {
$('#library-stats-thumb-' + stat_id).css('background-image', 'url(' + page('pms_image_proxy', thumb, rating_key, 300, 300, null, null, null, 'cover') + ')')
$('#library-stats-thumb-' + stat_id).css('background-image', 'url(' + page('pms_image_proxy', thumb, img_rating_key, 300, 300, null, null, null, 'cover') + ')')
.removeClass('svg-icon library-' + stat_id);
} else {
$('#library-stats-thumb-' + stat_id).css('background-image', '')
@ -874,7 +929,7 @@
getLibraryStats();
</script>
% endif
% if 'recently_added' in config['home_sections'] and PLEX_SERVER_UP:
% if 'recently_added' in config['home_sections']:
<script>
function recentlyAdded(recently_added_count, recently_added_type) {
showMsg("Loading recently added items...", true, false, 0);
@ -887,10 +942,14 @@
count: recently_added_count,
media_type: recently_added_type
},
beforeSend: function () {
$(".dashboard-recent-media-row").animate({ scrollLeft: 0 }, 1000);
},
complete: function (xhr, status) {
$("#recentlyAdded").html(xhr.responseText);
$('#ajaxMsg').fadeOut();
highlightAddedScrollerButton();
highlightScrollerButton("#recently-added");
paginateScroller("#recently-added", ".paginate-added");
}
});
}
@ -902,59 +961,15 @@
$('#recently-added-toggle-' + recently_added_type).closest('label').addClass('active');
$('#recently-added-count').val(recently_added_count);
recentlyAdded(recently_added_count, recently_added_type);
function highlightAddedScrollerButton() {
var scroller = $("#recently-added-row-scroller");
var numElems = scroller.find("li:visible").length;
scroller.width(numElems * 175);
if (scroller.width() > $("body").find(".container-fluid").width()) {
$("#recently-added-page-right").removeClass("disabled");
} else {
$("#recently-added-page-right").addClass("disabled");
}
function recentlyAddedConnected() {
recentlyAdded(recently_added_count, recently_added_type);
}
$(window).resize(function () {
highlightAddedScrollerButton();
});
function resetScroller() {
leftTotal = 0;
$("#recently-added-row-scroller").animate({ left: leftTotal }, 1000);
$("#recently-added-page-left").addClass("disabled").blur();
}
var leftTotal = 0;
$(".paginate").click(function (e) {
e.preventDefault();
var scroller = $("#recently-added-row-scroller");
var containerWidth = $("body").find(".container-fluid").width();
var scrollAmount = $(this).data("id") * parseInt((containerWidth - 15) / 175) * 175;
var leftMax = Math.min(-parseInt(scroller.width()) + Math.abs(scrollAmount), 0);
leftTotal = Math.max(Math.min(leftTotal + scrollAmount, 0), leftMax);
scroller.animate({ left: leftTotal }, 250);
if (leftTotal === 0) {
$("#recently-added-page-left").addClass("disabled").blur();
} else {
$("#recently-added-page-left").removeClass("disabled");
}
if (leftTotal === leftMax) {
$("#recently-added-page-right").addClass("disabled").blur();
} else {
$("#recently-added-page-right").removeClass("disabled");
}
});
$('#recently-added-toggles').on('change', function () {
$('#recently-added-toggles > label').removeClass('active');
selected_filter = $('input[name=recently-added-toggle]:checked', '#recently-added-toggles');
$(selected_filter).closest('label').addClass('active');
recently_added_type = $(selected_filter).val();
resetScroller();
setLocalStorage('home_stats_recently_added_type', recently_added_type);
recentlyAdded(recently_added_count, recently_added_type);
});
@ -962,7 +977,6 @@
$('#recently-added-count').change(function () {
forceMinMax($(this));
recently_added_count = $(this).val();
resetScroller();
setLocalStorage('home_stats_recently_added_count', recently_added_count);
recentlyAdded(recently_added_count, recently_added_type);
});
@ -994,4 +1008,4 @@
});
</script>
% endif
</%def>
</%def>

File diff suppressed because it is too large Load diff

View file

@ -28,19 +28,91 @@ DOCUMENTATION :: END
% if data != None:
<%
from plexpy.helpers import page
from plexpy.helpers import cast_to_int, page, short_season
%>
% if data['children_count'] > 0:
<div class="item-children-wrapper">
<ul class="item-children-instance list-unstyled">
<% max_height ='max-height' if data['children_type'] in ('track', 'photo') or media_type == 'playlist' else '' %>
<ul class="item-children-instance ${max_height} list-unstyled">
% for child in data['children_list']:
% if child['rating_key']:
% if data['children_type'] == 'track':
% if data['children_type'] in ('track', 'photo') or media_type == 'playlist':
<li class="item-children-list-item">
% else:
<li>
% endif
% if data['children_type'] == 'movie':
% if media_type == 'playlist':
<% e = 'even' if loop.index % 2 == 0 else 'odd' %>
<div class="item-children-list-item-${e}">
<span class="item-children-list-item-index">${loop.index + 1}</span>
<span class="item-children-list-item-title">
% if child['media_type'] == 'movie':
<span class="media-type-tooltip" data-toggle="tooltip" title="Movie"><i class="fa fa-film fa-fw"></i></span>
<a href="${page('info', child['rating_key'])}" title="${child['title']}">
<span class="thumb-tooltip" data-toggle="popover" data-img="${page('pms_image_proxy', child['thumb'], child['rating_key'], 300, 450, fallback='poster')}" data-height="120" data-width="80">
${child['title']}
</span>
</a>
<span class="text-muted"> (${child['year']})</span>
% elif child['media_type'] == 'episode':
<span class="media-type-tooltip" data-toggle="tooltip" title="Episode"><i class="fa fa-television fa-fw"></i></span>
<a href="${page('info', child['grandparent_rating_key'])}" title="${child['grandparent_title']}">
<span class="thumb-tooltip" data-toggle="popover" data-img="${page('pms_image_proxy', child['grandparent_thumb'], child['grandparent_rating_key'], 300, 450, fallback='poster')}" data-height="120" data-width="80">
${child['grandparent_title']}
</span>
</a> -
<a href="${page('info', child['rating_key'])}" title="${child['title']}">
<span class="thumb-tooltip" data-toggle="popover" data-img="${page('pms_image_proxy', child['parent_thumb'], child['parent_rating_key'], 300, 450, fallback='poster')}" data-height="120" data-width="80">
${child['title']}
</span>
</a>
<span class="text-muted"> (<a class="no-highlight" href="${page('info', child['parent_rating_key'])}" title="${child['parent_title']}">${short_season(child['parent_title'])}</a> &middot; <a class="no-highlight" href="${page('info', child['rating_key'])}" title="${child['title']}">E${child['media_index']}</a>)</span>
% elif child['media_type'] == 'track':
<span class="media-type-tooltip" data-toggle="tooltip" title="Track"><i class="fa fa-music fa-fw"></i></span>
<a href="${page('info', child['rating_key'])}" title="${child['title']}">
<span class="thumb-tooltip" data-toggle="popover" data-img="${page('pms_image_proxy', child['parent_thumb'], child['parent_rating_key'], 300, 300, fallback='cover')}" data-height="80" data-width="80">
${child['title']}
</span>
</a> -
<a href="${page('info', child['grandparent_rating_key'])}" title="${child['grandparent_title']}">
<span class="thumb-tooltip" data-toggle="popover" data-img="${page('pms_image_proxy', child['grandparent_thumb'], child['grandparent_rating_key'], 300, 300, fallback='cover')}" data-height="80" data-width="80">
${child['grandparent_title']}
</span>
</a>
<span class="text-muted"> (<a class="no-highlight" href="${page('info', child['parent_rating_key'])}" title="${child['parent_title']}">${child['parent_title']}</a>)</span>
% elif child['media_type'] == 'photo':
<span class="media-type-tooltip" data-toggle="tooltip" title="Photo"><i class="fa fa-picture-o fa-fw"></i></span>
<a href="${page('info', child['rating_key'])}" title="${child['title']}">
<span class="thumb-tooltip" data-toggle="popover" data-img="${page('pms_image_proxy', child['thumb'], child['rating_key'], 300, 300, fallback='cover')}" data-height="80" data-width="80">
${child['title']}
</span>
</a>
% if child['grandparent_title']:
- <a href="${page('info', child['grandparent_rating_key'])}" title="${child['grandparent_title']}">
<span class="thumb-tooltip" data-toggle="popover" data-img="${page('pms_image_proxy', child['grandparent_thumb'], child['grandparent_rating_key'], 300, 300, fallback='cover')}" data-height="80" data-width="80">
${child['grandparent_title']}
</span>
</a>
% endif
<span class="text-muted"> (<a class="no-highlight" href="${page('info', child['parent_rating_key'])}" title="${child['parent_title']}">${child['parent_title']}</a>)</span>
% elif child['media_type'] == 'clip':
<span class="media-type-tooltip" data-toggle="tooltip" title="Video"><i class="fa fa-video-camera fa-fw"></i></span>
<a href="${page('info', child['rating_key'])}" title="${child['title']}">
<span class="thumb-tooltip" data-toggle="popover" data-img="${page('pms_image_proxy', child['thumb'], child['rating_key'], 300, 300, fallback='cover')}" data-height="80" data-width="80">
${child['title']}
</span>
</a>
<span class="text-muted"> (<a class="no-highlight" href="${page('info', child['parent_rating_key'])}" title="${child['parent_title']}">${child['parent_title']}</a>)</span>
% endif
</span>
% if child['duration']:
<span class="item-children-list-item-duration" id="item-children-list-item-duration-${loop.index + 1}">
<% f = 'h:mm:ss' if cast_to_int(child['duration']) >= 3600000 else 'm:ss' %>
<script>$('#item-children-list-item-duration-${loop.index + 1}').text(moment.utc(${child['duration']}).format("${f}"));</script>
</span>
% endif
</div>
% elif child['media_type'] == 'movie':
<a href="${page('info', child['rating_key'])}" title="${child['title']}">
<div class="item-children-poster">
<div class="item-children-poster-face poster-item" style="background-image: url(${page('pms_image_proxy', child['thumb'], child['rating_key'], 300, 450, fallback='poster')});"></div>
@ -55,7 +127,7 @@ DOCUMENTATION :: END
</h3>
<h3 class="text-muted">${child['year']}</h3>
</div>
% elif data['children_type'] == 'show':
% elif child['media_type'] == 'show':
<a href="${page('info', child['rating_key'])}" title="${child['title']}">
<div class="item-children-poster">
<div class="item-children-poster-face poster-item" style="background-image: url(${page('pms_image_proxy', child['thumb'], child['rating_key'], 300, 450, fallback='poster')});"></div>
@ -69,8 +141,8 @@ DOCUMENTATION :: END
<a href="${page('info', child['rating_key'])}" title="${child['title']}">${child['title']}</a>
</h3>
</div>
% elif data['children_type'] == 'season':
<a href="${page('info', child['rating_key'])}" title="Season ${child['media_index']}">
% elif child['media_type'] == 'season':
<a href="${page('info', child['rating_key'])}" title="${child['title']}">
<div class="item-children-poster">
% if child['thumb']:
<div class="item-children-poster-face poster-item" style="background-image: url(${page('pms_image_proxy', child['thumb'], child['rating_key'], 300, 450, fallback='poster')});">
@ -79,7 +151,7 @@ DOCUMENTATION :: END
% endif
<div class="item-children-card-overlay">
<div class="item-children-overlay-text">
Season ${child['media_index']}
${child['title']}
</div>
</div>
</div>
@ -88,7 +160,17 @@ DOCUMENTATION :: END
% endif
</div>
</a>
% elif data['children_type'] == 'episode':
<div class="item-children-instance-text-wrapper poster-item">
<h3>
<a href="${page('info', child['rating_key'])}" title="${child['title']}">${child['title']}</a>
</h3>
% if media_type == 'collection':
<h3 class="text-muted">
<a class="text-muted" href="${page('info', child['parent_rating_key'])}" title="${child['parent_title']}">${child['parent_title']}</a>
</h3>
% endif
</div>
% elif child['media_type'] == 'episode':
<a href="${page('info', child['rating_key'])}" title="Episode ${child['media_index']}">
<div class="item-children-poster">
<div class="item-children-poster-face episode-item" style="background-image: url(${page('pms_image_proxy', child['thumb'], child['rating_key'], 500, 280, fallback='art')});">
@ -107,8 +189,17 @@ DOCUMENTATION :: END
<h3>
<a href="${page('info', child['rating_key'])}" title="${child['title']}">${child['title']}</a>
</h3>
% if media_type == 'collection':
<h3 class="text-muted">
<a href="${page('info', child['grandparent_rating_key'])}" title="${child['grandparent_title']}">${child['grandparent_title']}</a>
</h3>
<h3 class="text-muted">
<a href="${page('info', child['parent_rating_key'])}" title="${child['parent_title']}">${short_season(child['parent_title'])}</a>
&middot; <a href="${page('info', child['rating_key'])}" title="Episode ${child['media_index']}">E${child['media_index']}</a>
</h3>
% endif
</div>
% elif data['children_type'] == 'album':
% elif child['media_type'] == 'artist':
<a href="${page('info', child['rating_key'])}" title="${child['title']}">
<div class="item-children-poster">
<div class="item-children-poster-face cover-item" style="background-image: url(${page('pms_image_proxy', child['thumb'], child['rating_key'], 300, 300, fallback='cover')});"></div>
@ -122,38 +213,102 @@ DOCUMENTATION :: END
<a href="${page('info', child['rating_key'])}" title="${child['title']}">${child['title']}</a>
</h3>
</div>
% elif data['children_type'] == 'track':
% if loop.index % 2 == 0:
<div class="item-children-list-item-even">
<span class="item-children-list-item-index">&nbsp;${child['media_index']}</span>
<span class="item-children-list-item-title"><a href="${page('info', child['rating_key'])}" title="${child['title']}">${child['title']}</a>
% if child['original_title']:
<span class="text-muted"> - ${child['original_title']}</span>
% elif child['media_type'] == 'album':
<a href="${page('info', child['rating_key'])}" title="${child['title']}">
<div class="item-children-poster">
<div class="item-children-poster-face cover-item" style="background-image: url(${page('pms_image_proxy', child['thumb'], child['rating_key'], 300, 300, fallback='cover')});"></div>
% if _session['user_group'] == 'admin':
<span class="overlay-refresh-image" title="Refresh image"><i class="fa fa-refresh refresh_pms_image"></i></span>
% endif
</span>
<span class="item-children-list-item-duration" id="item-children-list-item-duration-${loop.index + 1}">
<script>$('#item-children-list-item-duration-${loop.index + 1}').text(moment.utc(${child['duration']}).format("m:ss"));</script>
</span>
</div>
% else:
<div class="item-children-list-item-odd">
<span class="item-children-list-item-index">&nbsp;${child['media_index']}</span>
<span class="item-children-list-item-title"><a href="${page('info', child['rating_key'])}" title="${child['title']}">${child['title']}</a>
% if child['original_title']:
<span class="text-muted"> - ${child['original_title']}</span>
% endif
</span>
<span class="item-children-list-item-duration" id="item-children-list-item-duration-${loop.index + 1}">
<script>$('#item-children-list-item-duration-${loop.index + 1}').text(moment.utc(${child['duration']}).format("m:ss"));</script>
</span>
</div>
</a>
<div class="item-children-instance-text-wrapper cover-item">
<h3>
<a href="${page('info', child['rating_key'])}" title="${child['title']}">${child['title']}</a>
</h3>
% if media_type == 'collection':
<h3 class="text-muted">
<a class="text-muted" href="${page('info', child['parent_rating_key'])}" title="${child['parent_title']}">${child['parent_title']}</a>
</h3>
% endif
</div>
% elif child['media_type'] == 'track':
<% e = 'even' if loop.index % 2 == 0 else 'odd' %>
<div class="item-children-list-item-${e}">
<span class="item-children-list-item-index">${child['media_index']}</span>
<span class="item-children-list-item-title">
<span class="media-type-tooltip" data-toggle="tooltip" title="Track"><i class="fa fa-music fa-fw"></i></span>
<a href="${page('info', child['rating_key'])}" title="${child['title']}">
<span class="thumb-tooltip" data-toggle="popover" data-img="${page('pms_image_proxy', child['parent_thumb'], child['parent_rating_key'], 300, 300, fallback='cover')}" data-height="80" data-width="80">
${child['title']}
</span>
</a>
% if media_type == 'collection':
-
<a href="${page('info', child['grandparent_rating_key'])}" title="${child['grandparent_title']}">
<span class="thumb-tooltip" data-toggle="popover" data-img="${page('pms_image_proxy', child['grandparent_thumb'], child['grandparent_rating_key'], 300, 300, fallback='cover')}" data-height="80" data-width="80">
${child['grandparent_title']}
</span>
</a>
<span class="text-muted"> (<a class="no-highlight" href="${page('info', child['parent_rating_key'])}" title="${child['parent_title']}">${child['parent_title']}</a>)</span>
% elif child['original_title']:
<span class="text-muted"> - ${child['original_title']}</span>
% endif
</span>
<span class="item-children-list-item-duration" id="item-children-list-item-duration-${loop.index + 1}">
<% f = 'h:mm:ss' if cast_to_int(child['duration']) >= 3600000 else 'm:ss' %>
<script>$('#item-children-list-item-duration-${loop.index + 1}').text(moment.utc(${child['duration']}).format("${f}"));</script>
</span>
</div>
% elif child['media_type'] == 'photo':
<% e = 'even' if loop.index % 2 == 0 else 'odd' %>
<div class="item-children-list-item-${e}">
<span class="item-children-list-item-index">${loop.index + 1}</span>
<span class="item-children-list-item-title">
% if child['media_type'] == 'photo_album':
<span class="media-type-tooltip" data-toggle="tooltip" title="Photo"><i class="fa fa-camera fa-fw"></i></span>
% elif child['media_type'] == 'clip':
<span class="media-type-tooltip" data-toggle="tooltip" title="Photo"><i class="fa fa-video-camera fa-fw"></i></span>
% else:
<span class="media-type-tooltip" data-toggle="tooltip" title="Photo"><i class="fa fa-picture-o fa-fw"></i></span>
% endif
<a href="${page('info', child['rating_key'])}" title="${child['title']}">
<span class="thumb-tooltip" data-toggle="popover" data-img="${page('pms_image_proxy', child['thumb'], child['rating_key'], 300, 300, fallback='cover')}" data-height="80" data-width="80">
${child['title']}
</span>
</a>
</span>
% if child['duration']:
<span class="item-children-list-item-duration" id="item-children-list-item-duration-${loop.index + 1}">
<% f = 'h:mm:ss' if cast_to_int(child['duration']) >= 3600000 else 'm:ss' %>
<script>$('#item-children-list-item-duration-${loop.index + 1}').text(moment.utc(${child['duration']}).format("${f}"));</script>
</span>
% endif
</div>
% endif
</li>
% endif
% endfor
</ul>
</div>
<script>
$('body').tooltip({
selector: '[data-toggle="tooltip"]',
container: 'body'
});
$('body').popover({
selector: '[data-toggle="popover"]',
html: true,
sanitize: false,
container: 'body',
trigger: 'hover',
placement: 'right',
template: '<div class="popover history-thumbnail-popover" role="tooltip"><div class="arrow" style="top: 50%;"></div><div class="popover-content"></div></div>',
content: function () {
return '<div class="history-thumbnail" style="background-image: url(' + $(this).data('img') + '); height: ' + $(this).data('height') + 'px; width: ' + $(this).data('width') + 'px;" />';
}
});
</script>
% endif
% endif

View file

@ -54,7 +54,7 @@ DOCUMENTATION :: END
% if data != None:
<%
from plexpy.helpers import page
from plexpy.helpers import page, short_season
%>
% if data['results_count'] > 0:
% if 'collection' in data['results_list'] and data['results_list']['collection']:
@ -65,7 +65,7 @@ DOCUMENTATION :: END
<ul class="item-children-instance list-unstyled">
% for child in data['results_list']['collection']:
<li>
<a href="${page('info', child['rating_key'])}" id="${child['rating_key']}">
<a href="${page('info', child['rating_key'])}" data-rating_key="${child['rating_key']}" data-library_name="${child['library_name']}">
<div class="item-children-poster">
<div class="item-children-poster-face poster-item" style="background-image: url(${page('pms_image_proxy', child['thumb'], child['rating_key'], 300, 450, fallback='poster')});"></div>
% if _session['user_group'] == 'admin':
@ -90,7 +90,7 @@ DOCUMENTATION :: END
<ul class="item-children-instance list-unstyled">
% for child in data['results_list']['movie']:
<li>
<a href="${page('info', child['rating_key'])}" id="${child['rating_key']}">
<a href="${page('info', child['rating_key'])}" data-rating_key="${child['rating_key']}" data-library_name="${child['library_name']}">
<div class="item-children-poster">
<div class="item-children-poster-face poster-item" style="background-image: url(${page('pms_image_proxy', child['thumb'], child['rating_key'], 300, 450, fallback='poster')});"></div>
% if _session['user_group'] == 'admin':
@ -115,7 +115,7 @@ DOCUMENTATION :: END
<ul class="item-children-instance list-unstyled">
% for child in data['results_list']['show']:
<li>
<a href="${page('info', child['rating_key'])}" id="${child['rating_key']}">
<a href="${page('info', child['rating_key'])}" data-rating_key="${child['rating_key']}" data-library_name="${child['library_name']}">
<div class="item-children-poster">
<div class="item-children-poster-face poster-item" style="background-image: url(${page('pms_image_proxy', child['thumb'], child['rating_key'], 300, 450, fallback='poster')});"></div>
% if _session['user_group'] == 'admin':
@ -140,7 +140,7 @@ DOCUMENTATION :: END
<ul class="item-children-instance list-unstyled">
% for child in data['results_list']['season']:
<li>
<a href="${page('info', child['rating_key'])}" id="${child['rating_key']}">
<a href="${page('info', child['rating_key'])}" data-rating_key="${child['rating_key']}" data-library_name="${child['library_name']}">
<div class="item-children-poster">
<div class="item-children-poster-face poster-item" style="background-image: url(${page('pms_image_proxy', child['thumb'], child['rating_key'], 300, 450, fallback='poster')});"></div>
% if _session['user_group'] == 'admin':
@ -149,7 +149,7 @@ DOCUMENTATION :: END
</div>
<div class="item-children-instance-text-wrapper poster-item">
<h3 title="${child['parent_title']}">${child['parent_title']}</h3>
<h3 class="text-muted">S${child['media_index']}</h3>
<h3 class="text-muted">${short_season(child['title'])}</h3>
</div>
</a>
</li>
@ -165,7 +165,7 @@ DOCUMENTATION :: END
<ul class="item-children-instance list-unstyled">
% for child in data['results_list']['episode']:
<li>
<a href="${page('info', child['rating_key'])}" id="${child['rating_key']}">
<a href="${page('info', child['rating_key'])}" data-rating_key="${child['rating_key']}" data-library_name="${child['library_name']}">
<div class="item-children-poster">
<div class="item-children-poster-face episode-item" style="background-image: url(${page('pms_image_proxy', child['thumb'], child['rating_key'], 500, 280, fallback='art')});"></div>
% if _session['user_group'] == 'admin':
@ -175,7 +175,7 @@ DOCUMENTATION :: END
<div class="item-children-instance-text-wrapper episode-item">
<h3 title="${child['grandparent_title']}">${child['grandparent_title']}</h3>
<h3 title="${child['title']}">${child['title']}</h3>
<h3 class="text-muted">S${child['parent_media_index']} &middot; E${child['media_index']}</h3>
<h3 class="text-muted">${short_season(child['parent_title'])} &middot; E${child['media_index']}</h3>
</div>
</a>
</li>
@ -191,7 +191,7 @@ DOCUMENTATION :: END
<ul class="item-children-instance list-unstyled">
% for child in data['results_list']['artist']:
<li>
<a href="${page('info', child['rating_key'])}" id="${child['rating_key']}">
<a href="${page('info', child['rating_key'])}" data-rating_key="${child['rating_key']}" data-library_name="${child['library_name']}">
<div class="item-children-poster">
<div class="item-children-poster-face cover-item" style="background-image: url(${page('pms_image_proxy', child['thumb'], child['rating_key'], 300, 300, fallback='cover')});"></div>
% if _session['user_group'] == 'admin':
@ -215,7 +215,7 @@ DOCUMENTATION :: END
<ul class="item-children-instance list-unstyled">
% for child in data['results_list']['album']:
<li>
<a href="${page('info', child['rating_key'])}" id="${child['rating_key']}">
<a href="${page('info', child['rating_key'])}" data-rating_key="${child['rating_key']}" data-library_name="${child['library_name']}">
<div class="item-children-poster">
<div class="item-children-poster-face cover-item" style="background-image: url(${page('pms_image_proxy', child['thumb'], child['rating_key'], 300, 300, fallback='cover')});"></div>
% if _session['user_group'] == 'admin':
@ -240,7 +240,7 @@ DOCUMENTATION :: END
<ul class="item-children-instance list-unstyled">
% for child in data['results_list']['track']:
<li>
<a href="${page('info', child['rating_key'])}" id="${child['rating_key']}">
<a href="${page('info', child['rating_key'])}" data-rating_key="${child['rating_key']}" data-library_name="${child['library_name']}">
<div class="item-children-poster">
<div class="item-children-poster-face cover-item" style="background-image: url(${page('pms_image_proxy', child['parent_thumb'], child['parent_rating_key'], 300, 300, fallback='cover')});">
<div class="item-children-card-overlay">

View file

@ -13,9 +13,25 @@
</h4>
</div>
<div class="modal-body" id="modal-text">
% if kwargs:
<div class="col-sm-12">
<h4>
<strong>Location Details</strong>
<strong>Connection Details</strong>
</h4>
</div>
<div class="col-sm-12">
<ul class="list-unstyled">
<% icon = {'0': 'times', '1': 'check'} %>
<li>Location: <strong>${(kwargs['location'] or 'unknown').upper()}</strong></li>
<li>Secure Connection: <i class="fa fa-${icon.get(kwargs['secure'], 'question')}"></i></li>
<li>Plex Relay: <i class="fa fa-${icon.get(kwargs['relayed'], 'question')}"></i></li>
</ul>
</div>
% endif
% if public:
<div class="col-sm-12">
<h4>
<strong>Geolocation Lookup</strong>
% if data:
<span id="ip_loading" style="padding-left: 5px;"><i class="fa fa-refresh fa-spin"></i></span>
% endif
@ -24,6 +40,7 @@
<div id="ip_error" class="col-sm-12 text-muted"></div>
<div class="col-sm-6">
<ul class="list-unstyled">
<li>Continent: <strong><span id="continent"></span></strong></li>
<li>Country: <strong><span id="country"></span></strong></li>
<li>Region: <strong><span id="region"></span></strong></li>
<li>City: <strong><span id="city"></span></strong></li>
@ -39,7 +56,7 @@
</div>
<div class="col-sm-12">
<h4>
<strong>Connection Details</strong>
<strong>Whois Lookup</strong>
% if data:
<span id="isp_loading" style="padding-left: 5px;"><i class="fa fa-refresh fa-spin"></i></span>
% endif
@ -57,13 +74,17 @@
<li>Address: <strong><span id="isp_address"></span></strong></li>
</ul>
</div>
% endif
</div>
<div class="modal-footer">
% if data == '127.0.0.1' and kwargs.get('location') == 'wan':
<div style="float: right;"><span class="text-muted" id="rquote">We've traced the call. It's coming from inside the house!</span></div>
% endif
</div>
</div>
</div>
% if data:
% if data and public:
<script>
function getUserLocation(ip_address) {
$.ajax({
@ -83,6 +104,7 @@
$('#ip_error').html('<i class="fa fa-exclamation-circle"></i> ' + result.message).show();
} else {
var data = result.data;
$('#continent').html(data.continent);
$('#country').html(data.country);
$('#region').html(data.region);
$('#city').html(data.city);

View file

@ -0,0 +1 @@
const blurhash=function(t){const e=["0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","#","$","%","*","+",",","-",".",":",";","=","?","@","[","]","^","_","{","|","}","~"],a=t=>{let a=0;for(let r=0;r<t.length;r++){const o=t[r];a=83*a+e.indexOf(o)}return a},r=(t,a)=>{var r="";for(let o=1;o<=a;o++){let h=Math.floor(t)/Math.pow(83,a-o)%83;r+=e[Math.floor(h)]}return r},o=t=>{let e=t/255;return e<=.04045?e/12.92:Math.pow((e+.055)/1.055,2.4)},h=t=>{let e=Math.max(0,Math.min(1,t));return e<=.0031308?Math.round(12.92*e*255+.5):Math.round(255*(1.055*Math.pow(e,1/2.4)-.055)+.5)},n=(t,e)=>(t=>t<0?-1:1)(t)*Math.pow(Math.abs(t),e),l=t=>{if(!t||t.length<6)throw new Error("The blurhash string must be at least 6 characters");const e=a(t[0]),r=Math.floor(e/9)+1,o=e%9+1;if(t.length!==4+2*o*r)throw new Error(`blurhash length mismatch: length is ${t.length} but it should be ${4+2*o*r}`)},s=t=>{const e=t>>8&255,a=255&t;return[o(t>>16),o(e),o(a)]},m=(t,e)=>{const a=Math.floor(t/361),r=Math.floor(t/19)%19,o=t%19;return[n((a-9)/9,2)*e,n((r-9)/9,2)*e,n((o-9)/9,2)*e]},c=(t,e,a,r)=>{let h=0,n=0,l=0;const s=4*e;for(let m=0;m<e;m++)for(let e=0;e<a;e++){const a=r(m,e);h+=a*o(t[4*m+0+e*s]),n+=a*o(t[4*m+1+e*s]),l+=a*o(t[4*m+2+e*s])}let m=1/(e*a);return[h*m,n*m,l*m]};return t.decodePromise=((e,a,r,o=1)=>new Promise((h,n)=>{h(t.decode(e,a,r,o))})),t.decode=((t,e,r,o=1)=>{l(t),o|=1;const n=a(t[0]),c=Math.floor(n/9)+1,i=n%9+1,M=(a(t[1])+1)/166,g=new Array(i*c);for(let e=0;e<g.length;e++)if(0===e){const r=a(t.substring(2,6));g[e]=s(r)}else{const r=a(t.substring(4+2*e,6+2*e));g[e]=m(r,M*o)}const f=4*e,d=new Uint8ClampedArray(f*r);for(let t=0;t<r;t++)for(let a=0;a<e;a++){let o=0,n=0,l=0;for(let h=0;h<c;h++)for(let s=0;s<i;s++){const m=Math.cos(Math.PI*a*s/e)*Math.cos(Math.PI*t*h/r);let c=g[s+h*i];o+=c[0]*m,n+=c[1]*m,l+=c[2]*m}let s=h(o),m=h(n),M=h(l);d[4*a+0+t*f]=s,d[4*a+1+t*f]=m,d[4*a+2+t*f]=M,d[4*a+3+t*f]=255}return d}),t.encodePromise=((e,a,r,o,h)=>new Promise((n,l)=>{n(t.encode(e,a,r,o,h))})),t.encode=((t,e,a,o,l)=>{if(o<1||o>9||l<1||l>9)throw new Error("BlurHash must have between 1 and 9 components");if(e*a*4!==t.length)throw new Error("Width and height must match the pixels array");let s=[];for(let r=0;r<l;r++)for(let h=0;h<o;h++){const o=0==h&&0==r?1:2,n=c(t,e,a,(t,n)=>o*Math.cos(Math.PI*h*t/e)*Math.cos(Math.PI*r*n/a));s.push(n)}const m=s[0],i=s.slice(1);let M,g="";if(g+=r(o-1+9*(l-1),1),i.length>0){let t=Math.max(...i.map(t=>Math.max(...t))),e=Math.floor(Math.max(0,Math.min(82,Math.floor(166*t-.5))));M=(e+1)/166,g+=r(e,1)}else M=1,g+=r(0,1);return g+=r((t=>{return(h(t[0])<<16)+(h(t[1])<<8)+h(t[2])})(m),4),i.forEach(t=>{g+=r(((t,e)=>{return 19*Math.floor(Math.max(0,Math.min(18,Math.floor(9*n(t[0]/e,.5)+9.5))))*19+19*Math.floor(Math.max(0,Math.min(18,Math.floor(9*n(t[1]/e,.5)+9.5))))+Math.floor(Math.max(0,Math.min(18,Math.floor(9*n(t[2]/e,.5)+9.5))))})(t,M),2)}),g}),t.getImageData=(t=>{const e=t.width,a=t.height,r=document.createElement("canvas"),o=r.getContext("2d");return r.width=e,r.height=a,o.width=e,o.height=a,o.drawImage(t,0,0),o.getImageData(0,0,e,a).data}),t.drawImageDataOnNewCanvas=((t,e,a)=>{const r=document.createElement("canvas"),o=r.getContext("2d");return r.width=e,r.height=a,o.width=e,o.height=a,o.putImageData(new ImageData(t,e,a),0,0),r}),t.getImageDataAsImageWithOnloadPromise=((e,a,r)=>new Promise((o,h)=>{t.getImageDataAsImage(e,a,r,(t,e)=>{o(e)})})),t.getImageDataAsImage=((e,a,r,o)=>{const h=t.drawImageDataOnNewCanvas(e,a,r).toDataURL(),n=new Image(a,r);return n.onload=(t=>o(t,n)),n.width=a,n.height=r,n.src=h,n}),t}({});

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -2,7 +2,13 @@
DataTables Bootstrap 3 integration
©2011-2015 SpryMedia Ltd - datatables.net/license
*/
(function(b){"function"===typeof define&&define.amd?define(["jquery","datatables.net"],function(a){return b(a,window,document)}):"object"===typeof exports?module.exports=function(a,d){a||(a=window);if(!d||!d.fn.dataTable)d=require("datatables.net")(a,d).$;return b(d,a,a.document)}:b(jQuery,window,document)})(function(b,a,d){var f=b.fn.dataTable;b.extend(!0,f.defaults,{dom:"<'row'<'col-sm-6'l><'col-sm-6'f>><'row'<'col-sm-12'tr>><'row'<'col-sm-5'i><'col-sm-7'p>>",renderer:"bootstrap"});b.extend(f.ext.classes,
{sWrapper:"dataTables_wrapper form-inline dt-bootstrap",sFilterInput:"form-control input-sm",sLengthSelect:"form-control input-sm",sProcessing:"dataTables_processing panel panel-default"});f.ext.renderer.pageButton.bootstrap=function(a,h,r,m,j,n){var o=new f.Api(a),s=a.oClasses,k=a.oLanguage.oPaginate,t=a.oLanguage.oAria.paginate||{},e,g,p=0,q=function(d,f){var l,h,i,c,m=function(a){a.preventDefault();!b(a.currentTarget).hasClass("disabled")&&o.page()!=a.data.action&&o.page(a.data.action).draw("page")};
l=0;for(h=f.length;l<h;l++)if(c=f[l],b.isArray(c))q(d,c);else{g=e="";switch(c){case "ellipsis":e="&#x2026;";g="disabled";break;case "first":e=k.sFirst;g=c+(0<j?"":" disabled");break;case "previous":e=k.sPrevious;g=c+(0<j?"":" disabled");break;case "next":e=k.sNext;g=c+(j<n-1?"":" disabled");break;case "last":e=k.sLast;g=c+(j<n-1?"":" disabled");break;default:e=c+1,g=j===c?"active":""}e&&(i=b("<li>",{"class":s.sPageButton+" "+g,id:0===r&&"string"===typeof c?a.sTableId+"_"+c:null}).append(b("<a>",{href:"#",
"aria-controls":a.sTableId,"aria-label":t[c],"data-dt-idx":p,tabindex:a.iTabIndex}).html(e)).appendTo(d),a.oApi._fnBindAction(i,{action:c},m),p++)}},i;try{i=b(h).find(d.activeElement).data("dt-idx")}catch(u){}q(b(h).empty().html('<ul class="pagination"/>').children("ul"),m);i&&b(h).find("[data-dt-idx="+i+"]").focus()};return f});
var $jscomp=$jscomp||{};$jscomp.scope={};$jscomp.findInternal=function(a,b,c){a instanceof String&&(a=String(a));for(var e=a.length,d=0;d<e;d++){var f=a[d];if(b.call(c,f,d,a))return{i:d,v:f}}return{i:-1,v:void 0}};$jscomp.ASSUME_ES5=!1;$jscomp.ASSUME_NO_NATIVE_MAP=!1;$jscomp.ASSUME_NO_NATIVE_SET=!1;$jscomp.SIMPLE_FROUND_POLYFILL=!1;$jscomp.ISOLATE_POLYFILLS=!1;
$jscomp.defineProperty=$jscomp.ASSUME_ES5||"function"==typeof Object.defineProperties?Object.defineProperty:function(a,b,c){if(a==Array.prototype||a==Object.prototype)return a;a[b]=c.value;return a};$jscomp.getGlobal=function(a){a=["object"==typeof globalThis&&globalThis,a,"object"==typeof window&&window,"object"==typeof self&&self,"object"==typeof global&&global];for(var b=0;b<a.length;++b){var c=a[b];if(c&&c.Math==Math)return c}throw Error("Cannot find global object");};$jscomp.global=$jscomp.getGlobal(this);
$jscomp.IS_SYMBOL_NATIVE="function"===typeof Symbol&&"symbol"===typeof Symbol("x");$jscomp.TRUST_ES6_POLYFILLS=!$jscomp.ISOLATE_POLYFILLS||$jscomp.IS_SYMBOL_NATIVE;$jscomp.polyfills={};$jscomp.propertyToPolyfillSymbol={};$jscomp.POLYFILL_PREFIX="$jscp$";var $jscomp$lookupPolyfilledValue=function(a,b){var c=$jscomp.propertyToPolyfillSymbol[b];if(null==c)return a[b];c=a[c];return void 0!==c?c:a[b]};
$jscomp.polyfill=function(a,b,c,e){b&&($jscomp.ISOLATE_POLYFILLS?$jscomp.polyfillIsolated(a,b,c,e):$jscomp.polyfillUnisolated(a,b,c,e))};$jscomp.polyfillUnisolated=function(a,b,c,e){c=$jscomp.global;a=a.split(".");for(e=0;e<a.length-1;e++){var d=a[e];if(!(d in c))return;c=c[d]}a=a[a.length-1];e=c[a];b=b(e);b!=e&&null!=b&&$jscomp.defineProperty(c,a,{configurable:!0,writable:!0,value:b})};
$jscomp.polyfillIsolated=function(a,b,c,e){var d=a.split(".");a=1===d.length;e=d[0];e=!a&&e in $jscomp.polyfills?$jscomp.polyfills:$jscomp.global;for(var f=0;f<d.length-1;f++){var l=d[f];if(!(l in e))return;e=e[l]}d=d[d.length-1];c=$jscomp.IS_SYMBOL_NATIVE&&"es6"===c?e[d]:null;b=b(c);null!=b&&(a?$jscomp.defineProperty($jscomp.polyfills,d,{configurable:!0,writable:!0,value:b}):b!==c&&($jscomp.propertyToPolyfillSymbol[d]=$jscomp.IS_SYMBOL_NATIVE?$jscomp.global.Symbol(d):$jscomp.POLYFILL_PREFIX+d,d=
$jscomp.propertyToPolyfillSymbol[d],$jscomp.defineProperty(e,d,{configurable:!0,writable:!0,value:b})))};$jscomp.polyfill("Array.prototype.find",function(a){return a?a:function(b,c){return $jscomp.findInternal(this,b,c).v}},"es6","es3");
(function(a){"function"===typeof define&&define.amd?define(["jquery","datatables.net"],function(b){return a(b,window,document)}):"object"===typeof exports?module.exports=function(b,c){b||(b=window);c&&c.fn.dataTable||(c=require("datatables.net")(b,c).$);return a(c,b,b.document)}:a(jQuery,window,document)})(function(a,b,c,e){var d=a.fn.dataTable;a.extend(!0,d.defaults,{dom:"<'row'<'col-sm-6'l><'col-sm-6'f>><'row'<'col-sm-12'tr>><'row'<'col-sm-5'i><'col-sm-7'p>>",renderer:"bootstrap"});a.extend(d.ext.classes,
{sWrapper:"dataTables_wrapper form-inline dt-bootstrap",sFilterInput:"form-control input-sm",sLengthSelect:"form-control input-sm",sProcessing:"dataTables_processing panel panel-default"});d.ext.renderer.pageButton.bootstrap=function(f,l,A,B,m,t){var u=new d.Api(f),C=f.oClasses,n=f.oLanguage.oPaginate,D=f.oLanguage.oAria.paginate||{},h,k,v=0,y=function(q,w){var x,E=function(p){p.preventDefault();a(p.currentTarget).hasClass("disabled")||u.page()==p.data.action||u.page(p.data.action).draw("page")};
var r=0;for(x=w.length;r<x;r++){var g=w[r];if(Array.isArray(g))y(q,g);else{k=h="";switch(g){case "ellipsis":h="&#x2026;";k="disabled";break;case "first":h=n.sFirst;k=g+(0<m?"":" disabled");break;case "previous":h=n.sPrevious;k=g+(0<m?"":" disabled");break;case "next":h=n.sNext;k=g+(m<t-1?"":" disabled");break;case "last":h=n.sLast;k=g+(m<t-1?"":" disabled");break;default:h=g+1,k=m===g?"active":""}if(h){var F=a("<li>",{"class":C.sPageButton+" "+k,id:0===A&&"string"===typeof g?f.sTableId+"_"+g:null}).append(a("<a>",
{href:"#","aria-controls":f.sTableId,"aria-label":D[g],"data-dt-idx":v,tabindex:f.iTabIndex}).html(h)).appendTo(q);f.oApi._fnBindAction(F,{action:g},E);v++}}}};try{var z=a(l).find(c.activeElement).data("dt-idx")}catch(q){}y(a(l).empty().html('<ul class="pagination"/>').children("ul"),B);z!==e&&a(l).find("[data-dt-idx="+z+"]").trigger("focus")};return d});

View file

@ -790,6 +790,9 @@ ColVis.prototype = {
oStyle.top = oPos.top+"px";
oStyle.left = iDivX+"px";
var iDocWidth = $(document).width();
var iDocHeight = $(document).height();
document.body.appendChild( nBackground );
document.body.appendChild( nHidden );
document.body.appendChild( this.dom.catcher );
@ -819,12 +822,17 @@ ColVis.prototype = {
var iDivWidth = $(nHidden).outerWidth();
var iDivHeight = $(nHidden).outerHeight();
var iDocWidth = $(document).width();
var iDivMarginTop = parseInt($(nHidden).css("marginTop"), 10);
var iDivMarginBottom = parseInt($(nHidden).css("marginBottom"), 10);
if ( iLeft + iDivWidth > iDocWidth )
{
nHidden.style.left = (iDocWidth-iDivWidth)+"px";
}
if ( iDivY + iDivHeight > iDocHeight )
{
nHidden.style.top = (oPos.top - iDivHeight - iDivMarginTop - iDivMarginBottom)+"px";
}
}
this.s.hidden = false;
@ -846,7 +854,8 @@ ColVis.prototype = {
this.s.hidden = true;
$(this.dom.collection).animate({"opacity": 0}, that.s.iOverlayFade, function (e) {
this.style.display = "none";
// this.style.display = "none";
document.body.removeChild( this );
} );
$(this.dom.background).animate({"opacity": 0}, that.s.iOverlayFade, function (e) {

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,76 @@
var formatter_function = function() {
if (moment(this.x, 'X').isValid() && (this.x > 946684800)) {
var s = '<b>'+ moment(this.x).format('ddd MMM D') +'</b>';
} else {
var s = '<b>'+ this.x +'</b>';
}
$.each(this.points, function(i, point) {
s += '<br/>'+point.series.name+': '+point.y;
});
return s;
};
var hc_concurrent_streams_by_stream_type_options = {
chart: {
type: 'line',
backgroundColor: 'rgba(0,0,0,0)',
renderTo: 'graph_concurrent_streams_by_stream_type'
},
title: {
text: ''
},
legend: {
enabled: true,
itemStyle: {
font: '9pt "Open Sans", sans-serif',
color: '#A0A0A0'
},
itemHoverStyle: {
color: '#FFF'
},
itemHiddenStyle: {
color: '#444'
}
},
credits: {
enabled: false
},
plotOptions: {
series: {
events: {
legendItemClick: function() {
setGraphVisibility(this.chart.renderTo.id, this.chart.series, this.name);
}
}
}
},
xAxis: {
type: 'datetime',
labels: {
formatter: function() {
return moment(this.value).format("MMM D");
},
style: {
color: '#aaa'
}
},
categories: [{}],
plotBands: []
},
yAxis: {
title: {
text: null
},
labels: {
style: {
color: '#aaa'
}
}
},
tooltip: {
shared: true,
crosshairs: true,
formatter: formatter_function
},
series: [{}]
};

View file

@ -0,0 +1,596 @@
/*
Highcharts JS v9.2.2 (2021-08-24)
(c) 2009-2021 Torstein Honsi
License: www.highcharts.com/license
*/
'use strict';(function(aa,M){"object"===typeof module&&module.exports?(M["default"]=M,module.exports=aa.document?M(aa):M):"function"===typeof define&&define.amd?define("highcharts/highcharts",function(){return M(aa)}):(aa.Highcharts&&aa.Highcharts.error(16,!0),aa.Highcharts=M(aa))})("undefined"!==typeof window?window:this,function(aa){function M(r,a,C,E){r.hasOwnProperty(a)||(r[a]=E.apply(null,C))}var a={};M(a,"Core/Globals.js",[],function(){var r="undefined"!==typeof aa?aa:"undefined"!==typeof window?
window:{},a;(function(a){a.SVG_NS="http://www.w3.org/2000/svg";a.product="Highcharts";a.version="9.2.2";a.win=r;a.doc=a.win.document;a.svg=a.doc&&a.doc.createElementNS&&!!a.doc.createElementNS(a.SVG_NS,"svg").createSVGRect;a.userAgent=a.win.navigator&&a.win.navigator.userAgent||"";a.isChrome=-1!==a.userAgent.indexOf("Chrome");a.isFirefox=-1!==a.userAgent.indexOf("Firefox");a.isMS=/(edge|msie|trident)/i.test(a.userAgent)&&!a.win.opera;a.isSafari=!a.isChrome&&-1!==a.userAgent.indexOf("Safari");a.isTouchDevice=
/(Mobile|Android|Windows Phone)/.test(a.userAgent);a.isWebKit=-1!==a.userAgent.indexOf("AppleWebKit");a.deg2rad=2*Math.PI/360;a.hasBidiBug=a.isFirefox&&4>parseInt(a.userAgent.split("Firefox/")[1],10);a.hasTouch=!!a.win.TouchEvent;a.marginNames=["plotTop","marginRight","marginBottom","plotLeft"];a.noop=function(){};a.supportsPassiveEvents=function(){var r=!1;if(!a.isMS){var w=Object.defineProperty({},"passive",{get:function(){r=!0}});a.win.addEventListener&&a.win.removeEventListener&&(a.win.addEventListener("testPassive",
a.noop,w),a.win.removeEventListener("testPassive",a.noop,w))}return r}();a.charts=[];a.dateFormats={};a.seriesTypes={};a.symbolSizes={};a.chartCount=0})(a||(a={}));"";return a});M(a,"Core/Utilities.js",[a["Core/Globals.js"]],function(a){function r(b,d,e,p){var y=d?"Highcharts error":"Highcharts warning";32===b&&(b=y+": Deprecated member");var F=m(b),c=F?y+" #"+b+": www.highcharts.com/errors/"+b+"/":b.toString();if("undefined"!==typeof p){var k="";F&&(c+="?");I(p,function(b,K){k+="\n - "+K+": "+b;
F&&(c+=encodeURI(K)+"="+encodeURI(b))});c+=k}B(a,"displayError",{chart:e,code:b,message:c,params:p},function(){if(d)throw Error(c);h.console&&-1===r.messages.indexOf(c)&&console.warn(c)});r.messages.push(c)}function C(b,d){var y={};I(b,function(h,c){if(J(b[c],!0)&&!b.nodeType&&d[c])h=C(b[c],d[c]),Object.keys(h).length&&(y[c]=h);else if(J(b[c])||b[c]!==d[c])y[c]=b[c]});return y}function E(b,d){return parseInt(b,d||10)}function z(b){return"string"===typeof b}function x(b){b=Object.prototype.toString.call(b);
return"[object Array]"===b||"[object Array Iterator]"===b}function J(b,d){return!!b&&"object"===typeof b&&(!d||!x(b))}function u(b){return J(b)&&"number"===typeof b.nodeType}function n(b){var d=b&&b.constructor;return!(!J(b,!0)||u(b)||!d||!d.name||"Object"===d.name)}function m(b){return"number"===typeof b&&!isNaN(b)&&Infinity>b&&-Infinity<b}function g(b){return"undefined"!==typeof b&&null!==b}function c(b,d,h){var y;z(d)?g(h)?b.setAttribute(d,h):b&&b.getAttribute&&((y=b.getAttribute(d))||"class"!==
d||(y=b.getAttribute(d+"Name"))):I(d,function(d,y){b.setAttribute(y,d)});return y}function e(b,d){var y;b||(b={});for(y in d)b[y]=d[y];return b}function l(){for(var b=arguments,d=b.length,h=0;h<d;h++){var c=b[h];if("undefined"!==typeof c&&null!==c)return c}}function f(b,d){a.isMS&&!a.svg&&d&&"undefined"!==typeof d.opacity&&(d.filter="alpha(opacity="+100*d.opacity+")");e(b.style,d)}function v(b,d,h,c,p){b=t.createElement(b);d&&e(b,d);p&&f(b,{padding:"0",border:"none",margin:"0"});h&&f(b,h);c&&c.appendChild(b);
return b}function q(b,d){return parseFloat(b.toPrecision(d||14))}function k(b,d,c){var y=a.getStyle||k;if("width"===d)return d=Math.min(b.offsetWidth,b.scrollWidth),c=b.getBoundingClientRect&&b.getBoundingClientRect().width,c<d&&c>=d-1&&(d=Math.floor(c)),Math.max(0,d-(y(b,"padding-left",!0)||0)-(y(b,"padding-right",!0)||0));if("height"===d)return Math.max(0,Math.min(b.offsetHeight,b.scrollHeight)-(y(b,"padding-top",!0)||0)-(y(b,"padding-bottom",!0)||0));h.getComputedStyle||r(27,!0);if(b=h.getComputedStyle(b,
void 0)){var e=b.getPropertyValue(d);l(c,"opacity"!==d)&&(e=E(e))}return e}function I(b,d,h){for(var y in b)Object.hasOwnProperty.call(b,y)&&d.call(h||b[y],b[y],y,b)}function D(b,d,h){function y(d,H){var K=b.removeEventListener||a.removeEventListenerPolyfill;K&&K.call(b,d,H,!1)}function c(h){var H;if(b.nodeName){if(d){var K={};K[d]=!0}else K=h;I(K,function(b,d){if(h[d])for(H=h[d].length;H--;)y(d,h[d][H].fn)})}}var e="function"===typeof b&&b.prototype||b;if(Object.hasOwnProperty.call(e,"hcEvents")){var p=
e.hcEvents;d?(e=p[d]||[],h?(p[d]=e.filter(function(b){return h!==b.fn}),y(d,h)):(c(p),p[d]=[])):(c(p),delete e.hcEvents)}}function B(b,d,h,c){h=h||{};if(t.createEvent&&(b.dispatchEvent||b.fireEvent&&b!==a)){var y=t.createEvent("Events");y.initEvent(d,!0,!0);h=e(y,h);b.dispatchEvent?b.dispatchEvent(h):b.fireEvent(d,h)}else if(b.hcEvents){h.target||e(h,{preventDefault:function(){h.defaultPrevented=!0},target:b,type:d});y=[];for(var p=b,k=!1;p.hcEvents;)Object.hasOwnProperty.call(p,"hcEvents")&&p.hcEvents[d]&&
(y.length&&(k=!0),y.unshift.apply(y,p.hcEvents[d])),p=Object.getPrototypeOf(p);k&&y.sort(function(b,d){return b.order-d.order});y.forEach(function(d){!1===d.fn.call(b,h)&&h.preventDefault()})}c&&!h.defaultPrevented&&c.call(b,h)}var O=a.charts,t=a.doc,h=a.win;(r||(r={})).messages=[];var d;Math.easeInOutSine=function(b){return-.5*(Math.cos(Math.PI*b)-1)};var b=Array.prototype.find?function(b,d){return b.find(d)}:function(b,d){var h,y=b.length;for(h=0;h<y;h++)if(d(b[h],h))return b[h]};I({map:"map",each:"forEach",
grep:"filter",reduce:"reduce",some:"some"},function(b,d){a[d]=function(h){var y;r(32,!1,void 0,(y={},y["Highcharts."+d]="use Array."+b,y));return Array.prototype[b].apply(h,[].slice.call(arguments,1))}});var p,G=function(){var b=Math.random().toString(36).substring(2,9)+"-",d=0;return function(){return"highcharts-"+(p?"":b)+d++}}();h.jQuery&&(h.jQuery.fn.highcharts=function(){var b=[].slice.call(arguments);if(this[0])return b[0]?(new (a[z(b[0])?b.shift():"Chart"])(this[0],b[0],b[1]),this):O[c(this[0],
"data-highcharts-chart")]});b={addEvent:function(b,d,h,c){void 0===c&&(c={});var y="function"===typeof b&&b.prototype||b;Object.hasOwnProperty.call(y,"hcEvents")||(y.hcEvents={});y=y.hcEvents;a.Point&&b instanceof a.Point&&b.series&&b.series.chart&&(b.series.chart.runTrackerClick=!0);var p=b.addEventListener||a.addEventListenerPolyfill;p&&p.call(b,d,h,a.supportsPassiveEvents?{passive:void 0===c.passive?-1!==d.indexOf("touch"):c.passive,capture:!1}:!1);y[d]||(y[d]=[]);y[d].push({fn:h,order:"number"===
typeof c.order?c.order:Infinity});y[d].sort(function(b,d){return b.order-d.order});return function(){D(b,d,h)}},arrayMax:function(b){for(var d=b.length,h=b[0];d--;)b[d]>h&&(h=b[d]);return h},arrayMin:function(b){for(var d=b.length,h=b[0];d--;)b[d]<h&&(h=b[d]);return h},attr:c,clamp:function(b,d,h){return b>d?b<h?b:h:d},cleanRecursively:C,clearTimeout:function(b){g(b)&&clearTimeout(b)},correctFloat:q,createElement:v,css:f,defined:g,destroyObjectProperties:function(b,d){I(b,function(h,c){h&&h!==d&&
h.destroy&&h.destroy();delete b[c]})},discardElement:function(b){d||(d=v("div"));b&&d.appendChild(b);d.innerHTML=""},erase:function(b,d){for(var h=b.length;h--;)if(b[h]===d){b.splice(h,1);break}},error:r,extend:e,extendClass:function(b,d){var h=function(){};h.prototype=new b;e(h.prototype,d);return h},find:b,fireEvent:B,getMagnitude:function(b){return Math.pow(10,Math.floor(Math.log(b)/Math.LN10))},getNestedProperty:function(b,d){for(b=b.split(".");b.length&&g(d);){var c=b.shift();if("undefined"===
typeof c||"__proto__"===c)return;d=d[c];if(!g(d)||"function"===typeof d||"number"===typeof d.nodeType||d===h)return}return d},getStyle:k,inArray:function(b,d,h){r(32,!1,void 0,{"Highcharts.inArray":"use Array.indexOf"});return d.indexOf(b,h)},isArray:x,isClass:n,isDOMElement:u,isFunction:function(b){return"function"===typeof b},isNumber:m,isObject:J,isString:z,keys:function(b){r(32,!1,void 0,{"Highcharts.keys":"use Object.keys"});return Object.keys(b)},merge:function(){var b,d=arguments,h={},c=function(b,
d){"object"!==typeof b&&(b={});I(d,function(h,H){"__proto__"!==H&&"constructor"!==H&&(!J(h,!0)||n(h)||u(h)?b[H]=d[H]:b[H]=c(b[H]||{},h))});return b};!0===d[0]&&(h=d[1],d=Array.prototype.slice.call(d,2));var p=d.length;for(b=0;b<p;b++)h=c(h,d[b]);return h},normalizeTickInterval:function(b,d,h,c,p){var e=b;h=l(h,1);var k=b/h;d||(d=p?[1,1.2,1.5,2,2.5,3,4,5,6,8,10]:[1,2,2.5,5,10],!1===c&&(1===h?d=d.filter(function(b){return 0===b%1}):.1>=h&&(d=[1/h])));for(c=0;c<d.length&&!(e=d[c],p&&e*h>=b||!p&&k<=(d[c]+
(d[c+1]||d[c]))/2);c++);return e=q(e*h,-Math.round(Math.log(.001)/Math.LN10))},objectEach:I,offset:function(b){var d=t.documentElement;b=b.parentElement||b.parentNode?b.getBoundingClientRect():{top:0,left:0,width:0,height:0};return{top:b.top+(h.pageYOffset||d.scrollTop)-(d.clientTop||0),left:b.left+(h.pageXOffset||d.scrollLeft)-(d.clientLeft||0),width:b.width,height:b.height}},pad:function(b,d,h){return Array((d||2)+1-String(b).replace("-","").length).join(h||"0")+b},pick:l,pInt:E,relativeLength:function(b,
d,h){return/%$/.test(b)?d*parseFloat(b)/100+(h||0):parseFloat(b)},removeEvent:D,splat:function(b){return x(b)?b:[b]},stableSort:function(b,d){var h=b.length,c,p;for(p=0;p<h;p++)b[p].safeI=p;b.sort(function(b,h){c=d(b,h);return 0===c?b.safeI-h.safeI:c});for(p=0;p<h;p++)delete b[p].safeI},syncTimeout:function(b,d,h){if(0<d)return setTimeout(b,d,h);b.call(0,h);return-1},timeUnits:{millisecond:1,second:1E3,minute:6E4,hour:36E5,day:864E5,week:6048E5,month:24192E5,year:314496E5},uniqueKey:G,useSerialIds:function(b){return p=
l(b,p)},wrap:function(b,d,h){var c=b[d];b[d]=function(){var b=Array.prototype.slice.call(arguments),d=arguments,p=this;p.proceed=function(){c.apply(p,arguments.length?arguments:d)};b.unshift(c);b=h.apply(this,b);p.proceed=null;return b}}};"";return b});M(a,"Core/Color/Palette.js",[],function(){return{colors:"#7cb5ec #434348 #90ed7d #f7a35c #8085e9 #f15c80 #e4d354 #2b908f #f45b5b #91e8e1".split(" "),backgroundColor:"#ffffff",neutralColor100:"#000000",neutralColor80:"#333333",neutralColor60:"#666666",
neutralColor40:"#999999",neutralColor20:"#cccccc",neutralColor10:"#e6e6e6",neutralColor5:"#f2f2f2",neutralColor3:"#f7f7f7",highlightColor100:"#003399",highlightColor80:"#335cad",highlightColor60:"#6685c2",highlightColor20:"#ccd6eb",highlightColor10:"#e6ebf5",positiveColor:"#06b535",negativeColor:"#f21313"}});M(a,"Core/Chart/ChartDefaults.js",[a["Core/Color/Palette.js"]],function(a){return{panning:{enabled:!1,type:"x"},styledMode:!1,borderRadius:0,colorCount:10,defaultSeriesType:"line",ignoreHiddenSeries:!0,
spacing:[10,10,15,10],resetZoomButton:{theme:{zIndex:6},position:{align:"right",x:-10,y:10}},zoomBySingleTouch:!1,width:null,height:null,borderColor:a.highlightColor80,backgroundColor:a.backgroundColor,plotBorderColor:a.neutralColor20}});M(a,"Core/Color/Color.js",[a["Core/Globals.js"],a["Core/Utilities.js"]],function(a,w){var r=w.isNumber,E=w.merge,z=w.pInt;w=function(){function x(r){this.rgba=[NaN,NaN,NaN,NaN];this.input=r;var u=a.Color;if(u&&u!==x)return new u(r);if(!(this instanceof x))return new x(r);
this.init(r)}x.parse=function(a){return a?new x(a):x.None};x.prototype.init=function(a){var u;if("object"===typeof a&&"undefined"!==typeof a.stops)this.stops=a.stops.map(function(c){return new x(c[1])});else if("string"===typeof a){this.input=a=x.names[a.toLowerCase()]||a;if("#"===a.charAt(0)){var n=a.length;var m=parseInt(a.substr(1),16);7===n?u=[(m&16711680)>>16,(m&65280)>>8,m&255,1]:4===n&&(u=[(m&3840)>>4|(m&3840)>>8,(m&240)>>4|m&240,(m&15)<<4|m&15,1])}if(!u)for(m=x.parsers.length;m--&&!u;){var g=
x.parsers[m];(n=g.regex.exec(a))&&(u=g.parse(n))}}u&&(this.rgba=u)};x.prototype.get=function(a){var u=this.input,n=this.rgba;if("object"===typeof u&&"undefined"!==typeof this.stops){var m=E(u);m.stops=[].slice.call(m.stops);this.stops.forEach(function(g,c){m.stops[c]=[m.stops[c][0],g.get(a)]});return m}return n&&r(n[0])?"rgb"===a||!a&&1===n[3]?"rgb("+n[0]+","+n[1]+","+n[2]+")":"a"===a?""+n[3]:"rgba("+n.join(",")+")":u};x.prototype.brighten=function(a){var u=this.rgba;if(this.stops)this.stops.forEach(function(m){m.brighten(a)});
else if(r(a)&&0!==a)for(var n=0;3>n;n++)u[n]+=z(255*a),0>u[n]&&(u[n]=0),255<u[n]&&(u[n]=255);return this};x.prototype.setOpacity=function(a){this.rgba[3]=a;return this};x.prototype.tweenTo=function(a,u){var n=this.rgba,m=a.rgba;if(!r(n[0])||!r(m[0]))return a.input||"none";a=1!==m[3]||1!==n[3];return(a?"rgba(":"rgb(")+Math.round(m[0]+(n[0]-m[0])*(1-u))+","+Math.round(m[1]+(n[1]-m[1])*(1-u))+","+Math.round(m[2]+(n[2]-m[2])*(1-u))+(a?","+(m[3]+(n[3]-m[3])*(1-u)):"")+")"};x.names={white:"#ffffff",black:"#000000"};
x.parsers=[{regex:/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]?(?:\.[0-9]+)?)\s*\)/,parse:function(a){return[z(a[1]),z(a[2]),z(a[3]),parseFloat(a[4],10)]}},{regex:/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/,parse:function(a){return[z(a[1]),z(a[2]),z(a[3]),1]}}];x.None=new x("");return x}();"";return w});M(a,"Core/Time.js",[a["Core/Globals.js"],a["Core/Utilities.js"]],function(a,w){var r=a.win,E=w.defined,z=w.error,x=w.extend,J=w.isObject,u=w.merge,
n=w.objectEach,m=w.pad,g=w.pick,c=w.splat,e=w.timeUnits,l=a.isSafari&&r.Intl&&r.Intl.DateTimeFormat.prototype.formatRange,f=a.isSafari&&r.Intl&&!r.Intl.DateTimeFormat.prototype.formatRange;w=function(){function v(c){this.options={};this.variableTimezone=this.useUTC=!1;this.Date=r.Date;this.getTimezoneOffset=this.timezoneOffsetFunction();this.update(c)}v.prototype.get=function(c,e){if(this.variableTimezone||this.timezoneOffset){var k=e.getTime(),f=k-this.getTimezoneOffset(e);e.setTime(f);c=e["getUTC"+
c]();e.setTime(k);return c}return this.useUTC?e["getUTC"+c]():e["get"+c]()};v.prototype.set=function(c,e,f){if(this.variableTimezone||this.timezoneOffset){if("Milliseconds"===c||"Seconds"===c||"Minutes"===c&&0===this.getTimezoneOffset(e)%36E5)return e["setUTC"+c](f);var k=this.getTimezoneOffset(e);k=e.getTime()-k;e.setTime(k);e["setUTC"+c](f);c=this.getTimezoneOffset(e);k=e.getTime()+c;return e.setTime(k)}return this.useUTC||l&&"FullYear"===c?e["setUTC"+c](f):e["set"+c](f)};v.prototype.update=function(c){var e=
g(c&&c.useUTC,!0);this.options=c=u(!0,this.options||{},c);this.Date=c.Date||r.Date||Date;this.timezoneOffset=(this.useUTC=e)&&c.timezoneOffset;this.getTimezoneOffset=this.timezoneOffsetFunction();this.variableTimezone=e&&!(!c.getTimezoneOffset&&!c.timezone)};v.prototype.makeTime=function(c,e,l,v,B,a){if(this.useUTC){var k=this.Date.UTC.apply(0,arguments);var h=this.getTimezoneOffset(k);k+=h;var d=this.getTimezoneOffset(k);h!==d?k+=d-h:h-36E5!==this.getTimezoneOffset(k-36E5)||f||(k-=36E5)}else k=(new this.Date(c,
e,g(l,1),g(v,0),g(B,0),g(a,0))).getTime();return k};v.prototype.timezoneOffsetFunction=function(){var c=this,e=this.options,f=e.moment||r.moment;if(!this.useUTC)return function(c){return 6E4*(new Date(c.toString())).getTimezoneOffset()};if(e.timezone){if(f)return function(c){return 6E4*-f.tz(c,e.timezone).utcOffset()};z(25)}return this.useUTC&&e.getTimezoneOffset?function(c){return 6E4*e.getTimezoneOffset(c.valueOf())}:function(){return 6E4*(c.timezoneOffset||0)}};v.prototype.dateFormat=function(c,
e,f){if(!E(e)||isNaN(e))return a.defaultOptions.lang&&a.defaultOptions.lang.invalidDate||"";c=g(c,"%Y-%m-%d %H:%M:%S");var k=this,l=new this.Date(e),q=this.get("Hours",l),t=this.get("Day",l),h=this.get("Date",l),d=this.get("Month",l),b=this.get("FullYear",l),p=a.defaultOptions.lang,G=p&&p.weekdays,y=p&&p.shortWeekdays;l=x({a:y?y[t]:G[t].substr(0,3),A:G[t],d:m(h),e:m(h,2," "),w:t,b:p.shortMonths[d],B:p.months[d],m:m(d+1),o:d+1,y:b.toString().substr(2,2),Y:b,H:m(q),k:q,I:m(q%12||12),l:q%12||12,M:m(this.get("Minutes",
l)),p:12>q?"AM":"PM",P:12>q?"am":"pm",S:m(l.getSeconds()),L:m(Math.floor(e%1E3),3)},a.dateFormats);n(l,function(b,d){for(;-1!==c.indexOf("%"+d);)c=c.replace("%"+d,"function"===typeof b?b.call(k,e):b)});return f?c.substr(0,1).toUpperCase()+c.substr(1):c};v.prototype.resolveDTLFormat=function(e){return J(e,!0)?e:(e=c(e),{main:e[0],from:e[1],to:e[2]})};v.prototype.getTimeTicks=function(c,k,f,l){var q=this,v=[],t={},h=new q.Date(k),d=c.unitRange,b=c.count||1,p;l=g(l,1);if(E(k)){q.set("Milliseconds",h,
d>=e.second?0:b*Math.floor(q.get("Milliseconds",h)/b));d>=e.second&&q.set("Seconds",h,d>=e.minute?0:b*Math.floor(q.get("Seconds",h)/b));d>=e.minute&&q.set("Minutes",h,d>=e.hour?0:b*Math.floor(q.get("Minutes",h)/b));d>=e.hour&&q.set("Hours",h,d>=e.day?0:b*Math.floor(q.get("Hours",h)/b));d>=e.day&&q.set("Date",h,d>=e.month?1:Math.max(1,b*Math.floor(q.get("Date",h)/b)));if(d>=e.month){q.set("Month",h,d>=e.year?0:b*Math.floor(q.get("Month",h)/b));var G=q.get("FullYear",h)}d>=e.year&&q.set("FullYear",
h,G-G%b);d===e.week&&(G=q.get("Day",h),q.set("Date",h,q.get("Date",h)-G+l+(G<l?-7:0)));G=q.get("FullYear",h);l=q.get("Month",h);var y=q.get("Date",h),a=q.get("Hours",h);k=h.getTime();!q.variableTimezone&&q.useUTC||!E(f)||(p=f-k>4*e.month||q.getTimezoneOffset(k)!==q.getTimezoneOffset(f));k=h.getTime();for(h=1;k<f;)v.push(k),k=d===e.year?q.makeTime(G+h*b,0):d===e.month?q.makeTime(G,l+h*b):!p||d!==e.day&&d!==e.week?p&&d===e.hour&&1<b?q.makeTime(G,l,y,a+h*b):k+d*b:q.makeTime(G,l,y+h*b*(d===e.day?1:7)),
h++;v.push(k);d<=e.hour&&1E4>v.length&&v.forEach(function(b){0===b%18E5&&"000000000"===q.dateFormat("%H%M%S%L",b)&&(t[b]="day")})}v.info=x(c,{higherRanks:t,totalRange:d*b});return v};v.prototype.getDateFormat=function(c,k,f,g){var l=this.dateFormat("%m-%d %H:%M:%S.%L",k),q={millisecond:15,second:12,minute:9,hour:6,day:3},t="millisecond";for(h in e){if(c===e.week&&+this.dateFormat("%w",k)===f&&"00:00:00.000"===l.substr(6)){var h="week";break}if(e[h]>c){h=t;break}if(q[h]&&l.substr(q[h])!=="01-01 00:00:00.000".substr(q[h]))break;
"week"!==h&&(t=h)}if(h)var d=this.resolveDTLFormat(g[h]).main;return d};return v}();"";return w});M(a,"Core/DefaultOptions.js",[a["Core/Chart/ChartDefaults.js"],a["Core/Color/Color.js"],a["Core/Globals.js"],a["Core/Color/Palette.js"],a["Core/Time.js"],a["Core/Utilities.js"]],function(a,w,C,E,z,x){w=w.parse;var r=x.merge,u={colors:E.colors,symbols:["circle","diamond","square","triangle","triangle-down"],lang:{loading:"Loading...",months:"January February March April May June July August September October November December".split(" "),
shortMonths:"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),weekdays:"Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),decimalPoint:".",numericSymbols:"kMGTPE".split(""),resetZoom:"Reset zoom",resetZoomTitle:"Reset zoom level 1:1",thousandsSep:" "},global:{},time:{Date:void 0,getTimezoneOffset:void 0,timezone:void 0,timezoneOffset:0,useUTC:!0},chart:a,title:{text:"Chart title",align:"center",margin:15,widthAdjust:-44},subtitle:{text:"",align:"center",widthAdjust:-44},
caption:{margin:15,text:"",align:"left",verticalAlign:"bottom"},plotOptions:{},labels:{style:{position:"absolute",color:E.neutralColor80}},legend:{enabled:!0,align:"center",alignColumns:!0,className:"highcharts-no-tooltip",layout:"horizontal",labelFormatter:function(){return this.name},borderColor:E.neutralColor40,borderRadius:0,navigation:{activeColor:E.highlightColor100,inactiveColor:E.neutralColor20},itemStyle:{color:E.neutralColor80,cursor:"pointer",fontSize:"12px",fontWeight:"bold",textOverflow:"ellipsis"},
itemHoverStyle:{color:E.neutralColor100},itemHiddenStyle:{color:E.neutralColor20},shadow:!1,itemCheckboxStyle:{position:"absolute",width:"13px",height:"13px"},squareSymbol:!0,symbolPadding:5,verticalAlign:"bottom",x:0,y:0,title:{style:{fontWeight:"bold"}}},loading:{labelStyle:{fontWeight:"bold",position:"relative",top:"45%"},style:{position:"absolute",backgroundColor:E.backgroundColor,opacity:.5,textAlign:"center"}},tooltip:{enabled:!0,animation:C.svg,borderRadius:3,dateTimeLabelFormats:{millisecond:"%A, %b %e, %H:%M:%S.%L",
second:"%A, %b %e, %H:%M:%S",minute:"%A, %b %e, %H:%M",hour:"%A, %b %e, %H:%M",day:"%A, %b %e, %Y",week:"Week from %A, %b %e, %Y",month:"%B %Y",year:"%Y"},footerFormat:"",headerShape:"callout",hideDelay:500,padding:8,shape:"callout",shared:!1,snap:C.isTouchDevice?25:10,headerFormat:'<span style="font-size: 10px">{point.key}</span><br/>',pointFormat:'<span style="color:{point.color}">\u25cf</span> {series.name}: <b>{point.y}</b><br/>',backgroundColor:w(E.neutralColor3).setOpacity(.85).get(),borderWidth:1,
shadow:!0,stickOnContact:!1,style:{color:E.neutralColor80,cursor:"default",fontSize:"12px",whiteSpace:"nowrap"},useHTML:!1},credits:{enabled:!0,href:"https://www.highcharts.com?credits",position:{align:"right",x:-10,verticalAlign:"bottom",y:-5},style:{cursor:"pointer",color:E.neutralColor40,fontSize:"9px"},text:"Highcharts.com"}};u.chart.styledMode=!1;"";var n=new z(r(u.global,u.time));a={defaultOptions:u,defaultTime:n,getOptions:function(){return u},setOptions:function(a){r(!0,u,a);if(a.time||a.global)C.time?
C.time.update(r(u.global,u.time,a.global,a.time)):C.time=n;return u}};"";return a});M(a,"Core/Animation/Fx.js",[a["Core/Color/Color.js"],a["Core/Globals.js"],a["Core/Utilities.js"]],function(a,w,C){var r=a.parse,z=w.win,x=C.isNumber,J=C.objectEach;return function(){function a(a,m,g){this.pos=NaN;this.options=m;this.elem=a;this.prop=g}a.prototype.dSetter=function(){var a=this.paths,m=a&&a[0];a=a&&a[1];var g=this.now||0,c=[];if(1!==g&&m&&a)if(m.length===a.length&&1>g)for(var e=0;e<a.length;e++){for(var l=
m[e],f=a[e],v=[],q=0;q<f.length;q++){var k=l[q],I=f[q];x(k)&&x(I)&&("A"!==f[0]||4!==q&&5!==q)?v[q]=k+g*(I-k):v[q]=I}c.push(v)}else c=a;else c=this.toD||[];this.elem.attr("d",c,void 0,!0)};a.prototype.update=function(){var a=this.elem,m=this.prop,g=this.now,c=this.options.step;if(this[m+"Setter"])this[m+"Setter"]();else a.attr?a.element&&a.attr(m,g,null,!0):a.style[m]=g+this.unit;c&&c.call(a,g,this)};a.prototype.run=function(n,m,g){var c=this,e=c.options,l=function(e){return l.stopped?!1:c.step(e)},
f=z.requestAnimationFrame||function(c){setTimeout(c,13)},v=function(){for(var c=0;c<a.timers.length;c++)a.timers[c]()||a.timers.splice(c--,1);a.timers.length&&f(v)};n!==m||this.elem["forceAnimate:"+this.prop]?(this.startTime=+new Date,this.start=n,this.end=m,this.unit=g,this.now=this.start,this.pos=0,l.elem=this.elem,l.prop=this.prop,l()&&1===a.timers.push(l)&&f(v)):(delete e.curAnim[this.prop],e.complete&&0===Object.keys(e.curAnim).length&&e.complete.call(this.elem))};a.prototype.step=function(a){var m=
+new Date,g=this.options,c=this.elem,e=g.complete,l=g.duration,f=g.curAnim;if(c.attr&&!c.element)a=!1;else if(a||m>=l+this.startTime){this.now=this.end;this.pos=1;this.update();var v=f[this.prop]=!0;J(f,function(c){!0!==c&&(v=!1)});v&&e&&e.call(c);a=!1}else this.pos=g.easing((m-this.startTime)/l),this.now=this.start+(this.end-this.start)*this.pos,this.update(),a=!0;return a};a.prototype.initPath=function(a,m,g){function c(c,e){for(;c.length<D;){var f=c[0],h=e[D-c.length];h&&"M"===f[0]&&(c[0]="C"===
h[0]?["C",f[1],f[2],f[1],f[2],f[1],f[2]]:["L",f[1],f[2]]);c.unshift(f);v&&(f=c.pop(),c.push(c[c.length-1],f))}}function e(c,e){for(;c.length<D;)if(e=c[Math.floor(c.length/q)-1].slice(),"C"===e[0]&&(e[1]=e[5],e[2]=e[6]),v){var f=c[Math.floor(c.length/q)].slice();c.splice(c.length/2,0,e,f)}else c.push(e)}var l=a.startX,f=a.endX;g=g.slice();var v=a.isArea,q=v?2:1;m=m&&m.slice();if(!m)return[g,g];if(l&&f&&f.length){for(a=0;a<l.length;a++)if(l[a]===f[0]){var k=a;break}else if(l[0]===f[f.length-l.length+
a]){k=a;var I=!0;break}else if(l[l.length-1]===f[f.length-l.length+a]){k=l.length-a;break}"undefined"===typeof k&&(m=[])}if(m.length&&x(k)){var D=g.length+k*q;I?(c(m,g),e(g,m)):(c(g,m),e(m,g))}return[m,g]};a.prototype.fillSetter=function(){a.prototype.strokeSetter.apply(this,arguments)};a.prototype.strokeSetter=function(){this.elem.attr(this.prop,r(this.start).tweenTo(r(this.end),this.pos),null,!0)};a.timers=[];return a}()});M(a,"Core/Animation/AnimationUtilities.js",[a["Core/Animation/Fx.js"],a["Core/Utilities.js"]],
function(a,w){function r(c){return n(c)?m({duration:500,defer:0},c):{duration:c?500:0,defer:0}}function E(c,g){for(var e=a.timers.length;e--;)a.timers[e].elem!==c||g&&g!==a.timers[e].prop||(a.timers[e].stopped=!0)}var z=w.defined,x=w.getStyle,J=w.isArray,u=w.isNumber,n=w.isObject,m=w.merge,g=w.objectEach,c=w.pick;return{animate:function(c,l,f){var e,q="",k,I;if(!n(f)){var D=arguments;f={duration:D[2],easing:D[3],complete:D[4]}}u(f.duration)||(f.duration=400);f.easing="function"===typeof f.easing?
f.easing:Math[f.easing]||Math.easeInOutSine;f.curAnim=m(l);g(l,function(g,v){E(c,v);I=new a(c,f,v);k=void 0;"d"===v&&J(l.d)?(I.paths=I.initPath(c,c.pathArray,l.d),I.toD=l.d,e=0,k=1):c.attr?e=c.attr(v):(e=parseFloat(x(c,v))||0,"opacity"!==v&&(q="px"));k||(k=g);"string"===typeof k&&k.match("px")&&(k=k.replace(/px/g,""));I.run(e,k,q)})},animObject:r,getDeferredAnimation:function(c,g,f){var e=r(g),a=0,k=0;(f?[f]:c.series).forEach(function(c){c=r(c.options.animation);a=g&&z(g.defer)?e.defer:Math.max(a,
c.duration+c.defer);k=Math.min(e.duration,c.duration)});c.renderer.forExport&&(a=0);return{defer:Math.max(0,a-k),duration:Math.min(a,k)}},setAnimation:function(e,g){g.renderer.globalAnimation=c(e,g.options.chart.animation,!0)},stop:E}});M(a,"Core/Renderer/HTML/AST.js",[a["Core/Globals.js"],a["Core/Utilities.js"]],function(a,w){var r=a.SVG_NS,E=w.attr,z=w.createElement,x=w.discardElement,J=w.error,u=w.isString,n=w.objectEach,m=w.splat;try{var g=!!(new DOMParser).parseFromString("","text/html")}catch(c){g=
!1}w=function(){function c(c){this.nodes="string"===typeof c?this.parseMarkup(c):c}c.filterUserAttributes=function(e){n(e,function(g,f){var a=!0;-1===c.allowedAttributes.indexOf(f)&&(a=!1);-1!==["background","dynsrc","href","lowsrc","src"].indexOf(f)&&(a=u(g)&&c.allowedReferences.some(function(c){return 0===g.indexOf(c)}));a||(J("Highcharts warning: Invalid attribute '"+f+"' in config"),delete e[f])});return e};c.setElementHTML=function(e,g){e.innerHTML="";g&&(new c(g)).addToDOM(e)};c.prototype.addToDOM=
function(e){function g(e,l){var f;m(e).forEach(function(e){var k=e.tagName,q=e.textContent?a.doc.createTextNode(e.textContent):void 0;if(k)if("#text"===k)var v=q;else if(-1!==c.allowedTags.indexOf(k)){k=a.doc.createElementNS("svg"===k?r:l.namespaceURI||r,k);var m=e.attributes||{};n(e,function(c,h){"tagName"!==h&&"attributes"!==h&&"children"!==h&&"textContent"!==h&&(m[h]=c)});E(k,c.filterUserAttributes(m));q&&k.appendChild(q);g(e.children||[],k);v=k}else J("Highcharts warning: Invalid tagName '"+k+
"' in config");v&&l.appendChild(v);f=v});return f}return g(this.nodes,e)};c.prototype.parseMarkup=function(c){var e=[];c=c.trim();if(g)c=(new DOMParser).parseFromString(c,"text/html");else{var f=z("div");f.innerHTML=c;c={body:f}}var a=function(c,e){var f=c.nodeName.toLowerCase(),k={tagName:f};"#text"===f&&(k.textContent=c.textContent||"");if(f=c.attributes){var g={};[].forEach.call(f,function(c){g[c.name]=c.value});k.attributes=g}if(c.childNodes.length){var l=[];[].forEach.call(c.childNodes,function(c){a(c,
l)});l.length&&(k.children=l)}e.push(k)};[].forEach.call(c.body.childNodes,function(c){return a(c,e)});f&&x(f);return e};c.allowedAttributes="aria-controls aria-describedby aria-expanded aria-haspopup aria-hidden aria-label aria-labelledby aria-live aria-pressed aria-readonly aria-roledescription aria-selected class clip-path color colspan cx cy d dx dy disabled fill height href id in markerHeight markerWidth offset opacity orient padding paddingLeft paddingRight patternUnits r refX refY role scope slope src startOffset stdDeviation stroke stroke-linecap stroke-width style tableValues result rowspan summary target tabindex text-align textAnchor textLength type valign width x x1 x2 y y1 y2 zIndex".split(" ");
c.allowedReferences="https:// http:// mailto: / ../ ./ #".split(" ");c.allowedTags="a b br button caption circle clipPath code dd defs div dl dt em feComponentTransfer feFuncA feFuncB feFuncG feFuncR feGaussianBlur feOffset feMerge feMergeNode filter h1 h2 h3 h4 h5 h6 hr i img li linearGradient marker ol p path pattern pre rect small span stop strong style sub sup svg table text thead tbody tspan td th tr u ul #text".split(" ");return c}();"";return w});M(a,"Core/FormatUtilities.js",[a["Core/DefaultOptions.js"],
a["Core/Utilities.js"]],function(a,w){function r(a,g,c,e){a=+a||0;g=+g;var l=E.lang,f=(a.toString().split(".")[1]||"").split("e")[0].length,v=a.toString().split("e"),q=g;if(-1===g)g=Math.min(f,20);else if(!J(g))g=2;else if(g&&v[1]&&0>v[1]){var k=g+ +v[1];0<=k?(v[0]=(+v[0]).toExponential(k).split("e")[0],g=k):(v[0]=v[0].split(".")[0]||0,a=20>g?(v[0]*Math.pow(10,v[1])).toFixed(g):0,v[1]=0)}k=(Math.abs(v[1]?v[0]:a)+Math.pow(10,-Math.max(g,f)-1)).toFixed(g);f=String(n(k));var m=3<f.length?f.length%3:
0;c=u(c,l.decimalPoint);e=u(e,l.thousandsSep);a=(0>a?"-":"")+(m?f.substr(0,m)+e:"");a=0>+v[1]&&!q?"0":a+f.substr(m).replace(/(\d{3})(?=\d)/g,"$1"+e);g&&(a+=c+k.slice(-g));v[1]&&0!==+a&&(a+="e"+v[1]);return a}var E=a.defaultOptions,z=a.defaultTime,x=w.getNestedProperty,J=w.isNumber,u=w.pick,n=w.pInt;return{dateFormat:function(a,g,c){return z.dateFormat(a,g,c)},format:function(a,g,c){var e="{",l=!1,f=/f$/,v=/\.([0-9])/,q=E.lang,k=c&&c.time||z;c=c&&c.numberFormatter||r;for(var m=[];a;){var D=a.indexOf(e);
if(-1===D)break;var B=a.slice(0,D);if(l){B=B.split(":");e=x(B.shift()||"",g);if(B.length&&"number"===typeof e)if(B=B.join(":"),f.test(B)){var u=parseInt((B.match(v)||["","-1"])[1],10);null!==e&&(e=c(e,u,q.decimalPoint,-1<B.indexOf(",")?q.thousandsSep:""))}else e=k.dateFormat(B,e);m.push(e)}else m.push(B);a=a.slice(D+1);e=(l=!l)?"}":"{"}m.push(a);return m.join("")},numberFormat:r}});M(a,"Core/Renderer/RendererUtilities.js",[a["Core/Utilities.js"]],function(a){var r=a.clamp,C=a.pick,E=a.stableSort,
z;(function(a){function x(a,n,m){var g=a,c=g.reducedLen||n,e=function(c,e){return(e.rank||0)-(c.rank||0)},l=function(c,e){return c.target-e.target},f,v=!0,q=[],k=0;for(f=a.length;f--;)k+=a[f].size;if(k>c){E(a,e);for(k=f=0;k<=c;)k+=a[f].size,f++;q=a.splice(f-1,a.length)}E(a,l);for(a=a.map(function(c){return{size:c.size,targets:[c.target],align:C(c.align,.5)}});v;){for(f=a.length;f--;)c=a[f],e=(Math.min.apply(0,c.targets)+Math.max.apply(0,c.targets))/2,c.pos=r(e-c.size*c.align,0,n-c.size);f=a.length;
for(v=!1;f--;)0<f&&a[f-1].pos+a[f-1].size>a[f].pos&&(a[f-1].size+=a[f].size,a[f-1].targets=a[f-1].targets.concat(a[f].targets),a[f-1].align=.5,a[f-1].pos+a[f-1].size>n&&(a[f-1].pos=n-a[f-1].size),a.splice(f,1),v=!0)}g.push.apply(g,q);f=0;a.some(function(c){var e=0;return(c.targets||[]).some(function(){g[f].pos=c.pos+e;if("undefined"!==typeof m&&Math.abs(g[f].pos-g[f].target)>m)return g.slice(0,f+1).forEach(function(c){return delete c.pos}),g.reducedLen=(g.reducedLen||n)-.1*n,g.reducedLen>.1*n&&x(g,
n,m),!0;e+=g[f].size;f++;return!1})});E(g,l);return g}a.distribute=x})(z||(z={}));return z});M(a,"Core/Renderer/SVG/SVGElement.js",[a["Core/Animation/AnimationUtilities.js"],a["Core/Renderer/HTML/AST.js"],a["Core/Color/Color.js"],a["Core/Globals.js"],a["Core/Color/Palette.js"],a["Core/Utilities.js"]],function(a,w,C,E,z,x){var r=a.animate,u=a.animObject,n=a.stop,m=E.deg2rad,g=E.doc,c=E.noop,e=E.svg,l=E.SVG_NS,f=E.win,v=x.addEvent,q=x.attr,k=x.createElement,I=x.css,D=x.defined,B=x.erase,O=x.extend,
t=x.fireEvent,h=x.isArray,d=x.isFunction,b=x.isNumber,p=x.isString,G=x.merge,y=x.objectEach,L=x.pick,F=x.pInt,P=x.syncTimeout,S=x.uniqueKey;a=function(){function a(){this.element=void 0;this.onEvents={};this.opacity=1;this.renderer=void 0;this.SVG_NS=l;this.symbolCustomAttribs="x y width height r start end innerR anchorX anchorY rounded".split(" ")}a.prototype._defaultGetter=function(b){b=L(this[b+"Value"],this[b],this.element?this.element.getAttribute(b):null,0);/^[\-0-9\.]+$/.test(b)&&(b=parseFloat(b));
return b};a.prototype._defaultSetter=function(b,d,c){c.setAttribute(d,b)};a.prototype.add=function(b){var d=this.renderer,c=this.element;b&&(this.parentGroup=b);this.parentInverted=b&&b.inverted;"undefined"!==typeof this.textStr&&"text"===this.element.nodeName&&d.buildText(this);this.added=!0;if(!b||b.handleZ||this.zIndex)var K=this.zIndexSetter();K||(b?b.element:d.box).appendChild(c);if(this.onAdd)this.onAdd();return this};a.prototype.addClass=function(b,d){var c=d?"":this.attr("class")||"";b=(b||
"").split(/ /g).reduce(function(b,d){-1===c.indexOf(d)&&b.push(d);return b},c?[c]:[]).join(" ");b!==c&&this.attr("class",b);return this};a.prototype.afterSetters=function(){this.doTransform&&(this.updateTransform(),this.doTransform=!1)};a.prototype.align=function(b,d,c){var K={},h=this.renderer,H=h.alignedObjects,a,e,A;if(b){if(this.alignOptions=b,this.alignByTranslate=d,!c||p(c))this.alignTo=a=c||"renderer",B(H,this),H.push(this),c=void 0}else b=this.alignOptions,d=this.alignByTranslate,a=this.alignTo;
c=L(c,h[a],"scrollablePlotBox"===a?h.plotBox:void 0,h);a=b.align;var f=b.verticalAlign;h=(c.x||0)+(b.x||0);H=(c.y||0)+(b.y||0);"right"===a?e=1:"center"===a&&(e=2);e&&(h+=(c.width-(b.width||0))/e);K[d?"translateX":"x"]=Math.round(h);"bottom"===f?A=1:"middle"===f&&(A=2);A&&(H+=(c.height-(b.height||0))/A);K[d?"translateY":"y"]=Math.round(H);this[this.placed?"animate":"attr"](K);this.placed=!0;this.alignAttr=K;return this};a.prototype.alignSetter=function(b){var d={left:"start",center:"middle",right:"end"};
d[b]&&(this.alignValue=b,this.element.setAttribute("text-anchor",d[b]))};a.prototype.animate=function(b,d,c){var h=this,H=u(L(d,this.renderer.globalAnimation,!0));d=H.defer;L(g.hidden,g.msHidden,g.webkitHidden,!1)&&(H.duration=0);0!==H.duration?(c&&(H.complete=c),P(function(){h.element&&r(h,b,H)},d)):(this.attr(b,void 0,c),y(b,function(b,d){H.step&&H.step.call(this,b,{prop:d,pos:1,elem:this})},this));return this};a.prototype.applyTextOutline=function(b){var d=this.element;-1!==b.indexOf("contrast")&&
(b=b.replace(/contrast/g,this.renderer.getContrast(d.style.fill)));var c=b.split(" ");b=c[c.length-1];if((c=c[0])&&"none"!==c&&E.svg){this.fakeTS=!0;this.ySetter=this.xSetter;c=c.replace(/(^[\d\.]+)(.*?)$/g,function(b,d,c){return 2*Number(d)+c});this.removeTextOutline();var h=g.createElementNS(l,"tspan");q(h,{"class":"highcharts-text-outline",fill:b,stroke:b,"stroke-width":c,"stroke-linejoin":"round"});[].forEach.call(d.childNodes,function(b){var d=b.cloneNode(!0);d.removeAttribute&&["fill","stroke",
"stroke-width","stroke"].forEach(function(b){return d.removeAttribute(b)});h.appendChild(d)});var a=g.createElementNS(l,"tspan");a.textContent="\u200b";["x","y"].forEach(function(b){var c=d.getAttribute(b);c&&a.setAttribute(b,c)});h.appendChild(a);d.insertBefore(h,d.firstChild)}};a.prototype.attr=function(b,d,c,h){var K=this.element,H=this.symbolCustomAttribs,a,e=this,A,p;if("string"===typeof b&&"undefined"!==typeof d){var f=b;b={};b[f]=d}"string"===typeof b?e=(this[b+"Getter"]||this._defaultGetter).call(this,
b,K):(y(b,function(d,c){A=!1;h||n(this,c);this.symbolName&&-1!==H.indexOf(c)&&(a||(this.symbolAttr(b),a=!0),A=!0);!this.rotation||"x"!==c&&"y"!==c||(this.doTransform=!0);A||(p=this[c+"Setter"]||this._defaultSetter,p.call(this,d,c,K),!this.styledMode&&this.shadows&&/^(width|height|visibility|x|y|d|transform|cx|cy|r)$/.test(c)&&this.updateShadows(c,d,p))},this),this.afterSetters());c&&c.call(this);return e};a.prototype.clip=function(b){return this.attr("clip-path",b?"url("+this.renderer.url+"#"+b.id+
")":"none")};a.prototype.crisp=function(b,d){d=d||b.strokeWidth||0;var c=Math.round(d)%2/2;b.x=Math.floor(b.x||this.x||0)+c;b.y=Math.floor(b.y||this.y||0)+c;b.width=Math.floor((b.width||this.width||0)-2*c);b.height=Math.floor((b.height||this.height||0)-2*c);D(b.strokeWidth)&&(b.strokeWidth=d);return b};a.prototype.complexColor=function(b,d,c){var K=this.renderer,a,H,e,p,A,f,k,g,l,q,v=[],F;t(this.renderer,"complexColor",{args:arguments},function(){b.radialGradient?H="radialGradient":b.linearGradient&&
(H="linearGradient");if(H){e=b[H];A=K.gradients;f=b.stops;l=c.radialReference;h(e)&&(b[H]=e={x1:e[0],y1:e[1],x2:e[2],y2:e[3],gradientUnits:"userSpaceOnUse"});"radialGradient"===H&&l&&!D(e.gradientUnits)&&(p=e,e=G(e,K.getRadialAttr(l,p),{gradientUnits:"userSpaceOnUse"}));y(e,function(b,d){"id"!==d&&v.push(d,b)});y(f,function(b){v.push(b)});v=v.join(",");if(A[v])q=A[v].attr("id");else{e.id=q=S();var N=A[v]=K.createElement(H).attr(e).add(K.defs);N.radAttr=p;N.stops=[];f.forEach(function(b){0===b[1].indexOf("rgba")?
(a=C.parse(b[1]),k=a.get("rgb"),g=a.get("a")):(k=b[1],g=1);b=K.createElement("stop").attr({offset:b[0],"stop-color":k,"stop-opacity":g}).add(N);N.stops.push(b)})}F="url("+K.url+"#"+q+")";c.setAttribute(d,F);c.gradient=v;b.toString=function(){return F}}})};a.prototype.css=function(b){var d=this.styles,c={},h=this.element,a=["textOutline","textOverflow","width"],p="",f=!d;b&&b.color&&(b.fill=b.color);d&&y(b,function(b,h){d&&d[h]!==b&&(c[h]=b,f=!0)});if(f){d&&(b=O(d,c));if(b)if(null===b.width||"auto"===
b.width)delete this.textWidth;else if("text"===h.nodeName.toLowerCase()&&b.width)var k=this.textWidth=F(b.width);this.styles=b;k&&!e&&this.renderer.forExport&&delete b.width;if(h.namespaceURI===this.SVG_NS){var A=function(b,d){return"-"+d.toLowerCase()};y(b,function(b,d){-1===a.indexOf(d)&&(p+=d.replace(/([A-Z])/g,A)+":"+b+";")});p&&q(h,"style",p)}else I(h,b);this.added&&("text"===this.element.nodeName&&this.renderer.buildText(this),b&&b.textOutline&&this.applyTextOutline(b.textOutline))}return this};
a.prototype.dashstyleSetter=function(b){var d=this["stroke-width"];"inherit"===d&&(d=1);if(b=b&&b.toLowerCase()){var c=b.replace("shortdashdotdot","3,1,1,1,1,1,").replace("shortdashdot","3,1,1,1").replace("shortdot","1,1,").replace("shortdash","3,1,").replace("longdash","8,3,").replace(/dot/g,"1,3,").replace("dash","4,3,").replace(/,$/,"").split(",");for(b=c.length;b--;)c[b]=""+F(c[b])*L(d,NaN);b=c.join(",").replace(/NaN/g,"none");this.element.setAttribute("stroke-dasharray",b)}};a.prototype.destroy=
function(){var b=this,d=b.element||{},c=b.renderer,h=d.ownerSVGElement,a=c.isSVG&&"SPAN"===d.nodeName&&b.parentGroup||void 0;d.onclick=d.onmouseout=d.onmouseover=d.onmousemove=d.point=null;n(b);if(b.clipPath&&h){var e=b.clipPath;[].forEach.call(h.querySelectorAll("[clip-path],[CLIP-PATH]"),function(b){-1<b.getAttribute("clip-path").indexOf(e.element.id)&&b.removeAttribute("clip-path")});b.clipPath=e.destroy()}if(b.stops){for(h=0;h<b.stops.length;h++)b.stops[h].destroy();b.stops.length=0;b.stops=void 0}b.safeRemoveChild(d);
for(c.styledMode||b.destroyShadows();a&&a.div&&0===a.div.childNodes.length;)d=a.parentGroup,b.safeRemoveChild(a.div),delete a.div,a=d;b.alignTo&&B(c.alignedObjects,b);y(b,function(d,c){b[c]&&b[c].parentGroup===b&&b[c].destroy&&b[c].destroy();delete b[c]})};a.prototype.destroyShadows=function(){(this.shadows||[]).forEach(function(b){this.safeRemoveChild(b)},this);this.shadows=void 0};a.prototype.destroyTextPath=function(b,d){var c=b.getElementsByTagName("text")[0];if(c){if(c.removeAttribute("dx"),
c.removeAttribute("dy"),d.element.setAttribute("id",""),this.textPathWrapper&&c.getElementsByTagName("textPath").length){for(b=this.textPathWrapper.element.childNodes;b.length;)c.appendChild(b[0]);c.removeChild(this.textPathWrapper.element)}}else if(b.getAttribute("dx")||b.getAttribute("dy"))b.removeAttribute("dx"),b.removeAttribute("dy");this.textPathWrapper&&(this.textPathWrapper=this.textPathWrapper.destroy())};a.prototype.dSetter=function(b,d,c){h(b)&&("string"===typeof b[0]&&(b=this.renderer.pathToSegments(b)),
this.pathArray=b,b=b.reduce(function(b,d,c){return d&&d.join?(c?b+" ":"")+d.join(" "):(d||"").toString()},""));/(NaN| {2}|^$)/.test(b)&&(b="M 0 0");this[d]!==b&&(c.setAttribute(d,b),this[d]=b)};a.prototype.fadeOut=function(b){var d=this;d.animate({opacity:0},{duration:L(b,150),complete:function(){d.attr({y:-9999}).hide()}})};a.prototype.fillSetter=function(b,d,c){"string"===typeof b?c.setAttribute(d,b):b&&this.complexColor(b,d,c)};a.prototype.getBBox=function(b,c){var h=this.renderer,K=this.element,
e=this.styles,p=this.textStr,f=h.cache,k=h.cacheKeys,A=K.namespaceURI===this.SVG_NS;c=L(c,this.rotation,0);var g=h.styledMode?K&&a.prototype.getStyle.call(K,"font-size"):e&&e.fontSize,y;if(D(p)){var G=p.toString();-1===G.indexOf("<")&&(G=G.replace(/[0-9]/g,"0"));G+=["",c,g,this.textWidth,e&&e.textOverflow,e&&e.fontWeight].join()}G&&!b&&(y=f[G]);if(!y){if(A||h.forExport){try{var l=this.fakeTS&&function(b){var d=K.querySelector(".highcharts-text-outline");d&&I(d,{display:b})};d(l)&&l("none");y=K.getBBox?
O({},K.getBBox()):{width:K.offsetWidth,height:K.offsetHeight};d(l)&&l("")}catch(Y){""}if(!y||0>y.width)y={width:0,height:0}}else y=this.htmlGetBBox();h.isSVG&&(b=y.width,h=y.height,A&&(y.height=h={"11px,17":14,"13px,20":16}[e&&e.fontSize+","+Math.round(h)]||h),c&&(e=c*m,y.width=Math.abs(h*Math.sin(e))+Math.abs(b*Math.cos(e)),y.height=Math.abs(h*Math.cos(e))+Math.abs(b*Math.sin(e))));if(G&&(""===p||0<y.height)){for(;250<k.length;)delete f[k.shift()];f[G]||k.push(G);f[G]=y}}return y};a.prototype.getStyle=
function(b){return f.getComputedStyle(this.element||this,"").getPropertyValue(b)};a.prototype.hasClass=function(b){return-1!==(""+this.attr("class")).split(" ").indexOf(b)};a.prototype.hide=function(b){b?this.attr({y:-9999}):this.attr({visibility:"hidden"});return this};a.prototype.htmlGetBBox=function(){return{height:0,width:0,x:0,y:0}};a.prototype.init=function(b,d){this.element="span"===d?k(d):g.createElementNS(this.SVG_NS,d);this.renderer=b;t(this,"afterInit")};a.prototype.invert=function(b){this.inverted=
b;this.updateTransform();return this};a.prototype.on=function(b,d){var c=this.onEvents;if(c[b])c[b]();c[b]=v(this.element,b,d);return this};a.prototype.opacitySetter=function(b,d,c){this.opacity=b=Number(Number(b).toFixed(3));c.setAttribute(d,b)};a.prototype.removeClass=function(b){return this.attr("class",(""+this.attr("class")).replace(p(b)?new RegExp("(^| )"+b+"( |$)"):b," ").replace(/ +/g," ").trim())};a.prototype.removeTextOutline=function(){var b=this.element.querySelector("tspan.highcharts-text-outline");
b&&this.safeRemoveChild(b)};a.prototype.safeRemoveChild=function(b){var d=b.parentNode;d&&d.removeChild(b)};a.prototype.setRadialReference=function(b){var d=this.element.gradient&&this.renderer.gradients[this.element.gradient];this.element.radialReference=b;d&&d.radAttr&&d.animate(this.renderer.getRadialAttr(b,d.radAttr));return this};a.prototype.setTextPath=function(d,h){var a=this.element,K=this.text?this.text.element:a,e={textAnchor:"text-anchor"},p=!1,f=this.textPathWrapper,k=!f;h=G(!0,{enabled:!0,
attributes:{dy:-5,startOffset:"50%",textAnchor:"middle"}},h);var A=w.filterUserAttributes(h.attributes);if(d&&h&&h.enabled){f&&null===f.element.parentNode?(k=!0,f=f.destroy()):f&&this.removeTextOutline.call(f.parentGroup);this.options&&this.options.padding&&(A.dx=-this.options.padding);f||(this.textPathWrapper=f=this.renderer.createElement("textPath"),p=!0);var g=f.element;(h=d.element.getAttribute("id"))||d.element.setAttribute("id",h=S());if(k)for(K.setAttribute("y",0),b(A.dx)&&K.setAttribute("x",
-A.dx),d=[].slice.call(K.childNodes),k=0;k<d.length;k++){var l=d[k];l.nodeType!==Node.TEXT_NODE&&"tspan"!==l.nodeName||g.appendChild(l)}p&&f&&f.add({element:K});g.setAttributeNS("http://www.w3.org/1999/xlink","href",this.renderer.url+"#"+h);D(A.dy)&&(g.parentNode.setAttribute("dy",A.dy),delete A.dy);D(A.dx)&&(g.parentNode.setAttribute("dx",A.dx),delete A.dx);y(A,function(b,d){g.setAttribute(e[d]||d,b)});a.removeAttribute("transform");this.removeTextOutline.call(f);this.text&&!this.renderer.styledMode&&
this.attr({fill:"none","stroke-width":0});this.applyTextOutline=this.updateTransform=c}else f&&(delete this.updateTransform,delete this.applyTextOutline,this.destroyTextPath(a,d),this.updateTransform(),this.options&&this.options.rotation&&this.applyTextOutline(this.options.style.textOutline));return this};a.prototype.shadow=function(b,d,c){var h=[],a=this.element,e=this.oldShadowOptions,H={color:z.neutralColor100,offsetX:this.parentInverted?-1:1,offsetY:this.parentInverted?-1:1,opacity:.15,width:3},
p=!1,A;!0===b?A=H:"object"===typeof b&&(A=O(H,b));A&&(A&&e&&y(A,function(b,d){b!==e[d]&&(p=!0)}),p&&this.destroyShadows(),this.oldShadowOptions=A);if(!A)this.destroyShadows();else if(!this.shadows){var f=A.opacity/A.width;var k=this.parentInverted?"translate("+A.offsetY+", "+A.offsetX+")":"translate("+A.offsetX+", "+A.offsetY+")";for(H=1;H<=A.width;H++){var g=a.cloneNode(!1);var G=2*A.width+1-2*H;q(g,{stroke:b.color||z.neutralColor100,"stroke-opacity":f*H,"stroke-width":G,transform:k,fill:"none"});
g.setAttribute("class",(g.getAttribute("class")||"")+" highcharts-shadow");c&&(q(g,"height",Math.max(q(g,"height")-G,0)),g.cutHeight=G);d?d.element.appendChild(g):a.parentNode&&a.parentNode.insertBefore(g,a);h.push(g)}this.shadows=h}return this};a.prototype.show=function(b){return this.attr({visibility:b?"inherit":"visible"})};a.prototype.strokeSetter=function(b,d,c){this[d]=b;this.stroke&&this["stroke-width"]?(a.prototype.fillSetter.call(this,this.stroke,"stroke",c),c.setAttribute("stroke-width",
this["stroke-width"]),this.hasStroke=!0):"stroke-width"===d&&0===b&&this.hasStroke?(c.removeAttribute("stroke"),this.hasStroke=!1):this.renderer.styledMode&&this["stroke-width"]&&(c.setAttribute("stroke-width",this["stroke-width"]),this.hasStroke=!0)};a.prototype.strokeWidth=function(){if(!this.renderer.styledMode)return this["stroke-width"]||0;var b=this.getStyle("stroke-width"),d=0;if(b.indexOf("px")===b.length-2)d=F(b);else if(""!==b){var c=g.createElementNS(l,"rect");q(c,{width:b,"stroke-width":0});
this.element.parentNode.appendChild(c);d=c.getBBox().width;c.parentNode.removeChild(c)}return d};a.prototype.symbolAttr=function(b){var d=this;"x y r start end width height innerR anchorX anchorY clockwise".split(" ").forEach(function(c){d[c]=L(b[c],d[c])});d.attr({d:d.renderer.symbols[d.symbolName](d.x,d.y,d.width,d.height,d)})};a.prototype.textSetter=function(b){b!==this.textStr&&(delete this.textPxLength,this.textStr=b,this.added&&this.renderer.buildText(this))};a.prototype.titleSetter=function(b){var d=
this.element,c=d.getElementsByTagName("title")[0]||g.createElementNS(this.SVG_NS,"title");d.insertBefore?d.insertBefore(c,d.firstChild):d.appendChild(c);c.textContent=String(L(b,"")).replace(/<[^>]*>/g,"").replace(/&lt;/g,"<").replace(/&gt;/g,">")};a.prototype.toFront=function(){var b=this.element;b.parentNode.appendChild(b);return this};a.prototype.translate=function(b,d){return this.attr({translateX:b,translateY:d})};a.prototype.updateShadows=function(b,d,c){var h=this.shadows;if(h)for(var a=h.length;a--;)c.call(h[a],
"height"===b?Math.max(d-(h[a].cutHeight||0),0):"d"===b?this.d:d,b,h[a])};a.prototype.updateTransform=function(){var b=this.scaleX,d=this.scaleY,c=this.inverted,h=this.rotation,a=this.matrix,e=this.element,p=this.translateX||0,f=this.translateY||0;c&&(p+=this.width,f+=this.height);p=["translate("+p+","+f+")"];D(a)&&p.push("matrix("+a.join(",")+")");c?p.push("rotate(90) scale(-1,1)"):h&&p.push("rotate("+h+" "+L(this.rotationOriginX,e.getAttribute("x"),0)+" "+L(this.rotationOriginY,e.getAttribute("y")||
0)+")");(D(b)||D(d))&&p.push("scale("+L(b,1)+" "+L(d,1)+")");p.length&&e.setAttribute("transform",p.join(" "))};a.prototype.visibilitySetter=function(b,d,c){"inherit"===b?c.removeAttribute(d):this[d]!==b&&c.setAttribute(d,b);this[d]=b};a.prototype.xGetter=function(b){"circle"===this.element.nodeName&&("x"===b?b="cx":"y"===b&&(b="cy"));return this._defaultGetter(b)};a.prototype.zIndexSetter=function(b,d){var c=this.renderer,h=this.parentGroup,a=(h||c).element||c.box,e=this.element;c=a===c.box;var p=
!1;var f=this.added;var A;D(b)?(e.setAttribute("data-z-index",b),b=+b,this[d]===b&&(f=!1)):D(this[d])&&e.removeAttribute("data-z-index");this[d]=b;if(f){(b=this.zIndex)&&h&&(h.handleZ=!0);d=a.childNodes;for(A=d.length-1;0<=A&&!p;A--){h=d[A];f=h.getAttribute("data-z-index");var k=!D(f);if(h!==e)if(0>b&&k&&!c&&!A)a.insertBefore(e,d[A]),p=!0;else if(F(f)<=b||k&&(!D(b)||0<=b))a.insertBefore(e,d[A+1]||null),p=!0}p||(a.insertBefore(e,d[c?3:0]||null),p=!0)}return p};return a}();a.prototype["stroke-widthSetter"]=
a.prototype.strokeSetter;a.prototype.yGetter=a.prototype.xGetter;a.prototype.matrixSetter=a.prototype.rotationOriginXSetter=a.prototype.rotationOriginYSetter=a.prototype.rotationSetter=a.prototype.scaleXSetter=a.prototype.scaleYSetter=a.prototype.translateXSetter=a.prototype.translateYSetter=a.prototype.verticalAlignSetter=function(b,d){this[d]=b;this.doTransform=!0};"";return a});M(a,"Core/Renderer/RendererRegistry.js",[a["Core/Globals.js"]],function(a){var r;(function(r){r.rendererTypes={};var w;
r.getRendererType=function(a){void 0===a&&(a=w);return r.rendererTypes[a]||r.rendererTypes[w]};r.registerRendererType=function(C,x,E){r.rendererTypes[C]=x;if(!w||E)w=C,a.Renderer=x}})(r||(r={}));return r});M(a,"Core/Renderer/SVG/SVGLabel.js",[a["Core/Renderer/SVG/SVGElement.js"],a["Core/Utilities.js"]],function(a,w){var r=this&&this.__extends||function(){var a=function(g,c){a=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(c,a){c.__proto__=a}||function(c,a){for(var e in a)a.hasOwnProperty(e)&&
(c[e]=a[e])};return a(g,c)};return function(g,c){function e(){this.constructor=g}a(g,c);g.prototype=null===c?Object.create(c):(e.prototype=c.prototype,new e)}}(),E=w.defined,z=w.extend,x=w.isNumber,J=w.merge,u=w.pick,n=w.removeEvent;return function(m){function g(c,a,l,f,v,q,k,I,D,B){var e=m.call(this)||this;e.paddingLeftSetter=e.paddingSetter;e.paddingRightSetter=e.paddingSetter;e.init(c,"g");e.textStr=a;e.x=l;e.y=f;e.anchorX=q;e.anchorY=k;e.baseline=D;e.className=B;e.addClass("button"===B?"highcharts-no-tooltip":
"highcharts-label");B&&e.addClass("highcharts-"+B);e.text=c.text(void 0,0,0,I).attr({zIndex:1});var t;"string"===typeof v&&((t=/^url\((.*?)\)$/.test(v))||e.renderer.symbols[v])&&(e.symbolKey=v);e.bBox=g.emptyBBox;e.padding=3;e.baselineOffset=0;e.needsBox=c.styledMode||t;e.deferredAttr={};e.alignFactor=0;return e}r(g,m);g.prototype.alignSetter=function(c){c={left:0,center:.5,right:1}[c];c!==this.alignFactor&&(this.alignFactor=c,this.bBox&&x(this.xSetting)&&this.attr({x:this.xSetting}))};g.prototype.anchorXSetter=
function(c,a){this.anchorX=c;this.boxAttr(a,Math.round(c)-this.getCrispAdjust()-this.xSetting)};g.prototype.anchorYSetter=function(c,a){this.anchorY=c;this.boxAttr(a,c-this.ySetting)};g.prototype.boxAttr=function(c,a){this.box?this.box.attr(c,a):this.deferredAttr[c]=a};g.prototype.css=function(c){if(c){var e={};c=J(c);g.textProps.forEach(function(a){"undefined"!==typeof c[a]&&(e[a]=c[a],delete c[a])});this.text.css(e);var l="width"in e;"fontSize"in e||"fontWeight"in e?this.updateTextPadding():l&&
this.updateBoxSize()}return a.prototype.css.call(this,c)};g.prototype.destroy=function(){n(this.element,"mouseenter");n(this.element,"mouseleave");this.text&&this.text.destroy();this.box&&(this.box=this.box.destroy());a.prototype.destroy.call(this)};g.prototype.fillSetter=function(c,a){c&&(this.needsBox=!0);this.fill=c;this.boxAttr(a,c)};g.prototype.getBBox=function(){this.textStr&&0===this.bBox.width&&0===this.bBox.height&&this.updateBoxSize();var c=this.padding,a=u(this.paddingLeft,c);return{width:this.width,
height:this.height,x:this.bBox.x-a,y:this.bBox.y-c}};g.prototype.getCrispAdjust=function(){return this.renderer.styledMode&&this.box?this.box.strokeWidth()%2/2:(this["stroke-width"]?parseInt(this["stroke-width"],10):0)%2/2};g.prototype.heightSetter=function(c){this.heightSetting=c};g.prototype.onAdd=function(){var c=this.textStr;this.text.add(this);this.attr({text:E(c)?c:"",x:this.x,y:this.y});this.box&&E(this.anchorX)&&this.attr({anchorX:this.anchorX,anchorY:this.anchorY})};g.prototype.paddingSetter=
function(c,a){x(c)?c!==this[a]&&(this[a]=c,this.updateTextPadding()):this[a]=void 0};g.prototype.rSetter=function(c,a){this.boxAttr(a,c)};g.prototype.shadow=function(c){c&&!this.renderer.styledMode&&(this.updateBoxSize(),this.box&&this.box.shadow(c));return this};g.prototype.strokeSetter=function(c,a){this.stroke=c;this.boxAttr(a,c)};g.prototype["stroke-widthSetter"]=function(c,a){c&&(this.needsBox=!0);this["stroke-width"]=c;this.boxAttr(a,c)};g.prototype["text-alignSetter"]=function(c){this.textAlign=
c};g.prototype.textSetter=function(c){"undefined"!==typeof c&&this.text.attr({text:c});this.updateTextPadding()};g.prototype.updateBoxSize=function(){var c=this.text.element.style,a={},l=this.padding,f=this.bBox=x(this.widthSetting)&&x(this.heightSetting)&&!this.textAlign||!E(this.text.textStr)?g.emptyBBox:this.text.getBBox();this.width=this.getPaddedWidth();this.height=(this.heightSetting||f.height||0)+2*l;c=this.renderer.fontMetrics(c&&c.fontSize,this.text);this.baselineOffset=l+Math.min((this.text.firstLineMetrics||
c).b,f.height||Infinity);this.heightSetting&&(this.baselineOffset+=(this.heightSetting-c.h)/2);this.needsBox&&(this.box||(l=this.box=this.symbolKey?this.renderer.symbol(this.symbolKey):this.renderer.rect(),l.addClass(("button"===this.className?"":"highcharts-label-box")+(this.className?" highcharts-"+this.className+"-box":"")),l.add(this)),l=this.getCrispAdjust(),a.x=l,a.y=(this.baseline?-this.baselineOffset:0)+l,a.width=Math.round(this.width),a.height=Math.round(this.height),this.box.attr(z(a,this.deferredAttr)),
this.deferredAttr={})};g.prototype.updateTextPadding=function(){var c=this.text;this.updateBoxSize();var a=this.baseline?0:this.baselineOffset,g=u(this.paddingLeft,this.padding);E(this.widthSetting)&&this.bBox&&("center"===this.textAlign||"right"===this.textAlign)&&(g+={center:.5,right:1}[this.textAlign]*(this.widthSetting-this.bBox.width));if(g!==c.x||a!==c.y)c.attr("x",g),c.hasBoxWidthChanged&&(this.bBox=c.getBBox(!0)),"undefined"!==typeof a&&c.attr("y",a);c.x=g;c.y=a};g.prototype.widthSetter=function(c){this.widthSetting=
x(c)?c:void 0};g.prototype.getPaddedWidth=function(){var c=this.padding,a=u(this.paddingLeft,c);c=u(this.paddingRight,c);return(this.widthSetting||this.bBox.width||0)+a+c};g.prototype.xSetter=function(c){this.x=c;this.alignFactor&&(c-=this.alignFactor*this.getPaddedWidth(),this["forceAnimate:x"]=!0);this.xSetting=Math.round(c);this.attr("translateX",this.xSetting)};g.prototype.ySetter=function(c){this.ySetting=this.y=Math.round(c);this.attr("translateY",this.ySetting)};g.emptyBBox={width:0,height:0,
x:0,y:0};g.textProps="color direction fontFamily fontSize fontStyle fontWeight lineHeight textAlign textDecoration textOutline textOverflow width".split(" ");return g}(a)});M(a,"Core/Renderer/SVG/Symbols.js",[a["Core/Utilities.js"]],function(a){function r(a,n,m,g,c){var e=[];if(c){var l=c.start||0,f=J(c.r,m);m=J(c.r,g||m);var v=(c.end||0)-.001;g=c.innerR;var q=J(c.open,.001>Math.abs((c.end||0)-l-2*Math.PI)),k=Math.cos(l),I=Math.sin(l),D=Math.cos(v),B=Math.sin(v);l=J(c.longArc,.001>v-l-Math.PI?0:1);
e.push(["M",a+f*k,n+m*I],["A",f,m,0,l,J(c.clockwise,1),a+f*D,n+m*B]);z(g)&&e.push(q?["M",a+g*D,n+g*B]:["L",a+g*D,n+g*B],["A",g,g,0,l,z(c.clockwise)?1-c.clockwise:0,a+g*k,n+g*I]);q||e.push(["Z"])}return e}function C(a,n,m,g,c){return c&&c.r?E(a,n,m,g,c):[["M",a,n],["L",a+m,n],["L",a+m,n+g],["L",a,n+g],["Z"]]}function E(a,n,m,g,c){c=c&&c.r||0;return[["M",a+c,n],["L",a+m-c,n],["C",a+m,n,a+m,n,a+m,n+c],["L",a+m,n+g-c],["C",a+m,n+g,a+m,n+g,a+m-c,n+g],["L",a+c,n+g],["C",a,n+g,a,n+g,a,n+g-c],["L",a,n+c],
["C",a,n,a,n,a+c,n]]}var z=a.defined,x=a.isNumber,J=a.pick;return{arc:r,callout:function(a,n,m,g,c){var e=Math.min(c&&c.r||0,m,g),l=e+6,f=c&&c.anchorX;c=c&&c.anchorY||0;var v=E(a,n,m,g,{r:e});if(!x(f))return v;a+f>=m?c>n+l&&c<n+g-l?v.splice(3,1,["L",a+m,c-6],["L",a+m+6,c],["L",a+m,c+6],["L",a+m,n+g-e]):v.splice(3,1,["L",a+m,g/2],["L",f,c],["L",a+m,g/2],["L",a+m,n+g-e]):0>=a+f?c>n+l&&c<n+g-l?v.splice(7,1,["L",a,c+6],["L",a-6,c],["L",a,c-6],["L",a,n+e]):v.splice(7,1,["L",a,g/2],["L",f,c],["L",a,g/2],
["L",a,n+e]):c&&c>g&&f>a+l&&f<a+m-l?v.splice(5,1,["L",f+6,n+g],["L",f,n+g+6],["L",f-6,n+g],["L",a+e,n+g]):c&&0>c&&f>a+l&&f<a+m-l&&v.splice(1,1,["L",f-6,n],["L",f,n-6],["L",f+6,n],["L",m-e,n]);return v},circle:function(a,n,m,g){return r(a+m/2,n+g/2,m/2,g/2,{start:.5*Math.PI,end:2.5*Math.PI,open:!1})},diamond:function(a,n,m,g){return[["M",a+m/2,n],["L",a+m,n+g/2],["L",a+m/2,n+g],["L",a,n+g/2],["Z"]]},rect:C,roundedRect:E,square:C,triangle:function(a,n,m,g){return[["M",a+m/2,n],["L",a+m,n+g],["L",a,
n+g],["Z"]]},"triangle-down":function(a,n,m,g){return[["M",a,n],["L",a+m,n],["L",a+m/2,n+g],["Z"]]}}});M(a,"Core/Renderer/SVG/TextBuilder.js",[a["Core/Renderer/HTML/AST.js"],a["Core/Globals.js"],a["Core/Utilities.js"]],function(a,w,C){var r=w.doc,z=w.SVG_NS,x=C.attr,J=C.isString,u=C.objectEach,n=C.pick;return function(){function m(a){var c=a.styles;this.renderer=a.renderer;this.svgElement=a;this.width=a.textWidth;this.textLineHeight=c&&c.lineHeight;this.textOutline=c&&c.textOutline;this.ellipsis=
!(!c||"ellipsis"!==c.textOverflow);this.noWrap=!(!c||"nowrap"!==c.whiteSpace);this.fontSize=c&&c.fontSize}m.prototype.buildSVG=function(){var g=this.svgElement,c=g.element,e=g.renderer,l=n(g.textStr,"").toString(),f=-1!==l.indexOf("<"),v=c.childNodes;e=this.width&&!g.added&&e.box;var q=/<br.*?>/g,k=[l,this.ellipsis,this.noWrap,this.textLineHeight,this.textOutline,this.fontSize,this.width].join();if(k!==g.textCache){g.textCache=k;delete g.actualWidth;for(k=v.length;k--;)c.removeChild(v[k]);f||this.ellipsis||
this.width||-1!==l.indexOf(" ")&&(!this.noWrap||q.test(l))?""!==l&&(e&&e.appendChild(c),l=new a(l),this.modifyTree(l.nodes),l.addToDOM(g.element),this.modifyDOM(),this.ellipsis&&-1!==(c.textContent||"").indexOf("\u2026")&&g.attr("title",this.unescapeEntities(g.textStr||"",["&lt;","&gt;"])),e&&e.removeChild(c)):c.appendChild(r.createTextNode(this.unescapeEntities(l)));J(this.textOutline)&&g.applyTextOutline&&g.applyTextOutline(this.textOutline)}};m.prototype.modifyDOM=function(){var a=this,c=this.svgElement,
e=x(c.element,"x");c.firstLineMetrics=void 0;for(var l;l=c.element.firstChild;)if(/^[\s\u200B]*$/.test(l.textContent||" "))c.element.removeChild(l);else break;[].forEach.call(c.element.querySelectorAll("tspan.highcharts-br"),function(f,g){f.nextSibling&&f.previousSibling&&(0===g&&1===f.previousSibling.nodeType&&(c.firstLineMetrics=c.renderer.fontMetrics(void 0,f.previousSibling)),x(f,{dy:a.getLineHeight(f.nextSibling),x:e}))});var f=this.width||0;if(f){var v=function(k,g){var l=k.textContent||"",
q=l.replace(/([^\^])-/g,"$1- ").split(" "),v=!a.noWrap&&(1<q.length||1<c.element.childNodes.length),t=a.getLineHeight(g),h=0,d=c.actualWidth;if(a.ellipsis)l&&a.truncate(k,l,void 0,0,Math.max(0,f-parseInt(a.fontSize||12,10)),function(b,d){return b.substring(0,d)+"\u2026"});else if(v){l=[];for(v=[];g.firstChild&&g.firstChild!==k;)v.push(g.firstChild),g.removeChild(g.firstChild);for(;q.length;)q.length&&!a.noWrap&&0<h&&(l.push(k.textContent||""),k.textContent=q.join(" ").replace(/- /g,"-")),a.truncate(k,
void 0,q,0===h?d||0:0,f,function(b,d){return q.slice(0,d).join(" ").replace(/- /g,"-")}),d=c.actualWidth,h++;v.forEach(function(b){g.insertBefore(b,k)});l.forEach(function(b){g.insertBefore(r.createTextNode(b),k);b=r.createElementNS(z,"tspan");b.textContent="\u200b";x(b,{dy:t,x:e});g.insertBefore(b,k)})}},q=function(a){[].slice.call(a.childNodes).forEach(function(e){e.nodeType===Node.TEXT_NODE?v(e,a):(-1!==e.className.baseVal.indexOf("highcharts-br")&&(c.actualWidth=0),q(e))})};q(c.element)}};m.prototype.getLineHeight=
function(a){var c;a=a.nodeType===Node.TEXT_NODE?a.parentElement:a;this.renderer.styledMode||(c=a&&/(px|em)$/.test(a.style.fontSize)?a.style.fontSize:this.fontSize||this.renderer.style.fontSize||12);return this.textLineHeight?parseInt(this.textLineHeight.toString(),10):this.renderer.fontMetrics(c,a||this.svgElement.element).h};m.prototype.modifyTree=function(a){var c=this,e=function(g,f){var l=g.tagName,q=c.renderer.styledMode,k=g.attributes||{};if("b"===l||"strong"===l)q?k["class"]="highcharts-strong":
k.style="font-weight:bold;"+(k.style||"");else if("i"===l||"em"===l)q?k["class"]="highcharts-emphasized":k.style="font-style:italic;"+(k.style||"");J(k.style)&&(k.style=k.style.replace(/(;| |^)color([ :])/,"$1fill$2"));"br"===l&&(k["class"]="highcharts-br",g.textContent="\u200b",(f=a[f+1])&&f.textContent&&(f.textContent=f.textContent.replace(/^ +/gm,"")));"#text"!==l&&"a"!==l&&(g.tagName="tspan");g.attributes=k;g.children&&g.children.filter(function(c){return"#text"!==c.tagName}).forEach(e)};a.forEach(e)};
m.prototype.truncate=function(a,c,e,l,f,v){var g=this.svgElement,k=g.renderer,m=g.rotation,D=[],B=e?1:0,n=(c||e||"").length,t=n,h,d=function(b,d){d=d||b;var h=a.parentNode;if(h&&"undefined"===typeof D[d])if(h.getSubStringLength)try{D[d]=l+h.getSubStringLength(0,e?d+1:d)}catch(L){""}else k.getSpanWidth&&(a.textContent=v(c||e,b),D[d]=l+k.getSpanWidth(g,a));return D[d]};g.rotation=0;var b=d(a.textContent.length);if(l+b>f){for(;B<=n;)t=Math.ceil((B+n)/2),e&&(h=v(e,t)),b=d(t,h&&h.length-1),B===n?B=n+1:
b>f?n=t-1:B=t;0===n?a.textContent="":c&&n===c.length-1||(a.textContent=h||v(c||e,t))}e&&e.splice(0,t);g.actualWidth=b;g.rotation=m};m.prototype.unescapeEntities=function(a,c){u(this.renderer.escapes,function(e,g){c&&-1!==c.indexOf(e)||(a=a.toString().replace(new RegExp(e,"g"),g))});return a};return m}()});M(a,"Core/Renderer/SVG/SVGRenderer.js",[a["Core/Renderer/HTML/AST.js"],a["Core/Color/Color.js"],a["Core/Globals.js"],a["Core/Color/Palette.js"],a["Core/Renderer/RendererRegistry.js"],a["Core/Renderer/SVG/SVGElement.js"],
a["Core/Renderer/SVG/SVGLabel.js"],a["Core/Renderer/SVG/Symbols.js"],a["Core/Renderer/SVG/TextBuilder.js"],a["Core/Utilities.js"]],function(a,w,C,E,z,x,J,u,n,m){var g=C.charts,c=C.deg2rad,e=C.doc,l=C.isFirefox,f=C.isMS,v=C.isWebKit,q=C.noop,k=C.SVG_NS,I=C.symbolSizes,D=C.win,B=m.addEvent,r=m.attr,t=m.createElement,h=m.css,d=m.defined,b=m.destroyObjectProperties,p=m.extend,G=m.isArray,y=m.isNumber,L=m.isObject,F=m.isString,P=m.merge,S=m.pick,Q=m.pInt,V=m.uniqueKey,fa;C=function(){function H(b,d,c,
a,h,e,p){this.width=this.url=this.style=this.isSVG=this.imgCount=this.height=this.gradients=this.globalAnimation=this.defs=this.chartIndex=this.cacheKeys=this.cache=this.boxWrapper=this.box=this.alignedObjects=void 0;this.init(b,d,c,a,h,e,p)}H.prototype.init=function(b,d,c,a,p,A,H){var K=this.createElement("svg").attr({version:"1.1","class":"highcharts-root"}),f=K.element;H||K.css(this.getStyle(a));b.appendChild(f);r(b,"dir","ltr");-1===b.innerHTML.indexOf("xmlns")&&r(f,"xmlns",this.SVG_NS);this.isSVG=
!0;this.box=f;this.boxWrapper=K;this.alignedObjects=[];this.url=this.getReferenceURL();this.createElement("desc").add().element.appendChild(e.createTextNode("Created with Highcharts 9.2.2"));this.defs=this.createElement("defs").add();this.allowHTML=A;this.forExport=p;this.styledMode=H;this.gradients={};this.cache={};this.cacheKeys=[];this.imgCount=0;this.setSize(d,c,!1);var k;l&&b.getBoundingClientRect&&(d=function(){h(b,{left:0,top:0});k=b.getBoundingClientRect();h(b,{left:Math.ceil(k.left)-k.left+
"px",top:Math.ceil(k.top)-k.top+"px"})},d(),this.unSubPixelFix=B(D,"resize",d))};H.prototype.definition=function(b){return(new a([b])).addToDOM(this.defs.element)};H.prototype.getReferenceURL=function(){if((l||v)&&e.getElementsByTagName("base").length){if(!d(fa)){var b=V();b=(new a([{tagName:"svg",attributes:{width:8,height:8},children:[{tagName:"defs",children:[{tagName:"clipPath",attributes:{id:b},children:[{tagName:"rect",attributes:{width:4,height:4}}]}]},{tagName:"rect",attributes:{id:"hitme",
width:8,height:8,"clip-path":"url(#"+b+")",fill:"rgba(0,0,0,0.001)"}}]}])).addToDOM(e.body);h(b,{position:"fixed",top:0,left:0,zIndex:9E5});var c=e.elementFromPoint(6,6);fa="hitme"===(c&&c.id);e.body.removeChild(b)}if(fa)return D.location.href.split("#")[0].replace(/<[^>]*>/g,"").replace(/([\('\)])/g,"\\$1").replace(/ /g,"%20")}return""};H.prototype.getStyle=function(b){return this.style=p({fontFamily:'"Lucida Grande", "Lucida Sans Unicode", Arial, Helvetica, sans-serif',fontSize:"12px"},b)};H.prototype.setStyle=
function(b){this.boxWrapper.css(this.getStyle(b))};H.prototype.isHidden=function(){return!this.boxWrapper.getBBox().width};H.prototype.destroy=function(){var d=this.defs;this.box=null;this.boxWrapper=this.boxWrapper.destroy();b(this.gradients||{});this.gradients=null;d&&(this.defs=d.destroy());this.unSubPixelFix&&this.unSubPixelFix();return this.alignedObjects=null};H.prototype.createElement=function(b){var d=new this.Element;d.init(this,b);return d};H.prototype.getRadialAttr=function(b,d){return{cx:b[0]-
b[2]/2+(d.cx||0)*b[2],cy:b[1]-b[2]/2+(d.cy||0)*b[2],r:(d.r||0)*b[2]}};H.prototype.buildText=function(b){(new n(b)).buildSVG()};H.prototype.getContrast=function(b){b=w.parse(b).rgba;b[0]*=1;b[1]*=1.2;b[2]*=.5;return 459<b[0]+b[1]+b[2]?"#000000":"#FFFFFF"};H.prototype.button=function(b,d,c,h,e,A,H,k,g,y){var K=this.label(b,d,c,g,void 0,void 0,y,void 0,"button"),G=this.styledMode,l=0,t=e?P(e):{};b=t&&t.style||{};t=a.filterUserAttributes(t);K.attr(P({padding:8,r:2},t));if(!G){t=P({fill:E.neutralColor3,
stroke:E.neutralColor20,"stroke-width":1,style:{color:E.neutralColor80,cursor:"pointer",fontWeight:"normal"}},{style:b},t);var N=t.style;delete t.style;A=P(t,{fill:E.neutralColor10},a.filterUserAttributes(A||{}));var q=A.style;delete A.style;H=P(t,{fill:E.highlightColor10,style:{color:E.neutralColor100,fontWeight:"bold"}},a.filterUserAttributes(H||{}));var v=H.style;delete H.style;k=P(t,{style:{color:E.neutralColor20}},a.filterUserAttributes(k||{}));var F=k.style;delete k.style}B(K.element,f?"mouseover":
"mouseenter",function(){3!==l&&K.setState(1)});B(K.element,f?"mouseout":"mouseleave",function(){3!==l&&K.setState(l)});K.setState=function(b){1!==b&&(K.state=l=b);K.removeClass(/highcharts-button-(normal|hover|pressed|disabled)/).addClass("highcharts-button-"+["normal","hover","pressed","disabled"][b||0]);G||K.attr([t,A,H,k][b||0]).css([N,q,v,F][b||0])};G||K.attr(t).css(p({cursor:"default"},N));return K.on("touchstart",function(b){return b.stopPropagation()}).on("click",function(b){3!==l&&h.call(K,
b)})};H.prototype.crispLine=function(b,c,a){void 0===a&&(a="round");var h=b[0],e=b[1];d(h[1])&&h[1]===e[1]&&(h[1]=e[1]=Math[a](h[1])-c%2/2);d(h[2])&&h[2]===e[2]&&(h[2]=e[2]=Math[a](h[2])+c%2/2);return b};H.prototype.path=function(b){var d=this.styledMode?{}:{fill:"none"};G(b)?d.d=b:L(b)&&p(d,b);return this.createElement("path").attr(d)};H.prototype.circle=function(b,d,c){b=L(b)?b:"undefined"===typeof b?{}:{x:b,y:d,r:c};d=this.createElement("circle");d.xSetter=d.ySetter=function(b,d,c){c.setAttribute("c"+
d,b)};return d.attr(b)};H.prototype.arc=function(b,d,c,a,h,e){L(b)?(a=b,d=a.y,c=a.r,b=a.x):a={innerR:a,start:h,end:e};b=this.symbol("arc",b,d,c,c,a);b.r=c;return b};H.prototype.rect=function(b,d,c,a,h,e){h=L(b)?b.r:h;var p=this.createElement("rect");b=L(b)?b:"undefined"===typeof b?{}:{x:b,y:d,width:Math.max(c,0),height:Math.max(a,0)};this.styledMode||("undefined"!==typeof e&&(b["stroke-width"]=e,b=p.crisp(b)),b.fill="none");h&&(b.r=h);p.rSetter=function(b,d,c){p.r=b;r(c,{rx:b,ry:b})};p.rGetter=function(){return p.r||
0};return p.attr(b)};H.prototype.setSize=function(b,d,c){this.width=b;this.height=d;this.boxWrapper.animate({width:b,height:d},{step:function(){this.attr({viewBox:"0 0 "+this.attr("width")+" "+this.attr("height")})},duration:S(c,!0)?void 0:0});this.alignElements()};H.prototype.g=function(b){var d=this.createElement("g");return b?d.attr({"class":"highcharts-"+b}):d};H.prototype.image=function(b,d,c,a,h,e){var A={preserveAspectRatio:"none"},H=function(b,d){b.setAttributeNS?b.setAttributeNS("http://www.w3.org/1999/xlink",
"href",d):b.setAttribute("hc-svg-href",d)};1<arguments.length&&p(A,{x:d,y:c,width:a,height:h});var f=this.createElement("image").attr(A);A=function(d){H(f.element,b);e.call(f,d)};if(e){H(f.element,"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==");var K=new D.Image;B(K,"load",A);K.src=b;K.complete&&A({})}else H(f.element,b);return f};H.prototype.symbol=function(b,c,a,H,f,A){var K=this,k=/^url\((.*?)\)$/,y=k.test(b),G=!y&&(this.symbols[b]?b:"circle"),l=G&&this.symbols[G],
q;if(l){"number"===typeof c&&(q=l.call(this.symbols,Math.round(c||0),Math.round(a||0),H||0,f||0,A));var v=this.path(q);K.styledMode||v.attr("fill","none");p(v,{symbolName:G||void 0,x:c,y:a,width:H,height:f});A&&p(v,A)}else if(y){var F=b.match(k)[1];var m=v=this.image(F);m.imgwidth=S(I[F]&&I[F].width,A&&A.width);m.imgheight=S(I[F]&&I[F].height,A&&A.height);var L=function(b){return b.attr({width:b.width,height:b.height})};["width","height"].forEach(function(b){m[b+"Setter"]=function(b,c){var a=this["img"+
c];this[c]=b;d(a)&&(A&&"within"===A.backgroundSize&&this.width&&this.height&&(a=Math.round(a*Math.min(this.width/this.imgwidth,this.height/this.imgheight))),this.element&&this.element.setAttribute(c,a),this.alignByTranslate||(b=((this[c]||0)-a)/2,this.attr("width"===c?{translateX:b}:{translateY:b})))}});d(c)&&m.attr({x:c,y:a});m.isImg=!0;d(m.imgwidth)&&d(m.imgheight)?L(m):(m.attr({width:0,height:0}),t("img",{onload:function(){var b=g[K.chartIndex];0===this.width&&(h(this,{position:"absolute",top:"-999em"}),
e.body.appendChild(this));I[F]={width:this.width,height:this.height};m.imgwidth=this.width;m.imgheight=this.height;m.element&&L(m);this.parentNode&&this.parentNode.removeChild(this);K.imgCount--;if(!K.imgCount&&b&&!b.hasLoaded)b.onload()},src:F}),this.imgCount++)}return v};H.prototype.clipRect=function(b,d,c,a){var h=V()+"-",e=this.createElement("clipPath").attr({id:h}).add(this.defs);b=this.rect(b,d,c,a,0).add(e);b.id=h;b.clipPath=e;b.count=0;return b};H.prototype.text=function(b,c,a,h){var e={};
if(h&&(this.allowHTML||!this.forExport))return this.html(b,c,a);e.x=Math.round(c||0);a&&(e.y=Math.round(a));d(b)&&(e.text=b);b=this.createElement("text").attr(e);if(!h||this.forExport&&!this.allowHTML)b.xSetter=function(b,d,c){for(var a=c.getElementsByTagName("tspan"),h=c.getAttribute(d),e=0,p;e<a.length;e++)p=a[e],p.getAttribute(d)===h&&p.setAttribute(d,b);c.setAttribute(d,b)};return b};H.prototype.fontMetrics=function(b,d){b=!this.styledMode&&/px/.test(b)||!D.getComputedStyle?b||d&&d.style&&d.style.fontSize||
this.style&&this.style.fontSize:d&&x.prototype.getStyle.call(d,"font-size");b=/px/.test(b)?Q(b):12;d=24>b?b+3:Math.round(1.2*b);return{h:d,b:Math.round(.8*d),f:b}};H.prototype.rotCorr=function(b,d,a){var h=b;d&&a&&(h=Math.max(h*Math.cos(d*c),4));return{x:-b/3*Math.sin(d*c),y:h}};H.prototype.pathToSegments=function(b){for(var d=[],c=[],a={A:8,C:7,H:2,L:3,M:3,Q:5,S:5,T:3,V:2},h=0;h<b.length;h++)F(c[0])&&y(b[h])&&c.length===a[c[0].toUpperCase()]&&b.splice(h,0,c[0].replace("M","L").replace("m","l")),
"string"===typeof b[h]&&(c.length&&d.push(c.slice(0)),c.length=0),c.push(b[h]);d.push(c.slice(0));return d};H.prototype.label=function(b,d,c,a,h,e,p,H,f){return new J(this,b,d,c,a,h,e,p,H,f)};H.prototype.alignElements=function(){this.alignedObjects.forEach(function(b){return b.align()})};return H}();p(C.prototype,{Element:x,SVG_NS:k,escapes:{"&":"&amp;","<":"&lt;",">":"&gt;","'":"&#39;",'"':"&quot;"},symbols:u,draw:q});z.registerRendererType("svg",C,!0);"";return C});M(a,"Core/Renderer/HTML/HTMLElement.js",
[a["Core/Globals.js"],a["Core/Renderer/SVG/SVGElement.js"],a["Core/Utilities.js"]],function(a,w,C){var r=this&&this.__extends||function(){var c=function(a,e){c=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(c,a){c.__proto__=a}||function(c,a){for(var e in a)a.hasOwnProperty(e)&&(c[e]=a[e])};return c(a,e)};return function(a,e){function f(){this.constructor=a}c(a,e);a.prototype=null===e?Object.create(e):(f.prototype=e.prototype,new f)}}(),z=a.isFirefox,x=a.isMS,J=a.isWebKit,u=a.win,
n=C.css,m=C.defined,g=C.extend,c=C.pick,e=C.pInt;return function(a){function f(){return null!==a&&a.apply(this,arguments)||this}r(f,a);f.compose=function(c){if(-1===f.composedClasses.indexOf(c)){f.composedClasses.push(c);var a=f.prototype,e=c.prototype;e.getSpanCorrection=a.getSpanCorrection;e.htmlCss=a.htmlCss;e.htmlGetBBox=a.htmlGetBBox;e.htmlUpdateTransform=a.htmlUpdateTransform;e.setSpanRotation=a.setSpanRotation}return c};f.prototype.getSpanCorrection=function(c,a,e){this.xCorr=-c*e;this.yCorr=
-a};f.prototype.htmlCss=function(a){var e="SPAN"===this.element.tagName&&a&&"width"in a,f=c(e&&a.width,void 0);if(e){delete a.width;this.textWidth=f;var l=!0}a&&"ellipsis"===a.textOverflow&&(a.whiteSpace="nowrap",a.overflow="hidden");this.styles=g(this.styles,a);n(this.element,a);l&&this.htmlUpdateTransform();return this};f.prototype.htmlGetBBox=function(){var c=this.element;return{x:c.offsetLeft,y:c.offsetTop,width:c.offsetWidth,height:c.offsetHeight}};f.prototype.htmlUpdateTransform=function(){if(this.added){var c=
this.renderer,a=this.element,f=this.translateX||0,g=this.translateY||0,l=this.x||0,B=this.y||0,r=this.textAlign||"left",t={left:0,center:.5,right:1}[r],h=this.styles;h=h&&h.whiteSpace;n(a,{marginLeft:f,marginTop:g});!c.styledMode&&this.shadows&&this.shadows.forEach(function(b){n(b,{marginLeft:f+1,marginTop:g+1})});this.inverted&&[].forEach.call(a.childNodes,function(b){c.invertChild(b,a)});if("SPAN"===a.tagName){var d=this.rotation,b=this.textWidth&&e(this.textWidth),p=[d,r,a.innerHTML,this.textWidth,
this.textAlign].join(),G=void 0;(G=b!==this.oldTextWidth)&&!(G=b>this.oldTextWidth)&&((G=this.textPxLength)||(n(a,{width:"",whiteSpace:h||"nowrap"}),G=a.offsetWidth),G=G>b);G&&(/[ \-]/.test(a.textContent||a.innerText)||"ellipsis"===a.style.textOverflow)?(n(a,{width:b+"px",display:"block",whiteSpace:h||"normal"}),this.oldTextWidth=b,this.hasBoxWidthChanged=!0):this.hasBoxWidthChanged=!1;p!==this.cTT&&(G=c.fontMetrics(a.style.fontSize,a).b,!m(d)||d===(this.oldRotation||0)&&r===this.oldAlign||this.setSpanRotation(d,
t,G),this.getSpanCorrection(!m(d)&&this.textPxLength||a.offsetWidth,G,t,d,r));n(a,{left:l+(this.xCorr||0)+"px",top:B+(this.yCorr||0)+"px"});this.cTT=p;this.oldRotation=d;this.oldAlign=r}}else this.alignOnAdd=!0};f.prototype.setSpanRotation=function(c,a,e){var f={},g=x&&!/Edge/.test(u.navigator.userAgent)?"-ms-transform":J?"-webkit-transform":z?"MozTransform":u.opera?"-o-transform":void 0;g&&(f[g]=f.transform="rotate("+c+"deg)",f[g+(z?"Origin":"-origin")]=f.transformOrigin=100*a+"% "+e+"px",n(this.element,
f))};f.composedClasses=[];return f}(w)});M(a,"Core/Renderer/HTML/HTMLRenderer.js",[a["Core/Renderer/HTML/AST.js"],a["Core/Renderer/SVG/SVGElement.js"],a["Core/Renderer/SVG/SVGRenderer.js"],a["Core/Utilities.js"]],function(a,w,C,E){var r=this&&this.__extends||function(){var a=function(g,c){a=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(a,c){a.__proto__=c}||function(a,c){for(var e in c)c.hasOwnProperty(e)&&(a[e]=c[e])};return a(g,c)};return function(g,c){function e(){this.constructor=
g}a(g,c);g.prototype=null===c?Object.create(c):(e.prototype=c.prototype,new e)}}(),x=E.attr,J=E.createElement,u=E.extend,n=E.pick;return function(m){function g(){return null!==m&&m.apply(this,arguments)||this}r(g,m);g.compose=function(c){-1===g.composedClasses.indexOf(c)&&(g.composedClasses.push(c),c.prototype.html=g.prototype.html);return c};g.prototype.html=function(c,e,g){var f=this.createElement("span"),l=f.element,q=f.renderer,k=q.isSVG,m=function(c,a){["opacity","visibility"].forEach(function(e){c[e+
"Setter"]=function(f,h,d){var b=c.div?c.div.style:a;w.prototype[e+"Setter"].call(this,f,h,d);b&&(b[h]=f)}});c.addedSetters=!0};f.textSetter=function(c){c!==this.textStr&&(delete this.bBox,delete this.oldTextWidth,a.setElementHTML(this.element,n(c,"")),this.textStr=c,f.doTransform=!0)};k&&m(f,f.element.style);f.xSetter=f.ySetter=f.alignSetter=f.rotationSetter=function(c,a){"align"===a?f.alignValue=f.textAlign=c:f[a]=c;f.doTransform=!0};f.afterSetters=function(){this.doTransform&&(this.htmlUpdateTransform(),
this.doTransform=!1)};f.attr({text:c,x:Math.round(e),y:Math.round(g)}).css({position:"absolute"});q.styledMode||f.css({fontFamily:this.style.fontFamily,fontSize:this.style.fontSize});l.style.whiteSpace="nowrap";f.css=f.htmlCss;k&&(f.add=function(c){var a=q.box.parentNode,e=[];if(this.parentGroup=c){var g=c.div;if(!g){for(;c;)e.push(c),c=c.parentGroup;e.reverse().forEach(function(c){function d(b,d){c[d]=b;"translateX"===d?k.left=b+"px":k.top=b+"px";c.doTransform=!0}var b=x(c.element,"class"),h=c.styles||
{};g=c.div=c.div||J("div",b?{className:b}:void 0,{position:"absolute",left:(c.translateX||0)+"px",top:(c.translateY||0)+"px",display:c.display,opacity:c.opacity,cursor:h.cursor,pointerEvents:h.pointerEvents,visibility:c.visibility},g||a);var k=g.style;u(c,{classSetter:function(b){return function(d){this.element.setAttribute("class",d);b.className=d}}(g),on:function(){e[0].div&&f.on.apply({element:e[0].div,onEvents:c.onEvents},arguments);return c},translateXSetter:d,translateYSetter:d});c.addedSetters||
m(c)})}}else g=a;g.appendChild(l);f.added=!0;f.alignOnAdd&&f.htmlUpdateTransform();return f});return f};g.composedClasses=[];return g}(C)});M(a,"Core/Axis/AxisDefaults.js",[a["Core/Color/Palette.js"]],function(a){var r;(function(r){r.defaultXAxisOptions={alignTicks:!0,allowDecimals:void 0,panningEnabled:!0,zIndex:2,zoomEnabled:!0,dateTimeLabelFormats:{millisecond:{main:"%H:%M:%S.%L",range:!1},second:{main:"%H:%M:%S",range:!1},minute:{main:"%H:%M",range:!1},hour:{main:"%H:%M",range:!1},day:{main:"%e. %b"},
week:{main:"%e. %b"},month:{main:"%b '%y"},year:{main:"%Y"}},endOnTick:!1,gridLineDashStyle:"Solid",gridZIndex:1,labels:{autoRotation:void 0,autoRotationLimit:80,distance:void 0,enabled:!0,indentation:10,overflow:"justify",padding:5,reserveSpace:void 0,rotation:void 0,staggerLines:0,step:0,useHTML:!1,x:0,zIndex:7,style:{color:a.neutralColor60,cursor:"default",fontSize:"11px"}},maxPadding:.01,minorGridLineDashStyle:"Solid",minorTickLength:2,minorTickPosition:"outside",minPadding:.01,offset:void 0,
opposite:!1,reversed:void 0,reversedStacks:!1,showEmpty:!0,showFirstLabel:!0,showLastLabel:!0,startOfWeek:1,startOnTick:!1,tickLength:10,tickPixelInterval:100,tickmarkPlacement:"between",tickPosition:"outside",title:{align:"middle",rotation:0,useHTML:!1,x:0,y:0,style:{color:a.neutralColor60}},type:"linear",uniqueNames:!0,visible:!0,minorGridLineColor:a.neutralColor5,minorGridLineWidth:1,minorTickColor:a.neutralColor40,lineColor:a.highlightColor20,lineWidth:1,gridLineColor:a.neutralColor10,gridLineWidth:void 0,
tickColor:a.highlightColor20};r.defaultYAxisOptions={reversedStacks:!0,endOnTick:!0,maxPadding:.05,minPadding:.05,tickPixelInterval:72,showLastLabel:!0,labels:{x:-8},startOnTick:!0,title:{rotation:270,text:"Values"},stackLabels:{animation:{},allowOverlap:!1,enabled:!1,crop:!0,overflow:"justify",formatter:function(){var a=this.axis.chart.numberFormatter;return a(this.total,-1)},style:{color:a.neutralColor100,fontSize:"11px",fontWeight:"bold",textOutline:"1px contrast"}},gridLineWidth:1,lineWidth:0};
r.defaultLeftAxisOptions={labels:{x:-15},title:{rotation:270}};r.defaultRightAxisOptions={labels:{x:15},title:{rotation:90}};r.defaultBottomAxisOptions={labels:{autoRotation:[-45],x:0},margin:15,title:{rotation:0}};r.defaultTopAxisOptions={labels:{autoRotation:[-45],x:0},margin:15,title:{rotation:0}}})(r||(r={}));return r});M(a,"Core/Foundation.js",[a["Core/Utilities.js"]],function(a){var r=a.addEvent,C=a.isFunction,E=a.objectEach,z=a.removeEvent;return{registerEventOptions:function(a,w){a.eventOptions=
a.eventOptions||{};E(w.events,function(u,n){a.eventOptions[n]!==u&&(a.eventOptions[n]&&(z(a,n,a.eventOptions[n]),delete a.eventOptions[n]),C(u)&&(a.eventOptions[n]=u,r(a,n,u)))})}}});M(a,"Core/Axis/Tick.js",[a["Core/FormatUtilities.js"],a["Core/Globals.js"],a["Core/Utilities.js"]],function(a,w,C){var r=w.deg2rad,z=C.clamp,x=C.correctFloat,J=C.defined,u=C.destroyObjectProperties,n=C.extend,m=C.fireEvent,g=C.isNumber,c=C.merge,e=C.objectEach,l=C.pick;w=function(){function f(c,a,e,f,g){this.isNewLabel=
this.isNew=!0;this.axis=c;this.pos=a;this.type=e||"";this.parameters=g||{};this.tickmarkOffset=this.parameters.tickmarkOffset;this.options=this.parameters.options;m(this,"init");e||f||this.addLabel()}f.prototype.addLabel=function(){var c=this,e=c.axis,f=e.options,I=e.chart,D=e.categories,B=e.logarithmic,r=e.names,t=c.pos,h=l(c.options&&c.options.labels,f.labels),d=e.tickPositions,b=t===d[0],p=t===d[d.length-1],G=(!h.step||1===h.step)&&1===e.tickInterval;d=d.info;var y=c.label,L;D=this.parameters.category||
(D?l(D[t],r[t],t):t);B&&g(D)&&(D=x(B.lin2log(D)));if(e.dateTime)if(d){var F=I.time.resolveDTLFormat(f.dateTimeLabelFormats[!f.grid&&d.higherRanks[t]||d.unitName]);var P=F.main}else g(D)&&(P=e.dateTime.getXDateFormat(D,f.dateTimeLabelFormats||{}));c.isFirst=b;c.isLast=p;var S={axis:e,chart:I,dateTimeLabelFormat:P,isFirst:b,isLast:p,pos:t,tick:c,tickPositionInfo:d,value:D};m(this,"labelFormat",S);var Q=function(b){return h.formatter?h.formatter.call(b,b):h.format?(b.text=e.defaultLabelFormatter.call(b),
a.format(h.format,b,I)):e.defaultLabelFormatter.call(b,b)};f=Q.call(S,S);var u=F&&F.list;c.shortenLabel=u?function(){for(L=0;L<u.length;L++)if(n(S,{dateTimeLabelFormat:u[L]}),y.attr({text:Q.call(S,S)}),y.getBBox().width<e.getSlotWidth(c)-2*h.padding)return;y.attr({text:""})}:void 0;G&&e._addedPlotLB&&c.moveLabel(f,h);J(y)||c.movedLabel?y&&y.textStr!==f&&!G&&(!y.textWidth||h.style.width||y.styles.width||y.css({width:null}),y.attr({text:f}),y.textPxLength=y.getBBox().width):(c.label=y=c.createLabel({x:0,
y:0},f,h),c.rotation=0)};f.prototype.createLabel=function(a,e,f){var g=this.axis,k=g.chart;if(a=J(e)&&f.enabled?k.renderer.text(e,a.x,a.y,f.useHTML).add(g.labelGroup):null)k.styledMode||a.css(c(f.style)),a.textPxLength=a.getBBox().width;return a};f.prototype.destroy=function(){u(this,this.axis)};f.prototype.getPosition=function(c,a,e,f){var g=this.axis,k=g.chart,l=f&&k.oldChartHeight||k.chartHeight;c={x:c?x(g.translate(a+e,null,null,f)+g.transB):g.left+g.offset+(g.opposite?(f&&k.oldChartWidth||k.chartWidth)-
g.right-g.left:0),y:c?l-g.bottom+g.offset-(g.opposite?g.height:0):x(l-g.translate(a+e,null,null,f)-g.transB)};c.y=z(c.y,-1E5,1E5);m(this,"afterGetPosition",{pos:c});return c};f.prototype.getLabelPosition=function(c,a,e,f,g,l,n,t){var h=this.axis,d=h.transA,b=h.isLinked&&h.linkedParent?h.linkedParent.reversed:h.reversed,p=h.staggerLines,k=h.tickRotCorr||{x:0,y:0},y=f||h.reserveSpaceDefault?0:-h.labelOffset*("center"===h.labelAlign?.5:1),q={},F=g.y;J(F)||(F=0===h.side?e.rotation?-8:-e.getBBox().height:
2===h.side?k.y+8:Math.cos(e.rotation*r)*(k.y-e.getBBox(!1,0).height/2));c=c+g.x+y+k.x-(l&&f?l*d*(b?-1:1):0);a=a+F-(l&&!f?l*d*(b?1:-1):0);p&&(e=n/(t||1)%p,h.opposite&&(e=p-e-1),a+=h.labelOffset/p*e);q.x=c;q.y=Math.round(a);m(this,"afterGetLabelPosition",{pos:q,tickmarkOffset:l,index:n});return q};f.prototype.getLabelSize=function(){return this.label?this.label.getBBox()[this.axis.horiz?"height":"width"]:0};f.prototype.getMarkPath=function(c,a,e,f,g,l){return l.crispLine([["M",c,a],["L",c+(g?0:-e),
a+(g?e:0)]],f)};f.prototype.handleOverflow=function(c){var a=this.axis,e=a.options.labels,f=c.x,g=a.chart.chartWidth,m=a.chart.spacing,v=l(a.labelLeft,Math.min(a.pos,m[3]));m=l(a.labelRight,Math.max(a.isRadial?0:a.pos+a.len,g-m[1]));var t=this.label,h=this.rotation,d={left:0,center:.5,right:1}[a.labelAlign||t.attr("align")],b=t.getBBox().width,p=a.getSlotWidth(this),G={},y=p,L=1,F;if(h||"justify"!==e.overflow)0>h&&f-d*b<v?F=Math.round(f/Math.cos(h*r)-v):0<h&&f+d*b>m&&(F=Math.round((g-f)/Math.cos(h*
r)));else if(g=f+(1-d)*b,f-d*b<v?y=c.x+y*(1-d)-v:g>m&&(y=m-c.x+y*d,L=-1),y=Math.min(p,y),y<p&&"center"===a.labelAlign&&(c.x+=L*(p-y-d*(p-Math.min(b,y)))),b>y||a.autoRotation&&(t.styles||{}).width)F=y;F&&(this.shortenLabel?this.shortenLabel():(G.width=Math.floor(F)+"px",(e.style||{}).textOverflow||(G.textOverflow="ellipsis"),t.css(G)))};f.prototype.moveLabel=function(c,a){var f=this,g=f.label,l=f.axis,m=l.reversed,q=!1;g&&g.textStr===c?(f.movedLabel=g,q=!0,delete f.label):e(l.ticks,function(a){q||
a.isNew||a===f||!a.label||a.label.textStr!==c||(f.movedLabel=a.label,q=!0,a.labelPos=f.movedLabel.xy,delete a.label)});if(!q&&(f.labelPos||g)){var t=f.labelPos||g.xy;g=l.horiz?m?0:l.width+l.left:t.x;l=l.horiz?t.y:m?l.width+l.left:0;f.movedLabel=f.createLabel({x:g,y:l},c,a);f.movedLabel&&f.movedLabel.attr({opacity:0})}};f.prototype.render=function(a,c,e){var f=this.axis,g=f.horiz,k=this.pos,q=l(this.tickmarkOffset,f.tickmarkOffset);k=this.getPosition(g,k,q,c);q=k.x;var t=k.y;f=g&&q===f.pos+f.len||
!g&&t===f.pos?-1:1;g=l(e,this.label&&this.label.newOpacity,1);e=l(e,1);this.isActive=!0;this.renderGridLine(c,e,f);this.renderMark(k,e,f);this.renderLabel(k,c,g,a);this.isNew=!1;m(this,"afterRender")};f.prototype.renderGridLine=function(c,a,e){var f=this.axis,g=f.options,k={},m=this.pos,t=this.type,h=l(this.tickmarkOffset,f.tickmarkOffset),d=f.chart.renderer,b=this.gridLine,p=g.gridLineWidth,G=g.gridLineColor,y=g.gridLineDashStyle;"minor"===this.type&&(p=g.minorGridLineWidth,G=g.minorGridLineColor,
y=g.minorGridLineDashStyle);b||(f.chart.styledMode||(k.stroke=G,k["stroke-width"]=p||0,k.dashstyle=y),t||(k.zIndex=1),c&&(a=0),this.gridLine=b=d.path().attr(k).addClass("highcharts-"+(t?t+"-":"")+"grid-line").add(f.gridGroup));if(b&&(e=f.getPlotLinePath({value:m+h,lineWidth:b.strokeWidth()*e,force:"pass",old:c})))b[c||this.isNew?"attr":"animate"]({d:e,opacity:a})};f.prototype.renderMark=function(c,a,e){var f=this.axis,g=f.options,k=f.chart.renderer,m=this.type,t=f.tickSize(m?m+"Tick":"tick"),h=c.x;
c=c.y;var d=l(g["minor"!==m?"tickWidth":"minorTickWidth"],!m&&f.isXAxis?1:0);g=g["minor"!==m?"tickColor":"minorTickColor"];var b=this.mark,p=!b;t&&(f.opposite&&(t[0]=-t[0]),b||(this.mark=b=k.path().addClass("highcharts-"+(m?m+"-":"")+"tick").add(f.axisGroup),f.chart.styledMode||b.attr({stroke:g,"stroke-width":d})),b[p?"attr":"animate"]({d:this.getMarkPath(h,c,t[0],b.strokeWidth()*e,f.horiz,k),opacity:a}))};f.prototype.renderLabel=function(c,a,e,f){var k=this.axis,m=k.horiz,q=k.options,t=this.label,
h=q.labels,d=h.step;k=l(this.tickmarkOffset,k.tickmarkOffset);var b=c.x;c=c.y;var p=!0;t&&g(b)&&(t.xy=c=this.getLabelPosition(b,c,t,m,h,k,f,d),this.isFirst&&!this.isLast&&!q.showFirstLabel||this.isLast&&!this.isFirst&&!q.showLastLabel?p=!1:!m||h.step||h.rotation||a||0===e||this.handleOverflow(c),d&&f%d&&(p=!1),p&&g(c.y)?(c.opacity=e,t[this.isNewLabel?"attr":"animate"](c),this.isNewLabel=!1):(t.attr("y",-9999),this.isNewLabel=!0))};f.prototype.replaceMovedLabel=function(){var c=this.label,a=this.axis,
e=a.reversed;if(c&&!this.isNew){var f=a.horiz?e?a.left:a.width+a.left:c.xy.x;e=a.horiz?c.xy.y:e?a.width+a.top:a.top;c.animate({x:f,y:e,opacity:0},void 0,c.destroy);delete this.label}a.isDirty=!0;this.label=this.movedLabel;delete this.movedLabel};return f}();"";return w});M(a,"Core/Axis/Axis.js",[a["Core/Animation/AnimationUtilities.js"],a["Core/Axis/AxisDefaults.js"],a["Core/Color/Color.js"],a["Core/Color/Palette.js"],a["Core/DefaultOptions.js"],a["Core/Foundation.js"],a["Core/Globals.js"],a["Core/Axis/Tick.js"],
a["Core/Utilities.js"]],function(a,w,C,E,z,x,J,u,n){var m=a.animObject,g=z.defaultOptions,c=x.registerEventOptions,e=J.deg2rad,l=n.arrayMax,f=n.arrayMin,v=n.clamp,q=n.correctFloat,k=n.defined,r=n.destroyObjectProperties,D=n.erase,B=n.error,O=n.extend,t=n.fireEvent,h=n.getMagnitude,d=n.isArray,b=n.isNumber,p=n.isString,G=n.merge,y=n.normalizeTickInterval,L=n.objectEach,F=n.pick,P=n.relativeLength,S=n.removeEvent,Q=n.splat,V=n.syncTimeout;a=function(){function a(b,a){this.zoomEnabled=this.width=this.visible=
this.userOptions=this.translationSlope=this.transB=this.transA=this.top=this.ticks=this.tickRotCorr=this.tickPositions=this.tickmarkOffset=this.tickInterval=this.tickAmount=this.side=this.series=this.right=this.positiveValuesOnly=this.pos=this.pointRangePadding=this.pointRange=this.plotLinesAndBandsGroups=this.plotLinesAndBands=this.paddedTicks=this.overlap=this.options=this.offset=this.names=this.minPixelPadding=this.minorTicks=this.minorTickInterval=this.min=this.maxLabelLength=this.max=this.len=
this.left=this.labelFormatter=this.labelEdge=this.isLinked=this.height=this.hasVisibleSeries=this.hasNames=this.eventOptions=this.coll=this.closestPointRange=this.chart=this.categories=this.bottom=this.alternateBands=void 0;this.init(b,a)}a.prototype.init=function(a,d){var h=d.isX;this.chart=a;this.horiz=a.inverted&&!this.isZAxis?!h:h;this.isXAxis=h;this.coll=this.coll||(h?"xAxis":"yAxis");t(this,"init",{userOptions:d});this.opposite=F(d.opposite,this.opposite);this.side=F(d.side,this.side,this.horiz?
this.opposite?0:2:this.opposite?1:3);this.setOptions(d);var e=this.options,f=e.labels,p=e.type;this.userOptions=d;this.minPixelPadding=0;this.reversed=F(e.reversed,this.reversed);this.visible=e.visible;this.zoomEnabled=e.zoomEnabled;this.hasNames="category"===p||!0===e.categories;this.categories=e.categories||this.hasNames;this.names||(this.names=[],this.names.keys={});this.plotLinesAndBandsGroups={};this.positiveValuesOnly=!!this.logarithmic;this.isLinked=k(e.linkedTo);this.ticks={};this.labelEdge=
[];this.minorTicks={};this.plotLinesAndBands=[];this.alternateBands={};this.len=0;this.minRange=this.userMinRange=e.minRange||e.maxZoom;this.range=e.range;this.offset=e.offset||0;this.min=this.max=null;d=F(e.crosshair,Q(a.options.tooltip.crosshairs)[h?0:1]);this.crosshair=!0===d?{}:d;-1===a.axes.indexOf(this)&&(h?a.axes.splice(a.xAxis.length,0,this):a.axes.push(this),a[this.coll].push(this));this.series=this.series||[];a.inverted&&!this.isZAxis&&h&&"undefined"===typeof this.reversed&&(this.reversed=
!0);this.labelRotation=b(f.rotation)?f.rotation:void 0;c(this,e);t(this,"afterInit")};a.prototype.setOptions=function(b){this.options=G(w.defaultXAxisOptions,"yAxis"===this.coll&&w.defaultYAxisOptions,[w.defaultTopAxisOptions,w.defaultRightAxisOptions,w.defaultBottomAxisOptions,w.defaultLeftAxisOptions][this.side],G(g[this.coll],b));t(this,"afterSetOptions",{userOptions:b})};a.prototype.defaultLabelFormatter=function(a){var d=this.axis;a=this.chart.numberFormatter;var c=b(this.value)?this.value:NaN,
e=d.chart.time,h=this.dateTimeLabelFormat,f=g.lang,p=f.numericSymbols;f=f.numericSymbolMagnitude||1E3;var H=d.logarithmic?Math.abs(c):d.tickInterval,y=p&&p.length;if(d.categories)var k=""+this.value;else if(h)k=e.dateFormat(h,c);else if(y&&1E3<=H)for(;y--&&"undefined"===typeof k;)d=Math.pow(f,y+1),H>=d&&0===10*c%d&&null!==p[y]&&0!==c&&(k=a(c/d,-1)+p[y]);"undefined"===typeof k&&(k=1E4<=Math.abs(c)?a(c,-1):a(c,-1,void 0,""));return k};a.prototype.getSeriesExtremes=function(){var a=this,d=a.chart,c;
t(this,"getSeriesExtremes",null,function(){a.hasVisibleSeries=!1;a.dataMin=a.dataMax=a.threshold=null;a.softThreshold=!a.isXAxis;a.stacking&&a.stacking.buildStacks();a.series.forEach(function(e){if(e.visible||!d.options.chart.ignoreHiddenSeries){var h=e.options,f=h.threshold;a.hasVisibleSeries=!0;a.positiveValuesOnly&&0>=f&&(f=null);if(a.isXAxis){if(h=e.xData,h.length){h=a.logarithmic?h.filter(a.validatePositiveValue):h;c=e.getXExtremes(h);var p=c.min;var g=c.max;b(p)||p instanceof Date||(h=h.filter(b),
c=e.getXExtremes(h),p=c.min,g=c.max);h.length&&(a.dataMin=Math.min(F(a.dataMin,p),p),a.dataMax=Math.max(F(a.dataMax,g),g))}}else if(e=e.applyExtremes(),b(e.dataMin)&&(p=e.dataMin,a.dataMin=Math.min(F(a.dataMin,p),p)),b(e.dataMax)&&(g=e.dataMax,a.dataMax=Math.max(F(a.dataMax,g),g)),k(f)&&(a.threshold=f),!h.softThreshold||a.positiveValuesOnly)a.softThreshold=!1}})});t(this,"afterGetSeriesExtremes")};a.prototype.translate=function(a,d,c,e,h,f){var p=this.linkedParent||this,g=e&&p.old?p.old.min:p.min,
H=p.minPixelPadding;h=(p.isOrdinal||p.brokenAxis&&p.brokenAxis.hasBreaks||p.logarithmic&&h)&&p.lin2val;var K=1,y=0;e=e&&p.old?p.old.transA:p.transA;e||(e=p.transA);c&&(K*=-1,y=p.len);p.reversed&&(K*=-1,y-=K*(p.sector||p.len));d?(a=(a*K+y-H)/e+g,h&&(a=p.lin2val(a))):(h&&(a=p.val2lin(a)),a=b(g)?K*(a-g)*e+y+K*H+(b(f)?e*f:0):void 0);return a};a.prototype.toPixels=function(b,a){return this.translate(b,!1,!this.horiz,null,!0)+(a?0:this.pos)};a.prototype.toValue=function(b,a){return this.translate(b-(a?
0:this.pos),!0,!this.horiz,null,!0)};a.prototype.getPlotLinePath=function(a){function d(b,a,d){if("pass"!==m&&b<a||b>d)m?b=v(b,a,d):r=!0;return b}var c=this,e=c.chart,h=c.left,f=c.top,p=a.old,g=a.value,H=a.lineWidth,y=p&&e.oldChartHeight||e.chartHeight,k=p&&e.oldChartWidth||e.chartWidth,G=c.transB,l=a.translatedValue,m=a.force,L,q,n,B,r;a={value:g,lineWidth:H,old:p,force:m,acrossPanes:a.acrossPanes,translatedValue:l};t(this,"getPlotLinePath",a,function(a){l=F(l,c.translate(g,null,null,p));l=v(l,-1E5,
1E5);L=n=Math.round(l+G);q=B=Math.round(y-l-G);b(l)?c.horiz?(q=f,B=y-c.bottom,L=n=d(L,h,h+c.width)):(L=h,n=k-c.right,q=B=d(q,f,f+c.height)):(r=!0,m=!1);a.path=r&&!m?null:e.renderer.crispLine([["M",L,q],["L",n,B]],H||1)});return a.path};a.prototype.getLinearTickPositions=function(b,a,d){var c=q(Math.floor(a/b)*b);d=q(Math.ceil(d/b)*b);var e=[],h;q(c+b)===c&&(h=20);if(this.single)return[a];for(a=c;a<=d;){e.push(a);a=q(a+b,h);if(a===f)break;var f=a}return e};a.prototype.getMinorTickInterval=function(){var b=
this.options;return!0===b.minorTicks?F(b.minorTickInterval,"auto"):!1===b.minorTicks?null:b.minorTickInterval};a.prototype.getMinorTickPositions=function(){var b=this.options,a=this.tickPositions,d=this.minorTickInterval,c=this.pointRangePadding||0,e=this.min-c;c=this.max+c;var h=c-e,f=[];if(h&&h/d<this.len/3){var p=this.logarithmic;if(p)this.paddedTicks.forEach(function(b,a,c){a&&f.push.apply(f,p.getLogTickPositions(d,c[a-1],c[a],!0))});else if(this.dateTime&&"auto"===this.getMinorTickInterval())f=
f.concat(this.getTimeTicks(this.dateTime.normalizeTimeTickInterval(d),e,c,b.startOfWeek));else for(b=e+(a[0]-e)%d;b<=c&&b!==f[0];b+=d)f.push(b)}0!==f.length&&this.trimTicks(f);return f};a.prototype.adjustForMinRange=function(){var b=this.options,a=this.logarithmic,d=this.min,c=this.max,e=0,h,p,g,y;this.isXAxis&&"undefined"===typeof this.minRange&&!a&&(k(b.min)||k(b.max)?this.minRange=null:(this.series.forEach(function(b){g=b.xData;y=b.xIncrement?1:g.length-1;if(1<g.length)for(h=y;0<h;h--)if(p=g[h]-
g[h-1],!e||p<e)e=p}),this.minRange=Math.min(5*e,this.dataMax-this.dataMin)));if(c-d<this.minRange){var G=this.dataMax-this.dataMin>=this.minRange;var t=this.minRange;var m=(t-c+d)/2;m=[d-m,F(b.min,d-m)];G&&(m[2]=this.logarithmic?this.logarithmic.log2lin(this.dataMin):this.dataMin);d=l(m);c=[d+t,F(b.max,d+t)];G&&(c[2]=a?a.log2lin(this.dataMax):this.dataMax);c=f(c);c-d<t&&(m[0]=c-t,m[1]=F(b.min,c-t),d=l(m))}this.min=d;this.max=c};a.prototype.getClosest=function(){var b;this.categories?b=1:this.series.forEach(function(a){var d=
a.closestPointRange,c=a.visible||!a.chart.options.chart.ignoreHiddenSeries;!a.noSharedTooltip&&k(d)&&c&&(b=k(b)?Math.min(b,d):d)});return b};a.prototype.nameToX=function(b){var a=d(this.categories),c=a?this.categories:this.names,e=b.options.x;b.series.requireSorting=!1;k(e)||(e=this.options.uniqueNames?a?c.indexOf(b.name):F(c.keys[b.name],-1):b.series.autoIncrement());if(-1===e){if(!a)var h=c.length}else h=e;"undefined"!==typeof h&&(this.names[h]=b.name,this.names.keys[b.name]=h);return h};a.prototype.updateNames=
function(){var b=this,a=this.names;0<a.length&&(Object.keys(a.keys).forEach(function(b){delete a.keys[b]}),a.length=0,this.minRange=this.userMinRange,(this.series||[]).forEach(function(a){a.xIncrement=null;if(!a.points||a.isDirtyData)b.max=Math.max(b.max,a.xData.length-1),a.processData(),a.generatePoints();a.data.forEach(function(d,c){if(d&&d.options&&"undefined"!==typeof d.name){var e=b.nameToX(d);"undefined"!==typeof e&&e!==d.x&&(d.x=e,a.xData[c]=e)}})}))};a.prototype.setAxisTranslation=function(){var b=
this,a=b.max-b.min,d=b.linkedParent,c=!!b.categories,e=b.isXAxis,h=b.axisPointRange||0,f=0,g=0,y=b.transA;if(e||c||h){var k=b.getClosest();d?(f=d.minPointOffset,g=d.pointRangePadding):b.series.forEach(function(a){var d=c?1:e?F(a.options.pointRange,k,0):b.axisPointRange||0,A=a.options.pointPlacement;h=Math.max(h,d);if(!b.single||c)a=a.is("xrange")?!e:e,f=Math.max(f,a&&p(A)?0:d/2),g=Math.max(g,a&&"on"===A?0:d)});d=b.ordinal&&b.ordinal.slope&&k?b.ordinal.slope/k:1;b.minPointOffset=f*=d;b.pointRangePadding=
g*=d;b.pointRange=Math.min(h,b.single&&c?1:a);e&&(b.closestPointRange=k)}b.translationSlope=b.transA=y=b.staticScale||b.len/(a+g||1);b.transB=b.horiz?b.left:b.bottom;b.minPixelPadding=y*f;t(this,"afterSetAxisTranslation")};a.prototype.minFromRange=function(){return this.max-this.range};a.prototype.setTickInterval=function(a){var d=this,c=d.chart,e=d.logarithmic,f=d.options,p=d.isXAxis,g=d.isLinked,l=f.tickPixelInterval,G=d.categories,H=d.softThreshold,m=f.maxPadding,L=f.minPadding,n=f.tickInterval,
v=b(d.threshold)?d.threshold:null;d.dateTime||G||g||this.getTickAmount();var r=F(d.userMin,f.min);var P=F(d.userMax,f.max);if(g){d.linkedParent=c[d.coll][f.linkedTo];var D=d.linkedParent.getExtremes();d.min=F(D.min,D.dataMin);d.max=F(D.max,D.dataMax);f.type!==d.linkedParent.options.type&&B(11,1,c)}else{if(H&&k(v))if(d.dataMin>=v)D=v,L=0;else if(d.dataMax<=v){var I=v;m=0}d.min=F(r,D,d.dataMin);d.max=F(P,I,d.dataMax)}e&&(d.positiveValuesOnly&&!a&&0>=Math.min(d.min,F(d.dataMin,d.min))&&B(10,1,c),d.min=
q(e.log2lin(d.min),16),d.max=q(e.log2lin(d.max),16));d.range&&k(d.max)&&(d.userMin=d.min=r=Math.max(d.dataMin,d.minFromRange()),d.userMax=P=d.max,d.range=null);t(d,"foundExtremes");d.beforePadding&&d.beforePadding();d.adjustForMinRange();!(G||d.axisPointRange||d.stacking&&d.stacking.usePercentage||g)&&k(d.min)&&k(d.max)&&(c=d.max-d.min)&&(!k(r)&&L&&(d.min-=c*L),!k(P)&&m&&(d.max+=c*m));b(d.userMin)||(b(f.softMin)&&f.softMin<d.min&&(d.min=r=f.softMin),b(f.floor)&&(d.min=Math.max(d.min,f.floor)));b(d.userMax)||
(b(f.softMax)&&f.softMax>d.max&&(d.max=P=f.softMax),b(f.ceiling)&&(d.max=Math.min(d.max,f.ceiling)));H&&k(d.dataMin)&&(v=v||0,!k(r)&&d.min<v&&d.dataMin>=v?d.min=d.options.minRange?Math.min(v,d.max-d.minRange):v:!k(P)&&d.max>v&&d.dataMax<=v&&(d.max=d.options.minRange?Math.max(v,d.min+d.minRange):v));b(d.min)&&b(d.max)&&!this.chart.polar&&d.min>d.max&&(k(d.options.min)?d.max=d.min:k(d.options.max)&&(d.min=d.max));d.tickInterval=d.min===d.max||"undefined"===typeof d.min||"undefined"===typeof d.max?1:
g&&d.linkedParent&&!n&&l===d.linkedParent.options.tickPixelInterval?n=d.linkedParent.tickInterval:F(n,this.tickAmount?(d.max-d.min)/Math.max(this.tickAmount-1,1):void 0,G?1:(d.max-d.min)*l/Math.max(d.len,l));p&&!a&&(d.series.forEach(function(b){b.forceCrop=b.forceCropping&&b.forceCropping();b.processData(d.min!==(d.old&&d.old.min)||d.max!==(d.old&&d.old.max))}),t(this,"postProcessData"));d.setAxisTranslation();t(this,"initialAxisTranslation");d.pointRange&&!n&&(d.tickInterval=Math.max(d.pointRange,
d.tickInterval));a=F(f.minTickInterval,d.dateTime&&!d.series.some(function(b){return b.noSharedTooltip})?d.closestPointRange:0);!n&&d.tickInterval<a&&(d.tickInterval=a);d.dateTime||d.logarithmic||n||(d.tickInterval=y(d.tickInterval,void 0,h(d.tickInterval),F(f.allowDecimals,.5>d.tickInterval||void 0!==this.tickAmount),!!this.tickAmount));this.tickAmount||(d.tickInterval=d.unsquish());this.setTickPositions()};a.prototype.setTickPositions=function(){var b=this.options,d=b.tickPositions,a=this.getMinorTickInterval(),
c=this.hasVerticalPanning(),e="colorAxis"===this.coll,h=(e||!c)&&b.startOnTick;c=(e||!c)&&b.endOnTick;e=b.tickPositioner;this.tickmarkOffset=this.categories&&"between"===b.tickmarkPlacement&&1===this.tickInterval?.5:0;this.minorTickInterval="auto"===a&&this.tickInterval?this.tickInterval/5:a;this.single=this.min===this.max&&k(this.min)&&!this.tickAmount&&(parseInt(this.min,10)===this.min||!1!==b.allowDecimals);this.tickPositions=a=d&&d.slice();!a&&(this.ordinal&&this.ordinal.positions||!((this.max-
this.min)/this.tickInterval>Math.max(2*this.len,200))?a=this.dateTime?this.getTimeTicks(this.dateTime.normalizeTimeTickInterval(this.tickInterval,b.units),this.min,this.max,b.startOfWeek,this.ordinal&&this.ordinal.positions,this.closestPointRange,!0):this.logarithmic?this.logarithmic.getLogTickPositions(this.tickInterval,this.min,this.max):this.getLinearTickPositions(this.tickInterval,this.min,this.max):(a=[this.min,this.max],B(19,!1,this.chart)),a.length>this.len&&(a=[a[0],a.pop()],a[0]===a[1]&&
(a.length=1)),this.tickPositions=a,e&&(e=e.apply(this,[this.min,this.max])))&&(this.tickPositions=a=e);this.paddedTicks=a.slice(0);this.trimTicks(a,h,c);this.isLinked||(this.single&&2>a.length&&!this.categories&&!this.series.some(function(b){return b.is("heatmap")&&"between"===b.options.pointPlacement})&&(this.min-=.5,this.max+=.5),d||e||this.adjustTickAmount());t(this,"afterSetTickPositions")};a.prototype.trimTicks=function(b,d,a){var c=b[0],e=b[b.length-1],h=!this.isOrdinal&&this.minPointOffset||
0;t(this,"trimTicks");if(!this.isLinked){if(d&&-Infinity!==c)this.min=c;else for(;this.min-h>b[0];)b.shift();if(a)this.max=e;else for(;this.max+h<b[b.length-1];)b.pop();0===b.length&&k(c)&&!this.options.tickPositions&&b.push((e+c)/2)}};a.prototype.alignToOthers=function(){var b={},d=this.options,a;!1!==this.chart.options.chart.alignTicks&&d.alignTicks&&!1!==d.startOnTick&&!1!==d.endOnTick&&!this.logarithmic&&this.chart[this.coll].forEach(function(d){var c=d.options;c=[d.horiz?c.left:c.top,c.width,
c.height,c.pane].join();d.series.length&&(b[c]?a=!0:b[c]=1)});return a};a.prototype.getTickAmount=function(){var b=this.options,d=b.tickPixelInterval,a=b.tickAmount;!k(b.tickInterval)&&!a&&this.len<d&&!this.isRadial&&!this.logarithmic&&b.startOnTick&&b.endOnTick&&(a=2);!a&&this.alignToOthers()&&(a=Math.ceil(this.len/d)+1);4>a&&(this.finalTickAmt=a,a=5);this.tickAmount=a};a.prototype.adjustTickAmount=function(){var d=this.options,a=this.tickInterval,c=this.tickPositions,e=this.tickAmount,h=this.finalTickAmt,
f=c&&c.length,p=F(this.threshold,this.softThreshold?0:null);if(this.hasData()&&b(this.min)&&b(this.max)){if(f<e){for(;c.length<e;)c.length%2||this.min===p?c.push(q(c[c.length-1]+a)):c.unshift(q(c[0]-a));this.transA*=(f-1)/(e-1);this.min=d.startOnTick?c[0]:Math.min(this.min,c[0]);this.max=d.endOnTick?c[c.length-1]:Math.max(this.max,c[c.length-1])}else f>e&&(this.tickInterval*=2,this.setTickPositions());if(k(h)){for(a=d=c.length;a--;)(3===h&&1===a%2||2>=h&&0<a&&a<d-1)&&c.splice(a,1);this.finalTickAmt=
void 0}}};a.prototype.setScale=function(){var b=!1,d=!1;this.series.forEach(function(a){b=b||a.isDirtyData||a.isDirty;d=d||a.xAxis&&a.xAxis.isDirty||!1});this.setAxisSize();var a=this.len!==(this.old&&this.old.len);a||b||d||this.isLinked||this.forceRedraw||this.userMin!==(this.old&&this.old.userMin)||this.userMax!==(this.old&&this.old.userMax)||this.alignToOthers()?(this.stacking&&this.stacking.resetStacks(),this.forceRedraw=!1,this.getSeriesExtremes(),this.setTickInterval(),this.isDirty||(this.isDirty=
a||this.min!==(this.old&&this.old.min)||this.max!==(this.old&&this.old.max))):this.stacking&&this.stacking.cleanStacks();b&&this.panningState&&(this.panningState.isDirty=!0);t(this,"afterSetScale")};a.prototype.setExtremes=function(b,d,a,c,e){var h=this,f=h.chart;a=F(a,!0);h.series.forEach(function(b){delete b.kdTree});e=O(e,{min:b,max:d});t(h,"setExtremes",e,function(){h.userMin=b;h.userMax=d;h.eventArgs=e;a&&f.redraw(c)})};a.prototype.zoom=function(b,d){var a=this,c=this.dataMin,e=this.dataMax,
h=this.options,f=Math.min(c,F(h.min,c)),p=Math.max(e,F(h.max,e));b={newMin:b,newMax:d};t(this,"zoom",b,function(b){var d=b.newMin,h=b.newMax;if(d!==a.min||h!==a.max)a.allowZoomOutside||(k(c)&&(d<f&&(d=f),d>p&&(d=p)),k(e)&&(h<f&&(h=f),h>p&&(h=p))),a.displayBtn="undefined"!==typeof d||"undefined"!==typeof h,a.setExtremes(d,h,!1,void 0,{trigger:"zoom"});b.zoomed=!0});return b.zoomed};a.prototype.setAxisSize=function(){var b=this.chart,d=this.options,a=d.offsets||[0,0,0,0],c=this.horiz,e=this.width=Math.round(P(F(d.width,
b.plotWidth-a[3]+a[1]),b.plotWidth)),h=this.height=Math.round(P(F(d.height,b.plotHeight-a[0]+a[2]),b.plotHeight)),f=this.top=Math.round(P(F(d.top,b.plotTop+a[0]),b.plotHeight,b.plotTop));d=this.left=Math.round(P(F(d.left,b.plotLeft+a[3]),b.plotWidth,b.plotLeft));this.bottom=b.chartHeight-h-f;this.right=b.chartWidth-e-d;this.len=Math.max(c?e:h,0);this.pos=c?d:f};a.prototype.getExtremes=function(){var b=this.logarithmic;return{min:b?q(b.lin2log(this.min)):this.min,max:b?q(b.lin2log(this.max)):this.max,
dataMin:this.dataMin,dataMax:this.dataMax,userMin:this.userMin,userMax:this.userMax}};a.prototype.getThreshold=function(b){var d=this.logarithmic,a=d?d.lin2log(this.min):this.min;d=d?d.lin2log(this.max):this.max;null===b||-Infinity===b?b=a:Infinity===b?b=d:a>b?b=a:d<b&&(b=d);return this.translate(b,0,1,0,1)};a.prototype.autoLabelAlign=function(b){var d=(F(b,0)-90*this.side+720)%360;b={align:"center"};t(this,"autoLabelAlign",b,function(b){15<d&&165>d?b.align="right":195<d&&345>d&&(b.align="left")});
return b.align};a.prototype.tickSize=function(b){var d=this.options,a=F(d["tick"===b?"tickWidth":"minorTickWidth"],"tick"===b&&this.isXAxis&&!this.categories?1:0),c=d["tick"===b?"tickLength":"minorTickLength"];if(a&&c){"inside"===d[b+"Position"]&&(c=-c);var e=[c,a]}b={tickSize:e};t(this,"afterTickSize",b);return b.tickSize};a.prototype.labelMetrics=function(){var b=this.tickPositions&&this.tickPositions[0]||0;return this.chart.renderer.fontMetrics(this.options.labels.style.fontSize,this.ticks[b]&&
this.ticks[b].label)};a.prototype.unsquish=function(){var d=this.options.labels,a=this.horiz,c=this.tickInterval,h=this.len/(((this.categories?1:0)+this.max-this.min)/c),f=d.rotation,p=this.labelMetrics(),g=Math.max(this.max-this.min,0),y=function(b){var d=b/(h||1);d=1<d?Math.ceil(d):1;d*c>g&&Infinity!==b&&Infinity!==h&&g&&(d=Math.ceil(g/c));return q(d*c)},k=c,l,G,t=Number.MAX_VALUE;if(a){if(!d.staggerLines&&!d.step)if(b(f))var m=[f];else h<d.autoRotationLimit&&(m=d.autoRotation);m&&m.forEach(function(b){if(b===
f||b&&-90<=b&&90>=b){G=y(Math.abs(p.h/Math.sin(e*b)));var d=G+Math.abs(b/360);d<t&&(t=d,l=b,k=G)}})}else d.step||(k=y(p.h));this.autoRotation=m;this.labelRotation=F(l,b(f)?f:0);return k};a.prototype.getSlotWidth=function(d){var a=this.chart,c=this.horiz,e=this.options.labels,h=Math.max(this.tickPositions.length-(this.categories?0:1),1),f=a.margin[3];if(d&&b(d.slotWidth))return d.slotWidth;if(c&&2>e.step)return e.rotation?0:(this.staggerLines||1)*this.len/h;if(!c){d=e.style.width;if(void 0!==d)return parseInt(String(d),
10);if(f)return f-a.spacing[3]}return.33*a.chartWidth};a.prototype.renderUnsquish=function(){var b=this.chart,d=b.renderer,a=this.tickPositions,c=this.ticks,e=this.options.labels,h=e.style,f=this.horiz,g=this.getSlotWidth(),y=Math.max(1,Math.round(g-2*e.padding)),k={},G=this.labelMetrics(),l=h.textOverflow,t=0;p(e.rotation)||(k.rotation=e.rotation||0);a.forEach(function(b){b=c[b];b.movedLabel&&b.replaceMovedLabel();b&&b.label&&b.label.textPxLength>t&&(t=b.label.textPxLength)});this.maxLabelLength=
t;if(this.autoRotation)t>y&&t>G.h?k.rotation=this.labelRotation:this.labelRotation=0;else if(g){var m=y;if(!l){var F="clip";for(y=a.length;!f&&y--;){var L=a[y];if(L=c[L].label)L.styles&&"ellipsis"===L.styles.textOverflow?L.css({textOverflow:"clip"}):L.textPxLength>g&&L.css({width:g+"px"}),L.getBBox().height>this.len/a.length-(G.h-G.f)&&(L.specificTextOverflow="ellipsis")}}}k.rotation&&(m=t>.5*b.chartHeight?.33*b.chartHeight:t,l||(F="ellipsis"));if(this.labelAlign=e.align||this.autoLabelAlign(this.labelRotation))k.align=
this.labelAlign;a.forEach(function(b){var d=(b=c[b])&&b.label,a=h.width,e={};d&&(d.attr(k),b.shortenLabel?b.shortenLabel():m&&!a&&"nowrap"!==h.whiteSpace&&(m<d.textPxLength||"SPAN"===d.element.tagName)?(e.width=m+"px",l||(e.textOverflow=d.specificTextOverflow||F),d.css(e)):d.styles&&d.styles.width&&!e.width&&!a&&d.css({width:null}),delete d.specificTextOverflow,b.rotation=k.rotation)},this);this.tickRotCorr=d.rotCorr(G.b,this.labelRotation||0,0!==this.side)};a.prototype.hasData=function(){return this.series.some(function(b){return b.hasData()})||
this.options.showEmpty&&k(this.min)&&k(this.max)};a.prototype.addTitle=function(b){var d=this.chart.renderer,a=this.horiz,c=this.opposite,e=this.options.title,h=this.chart.styledMode,f;this.axisTitle||((f=e.textAlign)||(f=(a?{low:"left",middle:"center",high:"right"}:{low:c?"right":"left",middle:"center",high:c?"left":"right"})[e.align]),this.axisTitle=d.text(e.text||"",0,0,e.useHTML).attr({zIndex:7,rotation:e.rotation,align:f}).addClass("highcharts-axis-title"),h||this.axisTitle.css(G(e.style)),this.axisTitle.add(this.axisGroup),
this.axisTitle.isNew=!0);h||e.style.width||this.isRadial||this.axisTitle.css({width:this.len+"px"});this.axisTitle[b?"show":"hide"](b)};a.prototype.generateTick=function(b){var d=this.ticks;d[b]?d[b].addLabel():d[b]=new u(this,b)};a.prototype.getOffset=function(){var b=this,d=this,a=d.chart,c=a.renderer,e=d.options,h=d.tickPositions,f=d.ticks,p=d.horiz,g=d.side,y=a.inverted&&!d.isZAxis?[1,0,3,2][g]:g,G=d.hasData(),l=e.title,m=e.labels,q=a.axisOffset;a=a.clipOffset;var v=[-1,1,1,-1][g],n=e.className,
B=d.axisParent,r,P=0,D=0,ca=0;d.showAxis=r=G||e.showEmpty;d.staggerLines=d.horiz&&m.staggerLines||void 0;if(!d.axisGroup){var ia=function(d,a,e){return c.g(d).attr({zIndex:e}).addClass("highcharts-"+b.coll.toLowerCase()+a+" "+(b.isRadial?"highcharts-radial-axis"+a+" ":"")+(n||"")).add(B)};d.gridGroup=ia("grid","-grid",e.gridZIndex);d.axisGroup=ia("axis","",e.zIndex);d.labelGroup=ia("axis-labels","-labels",m.zIndex)}G||d.isLinked?(h.forEach(function(b){d.generateTick(b)}),d.renderUnsquish(),d.reserveSpaceDefault=
0===g||2===g||{1:"left",3:"right"}[g]===d.labelAlign,F(m.reserveSpace,"center"===d.labelAlign?!0:null,d.reserveSpaceDefault)&&h.forEach(function(b){ca=Math.max(f[b].getLabelSize(),ca)}),d.staggerLines&&(ca*=d.staggerLines),d.labelOffset=ca*(d.opposite?-1:1)):L(f,function(b,d){b.destroy();delete f[d]});if(l&&l.text&&!1!==l.enabled&&(d.addTitle(r),r&&!1!==l.reserveSpace)){d.titleOffset=P=d.axisTitle.getBBox()[p?"height":"width"];var I=l.offset;D=k(I)?0:F(l.margin,p?5:10)}d.renderLine();d.offset=v*F(e.offset,
q[g]?q[g]+(e.margin||0):0);d.tickRotCorr=d.tickRotCorr||{x:0,y:0};l=0===g?-d.labelMetrics().h:2===g?d.tickRotCorr.y:0;G=Math.abs(ca)+D;ca&&(G=G-l+v*(p?F(m.y,d.tickRotCorr.y+8*v):m.x));d.axisTitleMargin=F(I,G);d.getMaxLabelDimensions&&(d.maxLabelDimensions=d.getMaxLabelDimensions(f,h));p=this.tickSize("tick");q[g]=Math.max(q[g],(d.axisTitleMargin||0)+P+v*d.offset,G,h&&h.length&&p?p[0]+v*d.offset:0);e=e.offset?0:2*Math.floor(d.axisLine.strokeWidth()/2);a[y]=Math.max(a[y],e);t(this,"afterGetOffset")};
a.prototype.getLinePath=function(b){var d=this.chart,a=this.opposite,c=this.offset,e=this.horiz,h=this.left+(a?this.width:0)+c;c=d.chartHeight-this.bottom-(a?this.height:0)+c;a&&(b*=-1);return d.renderer.crispLine([["M",e?this.left:h,e?c:this.top],["L",e?d.chartWidth-this.right:h,e?c:d.chartHeight-this.bottom]],b)};a.prototype.renderLine=function(){this.axisLine||(this.axisLine=this.chart.renderer.path().addClass("highcharts-axis-line").add(this.axisGroup),this.chart.styledMode||this.axisLine.attr({stroke:this.options.lineColor,
"stroke-width":this.options.lineWidth,zIndex:7}))};a.prototype.getTitlePosition=function(){var b=this.horiz,d=this.left,a=this.top,c=this.len,e=this.options.title,h=b?d:a,f=this.opposite,p=this.offset,g=e.x,y=e.y,k=this.axisTitle,G=this.chart.renderer.fontMetrics(e.style.fontSize,k);k=Math.max(k.getBBox(null,0).height-G.h-1,0);c={low:h+(b?0:c),middle:h+c/2,high:h+(b?c:0)}[e.align];d=(b?a+this.height:d)+(b?1:-1)*(f?-1:1)*this.axisTitleMargin+[-k,k,G.f,-k][this.side];b={x:b?c+g:d+(f?this.width:0)+p+
g,y:b?d+y-(f?this.height:0)+p:c+y};t(this,"afterGetTitlePosition",{titlePosition:b});return b};a.prototype.renderMinorTick=function(b,d){var a=this.minorTicks;a[b]||(a[b]=new u(this,b,"minor"));d&&a[b].isNew&&a[b].render(null,!0);a[b].render(null,!1,1)};a.prototype.renderTick=function(b,d,a){var c=this.ticks;if(!this.isLinked||b>=this.min&&b<=this.max||this.grid&&this.grid.isColumn)c[b]||(c[b]=new u(this,b)),a&&c[b].isNew&&c[b].render(d,!0,-1),c[b].render(d)};a.prototype.render=function(){var d=this,
a=d.chart,c=d.logarithmic,e=d.options,h=d.isLinked,f=d.tickPositions,p=d.axisTitle,g=d.ticks,y=d.minorTicks,k=d.alternateBands,G=e.stackLabels,l=e.alternateGridColor,F=d.tickmarkOffset,q=d.axisLine,v=d.showAxis,n=m(a.renderer.globalAnimation),B,r;d.labelEdge.length=0;d.overlap=!1;[g,y,k].forEach(function(b){L(b,function(b){b.isActive=!1})});if(d.hasData()||h){var P=d.chart.hasRendered&&d.old&&b(d.old.min);d.minorTickInterval&&!d.categories&&d.getMinorTickPositions().forEach(function(b){d.renderMinorTick(b,
P)});f.length&&(f.forEach(function(b,a){d.renderTick(b,a,P)}),F&&(0===d.min||d.single)&&(g[-1]||(g[-1]=new u(d,-1,null,!0)),g[-1].render(-1)));l&&f.forEach(function(b,e){r="undefined"!==typeof f[e+1]?f[e+1]+F:d.max-F;0===e%2&&b<d.max&&r<=d.max+(a.polar?-F:F)&&(k[b]||(k[b]=new J.PlotLineOrBand(d)),B=b+F,k[b].options={from:c?c.lin2log(B):B,to:c?c.lin2log(r):r,color:l,className:"highcharts-alternate-grid"},k[b].render(),k[b].isActive=!0)});d._addedPlotLB||(d._addedPlotLB=!0,(e.plotLines||[]).concat(e.plotBands||
[]).forEach(function(b){d.addPlotBandOrLine(b)}))}[g,y,k].forEach(function(b){var d=[],c=n.duration;L(b,function(b,a){b.isActive||(b.render(a,!1,0),b.isActive=!1,d.push(a))});V(function(){for(var a=d.length;a--;)b[d[a]]&&!b[d[a]].isActive&&(b[d[a]].destroy(),delete b[d[a]])},b!==k&&a.hasRendered&&c?c:0)});q&&(q[q.isPlaced?"animate":"attr"]({d:this.getLinePath(q.strokeWidth())}),q.isPlaced=!0,q[v?"show":"hide"](v));p&&v&&(e=d.getTitlePosition(),b(e.y)?(p[p.isNew?"attr":"animate"](e),p.isNew=!1):(p.attr("y",
-9999),p.isNew=!0));G&&G.enabled&&d.stacking&&d.stacking.renderStackTotals();d.old={len:d.len,max:d.max,min:d.min,transA:d.transA,userMax:d.userMax,userMin:d.userMin};d.isDirty=!1;t(this,"afterRender")};a.prototype.redraw=function(){this.visible&&(this.render(),this.plotLinesAndBands.forEach(function(b){b.render()}));this.series.forEach(function(b){b.isDirty=!0})};a.prototype.getKeepProps=function(){return this.keepProps||a.keepProps};a.prototype.destroy=function(b){var d=this,a=d.plotLinesAndBands,
c=this.eventOptions;t(this,"destroy",{keepEvents:b});b||S(d);[d.ticks,d.minorTicks,d.alternateBands].forEach(function(b){r(b)});if(a)for(b=a.length;b--;)a[b].destroy();"axisLine axisTitle axisGroup gridGroup labelGroup cross scrollbar".split(" ").forEach(function(b){d[b]&&(d[b]=d[b].destroy())});for(var e in d.plotLinesAndBandsGroups)d.plotLinesAndBandsGroups[e]=d.plotLinesAndBandsGroups[e].destroy();L(d,function(b,a){-1===d.getKeepProps().indexOf(a)&&delete d[a]});this.eventOptions=c};a.prototype.drawCrosshair=
function(b,d){var a=this.crosshair,c=F(a&&a.snap,!0),e=this.chart,h,f=this.cross;t(this,"drawCrosshair",{e:b,point:d});b||(b=this.cross&&this.cross.e);if(a&&!1!==(k(d)||!c)){c?k(d)&&(h=F("colorAxis"!==this.coll?d.crosshairPos:null,this.isXAxis?d.plotX:this.len-d.plotY)):h=b&&(this.horiz?b.chartX-this.pos:this.len-b.chartY+this.pos);if(k(h)){var p={value:d&&(this.isXAxis?d.x:F(d.stackY,d.y)),translatedValue:h};e.polar&&O(p,{isCrosshair:!0,chartX:b&&b.chartX,chartY:b&&b.chartY,point:d});p=this.getPlotLinePath(p)||
null}if(!k(p)){this.hideCrosshair();return}c=this.categories&&!this.isRadial;f||(this.cross=f=e.renderer.path().addClass("highcharts-crosshair highcharts-crosshair-"+(c?"category ":"thin ")+(a.className||"")).attr({zIndex:F(a.zIndex,2)}).add(),e.styledMode||(f.attr({stroke:a.color||(c?C.parse(E.highlightColor20).setOpacity(.25).get():E.neutralColor20),"stroke-width":F(a.width,1)}).css({"pointer-events":"none"}),a.dashStyle&&f.attr({dashstyle:a.dashStyle})));f.show().attr({d:p});c&&!a.width&&f.attr({"stroke-width":this.transA});
this.cross.e=b}else this.hideCrosshair();t(this,"afterDrawCrosshair",{e:b,point:d})};a.prototype.hideCrosshair=function(){this.cross&&this.cross.hide();t(this,"afterHideCrosshair")};a.prototype.hasVerticalPanning=function(){var b=this.chart.options.chart.panning;return!!(b&&b.enabled&&/y/.test(b.type))};a.prototype.validatePositiveValue=function(d){return b(d)&&0<d};a.prototype.update=function(b,d){var a=this.chart;b=G(this.userOptions,b);this.destroy(!0);this.init(a,b);a.isDirtyBox=!0;F(d,!0)&&a.redraw()};
a.prototype.remove=function(b){for(var d=this.chart,a=this.coll,c=this.series,e=c.length;e--;)c[e]&&c[e].remove(!1);D(d.axes,this);D(d[a],this);d[a].forEach(function(b,d){b.options.index=b.userOptions.index=d});this.destroy();d.isDirtyBox=!0;F(b,!0)&&d.redraw()};a.prototype.setTitle=function(b,d){this.update({title:b},d)};a.prototype.setCategories=function(b,d){this.update({categories:b},d)};a.defaultOptions=w.defaultXAxisOptions;a.keepProps="extKey hcEvents names series userMax userMin".split(" ");
return a}();"";return a});M(a,"Core/Axis/DateTimeAxis.js",[a["Core/Utilities.js"]],function(a){var r=a.addEvent,C=a.getMagnitude,E=a.normalizeTickInterval,z=a.timeUnits,x;(function(a){function u(){return this.chart.time.getTimeTicks.apply(this.chart.time,arguments)}function n(a){"datetime"!==a.userOptions.type?this.dateTime=void 0:this.dateTime||(this.dateTime=new g(this))}var m=[];a.compose=function(a){-1===m.indexOf(a)&&(m.push(a),a.keepProps.push("dateTime"),a.prototype.getTimeTicks=u,r(a,"init",
n));return a};var g=function(){function a(a){this.axis=a}a.prototype.normalizeTimeTickInterval=function(a,c){var e=c||[["millisecond",[1,2,5,10,20,25,50,100,200,500]],["second",[1,2,5,10,15,30]],["minute",[1,2,5,10,15,30]],["hour",[1,2,3,4,6,8,12]],["day",[1,2]],["week",[1,2]],["month",[1,2,3,4,6]],["year",null]];c=e[e.length-1];var g=z[c[0]],l=c[1],k;for(k=0;k<e.length&&!(c=e[k],g=z[c[0]],l=c[1],e[k+1]&&a<=(g*l[l.length-1]+z[e[k+1][0]])/2);k++);g===z.year&&a<5*g&&(l=[1,2,5]);a=E(a/g,l,"year"===c[0]?
Math.max(C(a/g),1):1);return{unitRange:g,count:a,unitName:c[0]}};a.prototype.getXDateFormat=function(a,c){var e=this.axis;return e.closestPointRange?e.chart.time.getDateFormat(e.closestPointRange,a,e.options.startOfWeek,c)||c.year:c.day};return a}();a.Additions=g})(x||(x={}));return x});M(a,"Core/Axis/LogarithmicAxis.js",[a["Core/Utilities.js"]],function(a){var r=a.addEvent,C=a.getMagnitude,E=a.normalizeTickInterval,z=a.pick,x;(function(a){function u(a){var c=this.logarithmic;"logarithmic"!==a.userOptions.type?
this.logarithmic=void 0:c||(this.logarithmic=new g(this))}function n(){var a=this.logarithmic;a&&(this.lin2val=function(c){return a.lin2log(c)},this.val2lin=function(c){return a.log2lin(c)})}var m=[];a.compose=function(a){-1===m.indexOf(a)&&(m.push(a),a.keepProps.push("logarithmic"),r(a,"init",u),r(a,"afterInit",n));return a};var g=function(){function a(a){this.axis=a}a.prototype.getLogTickPositions=function(a,c,f,g){var e=this.axis,k=e.len,l=e.options,m=[];g||(this.minorAutoInterval=void 0);if(.5<=
a)a=Math.round(a),m=e.getLinearTickPositions(a,c,f);else if(.08<=a){var n=Math.floor(c),v,t=l=void 0;for(k=.3<a?[1,2,4]:.15<a?[1,2,4,6,8]:[1,2,3,4,5,6,7,8,9];n<f+1&&!t;n++){var h=k.length;for(v=0;v<h&&!t;v++){var d=this.log2lin(this.lin2log(n)*k[v]);d>c&&(!g||l<=f)&&"undefined"!==typeof l&&m.push(l);l>f&&(t=!0);l=d}}}else c=this.lin2log(c),f=this.lin2log(f),a=g?e.getMinorTickInterval():l.tickInterval,a=z("auto"===a?null:a,this.minorAutoInterval,l.tickPixelInterval/(g?5:1)*(f-c)/((g?k/e.tickPositions.length:
k)||1)),a=E(a,void 0,C(a)),m=e.getLinearTickPositions(a,c,f).map(this.log2lin),g||(this.minorAutoInterval=a/5);g||(e.tickInterval=a);return m};a.prototype.lin2log=function(a){return Math.pow(10,a)};a.prototype.log2lin=function(a){return Math.log(a)/Math.LN10};return a}();a.Additions=g})(x||(x={}));return x});M(a,"Core/Axis/PlotLineOrBand/PlotLineOrBandAxis.js",[a["Core/Utilities.js"]],function(a){var r=a.erase,C=a.extend,E=a.isNumber,z;(function(a){var x=[],u;a.compose=function(a,g){u||(u=a);-1===
x.indexOf(g)&&(x.push(g),C(g.prototype,n.prototype));return g};var n=function(){function a(){}a.prototype.getPlotBandPath=function(a,c,e){void 0===e&&(e=this.options);var g=this.getPlotLinePath({value:c,force:!0,acrossPanes:e.acrossPanes}),f=[],m=this.horiz;c=!E(this.min)||!E(this.max)||a<this.min&&c<this.min||a>this.max&&c>this.max;a=this.getPlotLinePath({value:a,force:!0,acrossPanes:e.acrossPanes});e=1;if(a&&g){if(c){var q=a.toString()===g.toString();e=0}for(c=0;c<a.length;c+=2){var k=a[c],n=a[c+
1],r=g[c],B=g[c+1];"M"!==k[0]&&"L"!==k[0]||"M"!==n[0]&&"L"!==n[0]||"M"!==r[0]&&"L"!==r[0]||"M"!==B[0]&&"L"!==B[0]||(m&&r[1]===k[1]?(r[1]+=e,B[1]+=e):m||r[2]!==k[2]||(r[2]+=e,B[2]+=e),f.push(["M",k[1],k[2]],["L",n[1],n[2]],["L",B[1],B[2]],["L",r[1],r[2]],["Z"]));f.isFlat=q}}return f};a.prototype.addPlotBand=function(a){return this.addPlotBandOrLine(a,"plotBands")};a.prototype.addPlotLine=function(a){return this.addPlotBandOrLine(a,"plotLines")};a.prototype.addPlotBandOrLine=function(a,c){var e=this,
g=this.userOptions,f=new u(this,a);this.visible&&(f=f.render());if(f){this._addedPlotLB||(this._addedPlotLB=!0,(g.plotLines||[]).concat(g.plotBands||[]).forEach(function(a){e.addPlotBandOrLine(a)}));if(c){var m=g[c]||[];m.push(a);g[c]=m}this.plotLinesAndBands.push(f)}return f};a.prototype.removePlotBandOrLine=function(a){var c=this.plotLinesAndBands,e=this.options,g=this.userOptions;if(c){for(var f=c.length;f--;)c[f].id===a&&c[f].destroy();[e.plotLines||[],g.plotLines||[],e.plotBands||[],g.plotBands||
[]].forEach(function(c){for(f=c.length;f--;)(c[f]||{}).id===a&&r(c,c[f])})}};a.prototype.removePlotBand=function(a){this.removePlotBandOrLine(a)};a.prototype.removePlotLine=function(a){this.removePlotBandOrLine(a)};return a}()})(z||(z={}));return z});M(a,"Core/Axis/PlotLineOrBand/PlotLineOrBand.js",[a["Core/Color/Palette.js"],a["Core/Axis/PlotLineOrBand/PlotLineOrBandAxis.js"],a["Core/Utilities.js"]],function(a,w,C){var r=C.arrayMax,z=C.arrayMin,x=C.defined,J=C.destroyObjectProperties,u=C.erase,n=
C.fireEvent,m=C.merge,g=C.objectEach,c=C.pick;C=function(){function e(a,c){this.axis=a;c&&(this.options=c,this.id=c.id)}e.compose=function(a){return w.compose(e,a)};e.prototype.render=function(){n(this,"render");var e=this,f=e.axis,v=f.horiz,q=f.logarithmic,k=e.options,r=k.color,D=c(k.zIndex,0),B=k.events,u={},t=f.chart.renderer,h=k.label,d=e.label,b=k.to,p=k.from,G=k.value,y=e.svgElem,L=[],F=x(p)&&x(b);L=x(G);var P=!y,S={"class":"highcharts-plot-"+(F?"band ":"line ")+(k.className||"")},Q=F?"bands":
"lines";q&&(p=q.log2lin(p),b=q.log2lin(b),G=q.log2lin(G));f.chart.styledMode||(L?(S.stroke=r||a.neutralColor40,S["stroke-width"]=c(k.width,1),k.dashStyle&&(S.dashstyle=k.dashStyle)):F&&(S.fill=r||a.highlightColor10,k.borderWidth&&(S.stroke=k.borderColor,S["stroke-width"]=k.borderWidth)));u.zIndex=D;Q+="-"+D;(q=f.plotLinesAndBandsGroups[Q])||(f.plotLinesAndBandsGroups[Q]=q=t.g("plot-"+Q).attr(u).add());P&&(e.svgElem=y=t.path().attr(S).add(q));if(L)L=f.getPlotLinePath({value:G,lineWidth:y.strokeWidth(),
acrossPanes:k.acrossPanes});else if(F)L=f.getPlotBandPath(p,b,k);else return;!e.eventsAdded&&B&&(g(B,function(b,d){y.on(d,function(b){B[d].apply(e,[b])})}),e.eventsAdded=!0);(P||!y.d)&&L&&L.length?y.attr({d:L}):y&&(L?(y.show(!0),y.animate({d:L})):y.d&&(y.hide(),d&&(e.label=d=d.destroy())));h&&(x(h.text)||x(h.formatter))&&L&&L.length&&0<f.width&&0<f.height&&!L.isFlat?(h=m({align:v&&F&&"center",x:v?!F&&4:10,verticalAlign:!v&&F&&"middle",y:v?F?16:10:F?6:-4,rotation:v&&!F&&90},h),this.renderLabel(h,L,
F,D)):d&&d.hide();return e};e.prototype.renderLabel=function(a,c,e,g){var f=this.axis,l=f.chart.renderer,q=this.label;q||(this.label=q=l.text(this.getLabelText(a),0,0,a.useHTML).attr({align:a.textAlign||a.align,rotation:a.rotation,"class":"highcharts-plot-"+(e?"band":"line")+"-label "+(a.className||""),zIndex:g}).add(),f.chart.styledMode||q.css(m({textOverflow:"ellipsis"},a.style)));g=c.xBounds||[c[0][1],c[1][1],e?c[2][1]:c[0][1]];c=c.yBounds||[c[0][2],c[1][2],e?c[2][2]:c[0][2]];e=z(g);l=z(c);q.align(a,
!1,{x:e,y:l,width:r(g)-e,height:r(c)-l});q.alignValue&&"left"!==q.alignValue||q.css({width:(90===q.rotation?f.height-(q.alignAttr.y-f.top):f.width-(q.alignAttr.x-f.left))+"px"});q.show(!0)};e.prototype.getLabelText=function(a){return x(a.formatter)?a.formatter.call(this):a.text};e.prototype.destroy=function(){u(this.axis.plotLinesAndBands,this);delete this.axis;J(this)};return e}();"";"";return C});M(a,"Core/Tooltip.js",[a["Core/FormatUtilities.js"],a["Core/Globals.js"],a["Core/Color/Palette.js"],
a["Core/Renderer/RendererUtilities.js"],a["Core/Renderer/RendererRegistry.js"],a["Core/Utilities.js"]],function(a,w,C,E,z,x){var r=a.format,u=w.doc,n=E.distribute,m=x.addEvent,g=x.clamp,c=x.css,e=x.defined,l=x.discardElement,f=x.extend,v=x.fireEvent,q=x.isArray,k=x.isNumber,I=x.isString,D=x.merge,B=x.pick,O=x.splat,t=x.syncTimeout;a=function(){function a(a,b){this.container=void 0;this.crosshairs=[];this.distance=0;this.isHidden=!0;this.isSticky=!1;this.now={};this.options={};this.outside=!1;this.chart=
a;this.init(a,b)}a.prototype.applyFilter=function(){var a=this.chart;a.renderer.definition({tagName:"filter",attributes:{id:"drop-shadow-"+a.index,opacity:.5},children:[{tagName:"feGaussianBlur",attributes:{"in":"SourceAlpha",stdDeviation:1}},{tagName:"feOffset",attributes:{dx:1,dy:1}},{tagName:"feComponentTransfer",children:[{tagName:"feFuncA",attributes:{type:"linear",slope:.3}}]},{tagName:"feMerge",children:[{tagName:"feMergeNode"},{tagName:"feMergeNode",attributes:{"in":"SourceGraphic"}}]}]})};
a.prototype.bodyFormatter=function(a){return a.map(function(b){var a=b.series.tooltipOptions;return(a[(b.point.formatPrefix||"point")+"Formatter"]||b.point.tooltipFormatter).call(b.point,a[(b.point.formatPrefix||"point")+"Format"]||"")})};a.prototype.cleanSplit=function(a){this.chart.series.forEach(function(b){var d=b&&b.tt;d&&(!d.isActive||a?b.tt=d.destroy():d.isActive=!1)})};a.prototype.defaultFormatter=function(a){var b=this.points||O(this);var d=[a.tooltipFooterHeaderFormatter(b[0])];d=d.concat(a.bodyFormatter(b));
d.push(a.tooltipFooterHeaderFormatter(b[0],!0));return d};a.prototype.destroy=function(){this.label&&(this.label=this.label.destroy());this.split&&this.tt&&(this.cleanSplit(this.chart,!0),this.tt=this.tt.destroy());this.renderer&&(this.renderer=this.renderer.destroy(),l(this.container));x.clearTimeout(this.hideTimer);x.clearTimeout(this.tooltipTimeout)};a.prototype.getAnchor=function(a,b){var d=this.chart,c=d.pointer,e=d.inverted,h=d.plotTop,f=d.plotLeft,g,k,t=0,l=0;a=O(a);this.followPointer&&b?("undefined"===
typeof b.chartX&&(b=c.normalize(b)),c=[b.chartX-f,b.chartY-h]):a[0].tooltipPos?c=a[0].tooltipPos:(a.forEach(function(b){g=b.series.yAxis;k=b.series.xAxis;t+=b.plotX||0;l+=b.plotLow?(b.plotLow+(b.plotHigh||0))/2:b.plotY||0;k&&g&&(e?(t+=h+d.plotHeight-k.len-k.pos,l+=f+d.plotWidth-g.len-g.pos):(t+=k.pos-f,l+=g.pos-h))}),t/=a.length,l/=a.length,c=[e?d.plotWidth-l:t,e?d.plotHeight-t:l],this.shared&&1<a.length&&b&&(e?c[0]=b.chartX-f:c[1]=b.chartY-h));return c.map(Math.round)};a.prototype.getLabel=function(){var a=
this,b=this.chart.styledMode,h=this.options,f="tooltip"+(e(h.className)?" "+h.className:""),g=h.style.pointerEvents||(!this.followPointer&&h.stickOnContact?"auto":"none"),k=function(){a.inContact=!0},t=function(b){var d=a.chart.hoverSeries;a.inContact=a.shouldStickOnContact()&&a.chart.pointer.inClass(b.relatedTarget,"highcharts-tooltip");if(!a.inContact&&d&&d.onMouseOut)d.onMouseOut()},l,q=this.chart.renderer;if(!this.label){if(this.outside){var n=this.chart.options.chart.style,v=z.getRendererType();
this.container=l=w.doc.createElement("div");l.className="highcharts-tooltip-container";c(l,{position:"absolute",top:"1px",pointerEvents:g,zIndex:Math.max(this.options.style.zIndex||0,(n&&n.zIndex||0)+3)});m(l,"mouseenter",k);m(l,"mouseleave",t);w.doc.body.appendChild(l);this.renderer=q=new v(l,0,0,n,void 0,void 0,q.styledMode)}this.split?this.label=q.g(f):(this.label=q.label("",0,0,h.shape,void 0,void 0,h.useHTML,void 0,f).attr({padding:h.padding,r:h.borderRadius}),b||this.label.attr({fill:h.backgroundColor,
"stroke-width":h.borderWidth}).css(h.style).css({pointerEvents:g}).shadow(h.shadow));b&&h.shadow&&(this.applyFilter(),this.label.attr({filter:"url(#drop-shadow-"+this.chart.index+")"}));if(a.outside&&!a.split){var r=this.label,B=r.xSetter,D=r.ySetter;r.xSetter=function(b){B.call(r,a.distance);l.style.left=b+"px"};r.ySetter=function(b){D.call(r,a.distance);l.style.top=b+"px"}}this.label.on("mouseenter",k).on("mouseleave",t).attr({zIndex:8}).add()}return this.label};a.prototype.getPosition=function(a,
b,c){var d=this.chart,e=this.distance,h={},f=d.inverted&&c.h||0,g=this.outside,p=g?u.documentElement.clientWidth-2*e:d.chartWidth,k=g?Math.max(u.body.scrollHeight,u.documentElement.scrollHeight,u.body.offsetHeight,u.documentElement.offsetHeight,u.documentElement.clientHeight):d.chartHeight,l=d.pointer.getChartPosition(),t=function(h){var f="x"===h;return[h,f?p:k,f?a:b].concat(g?[f?a*l.scaleX:b*l.scaleY,f?l.left-e+(c.plotX+d.plotLeft)*l.scaleX:l.top-e+(c.plotY+d.plotTop)*l.scaleY,0,f?p:k]:[f?a:b,f?
c.plotX+d.plotLeft:c.plotY+d.plotTop,f?d.plotLeft:d.plotTop,f?d.plotLeft+d.plotWidth:d.plotTop+d.plotHeight])},m=t("y"),q=t("x"),n,v=!this.followPointer&&B(c.ttBelow,!d.inverted===!!c.negative),r=function(b,a,d,c,p,k,y){var t=g?"y"===b?e*l.scaleY:e*l.scaleX:e,G=(d-c)/2,A=c<p-e,m=p+e+c<a,F=p-t-d+G;p=p+t-G;if(v&&m)h[b]=p;else if(!v&&A)h[b]=F;else if(A)h[b]=Math.min(y-c,0>F-f?F:F-f);else if(m)h[b]=Math.max(k,p+f+d>a?p:p+f);else return!1},D=function(b,a,d,c,f){var g;f<e||f>a-e?g=!1:h[b]=f<d/2?1:f>a-c/
2?a-c-2:f-d/2;return g},A=function(b){var a=m;m=q;q=a;n=b},U=function(){!1!==r.apply(0,m)?!1!==D.apply(0,q)||n||(A(!0),U()):n?h.x=h.y=0:(A(!0),U())};(d.inverted||1<this.len)&&A();U();return h};a.prototype.hide=function(a){var b=this;x.clearTimeout(this.hideTimer);a=B(a,this.options.hideDelay);this.isHidden||(this.hideTimer=t(function(){b.getLabel().fadeOut(a?void 0:a);b.isHidden=!0},a))};a.prototype.init=function(a,b){this.chart=a;this.options=b;this.crosshairs=[];this.now={x:0,y:0};this.isHidden=
!0;this.split=b.split&&!a.inverted&&!a.polar;this.shared=b.shared||this.split;this.outside=B(b.outside,!(!a.scrollablePixelsX&&!a.scrollablePixelsY))};a.prototype.shouldStickOnContact=function(){return!(this.followPointer||!this.options.stickOnContact)};a.prototype.isStickyOnContact=function(){return!(!this.shouldStickOnContact()||!this.inContact)};a.prototype.move=function(a,b,c,e){var d=this,h=d.now,g=!1!==d.options.animation&&!d.isHidden&&(1<Math.abs(a-h.x)||1<Math.abs(b-h.y)),p=d.followPointer||
1<d.len;f(h,{x:g?(2*h.x+a)/3:a,y:g?(h.y+b)/2:b,anchorX:p?void 0:g?(2*h.anchorX+c)/3:c,anchorY:p?void 0:g?(h.anchorY+e)/2:e});d.getLabel().attr(h);d.drawTracker();g&&(x.clearTimeout(this.tooltipTimeout),this.tooltipTimeout=setTimeout(function(){d&&d.move(a,b,c,e)},32))};a.prototype.refresh=function(a,b){var d=this.chart,c=this.options,e=O(a),h=e[0],f=[],g=c.formatter||this.defaultFormatter,k=this.shared,l=d.styledMode,t={};if(c.enabled){x.clearTimeout(this.hideTimer);this.followPointer=!this.split&&
h.series.tooltipOptions.followPointer;var m=this.getAnchor(a,b),n=m[0],r=m[1];!k||!q(a)&&a.series&&a.series.noSharedTooltip?t=h.getLabelConfig():(d.pointer.applyInactiveState(e),e.forEach(function(b){b.setState("hover");f.push(b.getLabelConfig())}),t={x:h.category,y:h.y},t.points=f);this.len=f.length;a=g.call(t,this);g=h.series;this.distance=B(g.tooltipOptions.distance,16);if(!1===a)this.hide();else{if(this.split)this.renderSplit(a,e);else if(e=n,k=r,b&&d.pointer.isDirectTouch&&(e=b.chartX-d.plotLeft,
k=b.chartY-d.plotTop),d.polar||!1===g.options.clip||g.shouldShowTooltip(e,k))b=this.getLabel(),c.style.width&&!l||b.css({width:this.chart.spacingBox.width+"px"}),b.attr({text:a&&a.join?a.join(""):a}),b.removeClass(/highcharts-color-[\d]+/g).addClass("highcharts-color-"+B(h.colorIndex,g.colorIndex)),l||b.attr({stroke:c.borderColor||h.color||g.color||C.neutralColor60}),this.updatePosition({plotX:n,plotY:r,negative:h.negative,ttBelow:h.ttBelow,h:m[2]||0});else{this.hide();return}this.isHidden&&this.label&&
this.label.attr({opacity:1}).show();this.isHidden=!1}v(this,"refresh")}};a.prototype.renderSplit=function(a,b){function d(b,a,d,e,h){void 0===h&&(h=!0);d?(a=Y?0:J,b=g(b-e/2,N.left,N.right-e-(c.outside?T:0))):(a-=da,b=h?b-e-z:b+z,b=g(b,h?b:N.left,N.right));return{x:b,y:a}}var c=this,e=c.chart,h=c.chart,k=h.chartWidth,l=h.chartHeight,t=h.plotHeight,m=h.plotLeft,q=h.plotTop,r=h.pointer,v=h.scrollablePixelsY;v=void 0===v?0:v;var D=h.scrollablePixelsX,x=h.scrollingContainer;x=void 0===x?{scrollLeft:0,
scrollTop:0}:x;var w=x.scrollLeft;x=x.scrollTop;var O=h.styledMode,z=c.distance,A=c.options,U=c.options.positioner,N=c.outside&&"number"!==typeof D?u.documentElement.getBoundingClientRect():{left:w,right:w+k,top:x,bottom:x+l},W=c.getLabel(),X=this.renderer||e.renderer,Y=!(!e.xAxis[0]||!e.xAxis[0].opposite);e=r.getChartPosition();var T=e.left;e=e.top;var da=q+x,E=0,J=t-v;I(a)&&(a=[!1,a]);a=a.slice(0,b.length+1).reduce(function(a,e,h){if(!1!==e&&""!==e){h=b[h-1]||{isHeader:!0,plotX:b[0].plotX,plotY:t,
series:{}};var f=h.isHeader,p=f?c:h.series;e=e.toString();var k=p.tt,l=h.isHeader;var y=h.series;var G="highcharts-color-"+B(h.colorIndex,y.colorIndex,"none");k||(k={padding:A.padding,r:A.borderRadius},O||(k.fill=A.backgroundColor,k["stroke-width"]=A.borderWidth),k=X.label("",0,0,A[l?"headerShape":"shape"],void 0,void 0,A.useHTML).addClass((l?"highcharts-tooltip-header ":"")+"highcharts-tooltip-box "+G).attr(k).add(W));k.isActive=!0;k.attr({text:e});O||k.css(A.style).shadow(A.shadow).attr({stroke:A.borderColor||
h.color||y.color||C.neutralColor80});p=p.tt=k;l=p.getBBox();e=l.width+p.strokeWidth();f&&(E=l.height,J+=E,Y&&(da-=E));y=h.plotX;y=void 0===y?0:y;G=h.plotY;G=void 0===G?0:G;k=h.series;if(h.isHeader){y=m+y;var F=q+t/2}else{var n=k.xAxis,ca=k.yAxis;y=n.pos+g(y,-z,n.len+z);k.shouldShowTooltip(0,ca.pos-q+G,{ignoreX:!0})&&(F=ca.pos+G)}y=g(y,N.left-z,N.right+z);"number"===typeof F?(l=l.height+1,G=U?U.call(c,e,l,h):d(y,F,f,e),a.push({align:U?0:void 0,anchorX:y,anchorY:F,boxWidth:e,point:h,rank:B(G.rank,f?
1:0),size:l,target:G.y,tt:p,x:G.x})):p.isActive=!1}return a},[]);!U&&a.some(function(b){var a=(c.outside?T:0)+b.anchorX;return a<N.left&&a+b.boxWidth<N.right?!0:a<T-N.left+b.boxWidth&&N.right-a>a})&&(a=a.map(function(b){var a=d(b.anchorX,b.anchorY,b.point.isHeader,b.boxWidth,!1);return f(b,{target:a.y,x:a.x})}));c.cleanSplit();n(a,J);var ba=T,ea=T;a.forEach(function(b){var a=b.x,d=b.boxWidth;b=b.isHeader;b||(c.outside&&T+a<ba&&(ba=T+a),!b&&c.outside&&ba+d>ea&&(ea=T+a))});a.forEach(function(b){var a=
b.x,d=b.anchorX,e=b.pos,h=b.point.isHeader;e={visibility:"undefined"===typeof e?"hidden":"inherit",x:a,y:e+da,anchorX:d,anchorY:b.anchorY};if(c.outside&&a<d){var f=T-ba;0<f&&(h||(e.x=a+f,e.anchorX=d+f),h&&(e.x=(ea-ba)/2,e.anchorX=d+f))}b.tt.attr(e)});a=c.container;v=c.renderer;c.outside&&a&&v&&(h=W.getBBox(),v.setSize(h.width+h.x,h.height+h.y,!1),a.style.left=ba+"px",a.style.top=e+"px")};a.prototype.drawTracker=function(){if(this.followPointer||!this.options.stickOnContact)this.tracker&&this.tracker.destroy();
else{var a=this.chart,b=this.label,c=this.shared?a.hoverPoints:a.hoverPoint;if(b&&c){var e={x:0,y:0,width:0,height:0};c=this.getAnchor(c);var h=b.getBBox();c[0]+=a.plotLeft-b.translateX;c[1]+=a.plotTop-b.translateY;e.x=Math.min(0,c[0]);e.y=Math.min(0,c[1]);e.width=0>c[0]?Math.max(Math.abs(c[0]),h.width-c[0]):Math.max(Math.abs(c[0]),h.width);e.height=0>c[1]?Math.max(Math.abs(c[1]),h.height-Math.abs(c[1])):Math.max(Math.abs(c[1]),h.height);this.tracker?this.tracker.attr(e):(this.tracker=b.renderer.rect(e).addClass("highcharts-tracker").add(b),
a.styledMode||this.tracker.attr({fill:"rgba(0,0,0,0)"}))}}};a.prototype.styledModeFormat=function(a){return a.replace('style="font-size: 10px"','class="highcharts-header"').replace(/style="color:{(point|series)\.color}"/g,'class="highcharts-color-{$1.colorIndex}"')};a.prototype.tooltipFooterHeaderFormatter=function(a,b){var d=a.series,c=d.tooltipOptions,e=d.xAxis,h=e&&e.dateTime;e={isFooter:b,labelConfig:a};var f=c.xDateFormat,g=c[b?"footerFormat":"headerFormat"];v(this,"headerFormatter",e,function(b){h&&
!f&&k(a.key)&&(f=h.getXDateFormat(a.key,c.dateTimeLabelFormats));h&&f&&(a.point&&a.point.tooltipDateKeys||["key"]).forEach(function(b){g=g.replace("{point."+b+"}","{point."+b+":"+f+"}")});d.chart.styledMode&&(g=this.styledModeFormat(g));b.text=r(g,{point:a,series:d},this.chart)});return e.text};a.prototype.update=function(a){this.destroy();D(!0,this.chart.options.tooltip.userOptions,a);this.init(this.chart,D(!0,this.options,a))};a.prototype.updatePosition=function(a){var b=this.chart,d=this.options,
e=b.pointer,h=this.getLabel();e=e.getChartPosition();var f=(d.positioner||this.getPosition).call(this,h.width,h.height,a),g=a.plotX+b.plotLeft;a=a.plotY+b.plotTop;if(this.outside){d=d.borderWidth+2*this.distance;this.renderer.setSize(h.width+d,h.height+d,!1);if(1!==e.scaleX||1!==e.scaleY)c(this.container,{transform:"scale("+e.scaleX+", "+e.scaleY+")"}),g*=e.scaleX,a*=e.scaleY;g+=e.left-f.x;a+=e.top-f.y}this.move(Math.round(f.x),Math.round(f.y||0),g,a)};return a}();"";return a});M(a,"Core/Series/Point.js",
[a["Core/Renderer/HTML/AST.js"],a["Core/Animation/AnimationUtilities.js"],a["Core/DefaultOptions.js"],a["Core/FormatUtilities.js"],a["Core/Utilities.js"]],function(a,w,C,E,z){var r=w.animObject,J=C.defaultOptions,u=E.format,n=z.addEvent,m=z.defined,g=z.erase,c=z.extend,e=z.fireEvent,l=z.getNestedProperty,f=z.isArray,v=z.isFunction,q=z.isNumber,k=z.isObject,I=z.merge,D=z.objectEach,B=z.pick,O=z.syncTimeout,t=z.removeEvent,h=z.uniqueKey;w=function(){function d(){this.colorIndex=this.category=void 0;
this.formatPrefix="point";this.id=void 0;this.isNull=!1;this.percentage=this.options=this.name=void 0;this.selected=!1;this.total=this.series=void 0;this.visible=!0;this.x=void 0}d.prototype.animateBeforeDestroy=function(){var b=this,a={x:b.startXPos,opacity:0},d=b.getGraphicalProps();d.singular.forEach(function(d){b[d]=b[d].animate("dataLabel"===d?{x:b[d].startXPos,y:b[d].startYPos,opacity:0}:a)});d.plural.forEach(function(a){b[a].forEach(function(a){a.element&&a.animate(c({x:b.startXPos},a.startYPos?
{x:a.startXPos,y:a.startYPos}:{}))})})};d.prototype.applyOptions=function(b,a){var e=this.series,h=e.options.pointValKey||e.pointValKey;b=d.prototype.optionsToObject.call(this,b);c(this,b);this.options=this.options?c(this.options,b):b;b.group&&delete this.group;b.dataLabels&&delete this.dataLabels;h&&(this.y=d.prototype.getNestedProperty.call(this,h));this.formatPrefix=(this.isNull=B(this.isValid&&!this.isValid(),null===this.x||!q(this.y)))?"null":"point";this.selected&&(this.state="select");"name"in
this&&"undefined"===typeof a&&e.xAxis&&e.xAxis.hasNames&&(this.x=e.xAxis.nameToX(this));"undefined"===typeof this.x&&e?this.x="undefined"===typeof a?e.autoIncrement():a:q(b.x)&&e.options.relativeXValue&&(this.x=e.autoIncrement(b.x));return this};d.prototype.destroy=function(){function b(){if(a.graphic||a.dataLabel||a.dataLabels)t(a),a.destroyElements();for(f in a)a[f]=null}var a=this,d=a.series,c=d.chart;d=d.options.dataSorting;var e=c.hoverPoints,h=r(a.series.chart.renderer.globalAnimation),f;a.legendItem&&
c.legend.destroyItem(a);e&&(a.setState(),g(e,a),e.length||(c.hoverPoints=null));if(a===c.hoverPoint)a.onMouseOut();d&&d.enabled?(this.animateBeforeDestroy(),O(b,h.duration)):b();c.pointCount--};d.prototype.destroyElements=function(b){var a=this;b=a.getGraphicalProps(b);b.singular.forEach(function(b){a[b]=a[b].destroy()});b.plural.forEach(function(b){a[b].forEach(function(b){b.element&&b.destroy()});delete a[b]})};d.prototype.firePointEvent=function(b,a,d){var c=this,h=this.series.options;(h.point.events[b]||
c.options&&c.options.events&&c.options.events[b])&&c.importEvents();"click"===b&&h.allowPointSelect&&(d=function(b){c.select&&c.select(null,b.ctrlKey||b.metaKey||b.shiftKey)});e(c,b,a,d)};d.prototype.getClassName=function(){return"highcharts-point"+(this.selected?" highcharts-point-select":"")+(this.negative?" highcharts-negative":"")+(this.isNull?" highcharts-null-point":"")+("undefined"!==typeof this.colorIndex?" highcharts-color-"+this.colorIndex:"")+(this.options.className?" "+this.options.className:
"")+(this.zone&&this.zone.className?" "+this.zone.className.replace("highcharts-negative",""):"")};d.prototype.getGraphicalProps=function(b){var a=this,d=[],c={singular:[],plural:[]},e;b=b||{graphic:1,dataLabel:1};b.graphic&&d.push("graphic","upperGraphic","shadowGroup");b.dataLabel&&d.push("dataLabel","dataLabelUpper","connector");for(e=d.length;e--;){var h=d[e];a[h]&&c.singular.push(h)}["dataLabel","connector"].forEach(function(d){var e=d+"s";b[d]&&a[e]&&c.plural.push(e)});return c};d.prototype.getLabelConfig=
function(){return{x:this.category,y:this.y,color:this.color,colorIndex:this.colorIndex,key:this.name||this.category,series:this.series,point:this,percentage:this.percentage,total:this.total||this.stackTotal}};d.prototype.getNestedProperty=function(b){if(b)return 0===b.indexOf("custom.")?l(b,this.options):this[b]};d.prototype.getZone=function(){var b=this.series,a=b.zones;b=b.zoneAxis||"y";var d,c=0;for(d=a[c];this[b]>=d.value;)d=a[++c];this.nonZonedColor||(this.nonZonedColor=this.color);this.color=
d&&d.color&&!this.options.color?d.color:this.nonZonedColor;return d};d.prototype.hasNewShapeType=function(){return(this.graphic&&(this.graphic.symbolName||this.graphic.element.nodeName))!==this.shapeType};d.prototype.init=function(b,a,d){this.series=b;this.applyOptions(a,d);this.id=m(this.id)?this.id:h();this.resolveColor();b.chart.pointCount++;e(this,"afterInit");return this};d.prototype.optionsToObject=function(b){var a=this.series,c=a.options.keys,e=c||a.pointArrayMap||["y"],h=e.length,g={},k=
0,l=0;if(q(b)||null===b)g[e[0]]=b;else if(f(b))for(!c&&b.length>h&&(a=typeof b[0],"string"===a?g.name=b[0]:"number"===a&&(g.x=b[0]),k++);l<h;)c&&"undefined"===typeof b[k]||(0<e[l].indexOf(".")?d.prototype.setNestedProperty(g,b[k],e[l]):g[e[l]]=b[k]),k++,l++;else"object"===typeof b&&(g=b,b.dataLabels&&(a._hasPointLabels=!0),b.marker&&(a._hasPointMarkers=!0));return g};d.prototype.resolveColor=function(){var b=this.series,a=b.chart.styledMode;var d=b.chart.options.chart.colorCount;delete this.nonZonedColor;
if(b.options.colorByPoint){if(!a){d=b.options.colors||b.chart.options.colors;var c=d[b.colorCounter];d=d.length}a=b.colorCounter;b.colorCounter++;b.colorCounter===d&&(b.colorCounter=0)}else a||(c=b.color),a=b.colorIndex;this.colorIndex=B(this.options.colorIndex,a);this.color=B(this.options.color,c)};d.prototype.setNestedProperty=function(b,a,d){d.split(".").reduce(function(b,d,c,e){b[d]=e.length-1===c?a:k(b[d],!0)?b[d]:{};return b[d]},b);return b};d.prototype.tooltipFormatter=function(b){var a=this.series,
d=a.tooltipOptions,c=B(d.valueDecimals,""),e=d.valuePrefix||"",h=d.valueSuffix||"";a.chart.styledMode&&(b=a.chart.tooltip.styledModeFormat(b));(a.pointArrayMap||["y"]).forEach(function(a){a="{point."+a;if(e||h)b=b.replace(RegExp(a+"}","g"),e+a+"}"+h);b=b.replace(RegExp(a+"}","g"),a+":,."+c+"f}")});return u(b,{point:this,series:this.series},a.chart)};d.prototype.update=function(b,a,d,c){function e(){h.applyOptions(b);var c=g&&h.hasDummyGraphic;c=null===h.y?!c:c;g&&c&&(h.graphic=g.destroy(),delete h.hasDummyGraphic);
k(b,!0)&&(g&&g.element&&b&&b.marker&&"undefined"!==typeof b.marker.symbol&&(h.graphic=g.destroy()),b&&b.dataLabels&&h.dataLabel&&(h.dataLabel=h.dataLabel.destroy()),h.connector&&(h.connector=h.connector.destroy()));t=h.index;f.updateParallelArrays(h,t);l.data[t]=k(l.data[t],!0)||k(b,!0)?h.options:B(b,l.data[t]);f.isDirty=f.isDirtyData=!0;!f.fixedBox&&f.hasCartesianSeries&&(p.isDirtyBox=!0);"point"===l.legendType&&(p.isDirtyLegend=!0);a&&p.redraw(d)}var h=this,f=h.series,g=h.graphic,p=f.chart,l=f.options,
t;a=B(a,!0);!1===c?e():h.firePointEvent("update",{options:b},e)};d.prototype.remove=function(b,a){this.series.removePoint(this.series.data.indexOf(this),b,a)};d.prototype.select=function(b,a){var d=this,c=d.series,e=c.chart;this.selectedStaging=b=B(b,!d.selected);d.firePointEvent(b?"select":"unselect",{accumulate:a},function(){d.selected=d.options.selected=b;c.options.data[c.data.indexOf(d)]=d.options;d.setState(b&&"select");a||e.getSelectedPoints().forEach(function(b){var a=b.series;b.selected&&
b!==d&&(b.selected=b.options.selected=!1,a.options.data[a.data.indexOf(b)]=b.options,b.setState(e.hoverPoints&&a.options.inactiveOtherPoints?"inactive":""),b.firePointEvent("unselect"))})});delete this.selectedStaging};d.prototype.onMouseOver=function(b){var a=this.series.chart,d=a.pointer;b=b?d.normalize(b):d.getChartCoordinatesFromPoint(this,a.inverted);d.runPointActions(b,this)};d.prototype.onMouseOut=function(){var b=this.series.chart;this.firePointEvent("mouseOut");this.series.options.inactiveOtherPoints||
(b.hoverPoints||[]).forEach(function(b){b.setState()});b.hoverPoints=b.hoverPoint=null};d.prototype.importEvents=function(){if(!this.hasImportedEvents){var b=this,a=I(b.series.options.point,b.options).events;b.events=a;D(a,function(a,d){v(a)&&n(b,d,a)});this.hasImportedEvents=!0}};d.prototype.setState=function(b,d){var h=this.series,f=this.state,g=h.options.states[b||"normal"]||{},k=J.plotOptions[h.type].marker&&h.options.marker,p=k&&!1===k.enabled,l=k&&k.states&&k.states[b||"normal"]||{},t=!1===
l.enabled,m=this.marker||{},n=h.chart,v=k&&h.markerAttribs,r=h.halo,D,I=h.stateMarkerGraphic;b=b||"";if(!(b===this.state&&!d||this.selected&&"select"!==b||!1===g.enabled||b&&(t||p&&!1===l.enabled)||b&&m.states&&m.states[b]&&!1===m.states[b].enabled)){this.state=b;v&&(D=h.markerAttribs(this,b));if(this.graphic&&!this.hasDummyGraphic){f&&this.graphic.removeClass("highcharts-point-"+f);b&&this.graphic.addClass("highcharts-point-"+b);if(!n.styledMode){var u=h.pointAttribs(this,b);var x=B(n.options.chart.animation,
g.animation);h.options.inactiveOtherPoints&&q(u.opacity)&&((this.dataLabels||[]).forEach(function(b){b&&b.animate({opacity:u.opacity},x)}),this.connector&&this.connector.animate({opacity:u.opacity},x));this.graphic.animate(u,x)}D&&this.graphic.animate(D,B(n.options.chart.animation,l.animation,k.animation));I&&I.hide()}else{if(b&&l){f=m.symbol||h.symbol;I&&I.currentSymbol!==f&&(I=I.destroy());if(D)if(I)I[d?"animate":"attr"]({x:D.x,y:D.y});else f&&(h.stateMarkerGraphic=I=n.renderer.symbol(f,D.x,D.y,
D.width,D.height).add(h.markerGroup),I.currentSymbol=f);!n.styledMode&&I&&I.attr(h.pointAttribs(this,b))}I&&(I[b&&this.isInside?"show":"hide"](),I.element.point=this,I.addClass(this.getClassName(),!0))}g=g.halo;D=(I=this.graphic||I)&&I.visibility||"inherit";g&&g.size&&I&&"hidden"!==D&&!this.isCluster?(r||(h.halo=r=n.renderer.path().add(I.parentGroup)),r.show()[d?"animate":"attr"]({d:this.haloPath(g.size)}),r.attr({"class":"highcharts-halo highcharts-color-"+B(this.colorIndex,h.colorIndex)+(this.className?
" "+this.className:""),visibility:D,zIndex:-1}),r.point=this,n.styledMode||r.attr(c({fill:this.color||h.color,"fill-opacity":g.opacity},a.filterUserAttributes(g.attributes||{})))):r&&r.point&&r.point.haloPath&&r.animate({d:r.point.haloPath(0)},null,r.hide);e(this,"afterSetState",{state:b})}};d.prototype.haloPath=function(b){return this.series.chart.renderer.symbols.circle(Math.floor(this.plotX)-b,this.plotY-b,2*b,2*b)};return d}();"";return w});M(a,"Core/Pointer.js",[a["Core/Color/Color.js"],a["Core/Globals.js"],
a["Core/Color/Palette.js"],a["Core/Tooltip.js"],a["Core/Utilities.js"]],function(a,w,C,E,z){var r=a.parse,J=w.charts,u=w.noop,n=z.addEvent,m=z.attr,g=z.css,c=z.defined,e=z.extend,l=z.find,f=z.fireEvent,v=z.isNumber,q=z.isObject,k=z.objectEach,I=z.offset,D=z.pick,B=z.splat;a=function(){function a(a,c){this.lastValidTouch={};this.pinchDown=[];this.runChartClick=!1;this.eventsToUnbind=[];this.chart=a;this.hasDragged=!1;this.options=c;this.init(a,c)}a.prototype.applyInactiveState=function(a){var c=[],
d;(a||[]).forEach(function(b){d=b.series;c.push(d);d.linkedParent&&c.push(d.linkedParent);d.linkedSeries&&(c=c.concat(d.linkedSeries));d.navigatorSeries&&c.push(d.navigatorSeries)});this.chart.series.forEach(function(b){-1===c.indexOf(b)?b.setState("inactive",!0):b.options.inactiveOtherPoints&&b.setAllPointsToState("inactive")})};a.prototype.destroy=function(){var c=this;this.eventsToUnbind.forEach(function(a){return a()});this.eventsToUnbind=[];w.chartCount||(a.unbindDocumentMouseUp&&(a.unbindDocumentMouseUp=
a.unbindDocumentMouseUp()),a.unbindDocumentTouchEnd&&(a.unbindDocumentTouchEnd=a.unbindDocumentTouchEnd()));clearInterval(c.tooltipTimeout);k(c,function(a,d){c[d]=void 0})};a.prototype.drag=function(a){var c=this.chart,d=c.options.chart,b=this.zoomHor,e=this.zoomVert,f=c.plotLeft,g=c.plotTop,k=c.plotWidth,l=c.plotHeight,t=this.mouseDownX||0,m=this.mouseDownY||0,n=q(d.panning)?d.panning&&d.panning.enabled:d.panning,v=d.panKey&&a[d.panKey+"Key"],B=a.chartX,D=a.chartY,I=this.selectionMarker;if(!I||!I.touch)if(B<
f?B=f:B>f+k&&(B=f+k),D<g?D=g:D>g+l&&(D=g+l),this.hasDragged=Math.sqrt(Math.pow(t-B,2)+Math.pow(m-D,2)),10<this.hasDragged){var u=c.isInsidePlot(t-f,m-g,{visiblePlotOnly:!0});c.hasCartesianSeries&&(this.zoomX||this.zoomY)&&u&&!v&&!I&&(this.selectionMarker=I=c.renderer.rect(f,g,b?1:k,e?1:l,0).attr({"class":"highcharts-selection-marker",zIndex:7}).add(),c.styledMode||I.attr({fill:d.selectionMarkerFill||r(C.highlightColor80).setOpacity(.25).get()}));I&&b&&(b=B-t,I.attr({width:Math.abs(b),x:(0<b?0:b)+
t}));I&&e&&(b=D-m,I.attr({height:Math.abs(b),y:(0<b?0:b)+m}));u&&!I&&n&&c.pan(a,d.panning)}};a.prototype.dragStart=function(a){var c=this.chart;c.mouseIsDown=a.type;c.cancelClick=!1;c.mouseDownX=this.mouseDownX=a.chartX;c.mouseDownY=this.mouseDownY=a.chartY};a.prototype.drop=function(a){var h=this,d=this.chart,b=this.hasPinched;if(this.selectionMarker){var k={originalEvent:a,xAxis:[],yAxis:[]},l=this.selectionMarker,t=l.attr?l.attr("x"):l.x,m=l.attr?l.attr("y"):l.y,q=l.attr?l.attr("width"):l.width,
n=l.attr?l.attr("height"):l.height,r;if(this.hasDragged||b)d.axes.forEach(function(d){if(d.zoomEnabled&&c(d.min)&&(b||h[{xAxis:"zoomX",yAxis:"zoomY"}[d.coll]])&&v(t)&&v(m)){var e=d.horiz,f="touchend"===a.type?d.minPixelPadding:0,g=d.toValue((e?t:m)+f);e=d.toValue((e?t+q:m+n)-f);k[d.coll].push({axis:d,min:Math.min(g,e),max:Math.max(g,e)});r=!0}}),r&&f(d,"selection",k,function(a){d.zoom(e(a,b?{animation:!1}:null))});v(d.index)&&(this.selectionMarker=this.selectionMarker.destroy());b&&this.scaleGroups()}d&&
v(d.index)&&(g(d.container,{cursor:d._cursor}),d.cancelClick=10<this.hasDragged,d.mouseIsDown=this.hasDragged=this.hasPinched=!1,this.pinchDown=[])};a.prototype.findNearestKDPoint=function(a,c,d){var b=this.chart,e=b.hoverPoint;b=b.tooltip;if(e&&b&&b.isStickyOnContact())return e;var h;a.forEach(function(b){var a=!(b.noSharedTooltip&&c)&&0>b.options.findNearestPointBy.indexOf("y");b=b.searchPoint(d,a);if((a=q(b,!0)&&b.series)&&!(a=!q(h,!0))){a=h.distX-b.distX;var e=h.dist-b.dist,f=(b.series.group&&
b.series.group.zIndex)-(h.series.group&&h.series.group.zIndex);a=0<(0!==a&&c?a:0!==e?e:0!==f?f:h.series.index>b.series.index?-1:1)}a&&(h=b)});return h};a.prototype.getChartCoordinatesFromPoint=function(a,c){var d=a.series,b=d.xAxis;d=d.yAxis;var e=a.shapeArgs;if(b&&d){var h=D(a.clientX,a.plotX),f=a.plotY||0;a.isNode&&e&&v(e.x)&&v(e.y)&&(h=e.x,f=e.y);return c?{chartX:d.len+d.pos-f,chartY:b.len+b.pos-h}:{chartX:h+b.pos,chartY:f+d.pos}}if(e&&e.x&&e.y)return{chartX:e.x,chartY:e.y}};a.prototype.getChartPosition=
function(){if(this.chartPosition)return this.chartPosition;var a=this.chart.container,c=I(a);this.chartPosition={left:c.left,top:c.top,scaleX:1,scaleY:1};var d=a.offsetWidth;a=a.offsetHeight;2<d&&2<a&&(this.chartPosition.scaleX=c.width/d,this.chartPosition.scaleY=c.height/a);return this.chartPosition};a.prototype.getCoordinates=function(a){var c={xAxis:[],yAxis:[]};this.chart.axes.forEach(function(d){c[d.isXAxis?"xAxis":"yAxis"].push({axis:d,value:d.toValue(a[d.horiz?"chartX":"chartY"])})});return c};
a.prototype.getHoverData=function(a,c,d,b,e,g){var h=[];b=!(!b||!a);var k={chartX:g?g.chartX:void 0,chartY:g?g.chartY:void 0,shared:e};f(this,"beforeGetHoverData",k);var p=c&&!c.stickyTracking?[c]:d.filter(function(b){return k.filter?k.filter(b):b.visible&&!(!e&&b.directTouch)&&D(b.options.enableMouseTracking,!0)&&b.stickyTracking});var t=b||!g?a:this.findNearestKDPoint(p,e,g);c=t&&t.series;t&&(e&&!c.noSharedTooltip?(p=d.filter(function(b){return k.filter?k.filter(b):b.visible&&!(!e&&b.directTouch)&&
D(b.options.enableMouseTracking,!0)&&!b.noSharedTooltip}),p.forEach(function(b){var a=l(b.points,function(b){return b.x===t.x&&!b.isNull});q(a)&&(b.chart.isBoosting&&(a=b.getPoint(a)),h.push(a))})):h.push(t));k={hoverPoint:t};f(this,"afterGetHoverData",k);return{hoverPoint:k.hoverPoint,hoverSeries:c,hoverPoints:h}};a.prototype.getPointFromEvent=function(a){a=a.target;for(var c;a&&!c;)c=a.point,a=a.parentNode;return c};a.prototype.onTrackerMouseOut=function(a){a=a.relatedTarget||a.toElement;var c=
this.chart.hoverSeries;this.isDirectTouch=!1;if(!(!c||!a||c.stickyTracking||this.inClass(a,"highcharts-tooltip")||this.inClass(a,"highcharts-series-"+c.index)&&this.inClass(a,"highcharts-tracker")))c.onMouseOut()};a.prototype.inClass=function(a,c){for(var d;a;){if(d=m(a,"class")){if(-1!==d.indexOf(c))return!0;if(-1!==d.indexOf("highcharts-container"))return!1}a=a.parentNode}};a.prototype.init=function(a,c){this.options=c;this.chart=a;this.runChartClick=!(!c.chart.events||!c.chart.events.click);this.pinchDown=
[];this.lastValidTouch={};E&&(a.tooltip=new E(a,c.tooltip),this.followTouchMove=D(c.tooltip.followTouchMove,!0));this.setDOMEvents()};a.prototype.normalize=function(a,c){var d=a.touches,b=d?d.length?d.item(0):D(d.changedTouches,a.changedTouches)[0]:a;c||(c=this.getChartPosition());d=b.pageX-c.left;b=b.pageY-c.top;d/=c.scaleX;b/=c.scaleY;return e(a,{chartX:Math.round(d),chartY:Math.round(b)})};a.prototype.onContainerClick=function(a){var c=this.chart,d=c.hoverPoint;a=this.normalize(a);var b=c.plotLeft,
g=c.plotTop;c.cancelClick||(d&&this.inClass(a.target,"highcharts-tracker")?(f(d.series,"click",e(a,{point:d})),c.hoverPoint&&d.firePointEvent("click",a)):(e(a,this.getCoordinates(a)),c.isInsidePlot(a.chartX-b,a.chartY-g,{visiblePlotOnly:!0})&&f(c,"click",a)))};a.prototype.onContainerMouseDown=function(a){var c=1===((a.buttons||a.button)&1);a=this.normalize(a);if(w.isFirefox&&0!==a.button)this.onContainerMouseMove(a);if("undefined"===typeof a.button||c)this.zoomOption(a),c&&a.preventDefault&&a.preventDefault(),
this.dragStart(a)};a.prototype.onContainerMouseLeave=function(c){var e=J[D(a.hoverChartIndex,-1)],d=this.chart.tooltip;d&&d.shouldStickOnContact()&&this.inClass(c.relatedTarget,"highcharts-tooltip-container")||(c=this.normalize(c),e&&(c.relatedTarget||c.toElement)&&(e.pointer.reset(),e.pointer.chartPosition=void 0),d&&!d.isHidden&&this.reset())};a.prototype.onContainerMouseEnter=function(a){delete this.chartPosition};a.prototype.onContainerMouseMove=function(a){var c=this.chart;a=this.normalize(a);
this.setHoverChartIndex();a.preventDefault||(a.returnValue=!1);("mousedown"===c.mouseIsDown||this.touchSelect(a))&&this.drag(a);c.openMenu||!this.inClass(a.target,"highcharts-tracker")&&!c.isInsidePlot(a.chartX-c.plotLeft,a.chartY-c.plotTop,{visiblePlotOnly:!0})||(this.inClass(a.target,"highcharts-no-tooltip")?this.reset(!1,0):this.runPointActions(a))};a.prototype.onDocumentTouchEnd=function(c){var e=J[D(a.hoverChartIndex,-1)];e&&e.pointer.drop(c)};a.prototype.onContainerTouchMove=function(a){if(this.touchSelect(a))this.onContainerMouseMove(a);
else this.touch(a)};a.prototype.onContainerTouchStart=function(a){if(this.touchSelect(a))this.onContainerMouseDown(a);else this.zoomOption(a),this.touch(a,!0)};a.prototype.onDocumentMouseMove=function(a){var c=this.chart,d=this.chartPosition;a=this.normalize(a,d);var b=c.tooltip;!d||b&&b.isStickyOnContact()||c.isInsidePlot(a.chartX-c.plotLeft,a.chartY-c.plotTop,{visiblePlotOnly:!0})||this.inClass(a.target,"highcharts-tracker")||this.reset()};a.prototype.onDocumentMouseUp=function(c){var e=J[D(a.hoverChartIndex,
-1)];e&&e.pointer.drop(c)};a.prototype.pinch=function(a){var c=this,d=c.chart,b=c.pinchDown,f=a.touches||[],g=f.length,k=c.lastValidTouch,l=c.hasZoom,m={},t=1===g&&(c.inClass(a.target,"highcharts-tracker")&&d.runTrackerClick||c.runChartClick),q={},n=c.selectionMarker;1<g?c.initiated=!0:1===g&&this.followTouchMove&&(c.initiated=!1);l&&c.initiated&&!t&&!1!==a.cancelable&&a.preventDefault();[].map.call(f,function(b){return c.normalize(b)});"touchstart"===a.type?([].forEach.call(f,function(a,d){b[d]=
{chartX:a.chartX,chartY:a.chartY}}),k.x=[b[0].chartX,b[1]&&b[1].chartX],k.y=[b[0].chartY,b[1]&&b[1].chartY],d.axes.forEach(function(b){if(b.zoomEnabled){var a=d.bounds[b.horiz?"h":"v"],c=b.minPixelPadding,e=b.toPixels(Math.min(D(b.options.min,b.dataMin),b.dataMin)),h=b.toPixels(Math.max(D(b.options.max,b.dataMax),b.dataMax)),f=Math.max(e,h);a.min=Math.min(b.pos,Math.min(e,h)-c);a.max=Math.max(b.pos+b.len,f+c)}}),c.res=!0):c.followTouchMove&&1===g?this.runPointActions(c.normalize(a)):b.length&&(n||
(c.selectionMarker=n=e({destroy:u,touch:!0},d.plotBox)),c.pinchTranslate(b,f,m,n,q,k),c.hasPinched=l,c.scaleGroups(m,q),c.res&&(c.res=!1,this.reset(!1,0)))};a.prototype.pinchTranslate=function(a,c,d,b,e,f){this.zoomHor&&this.pinchTranslateDirection(!0,a,c,d,b,e,f);this.zoomVert&&this.pinchTranslateDirection(!1,a,c,d,b,e,f)};a.prototype.pinchTranslateDirection=function(a,c,d,b,e,f,g,k){var h=this.chart,l=a?"x":"y",p=a?"X":"Y",m="chart"+p,y=a?"width":"height",t=h["plot"+(a?"Left":"Top")],q=h.inverted,
n=h.bounds[a?"h":"v"],r=1===c.length,v=c[0][m],B=!r&&c[1][m];c=function(){"number"===typeof I&&20<Math.abs(v-B)&&(D=k||Math.abs(N-I)/Math.abs(v-B));A=(t-N)/D+v;G=h["plot"+(a?"Width":"Height")]/D};var G,A,D=k||1,N=d[0][m],I=!r&&d[1][m];c();d=A;if(d<n.min){d=n.min;var L=!0}else d+G>n.max&&(d=n.max-G,L=!0);L?(N-=.8*(N-g[l][0]),"number"===typeof I&&(I-=.8*(I-g[l][1])),c()):g[l]=[N,I];q||(f[l]=A-t,f[y]=G);f=q?1/D:D;e[y]=G;e[l]=d;b[q?a?"scaleY":"scaleX":"scale"+p]=D;b["translate"+p]=f*t+(N-f*v)};a.prototype.reset=
function(a,c){var d=this.chart,b=d.hoverSeries,e=d.hoverPoint,h=d.hoverPoints,f=d.tooltip,g=f&&f.shared?h:e;a&&g&&B(g).forEach(function(b){b.series.isCartesian&&"undefined"===typeof b.plotX&&(a=!1)});if(a)f&&g&&B(g).length&&(f.refresh(g),f.shared&&h?h.forEach(function(b){b.setState(b.state,!0);b.series.isCartesian&&(b.series.xAxis.crosshair&&b.series.xAxis.drawCrosshair(null,b),b.series.yAxis.crosshair&&b.series.yAxis.drawCrosshair(null,b))}):e&&(e.setState(e.state,!0),d.axes.forEach(function(b){b.crosshair&&
e.series[b.coll]===b&&b.drawCrosshair(null,e)})));else{if(e)e.onMouseOut();h&&h.forEach(function(b){b.setState()});if(b)b.onMouseOut();f&&f.hide(c);this.unDocMouseMove&&(this.unDocMouseMove=this.unDocMouseMove());d.axes.forEach(function(b){b.hideCrosshair()});this.hoverX=d.hoverPoints=d.hoverPoint=null}};a.prototype.runPointActions=function(c,e){var d=this.chart,b=d.tooltip&&d.tooltip.options.enabled?d.tooltip:void 0,h=b?b.shared:!1,f=e||d.hoverPoint,g=f&&f.series||d.hoverSeries;e=this.getHoverData(f,
g,d.series,(!c||"touchmove"!==c.type)&&(!!e||g&&g.directTouch&&this.isDirectTouch),h,c);f=e.hoverPoint;g=e.hoverSeries;var k=e.hoverPoints;e=g&&g.tooltipOptions.followPointer&&!g.tooltipOptions.split;h=h&&g&&!g.noSharedTooltip;if(f&&(f!==d.hoverPoint||b&&b.isHidden)){(d.hoverPoints||[]).forEach(function(b){-1===k.indexOf(b)&&b.setState()});if(d.hoverSeries!==g)g.onMouseOver();this.applyInactiveState(k);(k||[]).forEach(function(b){b.setState("hover")});d.hoverPoint&&d.hoverPoint.firePointEvent("mouseOut");
if(!f.series)return;d.hoverPoints=k;d.hoverPoint=f;f.firePointEvent("mouseOver");b&&b.refresh(h?k:f,c)}else e&&b&&!b.isHidden&&(f=b.getAnchor([{}],c),d.isInsidePlot(f[0],f[1],{visiblePlotOnly:!0})&&b.updatePosition({plotX:f[0],plotY:f[1]}));this.unDocMouseMove||(this.unDocMouseMove=n(d.container.ownerDocument,"mousemove",function(b){var d=J[a.hoverChartIndex];if(d)d.pointer.onDocumentMouseMove(b)}),this.eventsToUnbind.push(this.unDocMouseMove));d.axes.forEach(function(b){var a=D((b.crosshair||{}).snap,
!0),e;a&&((e=d.hoverPoint)&&e.series[b.coll]===b||(e=l(k,function(a){return a.series[b.coll]===b})));e||!a?b.drawCrosshair(c,e):b.hideCrosshair()})};a.prototype.scaleGroups=function(a,c){var d=this.chart;d.series.forEach(function(b){var e=a||b.getPlotBox();b.xAxis&&b.xAxis.zoomEnabled&&b.group&&(b.group.attr(e),b.markerGroup&&(b.markerGroup.attr(e),b.markerGroup.clip(c?d.clipRect:null)),b.dataLabelsGroup&&b.dataLabelsGroup.attr(e))});d.clipRect.attr(c||d.clipBox)};a.prototype.setDOMEvents=function(){var c=
this,e=this.chart.container,d=e.ownerDocument;e.onmousedown=this.onContainerMouseDown.bind(this);e.onmousemove=this.onContainerMouseMove.bind(this);e.onclick=this.onContainerClick.bind(this);this.eventsToUnbind.push(n(e,"mouseenter",this.onContainerMouseEnter.bind(this)));this.eventsToUnbind.push(n(e,"mouseleave",this.onContainerMouseLeave.bind(this)));a.unbindDocumentMouseUp||(a.unbindDocumentMouseUp=n(d,"mouseup",this.onDocumentMouseUp.bind(this)));for(var b=this.chart.renderTo.parentElement;b&&
"BODY"!==b.tagName;)this.eventsToUnbind.push(n(b,"scroll",function(){delete c.chartPosition})),b=b.parentElement;w.hasTouch&&(this.eventsToUnbind.push(n(e,"touchstart",this.onContainerTouchStart.bind(this),{passive:!1})),this.eventsToUnbind.push(n(e,"touchmove",this.onContainerTouchMove.bind(this),{passive:!1})),a.unbindDocumentTouchEnd||(a.unbindDocumentTouchEnd=n(d,"touchend",this.onDocumentTouchEnd.bind(this),{passive:!1})))};a.prototype.setHoverChartIndex=function(){var c=this.chart,e=w.charts[D(a.hoverChartIndex,
-1)];if(e&&e!==c)e.pointer.onContainerMouseLeave({relatedTarget:!0});e&&e.mouseIsDown||(a.hoverChartIndex=c.index)};a.prototype.touch=function(a,c){var d=this.chart,b;this.setHoverChartIndex();if(1===a.touches.length)if(a=this.normalize(a),(b=d.isInsidePlot(a.chartX-d.plotLeft,a.chartY-d.plotTop,{visiblePlotOnly:!0}))&&!d.openMenu){c&&this.runPointActions(a);if("touchmove"===a.type){c=this.pinchDown;var e=c[0]?4<=Math.sqrt(Math.pow(c[0].chartX-a.chartX,2)+Math.pow(c[0].chartY-a.chartY,2)):!1}D(e,
!0)&&this.pinch(a)}else c&&this.reset();else 2===a.touches.length&&this.pinch(a)};a.prototype.touchSelect=function(a){return!(!this.chart.options.chart.zoomBySingleTouch||!a.touches||1!==a.touches.length)};a.prototype.zoomOption=function(a){var c=this.chart,d=c.options.chart;c=c.inverted;var b=d.zoomType||"";/touch/.test(a.type)&&(b=D(d.pinchType,b));this.zoomX=a=/x/.test(b);this.zoomY=d=/y/.test(b);this.zoomHor=a&&!c||d&&c;this.zoomVert=d&&!c||a&&c;this.hasZoom=a||d};return a}();"";return a});M(a,
"Core/MSPointer.js",[a["Core/Globals.js"],a["Core/Pointer.js"],a["Core/Utilities.js"]],function(a,w,C){function r(){var a=[];a.item=function(a){return this[a]};e(f,function(c){a.push({pageX:c.pageX,pageY:c.pageY,target:c.target})});return a}function z(a,c,e,f){var g=J[w.hoverChartIndex||NaN];"touch"!==a.pointerType&&a.pointerType!==a.MSPOINTER_TYPE_TOUCH||!g||(g=g.pointer,f(a),g[c]({type:e,target:a.currentTarget,preventDefault:n,touches:r()}))}var x=this&&this.__extends||function(){var a=function(c,
e){a=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(a,c){a.__proto__=c}||function(a,c){for(var e in c)c.hasOwnProperty(e)&&(a[e]=c[e])};return a(c,e)};return function(c,e){function f(){this.constructor=c}a(c,e);c.prototype=null===e?Object.create(e):(f.prototype=e.prototype,new f)}}(),J=a.charts,u=a.doc,n=a.noop,m=a.win,g=C.addEvent,c=C.css,e=C.objectEach,l=C.removeEvent,f={},v=!!m.PointerEvent;return function(e){function k(){return null!==e&&e.apply(this,arguments)||this}x(k,e);k.isRequired=
function(){return!(a.hasTouch||!m.PointerEvent&&!m.MSPointerEvent)};k.prototype.batchMSEvents=function(a){a(this.chart.container,v?"pointerdown":"MSPointerDown",this.onContainerPointerDown);a(this.chart.container,v?"pointermove":"MSPointerMove",this.onContainerPointerMove);a(u,v?"pointerup":"MSPointerUp",this.onDocumentPointerUp)};k.prototype.destroy=function(){this.batchMSEvents(l);e.prototype.destroy.call(this)};k.prototype.init=function(a,f){e.prototype.init.call(this,a,f);this.hasZoom&&c(a.container,
{"-ms-touch-action":"none","touch-action":"none"})};k.prototype.onContainerPointerDown=function(a){z(a,"onContainerTouchStart","touchstart",function(a){f[a.pointerId]={pageX:a.pageX,pageY:a.pageY,target:a.currentTarget}})};k.prototype.onContainerPointerMove=function(a){z(a,"onContainerTouchMove","touchmove",function(a){f[a.pointerId]={pageX:a.pageX,pageY:a.pageY};f[a.pointerId].target||(f[a.pointerId].target=a.currentTarget)})};k.prototype.onDocumentPointerUp=function(a){z(a,"onDocumentTouchEnd",
"touchend",function(a){delete f[a.pointerId]})};k.prototype.setDOMEvents=function(){e.prototype.setDOMEvents.call(this);(this.hasZoom||this.followTouchMove)&&this.batchMSEvents(g)};return k}(w)});M(a,"Core/Legend/Legend.js",[a["Core/Animation/AnimationUtilities.js"],a["Core/FormatUtilities.js"],a["Core/Globals.js"],a["Core/Series/Point.js"],a["Core/Renderer/RendererUtilities.js"],a["Core/Utilities.js"]],function(a,w,C,E,z,x){var r=a.animObject,u=a.setAnimation,n=w.format;a=C.isFirefox;var m=C.marginNames;
C=C.win;var g=z.distribute,c=x.addEvent,e=x.createElement,l=x.css,f=x.defined,v=x.discardElement,q=x.find,k=x.fireEvent,I=x.isNumber,D=x.merge,B=x.pick,O=x.relativeLength,t=x.stableSort,h=x.syncTimeout;z=x.wrap;x=function(){function a(a,d){this.allItems=[];this.contentGroup=this.box=void 0;this.display=!1;this.group=void 0;this.offsetWidth=this.maxLegendWidth=this.maxItemWidth=this.legendWidth=this.legendHeight=this.lastLineHeight=this.lastItemY=this.itemY=this.itemX=this.itemMarginTop=this.itemMarginBottom=
this.itemHeight=this.initialItemY=0;this.options={};this.padding=0;this.pages=[];this.proximate=!1;this.scrollGroup=void 0;this.widthOption=this.totalItemWidth=this.titleHeight=this.symbolWidth=this.symbolHeight=0;this.chart=a;this.init(a,d)}a.prototype.init=function(a,d){this.chart=a;this.setOptions(d);d.enabled&&(this.render(),c(this.chart,"endResize",function(){this.legend.positionCheckboxes()}),this.proximate?this.unchartrender=c(this.chart,"render",function(){this.legend.proximatePositions();
this.legend.positionItems()}):this.unchartrender&&this.unchartrender())};a.prototype.setOptions=function(a){var b=B(a.padding,8);this.options=a;this.chart.styledMode||(this.itemStyle=a.itemStyle,this.itemHiddenStyle=D(this.itemStyle,a.itemHiddenStyle));this.itemMarginTop=a.itemMarginTop||0;this.itemMarginBottom=a.itemMarginBottom||0;this.padding=b;this.initialItemY=b-5;this.symbolWidth=B(a.symbolWidth,16);this.pages=[];this.proximate="proximate"===a.layout&&!this.chart.inverted;this.baseline=void 0};
a.prototype.update=function(a,d){var b=this.chart;this.setOptions(D(!0,this.options,a));this.destroy();b.isDirtyLegend=b.isDirtyBox=!0;B(d,!0)&&b.redraw();k(this,"afterUpdate")};a.prototype.colorizeItem=function(a,d){a.legendGroup[d?"removeClass":"addClass"]("highcharts-legend-item-hidden");if(!this.chart.styledMode){var b=this.options,c=a.legendItem,e=a.legendLine,h=a.legendSymbol,f=this.itemHiddenStyle.color;b=d?b.itemStyle.color:f;var g=d?a.color||f:f,l=a.options&&a.options.marker,p={fill:g};c&&
c.css({fill:b,color:b});e&&e.attr({stroke:g});h&&(l&&h.isMarker&&(p=a.pointAttribs(),d||(p.stroke=p.fill=f)),h.attr(p))}k(this,"afterColorizeItem",{item:a,visible:d})};a.prototype.positionItems=function(){this.allItems.forEach(this.positionItem,this);this.chart.isResizing||this.positionCheckboxes()};a.prototype.positionItem=function(a){var b=this,d=this.options,c=d.symbolPadding,e=!d.rtl,h=a._legendItemPos;d=h[0];h=h[1];var g=a.checkbox,l=a.legendGroup;l&&l.element&&(c={translateX:e?d:this.legendWidth-
d-2*c-4,translateY:h},e=function(){k(b,"afterPositionItem",{item:a})},f(l.translateY)?l.animate(c,void 0,e):(l.attr(c),e()));g&&(g.x=d,g.y=h)};a.prototype.destroyItem=function(a){var b=a.checkbox;["legendItem","legendLine","legendSymbol","legendGroup"].forEach(function(b){a[b]&&(a[b]=a[b].destroy())});b&&v(a.checkbox)};a.prototype.destroy=function(){function a(a){this[a]&&(this[a]=this[a].destroy())}this.getAllItems().forEach(function(b){["legendItem","legendGroup"].forEach(a,b)});"clipRect up down pager nav box title group".split(" ").forEach(a,
this);this.display=null};a.prototype.positionCheckboxes=function(){var a=this.group&&this.group.alignAttr,d=this.clipHeight||this.legendHeight,c=this.titleHeight;if(a){var e=a.translateY;this.allItems.forEach(function(b){var h=b.checkbox;if(h){var f=e+c+h.y+(this.scrollOffset||0)+3;l(h,{left:a.translateX+b.checkboxOffset+h.x-20+"px",top:f+"px",display:this.proximate||f>e-6&&f<e+d-6?"":"none"})}},this)}};a.prototype.renderTitle=function(){var a=this.options,d=this.padding,c=a.title,e=0;c.text&&(this.title||
(this.title=this.chart.renderer.label(c.text,d-3,d-4,null,null,null,a.useHTML,null,"legend-title").attr({zIndex:1}),this.chart.styledMode||this.title.css(c.style),this.title.add(this.group)),c.width||this.title.css({width:this.maxLegendWidth+"px"}),a=this.title.getBBox(),e=a.height,this.offsetWidth=a.width,this.contentGroup.attr({translateY:e}));this.titleHeight=e};a.prototype.setText=function(a){var b=this.options;a.legendItem.attr({text:b.labelFormat?n(b.labelFormat,a,this.chart):b.labelFormatter.call(a)})};
a.prototype.renderItem=function(a){var b=this.chart,d=b.renderer,c=this.options,e=this.symbolWidth,h=c.symbolPadding||0,f=this.itemStyle,g=this.itemHiddenStyle,k="horizontal"===c.layout?B(c.itemDistance,20):0,l=!c.rtl,m=!a.series,n=!m&&a.series.drawLegendSymbol?a.series:a,q=n.options,t=this.createCheckboxForItem&&q&&q.showCheckbox,v=c.useHTML,r=a.options.className,I=a.legendItem;q=e+h+k+(t?20:0);I||(a.legendGroup=d.g("legend-item").addClass("highcharts-"+n.type+"-series highcharts-color-"+a.colorIndex+
(r?" "+r:"")+(m?" highcharts-series-"+a.index:"")).attr({zIndex:1}).add(this.scrollGroup),a.legendItem=I=d.text("",l?e+h:-h,this.baseline||0,v),b.styledMode||I.css(D(a.visible?f:g)),I.attr({align:l?"left":"right",zIndex:2}).add(a.legendGroup),this.baseline||(this.fontMetrics=d.fontMetrics(b.styledMode?12:f.fontSize,I),this.baseline=this.fontMetrics.f+3+this.itemMarginTop,I.attr("y",this.baseline),this.symbolHeight=c.symbolHeight||this.fontMetrics.f,c.squareSymbol&&(this.symbolWidth=B(c.symbolWidth,
Math.max(this.symbolHeight,16)),q=this.symbolWidth+h+k+(t?20:0),l&&I.attr("x",this.symbolWidth+h))),n.drawLegendSymbol(this,a),this.setItemEvents&&this.setItemEvents(a,I,v));t&&!a.checkbox&&this.createCheckboxForItem&&this.createCheckboxForItem(a);this.colorizeItem(a,a.visible);!b.styledMode&&f.width||I.css({width:(c.itemWidth||this.widthOption||b.spacingBox.width)-q+"px"});this.setText(a);b=I.getBBox();a.itemWidth=a.checkboxOffset=c.itemWidth||a.legendItemWidth||b.width+q;this.maxItemWidth=Math.max(this.maxItemWidth,
a.itemWidth);this.totalItemWidth+=a.itemWidth;this.itemHeight=a.itemHeight=Math.round(a.legendItemHeight||b.height||this.symbolHeight)};a.prototype.layoutItem=function(a){var b=this.options,d=this.padding,c="horizontal"===b.layout,e=a.itemHeight,h=this.itemMarginBottom,f=this.itemMarginTop,g=c?B(b.itemDistance,20):0,k=this.maxLegendWidth;b=b.alignColumns&&this.totalItemWidth>k?this.maxItemWidth:a.itemWidth;c&&this.itemX-d+b>k&&(this.itemX=d,this.lastLineHeight&&(this.itemY+=f+this.lastLineHeight+
h),this.lastLineHeight=0);this.lastItemY=f+this.itemY+h;this.lastLineHeight=Math.max(e,this.lastLineHeight);a._legendItemPos=[this.itemX,this.itemY];c?this.itemX+=b:(this.itemY+=f+e+h,this.lastLineHeight=e);this.offsetWidth=this.widthOption||Math.max((c?this.itemX-d-(a.checkbox?0:g):b)+d,this.offsetWidth)};a.prototype.getAllItems=function(){var a=[];this.chart.series.forEach(function(b){var d=b&&b.options;b&&B(d.showInLegend,f(d.linkedTo)?!1:void 0,!0)&&(a=a.concat(b.legendItems||("point"===d.legendType?
b.data:b)))});k(this,"afterGetAllItems",{allItems:a});return a};a.prototype.getAlignment=function(){var a=this.options;return this.proximate?a.align.charAt(0)+"tv":a.floating?"":a.align.charAt(0)+a.verticalAlign.charAt(0)+a.layout.charAt(0)};a.prototype.adjustMargins=function(a,d){var b=this.chart,c=this.options,e=this.getAlignment();e&&[/(lth|ct|rth)/,/(rtv|rm|rbv)/,/(rbh|cb|lbh)/,/(lbv|lm|ltv)/].forEach(function(h,g){h.test(e)&&!f(a[g])&&(b[m[g]]=Math.max(b[m[g]],b.legend[(g+1)%2?"legendHeight":
"legendWidth"]+[1,-1,-1,1][g]*c[g%2?"x":"y"]+B(c.margin,12)+d[g]+(b.titleOffset[g]||0)))})};a.prototype.proximatePositions=function(){var a=this.chart,d=[],c="left"===this.options.align;this.allItems.forEach(function(b){var e;var h=c;if(b.yAxis){b.xAxis.options.reversed&&(h=!h);b.points&&(e=q(h?b.points:b.points.slice(0).reverse(),function(a){return I(a.plotY)}));h=this.itemMarginTop+b.legendItem.getBBox().height+this.itemMarginBottom;var f=b.yAxis.top-a.plotTop;b.visible?(e=e?e.plotY:b.yAxis.height,
e+=f-.3*h):e=f+b.yAxis.height;d.push({target:e,size:h,item:b})}},this);g(d,a.plotHeight).forEach(function(b){b.item._legendItemPos&&(b.item._legendItemPos[1]=a.plotTop-a.spacing[0]+b.pos)})};a.prototype.render=function(){var a=this.chart,d=a.renderer,c=this.options,e=this.padding,h=this.getAllItems(),f=this.group,g=this.box;this.itemX=e;this.itemY=this.initialItemY;this.lastItemY=this.offsetWidth=0;this.widthOption=O(c.width,a.spacingBox.width-e);var l=a.spacingBox.width-2*e-c.x;-1<["rm","lm"].indexOf(this.getAlignment().substring(0,
2))&&(l/=2);this.maxLegendWidth=this.widthOption||l;f||(this.group=f=d.g("legend").addClass(c.className||"").attr({zIndex:7}).add(),this.contentGroup=d.g().attr({zIndex:1}).add(f),this.scrollGroup=d.g().add(this.contentGroup));this.renderTitle();t(h,function(a,b){return(a.options&&a.options.legendIndex||0)-(b.options&&b.options.legendIndex||0)});c.reversed&&h.reverse();this.allItems=h;this.display=l=!!h.length;this.itemHeight=this.totalItemWidth=this.maxItemWidth=this.lastLineHeight=0;h.forEach(this.renderItem,
this);h.forEach(this.layoutItem,this);h=(this.widthOption||this.offsetWidth)+e;var m=this.lastItemY+this.lastLineHeight+this.titleHeight;m=this.handleOverflow(m);m+=e;g||(this.box=g=d.rect().addClass("highcharts-legend-box").attr({r:c.borderRadius}).add(f),g.isNew=!0);a.styledMode||g.attr({stroke:c.borderColor,"stroke-width":c.borderWidth||0,fill:c.backgroundColor||"none"}).shadow(c.shadow);0<h&&0<m&&(g[g.isNew?"attr":"animate"](g.crisp.call({},{x:0,y:0,width:h,height:m},g.strokeWidth())),g.isNew=
!1);g[l?"show":"hide"]();a.styledMode&&"none"===f.getStyle("display")&&(h=m=0);this.legendWidth=h;this.legendHeight=m;l&&this.align();this.proximate||this.positionItems();k(this,"afterRender")};a.prototype.align=function(a){void 0===a&&(a=this.chart.spacingBox);var b=this.chart,d=this.options,c=a.y;/(lth|ct|rth)/.test(this.getAlignment())&&0<b.titleOffset[0]?c+=b.titleOffset[0]:/(lbh|cb|rbh)/.test(this.getAlignment())&&0<b.titleOffset[2]&&(c-=b.titleOffset[2]);c!==a.y&&(a=D(a,{y:c}));this.group.align(D(d,
{width:this.legendWidth,height:this.legendHeight,verticalAlign:this.proximate?"top":d.verticalAlign}),!0,a)};a.prototype.handleOverflow=function(a){var b=this,d=this.chart,c=d.renderer,e=this.options,h=e.y,f="top"===e.verticalAlign,g=this.padding,k=e.maxHeight,l=e.navigation,m=B(l.animation,!0),n=l.arrowSize||12,q=this.pages,t=this.allItems,v=function(a){"number"===typeof a?N.attr({height:a}):N&&(b.clipRect=N.destroy(),b.contentGroup.clip());b.contentGroup.div&&(b.contentGroup.div.style.clip=a?"rect("+
g+"px,9999px,"+(g+a)+"px,0)":"auto")},r=function(a){b[a]=c.circle(0,0,1.3*n).translate(n/2,n/2).add(U);d.styledMode||b[a].attr("fill","rgba(0,0,0,0.0001)");return b[a]},I,A;h=d.spacingBox.height+(f?-h:h)-g;var U=this.nav,N=this.clipRect;"horizontal"!==e.layout||"middle"===e.verticalAlign||e.floating||(h/=2);k&&(h=Math.min(h,k));q.length=0;a&&0<h&&a>h&&!1!==l.enabled?(this.clipHeight=I=Math.max(h-20-this.titleHeight-g,0),this.currentPage=B(this.currentPage,1),this.fullHeight=a,t.forEach(function(a,
b){var d=a._legendItemPos[1],c=Math.round(a.legendItem.getBBox().height),e=q.length;if(!e||d-q[e-1]>I&&(A||d)!==q[e-1])q.push(A||d),e++;a.pageIx=e-1;A&&(t[b-1].pageIx=e-1);b===t.length-1&&d+c-q[e-1]>I&&d!==A&&(q.push(d),a.pageIx=e);d!==A&&(A=d)}),N||(N=b.clipRect=c.clipRect(0,g,9999,0),b.contentGroup.clip(N)),v(I),U||(this.nav=U=c.g().attr({zIndex:1}).add(this.group),this.up=c.symbol("triangle",0,0,n,n).add(U),r("upTracker").on("click",function(){b.scroll(-1,m)}),this.pager=c.text("",15,10).addClass("highcharts-legend-navigation"),
d.styledMode||this.pager.css(l.style),this.pager.add(U),this.down=c.symbol("triangle-down",0,0,n,n).add(U),r("downTracker").on("click",function(){b.scroll(1,m)})),b.scroll(0),a=h):U&&(v(),this.nav=U.destroy(),this.scrollGroup.attr({translateY:1}),this.clipHeight=0);return a};a.prototype.scroll=function(a,d){var b=this,c=this.chart,e=this.pages,f=e.length,g=this.clipHeight,l=this.options.navigation,m=this.pager,p=this.padding,n=this.currentPage+a;n>f&&(n=f);0<n&&("undefined"!==typeof d&&u(d,c),this.nav.attr({translateX:p,
translateY:g+this.padding+7+this.titleHeight,visibility:"visible"}),[this.up,this.upTracker].forEach(function(a){a.attr({"class":1===n?"highcharts-legend-nav-inactive":"highcharts-legend-nav-active"})}),m.attr({text:n+"/"+f}),[this.down,this.downTracker].forEach(function(a){a.attr({x:18+this.pager.getBBox().width,"class":n===f?"highcharts-legend-nav-inactive":"highcharts-legend-nav-active"})},this),c.styledMode||(this.up.attr({fill:1===n?l.inactiveColor:l.activeColor}),this.upTracker.css({cursor:1===
n?"default":"pointer"}),this.down.attr({fill:n===f?l.inactiveColor:l.activeColor}),this.downTracker.css({cursor:n===f?"default":"pointer"})),this.scrollOffset=-e[n-1]+this.initialItemY,this.scrollGroup.animate({translateY:this.scrollOffset}),this.currentPage=n,this.positionCheckboxes(),a=r(B(d,c.renderer.globalAnimation,!0)),h(function(){k(b,"afterScroll",{currentPage:n})},a.duration))};a.prototype.setItemEvents=function(a,d,c){var b=this,e=b.chart.renderer.boxWrapper,h=a instanceof E,f="highcharts-legend-"+
(h?"point":"series")+"-active",g=b.chart.styledMode,l=function(d){b.allItems.forEach(function(b){a!==b&&[b].concat(b.linkedSeries||[]).forEach(function(a){a.setState(d,!h)})})};(c?[d,a.legendSymbol]:[a.legendGroup]).forEach(function(c){if(c)c.on("mouseover",function(){a.visible&&l("inactive");a.setState("hover");a.visible&&e.addClass(f);g||d.css(b.options.itemHoverStyle)}).on("mouseout",function(){b.chart.styledMode||d.css(D(a.visible?b.itemStyle:b.itemHiddenStyle));l("");e.removeClass(f);a.setState()}).on("click",
function(b){var d=function(){a.setVisible&&a.setVisible();l(a.visible?"inactive":"")};e.removeClass(f);b={browserEvent:b};a.firePointEvent?a.firePointEvent("legendItemClick",b,d):k(a,"legendItemClick",b,d)})})};a.prototype.createCheckboxForItem=function(a){a.checkbox=e("input",{type:"checkbox",className:"highcharts-legend-checkbox",checked:a.selected,defaultChecked:a.selected},this.options.itemCheckboxStyle,this.chart.container);c(a.checkbox,"click",function(b){k(a.series||a,"checkboxClick",{checked:b.target.checked,
item:a},function(){a.select()})})};return a}();(/Trident\/7\.0/.test(C.navigator&&C.navigator.userAgent)||a)&&z(x.prototype,"positionItem",function(a,b){var d=this,c=function(){b._legendItemPos&&a.call(d,b)};c();d.bubbleLegend||setTimeout(c)});"";return x});M(a,"Core/Series/SeriesRegistry.js",[a["Core/Globals.js"],a["Core/DefaultOptions.js"],a["Core/Series/Point.js"],a["Core/Utilities.js"]],function(a,w,C,E){var r=w.defaultOptions,x=E.error,J=E.extendClass,u=E.merge,n;(function(m){function g(a,e){var c=
r.plotOptions||{},f=e.defaultOptions;e.prototype.pointClass||(e.prototype.pointClass=C);e.prototype.type=a;f&&(c[a]=f);m.seriesTypes[a]=e}m.seriesTypes=a.seriesTypes;m.getSeries=function(a,e){void 0===e&&(e={});var c=a.options.chart;c=e.type||c.type||c.defaultSeriesType||"";var f=m.seriesTypes[c];m||x(17,!0,a,{missingModuleFor:c});c=new f;"function"===typeof c.init&&c.init(a,e);return c};m.registerSeriesType=g;m.seriesType=function(a,e,l,f,n){var c=r.plotOptions||{};e=e||"";c[a]=u(c[e],l);g(a,J(m.seriesTypes[e]||
function(){},f));m.seriesTypes[a].prototype.type=a;n&&(m.seriesTypes[a].prototype.pointClass=J(C,n));return m.seriesTypes[a]}})(n||(n={}));return n});M(a,"Core/Chart/Chart.js",[a["Core/Animation/AnimationUtilities.js"],a["Core/Axis/Axis.js"],a["Core/FormatUtilities.js"],a["Core/Foundation.js"],a["Core/Globals.js"],a["Core/Legend/Legend.js"],a["Core/MSPointer.js"],a["Core/DefaultOptions.js"],a["Core/Color/Palette.js"],a["Core/Pointer.js"],a["Core/Renderer/RendererRegistry.js"],a["Core/Series/SeriesRegistry.js"],
a["Core/Renderer/SVG/SVGRenderer.js"],a["Core/Time.js"],a["Core/Utilities.js"],a["Core/Renderer/HTML/AST.js"]],function(a,w,C,E,z,x,J,u,n,m,g,c,e,l,f,v){var q=a.animate,k=a.animObject,r=a.setAnimation,D=C.numberFormat,B=E.registerEventOptions,O=z.charts,t=z.doc,h=z.marginNames,d=z.svg,b=z.win,p=u.defaultOptions,G=u.defaultTime,y=c.seriesTypes,L=f.addEvent,F=f.attr,P=f.cleanRecursively,S=f.createElement,Q=f.css,V=f.defined,fa=f.discardElement,H=f.erase,K=f.error,M=f.extend,ha=f.find,R=f.fireEvent,
Z=f.getStyle,A=f.isArray,U=f.isNumber,N=f.isObject,W=f.isString,X=f.merge,Y=f.objectEach,T=f.pick,da=f.pInt,ka=f.relativeLength,ja=f.removeEvent,ba=f.splat,ea=f.syncTimeout,ma=f.uniqueKey;a=function(){function a(a,b,d){this.series=this.renderTo=this.renderer=this.pointer=this.pointCount=this.plotWidth=this.plotTop=this.plotLeft=this.plotHeight=this.plotBox=this.options=this.numberFormatter=this.margin=this.legend=this.labelCollectors=this.isResizing=this.index=this.eventOptions=this.container=this.colorCounter=
this.clipBox=this.chartWidth=this.chartHeight=this.bounds=this.axisOffset=this.axes=void 0;this.sharedClips={};this.yAxis=this.xAxis=this.userOptions=this.titleOffset=this.time=this.symbolCounter=this.spacingBox=this.spacing=void 0;this.getArgs(a,b,d)}a.chart=function(b,d,c){return new a(b,d,c)};a.prototype.getArgs=function(a,b,d){W(a)||a.nodeName?(this.renderTo=a,this.init(b,d)):this.init(a,b)};a.prototype.init=function(a,b){var d=a.plotOptions||{};R(this,"init",{args:arguments},function(){var c=
X(p,a),e=c.chart;Y(c.plotOptions,function(a,b){N(a)&&(a.tooltip=d[b]&&X(d[b].tooltip)||void 0)});c.tooltip.userOptions=a.chart&&a.chart.forExport&&a.tooltip.userOptions||a.tooltip;this.userOptions=a;this.margin=[];this.spacing=[];this.bounds={h:{},v:{}};this.labelCollectors=[];this.callback=b;this.isResizing=0;this.options=c;this.axes=[];this.series=[];this.time=a.time&&Object.keys(a.time).length?new l(a.time):z.time;this.numberFormatter=e.numberFormatter||D;this.styledMode=e.styledMode;this.hasCartesianSeries=
e.showAxes;this.index=O.length;O.push(this);z.chartCount++;B(this,e);this.xAxis=[];this.yAxis=[];this.pointCount=this.colorCounter=this.symbolCounter=0;R(this,"afterInit");this.firstRender()})};a.prototype.initSeries=function(a){var b=this.options.chart;b=a.type||b.type||b.defaultSeriesType;var d=y[b];d||K(17,!0,this,{missingModuleFor:b});b=new d;"function"===typeof b.init&&b.init(this,a);return b};a.prototype.setSeriesData=function(){this.getSeriesOrderByLinks().forEach(function(a){a.points||a.data||
!a.enabledDataSorting||a.setData(a.options.data,!1)})};a.prototype.getSeriesOrderByLinks=function(){return this.series.concat().sort(function(a,b){return a.linkedSeries.length||b.linkedSeries.length?b.linkedSeries.length-a.linkedSeries.length:0})};a.prototype.orderSeries=function(a){var b=this.series;a=a||0;for(var d=b.length;a<d;++a)b[a]&&(b[a].index=a,b[a].name=b[a].getName())};a.prototype.isInsidePlot=function(a,b,d){void 0===d&&(d={});var c=this.inverted,e=this.plotBox,h=this.plotLeft,f=this.plotTop,
g=this.scrollablePlotBox,k=0;var l=0;d.visiblePlotOnly&&this.scrollingContainer&&(l=this.scrollingContainer,k=l.scrollLeft,l=l.scrollTop);var m=d.series;e=d.visiblePlotOnly&&g||e;g=d.inverted?b:a;b=d.inverted?a:b;a={x:g,y:b,isInsidePlot:!0};if(!d.ignoreX){var A=m&&(c?m.yAxis:m.xAxis)||{pos:h,len:Infinity};g=d.paneCoordinates?A.pos+g:h+g;g>=Math.max(k+h,A.pos)&&g<=Math.min(k+h+e.width,A.pos+A.len)||(a.isInsidePlot=!1)}!d.ignoreY&&a.isInsidePlot&&(c=m&&(c?m.xAxis:m.yAxis)||{pos:f,len:Infinity},d=d.paneCoordinates?
c.pos+b:f+b,d>=Math.max(l+f,c.pos)&&d<=Math.min(l+f+e.height,c.pos+c.len)||(a.isInsidePlot=!1));R(this,"afterIsInsidePlot",a);return a.isInsidePlot};a.prototype.redraw=function(a){R(this,"beforeRedraw");var b=this.hasCartesianSeries?this.axes:this.colorAxis||[],d=this.series,c=this.pointer,e=this.legend,h=this.userOptions.legend,f=this.renderer,g=f.isHidden(),k=[],l=this.isDirtyBox,m=this.isDirtyLegend;this.setResponsive&&this.setResponsive(!1);r(this.hasRendered?a:!1,this);g&&this.temporaryDisplay();
this.layOutTitles();for(a=d.length;a--;){var A=d[a];if(A.options.stacking||A.options.centerInCategory){var p=!0;if(A.isDirty){var n=!0;break}}}if(n)for(a=d.length;a--;)A=d[a],A.options.stacking&&(A.isDirty=!0);d.forEach(function(a){a.isDirty&&("point"===a.options.legendType?("function"===typeof a.updateTotals&&a.updateTotals(),m=!0):h&&(h.labelFormatter||h.labelFormat)&&(m=!0));a.isDirtyData&&R(a,"updatedData")});m&&e&&e.options.enabled&&(e.render(),this.isDirtyLegend=!1);p&&this.getStacks();b.forEach(function(a){a.updateNames();
a.setScale()});this.getMargins();b.forEach(function(a){a.isDirty&&(l=!0)});b.forEach(function(a){var b=a.min+","+a.max;a.extKey!==b&&(a.extKey=b,k.push(function(){R(a,"afterSetExtremes",M(a.eventArgs,a.getExtremes()));delete a.eventArgs}));(l||p)&&a.redraw()});l&&this.drawChartBox();R(this,"predraw");d.forEach(function(a){(l||a.isDirty)&&a.visible&&a.redraw();a.isDirtyData=!1});c&&c.reset(!0);f.draw();R(this,"redraw");R(this,"render");g&&this.temporaryDisplay(!0);k.forEach(function(a){a.call()})};
a.prototype.get=function(a){function b(b){return b.id===a||b.options&&b.options.id===a}for(var d=this.series,c=ha(this.axes,b)||ha(this.series,b),e=0;!c&&e<d.length;e++)c=ha(d[e].points||[],b);return c};a.prototype.getAxes=function(){var a=this,b=this.options,d=b.xAxis=ba(b.xAxis||{});b=b.yAxis=ba(b.yAxis||{});R(this,"getAxes");d.forEach(function(a,b){a.index=b;a.isX=!0});b.forEach(function(a,b){a.index=b});d.concat(b).forEach(function(b){new w(a,b)});R(this,"afterGetAxes")};a.prototype.getSelectedPoints=
function(){return this.series.reduce(function(a,b){b.getPointsCollection().forEach(function(b){T(b.selectedStaging,b.selected)&&a.push(b)});return a},[])};a.prototype.getSelectedSeries=function(){return this.series.filter(function(a){return a.selected})};a.prototype.setTitle=function(a,b,d){this.applyDescription("title",a);this.applyDescription("subtitle",b);this.applyDescription("caption",void 0);this.layOutTitles(d)};a.prototype.applyDescription=function(a,b){var d=this,c="title"===a?{color:n.neutralColor80,
fontSize:this.options.isStock?"16px":"18px"}:{color:n.neutralColor60};c=this.options[a]=X(!this.styledMode&&{style:c},this.options[a],b);var e=this[a];e&&b&&(this[a]=e=e.destroy());c&&!e&&(e=this.renderer.text(c.text,0,0,c.useHTML).attr({align:c.align,"class":"highcharts-"+a,zIndex:c.zIndex||4}).add(),e.update=function(b){d[{title:"setTitle",subtitle:"setSubtitle",caption:"setCaption"}[a]](b)},this.styledMode||e.css(c.style),this[a]=e)};a.prototype.layOutTitles=function(a){var b=[0,0,0],d=this.renderer,
c=this.spacingBox;["title","subtitle","caption"].forEach(function(a){var e=this[a],h=this.options[a],f=h.verticalAlign||"top";a="title"===a?"top"===f?-3:0:"top"===f?b[0]+2:0;var g;if(e){this.styledMode||(g=h.style&&h.style.fontSize);g=d.fontMetrics(g,e).b;e.css({width:(h.width||c.width+(h.widthAdjust||0))+"px"});var k=Math.round(e.getBBox(h.useHTML).height);e.align(M({y:"bottom"===f?g:a+g,height:k},h),!1,"spacingBox");h.floating||("top"===f?b[0]=Math.ceil(b[0]+k):"bottom"===f&&(b[2]=Math.ceil(b[2]+
k)))}},this);b[0]&&"top"===(this.options.title.verticalAlign||"top")&&(b[0]+=this.options.title.margin);b[2]&&"bottom"===this.options.caption.verticalAlign&&(b[2]+=this.options.caption.margin);var e=!this.titleOffset||this.titleOffset.join(",")!==b.join(",");this.titleOffset=b;R(this,"afterLayOutTitles");!this.isDirtyBox&&e&&(this.isDirtyBox=this.isDirtyLegend=e,this.hasRendered&&T(a,!0)&&this.isDirtyBox&&this.redraw())};a.prototype.getChartSize=function(){var a=this.options.chart,b=a.width;a=a.height;
var d=this.renderTo;V(b)||(this.containerWidth=Z(d,"width"));V(a)||(this.containerHeight=Z(d,"height"));this.chartWidth=Math.max(0,b||this.containerWidth||600);this.chartHeight=Math.max(0,ka(a,this.chartWidth)||(1<this.containerHeight?this.containerHeight:400))};a.prototype.temporaryDisplay=function(a){var b=this.renderTo;if(a)for(;b&&b.style;)b.hcOrigStyle&&(Q(b,b.hcOrigStyle),delete b.hcOrigStyle),b.hcOrigDetached&&(t.body.removeChild(b),b.hcOrigDetached=!1),b=b.parentNode;else for(;b&&b.style;){t.body.contains(b)||
b.parentNode||(b.hcOrigDetached=!0,t.body.appendChild(b));if("none"===Z(b,"display",!1)||b.hcOricDetached)b.hcOrigStyle={display:b.style.display,height:b.style.height,overflow:b.style.overflow},a={display:"block",overflow:"hidden"},b!==this.renderTo&&(a.height=0),Q(b,a),b.offsetWidth||b.style.setProperty("display","block","important");b=b.parentNode;if(b===t.body)break}};a.prototype.setClassName=function(a){this.container.className="highcharts-container "+(a||"")};a.prototype.getContainer=function(){var a=
this.options,b=a.chart,c=ma(),h,f=this.renderTo;f||(this.renderTo=f=b.renderTo);W(f)&&(this.renderTo=f=t.getElementById(f));f||K(13,!0,this);var k=da(F(f,"data-highcharts-chart"));U(k)&&O[k]&&O[k].hasRendered&&O[k].destroy();F(f,"data-highcharts-chart",this.index);f.innerHTML="";b.skipClone||f.offsetWidth||this.temporaryDisplay();this.getChartSize();k=this.chartWidth;var l=this.chartHeight;Q(f,{overflow:"hidden"});this.styledMode||(h=M({position:"relative",overflow:"hidden",width:k+"px",height:l+
"px",textAlign:"left",lineHeight:"normal",zIndex:0,"-webkit-tap-highlight-color":"rgba(0,0,0,0)",userSelect:"none","touch-action":"manipulation",outline:"none"},b.style||{}));this.container=c=S("div",{id:c},h,f);this._cursor=c.style.cursor;this.renderer=new (b.renderer||!d?g.getRendererType(b.renderer):e)(c,k,l,void 0,b.forExport,a.exporting&&a.exporting.allowHTML,this.styledMode);r(void 0,this);this.setClassName(b.className);if(this.styledMode)for(var m in a.defs)this.renderer.definition(a.defs[m]);
else this.renderer.setStyle(b.style);this.renderer.chartIndex=this.index;R(this,"afterGetContainer")};a.prototype.getMargins=function(a){var b=this.spacing,d=this.margin,c=this.titleOffset;this.resetMargins();c[0]&&!V(d[0])&&(this.plotTop=Math.max(this.plotTop,c[0]+b[0]));c[2]&&!V(d[2])&&(this.marginBottom=Math.max(this.marginBottom,c[2]+b[2]));this.legend&&this.legend.display&&this.legend.adjustMargins(d,b);R(this,"getMargins");a||this.getAxisMargins()};a.prototype.getAxisMargins=function(){var a=
this,b=a.axisOffset=[0,0,0,0],d=a.colorAxis,c=a.margin,e=function(a){a.forEach(function(a){a.visible&&a.getOffset()})};a.hasCartesianSeries?e(a.axes):d&&d.length&&e(d);h.forEach(function(d,e){V(c[e])||(a[d]+=b[e])});a.setChartSize()};a.prototype.reflow=function(a){var d=this,c=d.options.chart,e=d.renderTo,h=V(c.width)&&V(c.height),g=c.width||Z(e,"width");c=c.height||Z(e,"height");e=a?a.target:b;delete d.pointer.chartPosition;if(!h&&!d.isPrinting&&g&&c&&(e===b||e===t)){if(g!==d.containerWidth||c!==
d.containerHeight)f.clearTimeout(d.reflowTimeout),d.reflowTimeout=ea(function(){d.container&&d.setSize(void 0,void 0,!1)},a?100:0);d.containerWidth=g;d.containerHeight=c}};a.prototype.setReflow=function(a){var d=this;!1===a||this.unbindReflow?!1===a&&this.unbindReflow&&(this.unbindReflow=this.unbindReflow()):(this.unbindReflow=L(b,"resize",function(a){d.options&&d.reflow(a)}),L(this,"destroy",this.unbindReflow))};a.prototype.setSize=function(a,b,d){var c=this,e=c.renderer;c.isResizing+=1;r(d,c);d=
e.globalAnimation;c.oldChartHeight=c.chartHeight;c.oldChartWidth=c.chartWidth;"undefined"!==typeof a&&(c.options.chart.width=a);"undefined"!==typeof b&&(c.options.chart.height=b);c.getChartSize();c.styledMode||(d?q:Q)(c.container,{width:c.chartWidth+"px",height:c.chartHeight+"px"},d);c.setChartSize(!0);e.setSize(c.chartWidth,c.chartHeight,d);c.axes.forEach(function(a){a.isDirty=!0;a.setScale()});c.isDirtyLegend=!0;c.isDirtyBox=!0;c.layOutTitles();c.getMargins();c.redraw(d);c.oldChartHeight=null;R(c,
"resize");ea(function(){c&&R(c,"endResize",null,function(){--c.isResizing})},k(d).duration)};a.prototype.setChartSize=function(a){var b=this.inverted,d=this.renderer,c=this.chartWidth,e=this.chartHeight,h=this.options.chart,f=this.spacing,g=this.clipOffset,k,l,m,A;this.plotLeft=k=Math.round(this.plotLeft);this.plotTop=l=Math.round(this.plotTop);this.plotWidth=m=Math.max(0,Math.round(c-k-this.marginRight));this.plotHeight=A=Math.max(0,Math.round(e-l-this.marginBottom));this.plotSizeX=b?A:m;this.plotSizeY=
b?m:A;this.plotBorderWidth=h.plotBorderWidth||0;this.spacingBox=d.spacingBox={x:f[3],y:f[0],width:c-f[3]-f[1],height:e-f[0]-f[2]};this.plotBox=d.plotBox={x:k,y:l,width:m,height:A};b=2*Math.floor(this.plotBorderWidth/2);c=Math.ceil(Math.max(b,g[3])/2);e=Math.ceil(Math.max(b,g[0])/2);this.clipBox={x:c,y:e,width:Math.floor(this.plotSizeX-Math.max(b,g[1])/2-c),height:Math.max(0,Math.floor(this.plotSizeY-Math.max(b,g[2])/2-e))};a||(this.axes.forEach(function(a){a.setAxisSize();a.setAxisTranslation()}),
d.alignElements());R(this,"afterSetChartSize",{skipAxes:a})};a.prototype.resetMargins=function(){R(this,"resetMargins");var a=this,b=a.options.chart;["margin","spacing"].forEach(function(d){var c=b[d],e=N(c)?c:[c,c,c,c];["Top","Right","Bottom","Left"].forEach(function(c,h){a[d][h]=T(b[d+c],e[h])})});h.forEach(function(b,d){a[b]=T(a.margin[d],a.spacing[d])});a.axisOffset=[0,0,0,0];a.clipOffset=[0,0,0,0]};a.prototype.drawChartBox=function(){var a=this.options.chart,b=this.renderer,d=this.chartWidth,
c=this.chartHeight,e=this.styledMode,h=this.plotBGImage,f=a.backgroundColor,g=a.plotBackgroundColor,k=a.plotBackgroundImage,l=this.plotLeft,m=this.plotTop,A=this.plotWidth,p=this.plotHeight,n=this.plotBox,q=this.clipRect,N=this.clipBox,t=this.chartBackground,v=this.plotBackground,r=this.plotBorder,B,y="animate";t||(this.chartBackground=t=b.rect().addClass("highcharts-background").add(),y="attr");if(e)var I=B=t.strokeWidth();else{I=a.borderWidth||0;B=I+(a.shadow?8:0);f={fill:f||"none"};if(I||t["stroke-width"])f.stroke=
a.borderColor,f["stroke-width"]=I;t.attr(f).shadow(a.shadow)}t[y]({x:B/2,y:B/2,width:d-B-I%2,height:c-B-I%2,r:a.borderRadius});y="animate";v||(y="attr",this.plotBackground=v=b.rect().addClass("highcharts-plot-background").add());v[y](n);e||(v.attr({fill:g||"none"}).shadow(a.plotShadow),k&&(h?(k!==h.attr("href")&&h.attr("href",k),h.animate(n)):this.plotBGImage=b.image(k,l,m,A,p).add()));q?q.animate({width:N.width,height:N.height}):this.clipRect=b.clipRect(N);y="animate";r||(y="attr",this.plotBorder=
r=b.rect().addClass("highcharts-plot-border").attr({zIndex:1}).add());e||r.attr({stroke:a.plotBorderColor,"stroke-width":a.plotBorderWidth||0,fill:"none"});r[y](r.crisp({x:l,y:m,width:A,height:p},-r.strokeWidth()));this.isDirtyBox=!1;R(this,"afterDrawChartBox")};a.prototype.propFromSeries=function(){var a=this,b=a.options.chart,d=a.options.series,c,e,h;["inverted","angular","polar"].forEach(function(f){e=y[b.type||b.defaultSeriesType];h=b[f]||e&&e.prototype[f];for(c=d&&d.length;!h&&c--;)(e=y[d[c].type])&&
e.prototype[f]&&(h=!0);a[f]=h})};a.prototype.linkSeries=function(){var a=this,b=a.series;b.forEach(function(a){a.linkedSeries.length=0});b.forEach(function(b){var d=b.options.linkedTo;W(d)&&(d=":previous"===d?a.series[b.index-1]:a.get(d))&&d.linkedParent!==b&&(d.linkedSeries.push(b),b.linkedParent=d,d.enabledDataSorting&&b.setDataSortingOptions(),b.visible=T(b.options.visible,d.options.visible,b.visible))});R(this,"afterLinkSeries")};a.prototype.renderSeries=function(){this.series.forEach(function(a){a.translate();
a.render()})};a.prototype.renderLabels=function(){var a=this,b=a.options.labels;b.items&&b.items.forEach(function(d){var c=M(b.style,d.style),e=da(c.left)+a.plotLeft,h=da(c.top)+a.plotTop+12;delete c.left;delete c.top;a.renderer.text(d.html,e,h).attr({zIndex:2}).css(c).add()})};a.prototype.render=function(){var a=this.axes,b=this.colorAxis,d=this.renderer,c=this.options,e=function(a){a.forEach(function(a){a.visible&&a.render()})},h=0;this.setTitle();this.legend=new x(this,c.legend);this.getStacks&&
this.getStacks();this.getMargins(!0);this.setChartSize();c=this.plotWidth;a.some(function(a){if(a.horiz&&a.visible&&a.options.labels.enabled&&a.series.length)return h=21,!0});var f=this.plotHeight=Math.max(this.plotHeight-h,0);a.forEach(function(a){a.setScale()});this.getAxisMargins();var g=1.1<c/this.plotWidth,k=1.05<f/this.plotHeight;if(g||k)a.forEach(function(a){(a.horiz&&g||!a.horiz&&k)&&a.setTickInterval(!0)}),this.getMargins();this.drawChartBox();this.hasCartesianSeries?e(a):b&&b.length&&e(b);
this.seriesGroup||(this.seriesGroup=d.g("series-group").attr({zIndex:3}).add());this.renderSeries();this.renderLabels();this.addCredits();this.setResponsive&&this.setResponsive();this.hasRendered=!0};a.prototype.addCredits=function(a){var d=this,c=X(!0,this.options.credits,a);c.enabled&&!this.credits&&(this.credits=this.renderer.text(c.text+(this.mapCredits||""),0,0).addClass("highcharts-credits").on("click",function(){c.href&&(b.location.href=c.href)}).attr({align:c.position.align,zIndex:8}),d.styledMode||
this.credits.css(c.style),this.credits.add().align(c.position),this.credits.update=function(a){d.credits=d.credits.destroy();d.addCredits(a)})};a.prototype.destroy=function(){var a=this,b=a.axes,d=a.series,c=a.container,e=c&&c.parentNode,h;R(a,"destroy");a.renderer.forExport?H(O,a):O[a.index]=void 0;z.chartCount--;a.renderTo.removeAttribute("data-highcharts-chart");ja(a);for(h=b.length;h--;)b[h]=b[h].destroy();this.scroller&&this.scroller.destroy&&this.scroller.destroy();for(h=d.length;h--;)d[h]=
d[h].destroy();"title subtitle chartBackground plotBackground plotBGImage plotBorder seriesGroup clipRect credits pointer rangeSelector legend resetZoomButton tooltip renderer".split(" ").forEach(function(b){var d=a[b];d&&d.destroy&&(a[b]=d.destroy())});c&&(c.innerHTML="",ja(c),e&&fa(c));Y(a,function(b,d){delete a[d]})};a.prototype.firstRender=function(){var a=this,b=a.options;if(!a.isReadyToRender||a.isReadyToRender()){a.getContainer();a.resetMargins();a.setChartSize();a.propFromSeries();a.getAxes();
(A(b.series)?b.series:[]).forEach(function(b){a.initSeries(b)});a.linkSeries();a.setSeriesData();R(a,"beforeRender");m&&(J.isRequired()?a.pointer=new J(a,b):a.pointer=new m(a,b));a.render();a.pointer.getChartPosition();if(!a.renderer.imgCount&&!a.hasLoaded)a.onload();a.temporaryDisplay(!0)}};a.prototype.onload=function(){this.callbacks.concat([this.callback]).forEach(function(a){a&&"undefined"!==typeof this.index&&a.apply(this,[this])},this);R(this,"load");R(this,"render");V(this.index)&&this.setReflow(this.options.chart.reflow);
this.hasLoaded=!0};a.prototype.addSeries=function(a,b,d){var c=this,e;a&&(b=T(b,!0),R(c,"addSeries",{options:a},function(){e=c.initSeries(a);c.isDirtyLegend=!0;c.linkSeries();e.enabledDataSorting&&e.setData(a.data,!1);R(c,"afterAddSeries",{series:e});b&&c.redraw(d)}));return e};a.prototype.addAxis=function(a,b,d,c){return this.createAxis(b?"xAxis":"yAxis",{axis:a,redraw:d,animation:c})};a.prototype.addColorAxis=function(a,b,d){return this.createAxis("colorAxis",{axis:a,redraw:b,animation:d})};a.prototype.createAxis=
function(a,b){a=new w(this,X(b.axis,{index:this[a].length,isX:"xAxis"===a}));T(b.redraw,!0)&&this.redraw(b.animation);return a};a.prototype.showLoading=function(a){var b=this,d=b.options,c=d.loading,e=function(){h&&Q(h,{left:b.plotLeft+"px",top:b.plotTop+"px",width:b.plotWidth+"px",height:b.plotHeight+"px"})},h=b.loadingDiv,f=b.loadingSpan;h||(b.loadingDiv=h=S("div",{className:"highcharts-loading highcharts-loading-hidden"},null,b.container));f||(b.loadingSpan=f=S("span",{className:"highcharts-loading-inner"},
null,h),L(b,"redraw",e));h.className="highcharts-loading";v.setElementHTML(f,T(a,d.lang.loading,""));b.styledMode||(Q(h,M(c.style,{zIndex:10})),Q(f,c.labelStyle),b.loadingShown||(Q(h,{opacity:0,display:""}),q(h,{opacity:c.style.opacity||.5},{duration:c.showDuration||0})));b.loadingShown=!0;e()};a.prototype.hideLoading=function(){var a=this.options,b=this.loadingDiv;b&&(b.className="highcharts-loading highcharts-loading-hidden",this.styledMode||q(b,{opacity:0},{duration:a.loading.hideDuration||100,
complete:function(){Q(b,{display:"none"})}}));this.loadingShown=!1};a.prototype.update=function(a,b,d,c){var e=this,h={credits:"addCredits",title:"setTitle",subtitle:"setSubtitle",caption:"setCaption"},f=a.isResponsiveOptions,g=[],k,m;R(e,"update",{options:a});f||e.setResponsive(!1,!0);a=P(a,e.options);e.userOptions=X(e.userOptions,a);var A=a.chart;if(A){X(!0,e.options.chart,A);"className"in A&&e.setClassName(A.className);"reflow"in A&&e.setReflow(A.reflow);if("inverted"in A||"polar"in A||"type"in
A){e.propFromSeries();var p=!0}"alignTicks"in A&&(p=!0);"events"in A&&B(this,A);Y(A,function(a,b){-1!==e.propsRequireUpdateSeries.indexOf("chart."+b)&&(k=!0);-1!==e.propsRequireDirtyBox.indexOf(b)&&(e.isDirtyBox=!0);-1!==e.propsRequireReflow.indexOf(b)&&(f?e.isDirtyBox=!0:m=!0)});!e.styledMode&&A.style&&e.renderer.setStyle(e.options.chart.style||{})}!e.styledMode&&a.colors&&(this.options.colors=a.colors);a.time&&(this.time===G&&(this.time=new l(a.time)),X(!0,e.options.time,a.time));Y(a,function(b,
d){if(e[d]&&"function"===typeof e[d].update)e[d].update(b,!1);else if("function"===typeof e[h[d]])e[h[d]](b);else"colors"!==d&&-1===e.collectionsWithUpdate.indexOf(d)&&X(!0,e.options[d],a[d]);"chart"!==d&&-1!==e.propsRequireUpdateSeries.indexOf(d)&&(k=!0)});this.collectionsWithUpdate.forEach(function(b){if(a[b]){var c=[];e[b].forEach(function(a,b){a.options.isInternal||c.push(T(a.options.index,b))});ba(a[b]).forEach(function(a,h){var f=V(a.id),g;f&&(g=e.get(a.id));!g&&e[b]&&(g=e[b][c?c[h]:h])&&f&&
V(g.options.id)&&(g=void 0);g&&g.coll===b&&(g.update(a,!1),d&&(g.touched=!0));!g&&d&&e.collectionsWithInit[b]&&(e.collectionsWithInit[b][0].apply(e,[a].concat(e.collectionsWithInit[b][1]||[]).concat([!1])).touched=!0)});d&&e[b].forEach(function(a){a.touched||a.options.isInternal?delete a.touched:g.push(a)})}});g.forEach(function(a){a.chart&&a.remove&&a.remove(!1)});p&&e.axes.forEach(function(a){a.update({},!1)});k&&e.getSeriesOrderByLinks().forEach(function(a){a.chart&&a.update({},!1)},this);p=A&&
A.width;A=A&&(W(A.height)?ka(A.height,p||e.chartWidth):A.height);m||U(p)&&p!==e.chartWidth||U(A)&&A!==e.chartHeight?e.setSize(p,A,c):T(b,!0)&&e.redraw(c);R(e,"afterUpdate",{options:a,redraw:b,animation:c})};a.prototype.setSubtitle=function(a,b){this.applyDescription("subtitle",a);this.layOutTitles(b)};a.prototype.setCaption=function(a,b){this.applyDescription("caption",a);this.layOutTitles(b)};a.prototype.showResetZoom=function(){function a(){b.zoomOut()}var b=this,d=p.lang,c=b.options.chart.resetZoomButton,
e=c.theme,h=e.states,f="chart"===c.relativeTo||"spacingBox"===c.relativeTo?null:"scrollablePlotBox";R(this,"beforeShowResetZoom",null,function(){b.resetZoomButton=b.renderer.button(d.resetZoom,null,null,a,e,h&&h.hover).attr({align:c.position.align,title:d.resetZoomTitle}).addClass("highcharts-reset-zoom").add().align(c.position,!1,f)});R(this,"afterShowResetZoom")};a.prototype.zoomOut=function(){R(this,"selection",{resetSelection:!0},this.zoom)};a.prototype.zoom=function(a){var b=this,d=b.pointer,
c=b.inverted?d.mouseDownX:d.mouseDownY,e=!1,h;!a||a.resetSelection?(b.axes.forEach(function(a){h=a.zoom()}),d.initiated=!1):a.xAxis.concat(a.yAxis).forEach(function(a){var f=a.axis,g=b.inverted?f.left:f.top,k=b.inverted?g+f.width:g+f.height,l=f.isXAxis,A=!1;if(!l&&c>=g&&c<=k||l||!V(c))A=!0;d[l?"zoomX":"zoomY"]&&A&&(h=f.zoom(a.min,a.max),f.displayBtn&&(e=!0))});var f=b.resetZoomButton;e&&!f?b.showResetZoom():!e&&N(f)&&(b.resetZoomButton=f.destroy());h&&b.redraw(T(b.options.chart.animation,a&&a.animation,
100>b.pointCount))};a.prototype.pan=function(a,b){var d=this,c=d.hoverPoints;b="object"===typeof b?b:{enabled:b,type:"x"};var e=d.options.chart,h=d.options.mapNavigation&&d.options.mapNavigation.enabled;e&&e.panning&&(e.panning=b);var f=b.type,g;R(this,"pan",{originalEvent:a},function(){c&&c.forEach(function(a){a.setState()});var b=d.xAxis;"xy"===f?b=b.concat(d.yAxis):"y"===f&&(b=d.yAxis);var e={};b.forEach(function(b){if(b.options.panningEnabled&&!b.options.isInternal){var c=b.horiz,k=a[c?"chartX":
"chartY"];c=c?"mouseDownX":"mouseDownY";var l=d[c],A=b.minPointOffset||0,m=b.reversed&&!d.inverted||!b.reversed&&d.inverted?-1:1,p=b.getExtremes(),n=b.toValue(l-k,!0)+A*m,q=b.toValue(l+b.len-k,!0)-(A*m||b.isXAxis&&b.pointRangePadding||0),t=q<n;m=b.hasVerticalPanning();l=t?q:n;n=t?n:q;var N=b.panningState;!m||b.isXAxis||N&&!N.isDirty||b.series.forEach(function(a){var b=a.getProcessedData(!0);b=a.getExtremes(b.yData,!0);N||(N={startMin:Number.MAX_VALUE,startMax:-Number.MAX_VALUE});U(b.dataMin)&&U(b.dataMax)&&
(N.startMin=Math.min(T(a.options.threshold,Infinity),b.dataMin,N.startMin),N.startMax=Math.max(T(a.options.threshold,-Infinity),b.dataMax,N.startMax))});m=Math.min(T(N&&N.startMin,p.dataMin),A?p.min:b.toValue(b.toPixels(p.min)-b.minPixelPadding));q=Math.max(T(N&&N.startMax,p.dataMax),A?p.max:b.toValue(b.toPixels(p.max)+b.minPixelPadding));b.panningState=N;b.isOrdinal||(A=m-l,0<A&&(n+=A,l=m),A=n-q,0<A&&(n=q,l-=A),b.series.length&&l!==p.min&&n!==p.max&&l>=m&&n<=q&&(b.setExtremes(l,n,!1,!1,{trigger:"pan"}),
d.resetZoomButton||h||l===m||n===q||!f.match("y")||(d.showResetZoom(),b.displayBtn=!1),g=!0),e[c]=k)}});Y(e,function(a,b){d[b]=a});g&&d.redraw(!1);Q(d.container,{cursor:"move"})})};return a}();M(a.prototype,{callbacks:[],collectionsWithInit:{xAxis:[a.prototype.addAxis,[!0]],yAxis:[a.prototype.addAxis,[!1]],series:[a.prototype.addSeries]},collectionsWithUpdate:["xAxis","yAxis","series"],propsRequireDirtyBox:"backgroundColor borderColor borderWidth borderRadius plotBackgroundColor plotBackgroundImage plotBorderColor plotBorderWidth plotShadow shadow".split(" "),
propsRequireReflow:"margin marginTop marginRight marginBottom marginLeft spacing spacingTop spacingRight spacingBottom spacingLeft".split(" "),propsRequireUpdateSeries:"chart.inverted chart.polar chart.ignoreHiddenSeries chart.type colors plotOptions time tooltip".split(" ")});"";return a});M(a,"Core/Legend/LegendSymbol.js",[a["Core/Utilities.js"]],function(a){var r=a.merge,C=a.pick,E;(function(a){a.drawLineMarker=function(a){var x=this.options,u=a.symbolWidth,n=a.symbolHeight,m=n/2,g=this.chart.renderer,
c=this.legendGroup;a=a.baseline-Math.round(.3*a.fontMetrics.b);var e={},l=x.marker;this.chart.styledMode||(e={"stroke-width":x.lineWidth||0},x.dashStyle&&(e.dashstyle=x.dashStyle));this.legendLine=g.path([["M",0,a],["L",u,a]]).addClass("highcharts-graph").attr(e).add(c);l&&!1!==l.enabled&&u&&(x=Math.min(C(l.radius,m),m),0===this.symbol.indexOf("url")&&(l=r(l,{width:n,height:n}),x=0),this.legendSymbol=u=g.symbol(this.symbol,u/2-x,a-x,2*x,2*x,l).addClass("highcharts-point").add(c),u.isMarker=!0)};a.drawRectangle=
function(a,r){var u=a.symbolHeight,n=a.options.squareSymbol;r.legendSymbol=this.chart.renderer.rect(n?(a.symbolWidth-u)/2:0,a.baseline-u+1,n?u:a.symbolWidth,u,C(a.options.symbolRadius,u/2)).addClass("highcharts-point").attr({zIndex:3}).add(r.legendGroup)}})(E||(E={}));return E});M(a,"Core/Series/SeriesDefaults.js",[a["Core/Color/Palette.js"]],function(a){return{lineWidth:2,allowPointSelect:!1,crisp:!0,showCheckbox:!1,animation:{duration:1E3},events:{},marker:{enabledThreshold:2,lineColor:a.backgroundColor,
lineWidth:0,radius:4,states:{normal:{animation:!0},hover:{animation:{duration:50},enabled:!0,radiusPlus:2,lineWidthPlus:1},select:{fillColor:a.neutralColor20,lineColor:a.neutralColor100,lineWidth:2}}},point:{events:{}},dataLabels:{animation:{},align:"center",defer:!0,formatter:function(){var a=this.series.chart.numberFormatter;return"number"!==typeof this.y?"":a(this.y,-1)},padding:5,style:{fontSize:"11px",fontWeight:"bold",color:"contrast",textOutline:"1px contrast"},verticalAlign:"bottom",x:0,y:0},
cropThreshold:300,opacity:1,pointRange:0,softThreshold:!0,states:{normal:{animation:!0},hover:{animation:{duration:50},lineWidthPlus:1,marker:{},halo:{size:10,opacity:.25}},select:{animation:{duration:0}},inactive:{animation:{duration:50},opacity:.2}},stickyTracking:!0,turboThreshold:1E3,findNearestPointBy:"x"}});M(a,"Core/Series/Series.js",[a["Core/Animation/AnimationUtilities.js"],a["Core/DefaultOptions.js"],a["Core/Foundation.js"],a["Core/Globals.js"],a["Core/Legend/LegendSymbol.js"],a["Core/Color/Palette.js"],
a["Core/Series/Point.js"],a["Core/Series/SeriesDefaults.js"],a["Core/Series/SeriesRegistry.js"],a["Core/Renderer/SVG/SVGElement.js"],a["Core/Utilities.js"]],function(a,w,C,E,z,x,J,u,n,m,g){var c=a.animObject,e=a.setAnimation,l=w.defaultOptions,f=C.registerEventOptions,v=E.hasTouch,q=E.svg,k=E.win,r=n.seriesTypes,D=g.addEvent,B=g.arrayMax,O=g.arrayMin,t=g.clamp,h=g.cleanRecursively,d=g.correctFloat,b=g.defined,p=g.erase,G=g.error,y=g.extend,L=g.find,F=g.fireEvent,P=g.getNestedProperty,S=g.isArray,
Q=g.isNumber,V=g.isString,M=g.merge,H=g.objectEach,K=g.pick,la=g.removeEvent,ha=g.splat,R=g.syncTimeout;a=function(){function a(){this.zones=this.yAxis=this.xAxis=this.userOptions=this.tooltipOptions=this.processedYData=this.processedXData=this.points=this.options=this.linkedSeries=this.index=this.eventsToUnbind=this.eventOptions=this.data=this.chart=this._i=void 0}a.prototype.init=function(a,b){F(this,"init",{options:b});var d=this,c=a.series;this.eventsToUnbind=[];d.chart=a;d.options=d.setOptions(b);
b=d.options;d.linkedSeries=[];d.bindAxes();y(d,{name:b.name,state:"",visible:!1!==b.visible,selected:!0===b.selected});f(this,b);var e=b.events;if(e&&e.click||b.point&&b.point.events&&b.point.events.click||b.allowPointSelect)a.runTrackerClick=!0;d.getColor();d.getSymbol();d.parallelArrays.forEach(function(a){d[a+"Data"]||(d[a+"Data"]=[])});d.isCartesian&&(a.hasCartesianSeries=!0);var h;c.length&&(h=c[c.length-1]);d._i=K(h&&h._i,-1)+1;d.opacity=d.options.opacity;a.orderSeries(this.insert(c));b.dataSorting&&
b.dataSorting.enabled?d.setDataSortingOptions():d.points||d.data||d.setData(b.data,!1);F(this,"afterInit")};a.prototype.is=function(a){return r[a]&&this instanceof r[a]};a.prototype.insert=function(a){var b=this.options.index,d;if(Q(b)){for(d=a.length;d--;)if(b>=K(a[d].options.index,a[d]._i)){a.splice(d+1,0,this);break}-1===d&&a.unshift(this);d+=1}else a.push(this);return K(d,a.length-1)};a.prototype.bindAxes=function(){var a=this,b=a.options,d=a.chart,c;F(this,"bindAxes",null,function(){(a.axisTypes||
[]).forEach(function(e){var h=0;d[e].forEach(function(d){c=d.options;if(b[e]===h&&!c.isInternal||"undefined"!==typeof b[e]&&b[e]===c.id||"undefined"===typeof b[e]&&0===c.index)a.insert(d.series),a[e]=d,d.isDirty=!0;c.isInternal||h++});a[e]||a.optionalAxis===e||G(18,!0,d)})});F(this,"afterBindAxes")};a.prototype.updateParallelArrays=function(a,b){var d=a.series,c=arguments,e=Q(b)?function(c){var e="y"===c&&d.toYData?d.toYData(a):a[c];d[c+"Data"][b]=e}:function(a){Array.prototype[b].apply(d[a+"Data"],
Array.prototype.slice.call(c,2))};d.parallelArrays.forEach(e)};a.prototype.hasData=function(){return this.visible&&"undefined"!==typeof this.dataMax&&"undefined"!==typeof this.dataMin||this.visible&&this.yData&&0<this.yData.length};a.prototype.autoIncrement=function(a){var b=this.options,d=b.pointIntervalUnit,c=b.relativeXValue,e=this.chart.time,h=this.xIncrement,f;h=K(h,b.pointStart,0);this.pointInterval=f=K(this.pointInterval,b.pointInterval,1);c&&Q(a)&&(f*=a);d&&(b=new e.Date(h),"day"===d?e.set("Date",
b,e.get("Date",b)+f):"month"===d?e.set("Month",b,e.get("Month",b)+f):"year"===d&&e.set("FullYear",b,e.get("FullYear",b)+f),f=b.getTime()-h);if(c&&Q(a))return h+f;this.xIncrement=h+f;return h};a.prototype.setDataSortingOptions=function(){var a=this.options;y(this,{requireSorting:!1,sorted:!1,enabledDataSorting:!0,allowDG:!1});b(a.pointRange)||(a.pointRange=1)};a.prototype.setOptions=function(a){var d=this.chart,c=d.options,e=c.plotOptions,h=d.userOptions||{};a=M(a);d=d.styledMode;var f={plotOptions:e,
userOptions:a};F(this,"setOptions",f);var g=f.plotOptions[this.type],k=h.plotOptions||{};this.userOptions=f.userOptions;h=M(g,e.series,h.plotOptions&&h.plotOptions[this.type],a);this.tooltipOptions=M(l.tooltip,l.plotOptions.series&&l.plotOptions.series.tooltip,l.plotOptions[this.type].tooltip,c.tooltip.userOptions,e.series&&e.series.tooltip,e[this.type].tooltip,a.tooltip);this.stickyTracking=K(a.stickyTracking,k[this.type]&&k[this.type].stickyTracking,k.series&&k.series.stickyTracking,this.tooltipOptions.shared&&
!this.noSharedTooltip?!0:h.stickyTracking);null===g.marker&&delete h.marker;this.zoneAxis=h.zoneAxis;e=this.zones=(h.zones||[]).slice();!h.negativeColor&&!h.negativeFillColor||h.zones||(c={value:h[this.zoneAxis+"Threshold"]||h.threshold||0,className:"highcharts-negative"},d||(c.color=h.negativeColor,c.fillColor=h.negativeFillColor),e.push(c));e.length&&b(e[e.length-1].value)&&e.push(d?{}:{color:this.color,fillColor:this.fillColor});F(this,"afterSetOptions",{options:h});return h};a.prototype.getName=
function(){return K(this.options.name,"Series "+(this.index+1))};a.prototype.getCyclic=function(a,d,c){var e=this.chart,h=this.userOptions,f=a+"Index",g=a+"Counter",k=c?c.length:K(e.options.chart[a+"Count"],e[a+"Count"]);if(!d){var l=K(h[f],h["_"+f]);b(l)||(e.series.length||(e[g]=0),h["_"+f]=l=e[g]%k,e[g]+=1);c&&(d=c[l])}"undefined"!==typeof l&&(this[f]=l);this[a]=d};a.prototype.getColor=function(){this.chart.styledMode?this.getCyclic("color"):this.options.colorByPoint?this.color=x.neutralColor20:
this.getCyclic("color",this.options.color||l.plotOptions[this.type].color,this.chart.options.colors)};a.prototype.getPointsCollection=function(){return(this.hasGroupedData?this.points:this.data)||[]};a.prototype.getSymbol=function(){this.getCyclic("symbol",this.options.marker.symbol,this.chart.options.symbols)};a.prototype.findPointIndex=function(a,b){var d=a.id,c=a.x,e=this.points,h=this.options.dataSorting,f,g;if(d)h=this.chart.get(d),h instanceof J&&(f=h);else if(this.linkedParent||this.enabledDataSorting||
this.options.relativeXValue)if(f=function(b){return!b.touched&&b.index===a.index},h&&h.matchByName?f=function(b){return!b.touched&&b.name===a.name}:this.options.relativeXValue&&(f=function(b){return!b.touched&&b.options.x===a.x}),f=L(e,f),!f)return;if(f){var k=f&&f.index;"undefined"!==typeof k&&(g=!0)}"undefined"===typeof k&&Q(c)&&(k=this.xData.indexOf(c,b));-1!==k&&"undefined"!==typeof k&&this.cropped&&(k=k>=this.cropStart?k-this.cropStart:k);!g&&Q(k)&&e[k]&&e[k].touched&&(k=void 0);return k};a.prototype.updateData=
function(a,d){var c=this.options,e=c.dataSorting,h=this.points,f=[],g=this.requireSorting,k=a.length===h.length,l,m,A,p=!0;this.xIncrement=null;a.forEach(function(a,d){var m=b(a)&&this.pointClass.prototype.optionsToObject.call({series:this},a)||{},p=m.x;if(m.id||Q(p)){if(m=this.findPointIndex(m,A),-1===m||"undefined"===typeof m?f.push(a):h[m]&&a!==c.data[m]?(h[m].update(a,!1,null,!1),h[m].touched=!0,g&&(A=m+1)):h[m]&&(h[m].touched=!0),!k||d!==m||e&&e.enabled||this.hasDerivedData)l=!0}else f.push(a)},
this);if(l)for(a=h.length;a--;)(m=h[a])&&!m.touched&&m.remove&&m.remove(!1,d);else!k||e&&e.enabled?p=!1:(a.forEach(function(a,b){a!==h[b].y&&h[b].update&&h[b].update(a,!1,null,!1)}),f.length=0);h.forEach(function(a){a&&(a.touched=!1)});if(!p)return!1;f.forEach(function(a){this.addPoint(a,!1,null,null,!1)},this);null===this.xIncrement&&this.xData&&this.xData.length&&(this.xIncrement=B(this.xData),this.autoIncrement());return!0};a.prototype.setData=function(a,b,d,c){var e=this,h=e.points,f=h&&h.length||
0,g=e.options,k=e.chart,l=g.dataSorting,m=e.xAxis,A=g.turboThreshold,p=this.xData,n=this.yData,q=e.pointArrayMap;q=q&&q.length;var t=g.keys,v,r=0,B=1,y=null;a=a||[];var N=a.length;b=K(b,!0);l&&l.enabled&&(a=this.sortData(a));!1!==c&&N&&f&&!e.cropped&&!e.hasGroupedData&&e.visible&&!e.isSeriesBoosting&&(v=this.updateData(a,d));if(!v){e.xIncrement=null;e.colorCounter=0;this.parallelArrays.forEach(function(a){e[a+"Data"].length=0});if(A&&N>A)if(y=e.getFirstValidPoint(a),Q(y))for(d=0;d<N;d++)p[d]=this.autoIncrement(),
n[d]=a[d];else if(S(y))if(q)for(d=0;d<N;d++)c=a[d],p[d]=c[0],n[d]=c.slice(1,q+1);else for(t&&(r=t.indexOf("x"),B=t.indexOf("y"),r=0<=r?r:0,B=0<=B?B:1),d=0;d<N;d++)c=a[d],p[d]=c[r],n[d]=c[B];else G(12,!1,k);else for(d=0;d<N;d++)"undefined"!==typeof a[d]&&(c={series:e},e.pointClass.prototype.applyOptions.apply(c,[a[d]]),e.updateParallelArrays(c,d));n&&V(n[0])&&G(14,!0,k);e.data=[];e.options.data=e.userOptions.data=a;for(d=f;d--;)h[d]&&h[d].destroy&&h[d].destroy();m&&(m.minRange=m.userMinRange);e.isDirty=
k.isDirtyBox=!0;e.isDirtyData=!!h;d=!1}"point"===g.legendType&&(this.processData(),this.generatePoints());b&&k.redraw(d)};a.prototype.sortData=function(a){var d=this,c=d.options.dataSorting.sortKey||"y",e=function(a,d){return b(d)&&a.pointClass.prototype.optionsToObject.call({series:a},d)||{}};a.forEach(function(b,c){a[c]=e(d,b);a[c].index=c},this);a.concat().sort(function(a,b){a=P(c,a);b=P(c,b);return b<a?-1:b>a?1:0}).forEach(function(a,b){a.x=b},this);d.linkedSeries&&d.linkedSeries.forEach(function(b){var d=
b.options,c=d.data;d.dataSorting&&d.dataSorting.enabled||!c||(c.forEach(function(d,h){c[h]=e(b,d);a[h]&&(c[h].x=a[h].x,c[h].index=h)}),b.setData(c,!1))});return a};a.prototype.getProcessedData=function(a){var b=this.xAxis,d=this.options,c=d.cropThreshold,e=a||this.getExtremesFromAll||d.getExtremesFromAll,h=this.isCartesian;a=b&&b.val2lin;d=!(!b||!b.logarithmic);var f=0,g=this.xData,k=this.yData,l=this.requireSorting;var m=!1;var A=g.length;if(b){m=b.getExtremes();var p=m.min;var n=m.max;m=b.categories&&
!b.names.length}if(h&&this.sorted&&!e&&(!c||A>c||this.forceCrop))if(g[A-1]<p||g[0]>n)g=[],k=[];else if(this.yData&&(g[0]<p||g[A-1]>n)){var q=this.cropData(this.xData,this.yData,p,n);g=q.xData;k=q.yData;f=q.start;q=!0}for(c=g.length||1;--c;)if(b=d?a(g[c])-a(g[c-1]):g[c]-g[c-1],0<b&&("undefined"===typeof t||b<t))var t=b;else 0>b&&l&&!m&&(G(15,!1,this.chart),l=!1);return{xData:g,yData:k,cropped:q,cropStart:f,closestPointRange:t}};a.prototype.processData=function(a){var b=this.xAxis;if(this.isCartesian&&
!this.isDirty&&!b.isDirty&&!this.yAxis.isDirty&&!a)return!1;a=this.getProcessedData();this.cropped=a.cropped;this.cropStart=a.cropStart;this.processedXData=a.xData;this.processedYData=a.yData;this.closestPointRange=this.basePointRange=a.closestPointRange};a.prototype.cropData=function(a,b,d,c,e){var h=a.length,f,g=0,k=h;e=K(e,this.cropShoulder);for(f=0;f<h;f++)if(a[f]>=d){g=Math.max(0,f-e);break}for(d=f;d<h;d++)if(a[d]>c){k=d+e;break}return{xData:a.slice(g,k),yData:b.slice(g,k),start:g,end:k}};a.prototype.generatePoints=
function(){var a=this.options,b=a.data,d=this.processedXData,c=this.processedYData,e=this.pointClass,h=d.length,f=this.cropStart||0,g=this.hasGroupedData,k=a.keys,l=[];a=a.dataGrouping&&a.dataGrouping.groupAll?f:0;var m,p,n=this.data;if(!n&&!g){var q=[];q.length=b.length;n=this.data=q}k&&g&&(this.options.keys=!1);for(p=0;p<h;p++){q=f+p;if(g){var t=(new e).init(this,[d[p]].concat(ha(c[p])));t.dataGroup=this.groupMap[a+p];t.dataGroup.options&&(t.options=t.dataGroup.options,y(t,t.dataGroup.options),
delete t.dataLabels)}else(t=n[q])||"undefined"===typeof b[q]||(n[q]=t=(new e).init(this,b[q],d[p]));t&&(t.index=g?a+p:q,l[p]=t)}this.options.keys=k;if(n&&(h!==(m=n.length)||g))for(p=0;p<m;p++)p!==f||g||(p+=h),n[p]&&(n[p].destroyElements(),n[p].plotX=void 0);this.data=n;this.points=l;F(this,"afterGeneratePoints")};a.prototype.getXExtremes=function(a){return{min:O(a),max:B(a)}};a.prototype.getExtremes=function(a,b){var d=this.xAxis,c=this.yAxis,e=this.processedXData||this.xData,h=[],f=this.requireSorting?
this.cropShoulder:0;c=c?c.positiveValuesOnly:!1;var g,k=0,l=0,m=0;a=a||this.stackedYData||this.processedYData||[];var p=a.length;if(d){var n=d.getExtremes();k=n.min;l=n.max}for(g=0;g<p;g++){var A=e[g];n=a[g];var q=(Q(n)||S(n))&&(n.length||0<n||!c);A=b||this.getExtremesFromAll||this.options.getExtremesFromAll||this.cropped||!d||(e[g+f]||A)>=k&&(e[g-f]||A)<=l;if(q&&A)if(q=n.length)for(;q--;)Q(n[q])&&(h[m++]=n[q]);else h[m++]=n}a={dataMin:O(h),dataMax:B(h)};F(this,"afterGetExtremes",{dataExtremes:a});
return a};a.prototype.applyExtremes=function(){var a=this.getExtremes();this.dataMin=a.dataMin;this.dataMax=a.dataMax;return a};a.prototype.getFirstValidPoint=function(a){for(var b=a.length,d=0,c=null;null===c&&d<b;)c=a[d],d++;return c};a.prototype.translate=function(){this.processedXData||this.processData();this.generatePoints();var a=this.options,c=a.stacking,e=this.xAxis,h=e.categories,f=this.enabledDataSorting,g=this.yAxis,k=this.points,l=k.length,m=!!this.modifyValue,p=this.pointPlacementToXValue(),
n=!!p,q=a.threshold,v=a.startFromThreshold?q:0,r=this.zoneAxis||"y",B,y,I=Number.MAX_VALUE;for(B=0;B<l;B++){var D=k[B],u=D.x,G=void 0,x=void 0,w=D.y,L=D.low,z=c&&g.stacking&&g.stacking.stacks[(this.negStacks&&w<(v?0:q)?"-":"")+this.stackKey];if(g.positiveValuesOnly&&!g.validatePositiveValue(w)||e.positiveValuesOnly&&!e.validatePositiveValue(u))D.isNull=!0;D.plotX=y=d(t(e.translate(u,0,0,0,1,p,"flags"===this.type),-1E5,1E5));if(c&&this.visible&&z&&z[u]){var C=this.getStackIndicator(C,u,this.index);
D.isNull||(G=z[u],x=G.points[C.key])}S(x)&&(L=x[0],w=x[1],L===v&&C.key===z[u].base&&(L=K(Q(q)&&q,g.min)),g.positiveValuesOnly&&0>=L&&(L=null),D.total=D.stackTotal=G.total,D.percentage=G.total&&D.y/G.total*100,D.stackY=w,this.irregularWidths||G.setOffset(this.pointXOffset||0,this.barW||0));D.yBottom=b(L)?t(g.translate(L,0,1,0,1),-1E5,1E5):null;m&&(w=this.modifyValue(w,D));D.plotY=void 0;Q(w)&&(G=g.translate(w,!1,!0,!1,!0),"undefined"!==typeof G&&(D.plotY=t(G,-1E5,1E5)));D.isInside=this.isPointInside(D);
D.clientX=n?d(e.translate(u,0,0,0,1,p)):y;D.negative=D[r]<(a[r+"Threshold"]||q||0);D.category=h&&"undefined"!==typeof h[D.x]?h[D.x]:D.x;if(!D.isNull&&!1!==D.visible){"undefined"!==typeof H&&(I=Math.min(I,Math.abs(y-H)));var H=y}D.zone=this.zones.length&&D.getZone();!D.graphic&&this.group&&f&&(D.isNew=!0)}this.closestPointRangePx=I;F(this,"afterTranslate")};a.prototype.getValidPoints=function(a,b,d){var c=this.chart;return(a||this.points||[]).filter(function(a){return b&&!c.isInsidePlot(a.plotX,a.plotY,
{inverted:c.inverted})?!1:!1!==a.visible&&(d||!a.isNull)})};a.prototype.getClipBox=function(a,b){var d=this.options,c=this.chart,e=c.inverted,h=this.xAxis,f=h&&this.yAxis,g=c.options.chart.scrollablePlotArea||{};a&&!1===d.clip&&f?a=e?{y:-c.chartWidth+f.len+f.pos,height:c.chartWidth,width:c.chartHeight,x:-c.chartHeight+h.len+h.pos}:{y:-f.pos,height:c.chartHeight,width:c.chartWidth,x:-h.pos}:(a=this.clipBox||c.clipBox,b&&(a.width=c.plotSizeX,a.x=(c.scrollablePixelsX||0)*(g.scrollPositionX||0)));return b?
{width:a.width,x:a.x}:a};a.prototype.getSharedClipKey=function(a){if(this.sharedClipKey)return this.sharedClipKey;var b=[a&&a.duration,a&&a.easing,a&&a.defer,this.getClipBox(a).height,this.options.xAxis,this.options.yAxis].join();if(!1!==this.options.clip||a)this.sharedClipKey=b;return b};a.prototype.setClip=function(a){var b=this.chart,d=this.options,c=b.renderer,e=b.inverted,h=this.clipBox,f=this.getClipBox(a),g=this.getSharedClipKey(a),k=b.sharedClips[g],l=b.sharedClips[g+"m"];a&&(f.width=0,e&&
(f.x=b.plotHeight+(!1!==d.clip?0:b.plotTop)));k?b.hasLoaded||k.attr(f):(a&&(b.sharedClips[g+"m"]=l=c.clipRect(e?(b.plotSizeX||0)+99:-99,e?-b.plotLeft:-b.plotTop,99,e?b.chartWidth:b.chartHeight)),b.sharedClips[g]=k=c.clipRect(f),k.count={length:0});a&&!k.count[this.index]&&(k.count[this.index]=!0,k.count.length+=1);if(!1!==d.clip||a)this.group.clip(a||h?k:b.clipRect),this.markerGroup.clip(l);a||(k.count[this.index]&&(delete k.count[this.index],--k.count.length),0===k.count.length&&(h||(b.sharedClips[g]=
k.destroy()),l&&(b.sharedClips[g+"m"]=l.destroy())))};a.prototype.animate=function(a){var b=this.chart,d=c(this.options.animation),e=this.sharedClipKey;if(a)this.setClip(d);else if(e){a=b.sharedClips[e];e=b.sharedClips[e+"m"];var h=this.getClipBox(d,!0);a&&a.animate(h,d);e&&e.animate({width:h.width+99,x:h.x-(b.inverted?0:99)},d)}};a.prototype.afterAnimate=function(){this.setClip();F(this,"afterAnimate");this.finishedAnimating=!0};a.prototype.drawPoints=function(){var a=this.points,b=this.chart,d=
this.options.marker,c=this[this.specialGroup]||this.markerGroup,e=this.xAxis,h=K(d.enabled,!e||e.isRadial?!0:null,this.closestPointRangePx>=d.enabledThreshold*d.radius),f,g;if(!1!==d.enabled||this._hasPointMarkers)for(f=0;f<a.length;f++){var k=a[f];var l=(g=k.graphic)?"animate":"attr";var m=k.marker||{};var p=!!k.marker;if((h&&"undefined"===typeof m.enabled||m.enabled)&&!k.isNull&&!1!==k.visible){var n=K(m.symbol,this.symbol,"rect");var q=this.markerAttribs(k,k.selected&&"select");this.enabledDataSorting&&
(k.startXPos=e.reversed?-(q.width||0):e.width);var t=!1!==k.isInside;g?g[t?"show":"hide"](t).animate(q):t&&(0<(q.width||0)||k.hasImage)&&(k.graphic=g=b.renderer.symbol(n,q.x,q.y,q.width,q.height,p?m:d).add(c),this.enabledDataSorting&&b.hasRendered&&(g.attr({x:k.startXPos}),l="animate"));g&&"animate"===l&&g[t?"show":"hide"](t).animate(q);if(g&&!b.styledMode)g[l](this.pointAttribs(k,k.selected&&"select"));g&&g.addClass(k.getClassName(),!0)}else g&&(k.graphic=g.destroy())}};a.prototype.markerAttribs=
function(a,b){var d=this.options,c=d.marker,e=a.marker||{},h=e.symbol||c.symbol,f=K(e.radius,c.radius);b&&(c=c.states[b],b=e.states&&e.states[b],f=K(b&&b.radius,c&&c.radius,f+(c&&c.radiusPlus||0)));a.hasImage=h&&0===h.indexOf("url");a.hasImage&&(f=0);a={x:d.crisp?Math.floor(a.plotX-f):a.plotX-f,y:a.plotY-f};f&&(a.width=a.height=2*f);return a};a.prototype.pointAttribs=function(a,b){var d=this.options.marker,c=a&&a.options,e=c&&c.marker||{},h=c&&c.color,f=a&&a.color,g=a&&a.zone&&a.zone.color,k=this.color;
a=K(e.lineWidth,d.lineWidth);c=1;k=h||g||f||k;h=e.fillColor||d.fillColor||k;f=e.lineColor||d.lineColor||k;b=b||"normal";d=d.states[b];b=e.states&&e.states[b]||{};a=K(b.lineWidth,d.lineWidth,a+K(b.lineWidthPlus,d.lineWidthPlus,0));h=b.fillColor||d.fillColor||h;f=b.lineColor||d.lineColor||f;c=K(b.opacity,d.opacity,c);return{stroke:f,"stroke-width":a,fill:h,opacity:c}};a.prototype.destroy=function(a){var b=this,d=b.chart,c=/AppleWebKit\/533/.test(k.navigator.userAgent),e=b.data||[],h,f,l,n;F(b,"destroy");
this.removeEvents(a);(b.axisTypes||[]).forEach(function(a){(n=b[a])&&n.series&&(p(n.series,b),n.isDirty=n.forceRedraw=!0)});b.legendItem&&b.chart.legend.destroyItem(b);for(f=e.length;f--;)(l=e[f])&&l.destroy&&l.destroy();b.clips&&b.clips.forEach(function(a){return a.destroy()});g.clearTimeout(b.animationTimeout);H(b,function(a,b){a instanceof m&&!a.survive&&(h=c&&"group"===b?"hide":"destroy",a[h]())});d.hoverSeries===b&&(d.hoverSeries=void 0);p(d.series,b);d.orderSeries();H(b,function(d,c){a&&"hcEvents"===
c||delete b[c]})};a.prototype.applyZones=function(){var a=this,b=this.chart,d=b.renderer,c=this.zones,e=this.clips||[],h=this.graph,f=this.area,g=Math.max(b.chartWidth,b.chartHeight),k=this[(this.zoneAxis||"y")+"Axis"],l=b.inverted,m,p,n,q,v,r,B,y,D=!1;if(c.length&&(h||f)&&k&&"undefined"!==typeof k.min){var I=k.reversed;var F=k.horiz;h&&!this.showLine&&h.hide();f&&f.hide();var u=k.getExtremes();c.forEach(function(c,A){m=I?F?b.plotWidth:0:F?0:k.toPixels(u.min)||0;m=t(K(p,m),0,g);p=t(Math.round(k.toPixels(K(c.value,
u.max),!0)||0),0,g);D&&(m=p=k.toPixels(u.max));q=Math.abs(m-p);v=Math.min(m,p);r=Math.max(m,p);k.isXAxis?(n={x:l?r:v,y:0,width:q,height:g},F||(n.x=b.plotHeight-n.x)):(n={x:0,y:l?r:v,width:g,height:q},F&&(n.y=b.plotWidth-n.y));l&&d.isVML&&(n=k.isXAxis?{x:0,y:I?v:r,height:n.width,width:b.chartWidth}:{x:n.y-b.plotLeft-b.spacingBox.x,y:0,width:n.height,height:b.chartHeight});e[A]?e[A].animate(n):e[A]=d.clipRect(n);B=a["zone-area-"+A];y=a["zone-graph-"+A];h&&y&&y.clip(e[A]);f&&B&&B.clip(e[A]);D=c.value>
u.max;a.resetZones&&0===p&&(p=void 0)});this.clips=e}else a.visible&&(h&&h.show(!0),f&&f.show(!0))};a.prototype.invertGroups=function(a){function b(){["group","markerGroup"].forEach(function(b){d[b]&&(c.renderer.isVML&&d[b].attr({width:d.yAxis.len,height:d.xAxis.len}),d[b].width=d.yAxis.len,d[b].height=d.xAxis.len,d[b].invert(d.isRadialSeries?!1:a))})}var d=this,c=d.chart;d.xAxis&&(d.eventsToUnbind.push(D(c,"resize",b)),b(),d.invertGroups=b)};a.prototype.plotGroup=function(a,d,c,e,h){var f=this[a],
g=!f;c={visibility:c,zIndex:e||.1};"undefined"===typeof this.opacity||this.chart.styledMode||"inactive"===this.state||(c.opacity=this.opacity);g&&(this[a]=f=this.chart.renderer.g().add(h));f.addClass("highcharts-"+d+" highcharts-series-"+this.index+" highcharts-"+this.type+"-series "+(b(this.colorIndex)?"highcharts-color-"+this.colorIndex+" ":"")+(this.options.className||"")+(f.hasClass("highcharts-tracker")?" highcharts-tracker":""),!0);f.attr(c)[g?"attr":"animate"](this.getPlotBox());return f};
a.prototype.getPlotBox=function(){var a=this.chart,b=this.xAxis,d=this.yAxis;a.inverted&&(b=d,d=this.xAxis);return{translateX:b?b.left:a.plotLeft,translateY:d?d.top:a.plotTop,scaleX:1,scaleY:1}};a.prototype.removeEvents=function(a){a||la(this);this.eventsToUnbind.length&&(this.eventsToUnbind.forEach(function(a){a()}),this.eventsToUnbind.length=0)};a.prototype.render=function(){var a=this,b=a.chart,d=a.options,e=c(d.animation),h=a.visible?"inherit":"hidden",f=d.zIndex,g=a.hasRendered,k=b.seriesGroup,
l=b.inverted,m=!a.finishedAnimating&&b.renderer.isSVG&&e.duration;F(this,"render");var p=a.plotGroup("group","series",h,f,k);a.markerGroup=a.plotGroup("markerGroup","markers",h,f,k);m&&a.animate&&a.animate(!0);p.inverted=K(a.invertible,a.isCartesian)?l:!1;a.drawGraph&&(a.drawGraph(),a.applyZones());a.visible&&a.drawPoints();a.drawDataLabels&&a.drawDataLabels();a.redrawPoints&&a.redrawPoints();a.drawTracker&&!1!==a.options.enableMouseTracking&&a.drawTracker();a.invertGroups(l);!1===d.clip||a.sharedClipKey||
g||p.clip(b.clipRect);m&&a.animate&&a.animate();g||(m&&e.defer&&(m+=e.defer),a.animationTimeout=R(function(){a.afterAnimate()},m||0));a.isDirty=!1;a.hasRendered=!0;F(a,"afterRender")};a.prototype.redraw=function(){var a=this.chart,b=this.isDirty||this.isDirtyData,d=this.group,c=this.xAxis,e=this.yAxis;d&&(a.inverted&&d.attr({width:a.plotWidth,height:a.plotHeight}),d.animate({translateX:K(c&&c.left,a.plotLeft),translateY:K(e&&e.top,a.plotTop)}));this.translate();this.render();b&&delete this.kdTree};
a.prototype.searchPoint=function(a,b){var d=this.xAxis,c=this.yAxis,e=this.chart.inverted;return this.searchKDTree({clientX:e?d.len-a.chartY+d.pos:a.chartX-d.pos,plotY:e?c.len-a.chartX+c.pos:a.chartY-c.pos},b,a)};a.prototype.buildKDTree=function(a){function b(a,c,e){var h=a&&a.length;if(h){var f=d.kdAxisArray[c%e];a.sort(function(a,b){return a[f]-b[f]});h=Math.floor(h/2);return{point:a[h],left:b(a.slice(0,h),c+1,e),right:b(a.slice(h+1),c+1,e)}}}this.buildingKdTree=!0;var d=this,c=-1<d.options.findNearestPointBy.indexOf("y")?
2:1;delete d.kdTree;R(function(){d.kdTree=b(d.getValidPoints(null,!d.directTouch),c,c);d.buildingKdTree=!1},d.options.kdNow||a&&"touchstart"===a.type?0:1)};a.prototype.searchKDTree=function(a,d,c){function e(a,d,c,l){var m=d.point,p=h.kdAxisArray[c%l],n=m,q=b(a[f])&&b(m[f])?Math.pow(a[f]-m[f],2):null;var t=b(a[g])&&b(m[g])?Math.pow(a[g]-m[g],2):null;t=(q||0)+(t||0);m.dist=b(t)?Math.sqrt(t):Number.MAX_VALUE;m.distX=b(q)?Math.sqrt(q):Number.MAX_VALUE;p=a[p]-m[p];t=0>p?"left":"right";q=0>p?"right":"left";
d[t]&&(t=e(a,d[t],c+1,l),n=t[k]<n[k]?t:m);d[q]&&Math.sqrt(p*p)<n[k]&&(a=e(a,d[q],c+1,l),n=a[k]<n[k]?a:n);return n}var h=this,f=this.kdAxisArray[0],g=this.kdAxisArray[1],k=d?"distX":"dist";d=-1<h.options.findNearestPointBy.indexOf("y")?2:1;this.kdTree||this.buildingKdTree||this.buildKDTree(c);if(this.kdTree)return e(a,this.kdTree,d,d)};a.prototype.pointPlacementToXValue=function(){var a=this.options,b=a.pointRange,d=this.xAxis;a=a.pointPlacement;"between"===a&&(a=d.reversed?-.5:.5);return Q(a)?a*(b||
d.pointRange):0};a.prototype.isPointInside=function(a){return"undefined"!==typeof a.plotY&&"undefined"!==typeof a.plotX&&0<=a.plotY&&a.plotY<=this.yAxis.len&&0<=a.plotX&&a.plotX<=this.xAxis.len};a.prototype.drawTracker=function(){var a=this,b=a.options,d=b.trackByArea,c=[].concat(d?a.areaPath:a.graphPath),e=a.chart,h=e.pointer,f=e.renderer,g=e.options.tooltip.snap,k=a.tracker,l=function(b){if(e.hoverSeries!==a)a.onMouseOver()},m="rgba(192,192,192,"+(q?.0001:.002)+")";k?k.attr({d:c}):a.graph&&(a.tracker=
f.path(c).attr({visibility:a.visible?"visible":"hidden",zIndex:2}).addClass(d?"highcharts-tracker-area":"highcharts-tracker-line").add(a.group),e.styledMode||a.tracker.attr({"stroke-linecap":"round","stroke-linejoin":"round",stroke:m,fill:d?m:"none","stroke-width":a.graph.strokeWidth()+(d?0:2*g)}),[a.tracker,a.markerGroup,a.dataLabelsGroup].forEach(function(a){if(a&&(a.addClass("highcharts-tracker").on("mouseover",l).on("mouseout",function(a){h.onTrackerMouseOut(a)}),b.cursor&&!e.styledMode&&a.css({cursor:b.cursor}),
v))a.on("touchstart",l)}));F(this,"afterDrawTracker")};a.prototype.addPoint=function(a,b,d,c,e){var h=this.options,f=this.data,g=this.chart,k=this.xAxis;k=k&&k.hasNames&&k.names;var l=h.data,m=this.xData,p;b=K(b,!0);var n={series:this};this.pointClass.prototype.applyOptions.apply(n,[a]);var q=n.x;var t=m.length;if(this.requireSorting&&q<m[t-1])for(p=!0;t&&m[t-1]>q;)t--;this.updateParallelArrays(n,"splice",t,0,0);this.updateParallelArrays(n,t);k&&n.name&&(k[q]=n.name);l.splice(t,0,a);p&&(this.data.splice(t,
0,null),this.processData());"point"===h.legendType&&this.generatePoints();d&&(f[0]&&f[0].remove?f[0].remove(!1):(f.shift(),this.updateParallelArrays(n,"shift"),l.shift()));!1!==e&&F(this,"addPoint",{point:n});this.isDirtyData=this.isDirty=!0;b&&g.redraw(c)};a.prototype.removePoint=function(a,b,d){var c=this,h=c.data,f=h[a],g=c.points,k=c.chart,l=function(){g&&g.length===h.length&&g.splice(a,1);h.splice(a,1);c.options.data.splice(a,1);c.updateParallelArrays(f||{series:c},"splice",a,1);f&&f.destroy();
c.isDirty=!0;c.isDirtyData=!0;b&&k.redraw()};e(d,k);b=K(b,!0);f?f.firePointEvent("remove",null,l):l()};a.prototype.remove=function(a,b,d,c){function e(){h.destroy(c);f.isDirtyLegend=f.isDirtyBox=!0;f.linkSeries();K(a,!0)&&f.redraw(b)}var h=this,f=h.chart;!1!==d?F(h,"remove",null,e):e()};a.prototype.update=function(a,b){a=h(a,this.userOptions);F(this,"update",{options:a});var d=this,c=d.chart,e=d.userOptions,f=d.initialType||d.type,g=c.options.plotOptions,k=r[f].prototype,l=d.finishedAnimating&&{animation:!1},
m={},p,n=["eventOptions","navigatorSeries","baseSeries"],q=a.type||e.type||c.options.chart.type,t=!(this.hasDerivedData||q&&q!==this.type||"undefined"!==typeof a.pointStart||"undefined"!==typeof a.pointInterval||"undefined"!==typeof a.relativeXValue||d.hasOptionChanged("dataGrouping")||d.hasOptionChanged("pointStart")||d.hasOptionChanged("pointInterval")||d.hasOptionChanged("pointIntervalUnit")||d.hasOptionChanged("keys"));q=q||f;t&&(n.push("data","isDirtyData","points","processedXData","processedYData",
"xIncrement","cropped","_hasPointMarkers","_hasPointLabels","clips","nodes","layout","mapMap","mapData","minY","maxY","minX","maxX"),!1!==a.visible&&n.push("area","graph"),d.parallelArrays.forEach(function(a){n.push(a+"Data")}),a.data&&(a.dataSorting&&y(d.options.dataSorting,a.dataSorting),this.setData(a.data,!1)));a=M(e,l,{index:"undefined"===typeof e.index?d.index:e.index,pointStart:K(g&&g.series&&g.series.pointStart,e.pointStart,d.xData[0])},!t&&{data:d.options.data},a);t&&a.data&&(a.data=d.options.data);
n=["group","markerGroup","dataLabelsGroup","transformGroup"].concat(n);n.forEach(function(a){n[a]=d[a];delete d[a]});g=!1;if(r[q]){if(g=q!==d.type,d.remove(!1,!1,!1,!0),g)if(Object.setPrototypeOf)Object.setPrototypeOf(d,r[q].prototype);else{l=Object.hasOwnProperty.call(d,"hcEvents")&&d.hcEvents;for(p in k)d[p]=void 0;y(d,r[q].prototype);l?d.hcEvents=l:delete d.hcEvents}}else G(17,!0,c,{missingModuleFor:q});n.forEach(function(a){d[a]=n[a]});d.init(c,a);if(t&&this.points){var v=d.options;!1===v.visible?
(m.graphic=1,m.dataLabel=1):d._hasPointLabels||(a=v.marker,k=v.dataLabels,!a||!1!==a.enabled&&(e.marker&&e.marker.symbol)===a.symbol||(m.graphic=1),k&&!1===k.enabled&&(m.dataLabel=1));this.points.forEach(function(a){a&&a.series&&(a.resolveColor(),Object.keys(m).length&&a.destroyElements(m),!1===v.showInLegend&&a.legendItem&&c.legend.destroyItem(a))},this)}d.initialType=f;c.linkSeries();g&&d.linkedSeries.length&&(d.isDirtyData=!0);F(this,"afterUpdate");K(b,!0)&&c.redraw(t?void 0:!1)};a.prototype.setName=
function(a){this.name=this.options.name=this.userOptions.name=a;this.chart.isDirtyLegend=!0};a.prototype.hasOptionChanged=function(a){var b=this.options[a],d=this.chart.options.plotOptions,c=this.userOptions[a];return c?b!==c:b!==K(d&&d[this.type]&&d[this.type][a],d&&d.series&&d.series[a],b)};a.prototype.onMouseOver=function(){var a=this.chart,b=a.hoverSeries;a.pointer.setHoverChartIndex();if(b&&b!==this)b.onMouseOut();this.options.events.mouseOver&&F(this,"mouseOver");this.setState("hover");a.hoverSeries=
this};a.prototype.onMouseOut=function(){var a=this.options,b=this.chart,d=b.tooltip,c=b.hoverPoint;b.hoverSeries=null;if(c)c.onMouseOut();this&&a.events.mouseOut&&F(this,"mouseOut");!d||this.stickyTracking||d.shared&&!this.noSharedTooltip||d.hide();b.series.forEach(function(a){a.setState("",!0)})};a.prototype.setState=function(a,b){var d=this,c=d.options,e=d.graph,h=c.inactiveOtherPoints,f=c.states,g=K(f[a||"normal"]&&f[a||"normal"].animation,d.chart.options.chart.animation),k=c.lineWidth,l=0,m=c.opacity;
a=a||"";if(d.state!==a&&([d.group,d.markerGroup,d.dataLabelsGroup].forEach(function(b){b&&(d.state&&b.removeClass("highcharts-series-"+d.state),a&&b.addClass("highcharts-series-"+a))}),d.state=a,!d.chart.styledMode)){if(f[a]&&!1===f[a].enabled)return;a&&(k=f[a].lineWidth||k+(f[a].lineWidthPlus||0),m=K(f[a].opacity,m));if(e&&!e.dashstyle)for(c={"stroke-width":k},e.animate(c,g);d["zone-graph-"+l];)d["zone-graph-"+l].animate(c,g),l+=1;h||[d.group,d.markerGroup,d.dataLabelsGroup,d.labelBySeries].forEach(function(a){a&&
a.animate({opacity:m},g)})}b&&h&&d.points&&d.setAllPointsToState(a||void 0)};a.prototype.setAllPointsToState=function(a){this.points.forEach(function(b){b.setState&&b.setState(a)})};a.prototype.setVisible=function(a,b){var d=this,c=d.chart,e=d.legendItem,h=c.options.chart.ignoreHiddenSeries,f=d.visible,g=(d.visible=a=d.options.visible=d.userOptions.visible="undefined"===typeof a?!f:a)?"show":"hide";["group","dataLabelsGroup","markerGroup","tracker","tt"].forEach(function(a){if(d[a])d[a][g]()});if(c.hoverSeries===
d||(c.hoverPoint&&c.hoverPoint.series)===d)d.onMouseOut();e&&c.legend.colorizeItem(d,a);d.isDirty=!0;d.options.stacking&&c.series.forEach(function(a){a.options.stacking&&a.visible&&(a.isDirty=!0)});d.linkedSeries.forEach(function(b){b.setVisible(a,!1)});h&&(c.isDirtyBox=!0);F(d,g);!1!==b&&c.redraw()};a.prototype.show=function(){this.setVisible(!0)};a.prototype.hide=function(){this.setVisible(!1)};a.prototype.select=function(a){this.selected=a=this.options.selected="undefined"===typeof a?!this.selected:
a;this.checkbox&&(this.checkbox.checked=a);F(this,a?"select":"unselect")};a.prototype.shouldShowTooltip=function(a,b,d){void 0===d&&(d={});d.series=this;d.visiblePlotOnly=!0;return this.chart.isInsidePlot(a,b,d)};a.defaultOptions=u;return a}();y(a.prototype,{axisTypes:["xAxis","yAxis"],coll:"series",colorCounter:0,cropShoulder:1,directTouch:!1,drawLegendSymbol:z.drawLineMarker,isCartesian:!0,kdAxisArray:["clientX","plotY"],parallelArrays:["x","y"],pointClass:J,requireSorting:!0,sorted:!0});n.series=
a;"";"";return a});M(a,"Extensions/ScrollablePlotArea.js",[a["Core/Animation/AnimationUtilities.js"],a["Core/Axis/Axis.js"],a["Core/Chart/Chart.js"],a["Core/Series/Series.js"],a["Core/Renderer/RendererRegistry.js"],a["Core/Utilities.js"]],function(a,w,C,E,z,x){var r=a.stop,u=x.addEvent,n=x.createElement,m=x.merge,g=x.pick;u(C,"afterSetChartSize",function(a){var c=this.options.chart.scrollablePlotArea,g=c&&c.minWidth;c=c&&c.minHeight;if(!this.renderer.forExport){if(g){if(this.scrollablePixelsX=g=Math.max(0,
g-this.chartWidth)){this.scrollablePlotBox=this.renderer.scrollablePlotBox=m(this.plotBox);this.plotBox.width=this.plotWidth+=g;this.inverted?this.clipBox.height+=g:this.clipBox.width+=g;var f={1:{name:"right",value:g}}}}else c&&(this.scrollablePixelsY=g=Math.max(0,c-this.chartHeight))&&(this.scrollablePlotBox=this.renderer.scrollablePlotBox=m(this.plotBox),this.plotBox.height=this.plotHeight+=g,this.inverted?this.clipBox.width+=g:this.clipBox.height+=g,f={2:{name:"bottom",value:g}});f&&!a.skipAxes&&
this.axes.forEach(function(a){f[a.side]?a.getPlotLinePath=function(){var c=f[a.side].name,e=this[c];this[c]=e-f[a.side].value;var g=w.prototype.getPlotLinePath.apply(this,arguments);this[c]=e;return g}:(a.setAxisSize(),a.setAxisTranslation())})}});u(C,"render",function(){this.scrollablePixelsX||this.scrollablePixelsY?(this.setUpScrolling&&this.setUpScrolling(),this.applyFixed()):this.fixedDiv&&this.applyFixed()});C.prototype.setUpScrolling=function(){var a=this,e={WebkitOverflowScrolling:"touch",
overflowX:"hidden",overflowY:"hidden"};this.scrollablePixelsX&&(e.overflowX="auto");this.scrollablePixelsY&&(e.overflowY="auto");this.scrollingParent=n("div",{className:"highcharts-scrolling-parent"},{position:"relative"},this.renderTo);this.scrollingContainer=n("div",{className:"highcharts-scrolling"},e,this.scrollingParent);u(this.scrollingContainer,"scroll",function(){a.pointer&&delete a.pointer.chartPosition});this.innerContainer=n("div",{className:"highcharts-inner-container"},null,this.scrollingContainer);
this.innerContainer.appendChild(this.container);this.setUpScrolling=null};C.prototype.moveFixedElements=function(){var a=this.container,e=this.fixedRenderer,g=".highcharts-contextbutton .highcharts-credits .highcharts-legend .highcharts-legend-checkbox .highcharts-navigator-series .highcharts-navigator-xaxis .highcharts-navigator-yaxis .highcharts-navigator .highcharts-reset-zoom .highcharts-drillup-button .highcharts-scrollbar .highcharts-subtitle .highcharts-title".split(" "),f;this.scrollablePixelsX&&
!this.inverted?f=".highcharts-yaxis":this.scrollablePixelsX&&this.inverted?f=".highcharts-xaxis":this.scrollablePixelsY&&!this.inverted?f=".highcharts-xaxis":this.scrollablePixelsY&&this.inverted&&(f=".highcharts-yaxis");f&&g.push(f+":not(.highcharts-radial-axis)",f+"-labels:not(.highcharts-radial-axis-labels)");g.forEach(function(c){[].forEach.call(a.querySelectorAll(c),function(a){(a.namespaceURI===e.SVG_NS?e.box:e.box.parentNode).appendChild(a);a.style.pointerEvents="auto"})})};C.prototype.applyFixed=
function(){var a=!this.fixedDiv,e=this.options.chart,l=e.scrollablePlotArea,f=z.getRendererType();a?(this.fixedDiv=n("div",{className:"highcharts-fixed"},{position:"absolute",overflow:"hidden",pointerEvents:"none",zIndex:(e.style&&e.style.zIndex||0)+2,top:0},null,!0),this.scrollingContainer&&this.scrollingContainer.parentNode.insertBefore(this.fixedDiv,this.scrollingContainer),this.renderTo.style.overflow="visible",this.fixedRenderer=e=new f(this.fixedDiv,this.chartWidth,this.chartHeight,this.options.chart.style),
this.scrollableMask=e.path().attr({fill:this.options.chart.backgroundColor||"#fff","fill-opacity":g(l.opacity,.85),zIndex:-1}).addClass("highcharts-scrollable-mask").add(),u(this,"afterShowResetZoom",this.moveFixedElements),u(this,"afterDrilldown",this.moveFixedElements),u(this,"afterLayOutTitles",this.moveFixedElements)):this.fixedRenderer.setSize(this.chartWidth,this.chartHeight);if(this.scrollableDirty||a)this.scrollableDirty=!1,this.moveFixedElements();e=this.chartWidth+(this.scrollablePixelsX||
0);f=this.chartHeight+(this.scrollablePixelsY||0);r(this.container);this.container.style.width=e+"px";this.container.style.height=f+"px";this.renderer.boxWrapper.attr({width:e,height:f,viewBox:[0,0,e,f].join(" ")});this.chartBackground.attr({width:e,height:f});this.scrollingContainer.style.height=this.chartHeight+"px";a&&(l.scrollPositionX&&(this.scrollingContainer.scrollLeft=this.scrollablePixelsX*l.scrollPositionX),l.scrollPositionY&&(this.scrollingContainer.scrollTop=this.scrollablePixelsY*l.scrollPositionY));
f=this.axisOffset;a=this.plotTop-f[0]-1;l=this.plotLeft-f[3]-1;e=this.plotTop+this.plotHeight+f[2]+1;f=this.plotLeft+this.plotWidth+f[1]+1;var m=this.plotLeft+this.plotWidth-(this.scrollablePixelsX||0),q=this.plotTop+this.plotHeight-(this.scrollablePixelsY||0);a=this.scrollablePixelsX?[["M",0,a],["L",this.plotLeft-1,a],["L",this.plotLeft-1,e],["L",0,e],["Z"],["M",m,a],["L",this.chartWidth,a],["L",this.chartWidth,e],["L",m,e],["Z"]]:this.scrollablePixelsY?[["M",l,0],["L",l,this.plotTop-1],["L",f,this.plotTop-
1],["L",f,0],["Z"],["M",l,q],["L",l,this.chartHeight],["L",f,this.chartHeight],["L",f,q],["Z"]]:[["M",0,0]];"adjustHeight"!==this.redrawTrigger&&this.scrollableMask.attr({d:a})};u(w,"afterInit",function(){this.chart.scrollableDirty=!0});u(E,"show",function(){this.chart.scrollableDirty=!0});""});M(a,"Core/Axis/StackingAxis.js",[a["Core/Animation/AnimationUtilities.js"],a["Core/Axis/Axis.js"],a["Core/Utilities.js"]],function(a,w,C){var r=a.getDeferredAnimation,z=C.addEvent,x=C.destroyObjectProperties,
J=C.fireEvent,u=C.isNumber,n=C.objectEach,m;(function(a){function c(){var a=this.stacking;if(a){var c=a.stacks;n(c,function(a,e){x(a);c[e]=null});a&&a.stackTotalGroup&&a.stackTotalGroup.destroy()}}function e(){this.stacking||(this.stacking=new f(this))}var g=[];a.compose=function(a){-1===g.indexOf(a)&&(g.push(a),z(a,"init",e),z(a,"destroy",c));return a};var f=function(){function a(a){this.oldStacks={};this.stacks={};this.stacksTouched=0;this.axis=a}a.prototype.buildStacks=function(){var a=this.axis,
c=a.series,e=a.options.reversedStacks,f=c.length,g;if(!a.isXAxis){this.usePercentage=!1;for(g=f;g--;){var l=c[e?g:f-g-1];l.setStackedPoints();l.setGroupedPoints()}for(g=0;g<f;g++)c[g].modifyStacks();J(a,"afterBuildStacks")}};a.prototype.cleanStacks=function(){if(!this.axis.isXAxis){if(this.oldStacks)var a=this.stacks=this.oldStacks;n(a,function(a){n(a,function(a){a.cumulative=a.total})})}};a.prototype.resetStacks=function(){var a=this,c=a.stacks;a.axis.isXAxis||n(c,function(c){n(c,function(e,f){u(e.touched)&&
e.touched<a.stacksTouched?(e.destroy(),delete c[f]):(e.total=null,e.cumulative=null)})})};a.prototype.renderStackTotals=function(){var a=this.axis,c=a.chart,e=c.renderer,f=this.stacks;a=r(c,a.options.stackLabels&&a.options.stackLabels.animation||!1);var g=this.stackTotalGroup=this.stackTotalGroup||e.g("stack-labels").attr({visibility:"visible",zIndex:6,opacity:0}).add();g.translate(c.plotLeft,c.plotTop);n(f,function(a){n(a,function(a){a.render(g)})});g.animate({opacity:1},a)};return a}();a.Additions=
f})(m||(m={}));return m});M(a,"Extensions/Stacking.js",[a["Core/Axis/Axis.js"],a["Core/Chart/Chart.js"],a["Core/FormatUtilities.js"],a["Core/Globals.js"],a["Core/Series/Series.js"],a["Core/Axis/StackingAxis.js"],a["Core/Utilities.js"]],function(a,w,C,E,z,x,J){var r=C.format,n=J.correctFloat,m=J.defined,g=J.destroyObjectProperties,c=J.isArray,e=J.isNumber,l=J.objectEach,f=J.pick,v=function(){function a(a,c,e,f,g){var k=a.chart.inverted;this.axis=a;this.isNegative=e;this.options=c=c||{};this.x=f;this.total=
null;this.points={};this.hasValidPoints=!1;this.stack=g;this.rightCliff=this.leftCliff=0;this.alignOptions={align:c.align||(k?e?"left":"right":"center"),verticalAlign:c.verticalAlign||(k?"middle":e?"bottom":"top"),y:c.y,x:c.x};this.textAlign=c.textAlign||(k?e?"right":"left":"center")}a.prototype.destroy=function(){g(this,this.axis)};a.prototype.render=function(a){var c=this.axis.chart,e=this.options,g=e.format;g=g?r(g,this,c):e.formatter.call(this);this.label?this.label.attr({text:g,visibility:"hidden"}):
(this.label=c.renderer.label(g,null,null,e.shape,null,null,e.useHTML,!1,"stack-labels"),g={r:e.borderRadius||0,text:g,rotation:e.rotation,padding:f(e.padding,5),visibility:"hidden"},c.styledMode||(g.fill=e.backgroundColor,g.stroke=e.borderColor,g["stroke-width"]=e.borderWidth,this.label.css(e.style)),this.label.attr(g),this.label.added||this.label.add(a));this.label.labelrank=c.plotSizeY};a.prototype.setOffset=function(a,c,g,l,n){var k=this.axis,h=k.chart;l=k.translate(k.stacking.usePercentage?100:
l?l:this.total,0,0,0,1);g=k.translate(g?g:0);g=m(l)&&Math.abs(l-g);a=f(n,h.xAxis[0].translate(this.x))+a;k=m(l)&&this.getStackBox(h,this,a,l,c,g,k);c=this.label;g=this.isNegative;a="justify"===f(this.options.overflow,"justify");var d=this.textAlign;c&&k&&(n=c.getBBox(),l=c.padding,d="left"===d?h.inverted?-l:l:"right"===d?n.width:h.inverted&&"center"===d?n.width/2:h.inverted?g?n.width+l:-l:n.width/2,g=h.inverted?n.height/2:g?-l:n.height,this.alignOptions.x=f(this.options.x,0),this.alignOptions.y=f(this.options.y,
0),k.x-=d,k.y-=g,c.align(this.alignOptions,null,k),h.isInsidePlot(c.alignAttr.x+d-this.alignOptions.x,c.alignAttr.y+g-this.alignOptions.y)?c.show():(c.alignAttr.y=-9999,a=!1),a&&z.prototype.justifyDataLabel.call(this.axis,c,this.alignOptions,c.alignAttr,n,k),c.attr({x:c.alignAttr.x,y:c.alignAttr.y}),f(!a&&this.options.crop,!0)&&((h=e(c.x)&&e(c.y)&&h.isInsidePlot(c.x-l+c.width,c.y)&&h.isInsidePlot(c.x+l,c.y))||c.hide()))};a.prototype.getStackBox=function(a,c,e,f,g,l,h){var d=c.axis.reversed,b=a.inverted,
k=h.height+h.pos-(b?a.plotLeft:a.plotTop);c=c.isNegative&&!d||!c.isNegative&&d;return{x:b?c?f-h.right:f-l+h.pos-a.plotLeft:e+a.xAxis[0].transB-a.plotLeft,y:b?h.height-e-g:c?k-f-l:k-f,width:b?l:g,height:b?g:l}};return a}();w.prototype.getStacks=function(){var a=this,c=a.inverted;a.yAxis.forEach(function(a){a.stacking&&a.stacking.stacks&&a.hasVisibleSeries&&(a.stacking.oldStacks=a.stacking.stacks)});a.series.forEach(function(e){var g=e.xAxis&&e.xAxis.options||{};!e.options.stacking||!0!==e.visible&&
!1!==a.options.chart.ignoreHiddenSeries||(e.stackKey=[e.type,f(e.options.stack,""),c?g.top:g.left,c?g.height:g.width].join())})};x.compose(a);z.prototype.setGroupedPoints=function(){var a=this.yAxis.stacking;this.options.centerInCategory&&(this.is("column")||this.is("columnrange"))&&!this.options.stacking&&1<this.chart.series.length?z.prototype.setStackedPoints.call(this,"group"):a&&l(a.stacks,function(c,e){"group"===e.slice(-5)&&(l(c,function(a){return a.destroy()}),delete a.stacks[e])})};z.prototype.setStackedPoints=
function(a){var e=a||this.options.stacking;if(e&&(!0===this.visible||!1===this.chart.options.chart.ignoreHiddenSeries)){var g=this.processedXData,l=this.processedYData,q=[],r=l.length,t=this.options,h=t.threshold,d=f(t.startFromThreshold&&h,0);t=t.stack;a=a?this.type+","+e:this.stackKey;var b="-"+a,p=this.negStacks,u=this.yAxis,y=u.stacking.stacks,x=u.stacking.oldStacks,F,w;u.stacking.stacksTouched+=1;for(w=0;w<r;w++){var z=g[w];var C=l[w];var E=this.getStackIndicator(E,z,this.index);var J=E.key;
var H=(F=p&&C<(d?0:h))?b:a;y[H]||(y[H]={});y[H][z]||(x[H]&&x[H][z]?(y[H][z]=x[H][z],y[H][z].total=null):y[H][z]=new v(u,u.options.stackLabels,F,z,t));H=y[H][z];null!==C?(H.points[J]=H.points[this.index]=[f(H.cumulative,d)],m(H.cumulative)||(H.base=J),H.touched=u.stacking.stacksTouched,0<E.index&&!1===this.singleStacks&&(H.points[J][0]=H.points[this.index+","+z+",0"][0])):H.points[J]=H.points[this.index]=null;"percent"===e?(F=F?a:b,p&&y[F]&&y[F][z]?(F=y[F][z],H.total=F.total=Math.max(F.total,H.total)+
Math.abs(C)||0):H.total=n(H.total+(Math.abs(C)||0))):"group"===e?(c(C)&&(C=C[0]),null!==C&&(H.total=(H.total||0)+1)):H.total=n(H.total+(C||0));H.cumulative="group"===e?(H.total||1)-1:f(H.cumulative,d)+(C||0);null!==C&&(H.points[J].push(H.cumulative),q[w]=H.cumulative,H.hasValidPoints=!0)}"percent"===e&&(u.stacking.usePercentage=!0);"group"!==e&&(this.stackedYData=q);u.stacking.oldStacks={}}};z.prototype.modifyStacks=function(){var a=this,c=a.stackKey,e=a.yAxis.stacking.stacks,f=a.processedXData,g,
l=a.options.stacking;a[l+"Stacker"]&&[c,"-"+c].forEach(function(c){for(var h=f.length,d,b;h--;)if(d=f[h],g=a.getStackIndicator(g,d,a.index,c),b=(d=e[c]&&e[c][d])&&d.points[g.key])a[l+"Stacker"](b,d,h)})};z.prototype.percentStacker=function(a,c,e){c=c.total?100/c.total:0;a[0]=n(a[0]*c);a[1]=n(a[1]*c);this.stackedYData[e]=a[1]};z.prototype.getStackIndicator=function(a,c,e,f){!m(a)||a.x!==c||f&&a.key!==f?a={x:c,index:0,key:f}:a.index++;a.key=[e,c,a.index].join();return a};E.StackItem=v;"";return E.StackItem});
M(a,"Series/Line/LineSeries.js",[a["Core/Color/Palette.js"],a["Core/Series/Series.js"],a["Core/Series/SeriesRegistry.js"],a["Core/Utilities.js"]],function(a,w,C,E){var r=this&&this.__extends||function(){var a=function(n,m){a=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(a,c){a.__proto__=c}||function(a,c){for(var e in c)c.hasOwnProperty(e)&&(a[e]=c[e])};return a(n,m)};return function(n,m){function g(){this.constructor=n}a(n,m);n.prototype=null===m?Object.create(m):(g.prototype=m.prototype,
new g)}}(),x=E.defined,J=E.merge;E=function(u){function n(){var a=null!==u&&u.apply(this,arguments)||this;a.data=void 0;a.options=void 0;a.points=void 0;return a}r(n,u);n.prototype.drawGraph=function(){var m=this,g=this.options,c=(this.gappedPath||this.getGraphPath).call(this),e=this.chart.styledMode,l=[["graph","highcharts-graph"]];e||l[0].push(g.lineColor||this.color||a.neutralColor20,g.dashStyle);l=m.getZonesGraphs(l);l.forEach(function(a,l){var f=a[0],k=m[f],n=k?"animate":"attr";k?(k.endX=m.preventGraphAnimation?
null:c.xMap,k.animate({d:c})):c.length&&(m[f]=k=m.chart.renderer.path(c).addClass(a[1]).attr({zIndex:1}).add(m.group));k&&!e&&(f={stroke:a[2],"stroke-width":g.lineWidth,fill:m.fillGraph&&m.color||"none"},a[3]?f.dashstyle=a[3]:"square"!==g.linecap&&(f["stroke-linecap"]=f["stroke-linejoin"]="round"),k[n](f).shadow(2>l&&g.shadow));k&&(k.startX=c.xMap,k.isArea=c.isArea)})};n.prototype.getGraphPath=function(a,g,c){var e=this,l=e.options,f=[],m=[],n,k=l.step;a=a||e.points;var r=a.reversed;r&&a.reverse();
(k={right:1,center:2}[k]||k&&3)&&r&&(k=4-k);a=this.getValidPoints(a,!1,!(l.connectNulls&&!g&&!c));a.forEach(function(q,r){var v=q.plotX,t=q.plotY,h=a[r-1];(q.leftCliff||h&&h.rightCliff)&&!c&&(n=!0);q.isNull&&!x(g)&&0<r?n=!l.connectNulls:q.isNull&&!g?n=!0:(0===r||n?r=[["M",q.plotX,q.plotY]]:e.getPointSpline?r=[e.getPointSpline(a,q,r)]:k?(r=1===k?[["L",h.plotX,t]]:2===k?[["L",(h.plotX+v)/2,h.plotY],["L",(h.plotX+v)/2,t]]:[["L",v,h.plotY]],r.push(["L",v,t])):r=[["L",v,t]],m.push(q.x),k&&(m.push(q.x),
2===k&&m.push(q.x)),f.push.apply(f,r),n=!1)});f.xMap=m;return e.graphPath=f};n.prototype.getZonesGraphs=function(a){this.zones.forEach(function(g,c){c=["zone-graph-"+c,"highcharts-graph highcharts-zone-graph-"+c+" "+(g.className||"")];this.chart.styledMode||c.push(g.color||this.color,g.dashStyle||this.options.dashStyle);a.push(c)},this);return a};n.defaultOptions=J(w.defaultOptions,{});return n}(w);C.registerSeriesType("line",E);"";return E});M(a,"Series/Area/AreaSeries.js",[a["Core/Color/Color.js"],
a["Core/Legend/LegendSymbol.js"],a["Core/Series/SeriesRegistry.js"],a["Core/Utilities.js"]],function(a,w,C,E){var r=this&&this.__extends||function(){var a=function(c,e){a=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(a,c){a.__proto__=c}||function(a,c){for(var e in c)c.hasOwnProperty(e)&&(a[e]=c[e])};return a(c,e)};return function(c,e){function g(){this.constructor=c}a(c,e);c.prototype=null===e?Object.create(e):(g.prototype=e.prototype,new g)}}(),x=a.parse,J=C.seriesTypes.line;a=
E.extend;var u=E.merge,n=E.objectEach,m=E.pick;E=function(a){function c(){var c=null!==a&&a.apply(this,arguments)||this;c.data=void 0;c.options=void 0;c.points=void 0;return c}r(c,a);c.prototype.drawGraph=function(){this.areaPath=[];a.prototype.drawGraph.apply(this);var c=this,g=this.areaPath,f=this.options,n=[["area","highcharts-area",this.color,f.fillColor]];this.zones.forEach(function(a,e){n.push(["zone-area-"+e,"highcharts-area highcharts-zone-area-"+e+" "+a.className,a.color||c.color,a.fillColor||
f.fillColor])});n.forEach(function(a){var e=a[0],l=c[e],n=l?"animate":"attr",q={};l?(l.endX=c.preventGraphAnimation?null:g.xMap,l.animate({d:g})):(q.zIndex=0,l=c[e]=c.chart.renderer.path(g).addClass(a[1]).add(c.group),l.isArea=!0);c.chart.styledMode||(q.fill=m(a[3],x(a[2]).setOpacity(m(f.fillOpacity,.75)).get()));l[n](q);l.startX=g.xMap;l.shiftUnit=f.step?2:1})};c.prototype.getGraphPath=function(a){var c=J.prototype.getGraphPath,e=this.options,g=e.stacking,n=this.yAxis,k,r=[],u=[],B=this.index,x=
n.stacking.stacks[this.stackKey],t=e.threshold,h=Math.round(n.getThreshold(e.threshold));e=m(e.connectNulls,"percent"===g);var d=function(b,d,c){var e=a[b];b=g&&x[e.x].points[B];var f=e[c+"Null"]||0;c=e[c+"Cliff"]||0;e=!0;if(c||f){var k=(f?b[0]:b[1])+c;var l=b[0]+c;e=!!f}else!g&&a[d]&&a[d].isNull&&(k=l=t);"undefined"!==typeof k&&(u.push({plotX:p,plotY:null===k?h:n.getThreshold(k),isNull:e,isCliff:!0}),r.push({plotX:p,plotY:null===l?h:n.getThreshold(l),doCurve:!1}))};a=a||this.points;g&&(a=this.getStackPoints(a));
for(k=0;k<a.length;k++){g||(a[k].leftCliff=a[k].rightCliff=a[k].leftNull=a[k].rightNull=void 0);var b=a[k].isNull;var p=m(a[k].rectPlotX,a[k].plotX);var G=g?m(a[k].yBottom,h):h;if(!b||e)e||d(k,k-1,"left"),b&&!g&&e||(u.push(a[k]),r.push({x:k,plotX:p,plotY:G})),e||d(k,k+1,"right")}k=c.call(this,u,!0,!0);r.reversed=!0;b=c.call(this,r,!0,!0);(G=b[0])&&"M"===G[0]&&(b[0]=["L",G[1],G[2]]);b=k.concat(b);b.length&&b.push(["Z"]);c=c.call(this,u,!1,e);b.xMap=k.xMap;this.areaPath=b;return c};c.prototype.getStackPoints=
function(a){var c=this,e=[],g=[],r=this.xAxis,k=this.yAxis,u=k.stacking.stacks[this.stackKey],x={},B=k.series,w=B.length,t=k.options.reversedStacks?1:-1,h=B.indexOf(c);a=a||this.points;if(this.options.stacking){for(var d=0;d<a.length;d++)a[d].leftNull=a[d].rightNull=void 0,x[a[d].x]=a[d];n(u,function(a,b){null!==a.total&&g.push(b)});g.sort(function(a,b){return a-b});var b=B.map(function(a){return a.visible});g.forEach(function(a,d){var f=0,l,n;if(x[a]&&!x[a].isNull)e.push(x[a]),[-1,1].forEach(function(e){var f=
1===e?"rightNull":"leftNull",k=0,m=u[g[d+e]];if(m)for(var p=h;0<=p&&p<w;){var r=B[p].index;l=m.points[r];l||(r===c.index?x[a][f]=!0:b[p]&&(n=u[a].points[r])&&(k-=n[1]-n[0]));p+=t}x[a][1===e?"rightCliff":"leftCliff"]=k});else{for(var p=h;0<=p&&p<w;){if(l=u[a].points[B[p].index]){f=l[1];break}p+=t}f=m(f,0);f=k.translate(f,0,1,0,1);e.push({isNull:!0,plotX:r.translate(a,0,0,0,1),x:a,plotY:f,yBottom:f})}})}return e};c.defaultOptions=u(J.defaultOptions,{threshold:0});return c}(J);a(E.prototype,{singleStacks:!1,
drawLegendSymbol:w.drawRectangle});C.registerSeriesType("area",E);"";return E});M(a,"Series/Spline/SplineSeries.js",[a["Core/Series/SeriesRegistry.js"],a["Core/Utilities.js"]],function(a,w){var r=this&&this.__extends||function(){var a=function(r,n){a=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(a,g){a.__proto__=g}||function(a,g){for(var c in g)g.hasOwnProperty(c)&&(a[c]=g[c])};return a(r,n)};return function(r,n){function m(){this.constructor=r}a(r,n);r.prototype=null===n?Object.create(n):
(m.prototype=n.prototype,new m)}}(),E=a.seriesTypes.line,z=w.merge,x=w.pick;w=function(a){function u(){var n=null!==a&&a.apply(this,arguments)||this;n.data=void 0;n.options=void 0;n.points=void 0;return n}r(u,a);u.prototype.getPointSpline=function(a,m,g){var c=m.plotX||0,e=m.plotY||0,l=a[g-1];g=a[g+1];if(l&&!l.isNull&&!1!==l.doCurve&&!m.isCliff&&g&&!g.isNull&&!1!==g.doCurve&&!m.isCliff){a=l.plotY||0;var f=g.plotX||0;g=g.plotY||0;var n=0;var r=(1.5*c+(l.plotX||0))/2.5;var k=(1.5*e+a)/2.5;f=(1.5*c+
f)/2.5;var u=(1.5*e+g)/2.5;f!==r&&(n=(u-k)*(f-c)/(f-r)+e-u);k+=n;u+=n;k>a&&k>e?(k=Math.max(a,e),u=2*e-k):k<a&&k<e&&(k=Math.min(a,e),u=2*e-k);u>g&&u>e?(u=Math.max(g,e),k=2*e-u):u<g&&u<e&&(u=Math.min(g,e),k=2*e-u);m.rightContX=f;m.rightContY=u}m=["C",x(l.rightContX,l.plotX,0),x(l.rightContY,l.plotY,0),x(r,c,0),x(k,e,0),c,e];l.rightContX=l.rightContY=void 0;return m};u.defaultOptions=z(E.defaultOptions);return u}(E);a.registerSeriesType("spline",w);"";return w});M(a,"Series/AreaSpline/AreaSplineSeries.js",
[a["Series/Area/AreaSeries.js"],a["Series/Spline/SplineSeries.js"],a["Core/Legend/LegendSymbol.js"],a["Core/Series/SeriesRegistry.js"],a["Core/Utilities.js"]],function(a,w,C,E,z){var r=this&&this.__extends||function(){var a=function(g,c){a=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(a,c){a.__proto__=c}||function(a,c){for(var e in c)c.hasOwnProperty(e)&&(a[e]=c[e])};return a(g,c)};return function(g,c){function e(){this.constructor=g}a(g,c);g.prototype=null===c?Object.create(c):
(e.prototype=c.prototype,new e)}}(),J=a.prototype,u=z.extend,n=z.merge;z=function(m){function g(){var a=null!==m&&m.apply(this,arguments)||this;a.data=void 0;a.points=void 0;a.options=void 0;return a}r(g,m);g.defaultOptions=n(w.defaultOptions,a.defaultOptions);return g}(w);u(z.prototype,{getGraphPath:J.getGraphPath,getStackPoints:J.getStackPoints,drawGraph:J.drawGraph,drawLegendSymbol:C.drawRectangle});E.registerSeriesType("areaspline",z);"";return z});M(a,"Series/Column/ColumnSeries.js",[a["Core/Animation/AnimationUtilities.js"],
a["Core/Color/Color.js"],a["Core/Globals.js"],a["Core/Legend/LegendSymbol.js"],a["Core/Color/Palette.js"],a["Core/Series/Series.js"],a["Core/Series/SeriesRegistry.js"],a["Core/Utilities.js"]],function(a,w,C,E,z,x,J,u){var n=this&&this.__extends||function(){var a=function(c,d){a=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(a,d){a.__proto__=d}||function(a,d){for(var b in d)d.hasOwnProperty(b)&&(a[b]=d[b])};return a(c,d)};return function(c,d){function b(){this.constructor=c}a(c,d);
c.prototype=null===d?Object.create(d):(b.prototype=d.prototype,new b)}}(),m=a.animObject,g=w.parse,c=C.hasTouch;a=C.noop;var e=u.clamp,l=u.css,f=u.defined,r=u.extend,q=u.fireEvent,k=u.isArray,I=u.isNumber,D=u.merge,B=u.pick,O=u.objectEach;u=function(a){function h(){var d=null!==a&&a.apply(this,arguments)||this;d.borderWidth=void 0;d.data=void 0;d.group=void 0;d.options=void 0;d.points=void 0;return d}n(h,a);h.prototype.animate=function(a){var b=this,d=this.yAxis,c=b.options,h=this.chart.inverted,
f={},g=h?"translateX":"translateY";if(a)f.scaleY=.001,a=e(d.toPixels(c.threshold),d.pos,d.pos+d.len),h?f.translateX=a-d.len:f.translateY=a,b.clipBox&&b.setClip(),b.group.attr(f);else{var k=Number(b.group.attr(g));b.group.animate({scaleY:1},r(m(b.options.animation),{step:function(a,c){b.group&&(f[g]=k+c.pos*(d.pos-k),b.group.attr(f))}}))}};h.prototype.init=function(d,b){a.prototype.init.apply(this,arguments);var c=this;d=c.chart;d.hasRendered&&d.series.forEach(function(a){a.type===c.type&&(a.isDirty=
!0)})};h.prototype.getColumnMetrics=function(){var a=this,b=a.options,c=a.xAxis,e=a.yAxis,h=c.options.reversedStacks;h=c.reversed&&!h||!c.reversed&&h;var f={},g,k=0;!1===b.grouping?k=1:a.chart.series.forEach(function(b){var d=b.yAxis,c=b.options;if(b.type===a.type&&(b.visible||!a.chart.options.chart.ignoreHiddenSeries)&&e.len===d.len&&e.pos===d.pos){if(c.stacking&&"group"!==c.stacking){g=b.stackKey;"undefined"===typeof f[g]&&(f[g]=k++);var h=f[g]}else!1!==c.grouping&&(h=k++);b.columnIndex=h}});var l=
Math.min(Math.abs(c.transA)*(c.ordinal&&c.ordinal.slope||b.pointRange||c.closestPointRange||c.tickInterval||1),c.len),m=l*b.groupPadding,n=(l-2*m)/(k||1);b=Math.min(b.maxPointWidth||c.len,B(b.pointWidth,n*(1-2*b.pointPadding)));a.columnMetrics={width:b,offset:(n-b)/2+(m+((a.columnIndex||0)+(h?1:0))*n-l/2)*(h?-1:1),paddedWidth:n,columnCount:k};return a.columnMetrics};h.prototype.crispCol=function(a,b,c,e){var d=this.chart,h=this.borderWidth,f=-(h%2?.5:0);h=h%2?.5:1;d.inverted&&d.renderer.isVML&&(h+=
1);this.options.crisp&&(c=Math.round(a+c)+f,a=Math.round(a)+f,c-=a);e=Math.round(b+e)+h;f=.5>=Math.abs(b)&&.5<e;b=Math.round(b)+h;e-=b;f&&e&&(--b,e+=1);return{x:a,y:b,width:c,height:e}};h.prototype.adjustForMissingColumns=function(a,b,c,e){var d=this,h=this.options.stacking;if(!c.isNull&&1<e.columnCount){var f=0,g=0;O(this.yAxis.stacking&&this.yAxis.stacking.stacks,function(a){if("number"===typeof c.x&&(a=a[c.x.toString()])){var b=a.points[d.index],e=a.total;h?(b&&(f=g),a.hasValidPoints&&g++):k(b)&&
(f=b[1],g=e||0)}});a=(c.plotX||0)+((g-1)*e.paddedWidth+b)/2-b-f*e.paddedWidth}return a};h.prototype.translate=function(){var a=this,b=a.chart,c=a.options,h=a.dense=2>a.closestPointRange*a.xAxis.transA;h=a.borderWidth=B(c.borderWidth,h?0:1);var g=a.xAxis,k=a.yAxis,l=c.threshold,m=a.translatedThreshold=k.getThreshold(l),n=B(c.minPointLength,5),r=a.getColumnMetrics(),t=r.width,q=a.pointXOffset=r.offset,v=a.dataMin,u=a.dataMax,w=a.barW=Math.max(t,1+2*h);b.inverted&&(m-=.5);c.pointPadding&&(w=Math.ceil(w));
x.prototype.translate.apply(a);a.points.forEach(function(d){var h=B(d.yBottom,m),p=999+Math.abs(h),y=d.plotX||0;p=e(d.plotY,-p,k.len+p);var x=Math.min(p,h),F=Math.max(p,h)-x,D=t,G=y+q,z=w;n&&Math.abs(F)<n&&(F=n,y=!k.reversed&&!d.negative||k.reversed&&d.negative,I(l)&&I(u)&&d.y===l&&u<=l&&(k.min||0)<l&&(v!==u||(k.max||0)<=l)&&(y=!y),x=Math.abs(x-m)>n?h-n:m-(y?n:0));f(d.options.pointWidth)&&(D=z=Math.ceil(d.options.pointWidth),G-=Math.round((D-t)/2));c.centerInCategory&&(G=a.adjustForMissingColumns(G,
D,d,r));d.barX=G;d.pointWidth=D;d.tooltipPos=b.inverted?[e(k.len+k.pos-b.plotLeft-p,k.pos-b.plotLeft,k.len+k.pos-b.plotLeft),g.len+g.pos-b.plotTop-G-z/2,F]:[g.left-b.plotLeft+G+z/2,e(p+k.pos-b.plotTop,k.pos-b.plotTop,k.len+k.pos-b.plotTop),F];d.shapeType=a.pointClass.prototype.shapeType||"rect";d.shapeArgs=a.crispCol.apply(a,d.isNull?[G,m,z,0]:[G,x,z,F])})};h.prototype.drawGraph=function(){this.group[this.dense?"addClass":"removeClass"]("highcharts-dense-data")};h.prototype.pointAttribs=function(a,
b){var d=this.options,c=this.pointAttrToOptions||{},e=c.stroke||"borderColor",h=c["stroke-width"]||"borderWidth",f=a&&a.color||this.color,k=a&&a[e]||d[e]||f;c=a&&a.options.dashStyle||d.dashStyle;var l=a&&a[h]||d[h]||this[h]||0,m=B(a&&a.opacity,d.opacity,1);if(a&&this.zones.length){var n=a.getZone();f=a.options.color||n&&(n.color||a.nonZonedColor)||this.color;n&&(k=n.borderColor||k,c=n.dashStyle||c,l=n.borderWidth||l)}b&&a&&(a=D(d.states[b],a.options.states&&a.options.states[b]||{}),b=a.brightness,
f=a.color||"undefined"!==typeof b&&g(f).brighten(a.brightness).get()||f,k=a[e]||k,l=a[h]||l,c=a.dashStyle||c,m=B(a.opacity,m));e={fill:f,stroke:k,"stroke-width":l,opacity:m};c&&(e.dashstyle=c);return e};h.prototype.drawPoints=function(){var a=this,b=this.chart,c=a.options,e=b.renderer,h=c.animationLimit||250,f;a.points.forEach(function(d){var g=d.graphic,k=!!g,l=g&&b.pointCount<h?"animate":"attr";if(I(d.plotY)&&null!==d.y){f=d.shapeArgs;g&&d.hasNewShapeType()&&(g=g.destroy());a.enabledDataSorting&&
(d.startXPos=a.xAxis.reversed?-(f?f.width||0:0):a.xAxis.width);g||(d.graphic=g=e[d.shapeType](f).add(d.group||a.group))&&a.enabledDataSorting&&b.hasRendered&&b.pointCount<h&&(g.attr({x:d.startXPos}),k=!0,l="animate");if(g&&k)g[l](D(f));if(c.borderRadius)g[l]({r:c.borderRadius});b.styledMode||g[l](a.pointAttribs(d,d.selected&&"select")).shadow(!1!==d.allowShadow&&c.shadow,null,c.stacking&&!c.borderRadius);g&&(g.addClass(d.getClassName(),!0),g.attr({visibility:d.visible?"inherit":"hidden"}))}else g&&
(d.graphic=g.destroy())})};h.prototype.drawTracker=function(){var a=this,b=a.chart,e=b.pointer,h=function(a){var b=e.getPointFromEvent(a);"undefined"!==typeof b&&(e.isDirectTouch=!0,b.onMouseOver(a))},f;a.points.forEach(function(a){f=k(a.dataLabels)?a.dataLabels:a.dataLabel?[a.dataLabel]:[];a.graphic&&(a.graphic.element.point=a);f.forEach(function(b){b.div?b.div.point=a:b.element.point=a})});a._hasTracking||(a.trackerGroups.forEach(function(d){if(a[d]){a[d].addClass("highcharts-tracker").on("mouseover",
h).on("mouseout",function(a){e.onTrackerMouseOut(a)});if(c)a[d].on("touchstart",h);!b.styledMode&&a.options.cursor&&a[d].css(l).css({cursor:a.options.cursor})}}),a._hasTracking=!0);q(this,"afterDrawTracker")};h.prototype.remove=function(){var a=this,b=a.chart;b.hasRendered&&b.series.forEach(function(b){b.type===a.type&&(b.isDirty=!0)});x.prototype.remove.apply(a,arguments)};h.defaultOptions=D(x.defaultOptions,{borderRadius:0,centerInCategory:!1,groupPadding:.2,marker:null,pointPadding:.1,minPointLength:0,
cropThreshold:50,pointRange:null,states:{hover:{halo:!1,brightness:.1},select:{color:z.neutralColor20,borderColor:z.neutralColor100}},dataLabels:{align:void 0,verticalAlign:void 0,y:void 0},startFromThreshold:!0,stickyTracking:!1,tooltip:{distance:6},threshold:0,borderColor:z.backgroundColor});return h}(x);r(u.prototype,{cropShoulder:0,directTouch:!0,drawLegendSymbol:E.drawRectangle,getSymbol:a,negStacks:!0,trackerGroups:["group","dataLabelsGroup"]});J.registerSeriesType("column",u);"";"";return u});
M(a,"Core/Series/DataLabel.js",[a["Core/Animation/AnimationUtilities.js"],a["Core/FormatUtilities.js"],a["Core/Color/Palette.js"],a["Core/Utilities.js"]],function(a,w,C,E){var r=a.getDeferredAnimation,x=w.format,J=E.defined,u=E.extend,n=E.fireEvent,m=E.isArray,g=E.merge,c=E.objectEach,e=E.pick,l=E.splat,f;(function(a){function f(a,c,b,f,g){var d=this,h=this.chart,k=this.isCartesian&&h.inverted,l=this.enabledDataSorting,m=e(a.dlBox&&a.dlBox.centerX,a.plotX,-9999),n=e(a.plotY,-9999),p=c.getBBox(),r=
b.rotation,t=b.align,q=h.isInsidePlot(m,Math.round(n),{inverted:k,paneCoordinates:!0,series:d}),v=function(b){l&&d.xAxis&&!B&&d.setDataLabelStartPos(a,c,g,q,b)},B="justify"===e(b.overflow,l?"none":"justify"),x=this.visible&&!1!==a.visible&&(a.series.forceDL||l&&!B||q||e(b.inside,!!this.options.stacking)&&f&&h.isInsidePlot(m,k?f.x+1:f.y+f.height-1,{inverted:k,paneCoordinates:!0,series:d}));if(x){var w=h.renderer.fontMetrics(h.styledMode?void 0:b.style.fontSize,c).b;f=u({x:k?this.yAxis.len-n:m,y:Math.round(k?
this.xAxis.len-m:n),width:0,height:0},f);u(b,{width:p.width,height:p.height});r?(B=!1,m=h.renderer.rotCorr(w,r),m={x:f.x+(b.x||0)+f.width/2+m.x,y:f.y+(b.y||0)+{top:0,middle:.5,bottom:1}[b.verticalAlign]*f.height},v(m),c[g?"attr":"animate"](m).attr({align:t}),v=(r+720)%360,v=180<v&&360>v,"left"===t?m.y-=v?p.height:0:"center"===t?(m.x-=p.width/2,m.y-=p.height/2):"right"===t&&(m.x-=p.width,m.y-=v?0:p.height),c.placed=!0,c.alignAttr=m):(v(f),c.align(b,void 0,f),m=c.alignAttr);B&&0<=f.height?this.justifyDataLabel(c,
b,m,p,f,g):e(b.crop,!0)&&(x=h.isInsidePlot(m.x,m.y,{paneCoordinates:!0,series:d})&&h.isInsidePlot(m.x+p.width,m.y+p.height,{paneCoordinates:!0,series:d}));if(b.shape&&!r)c[g?"attr":"animate"]({anchorX:k?h.plotWidth-a.plotY:a.plotX,anchorY:k?h.plotHeight-a.plotX:a.plotY})}g&&l&&(c.placed=!1);x||l&&!B||(c.hide(!0),c.placed=!1)}function k(a,c){var b=c.filter;return b?(c=b.operator,a=a[b.property],b=b.value,">"===c&&a>b||"<"===c&&a<b||">="===c&&a>=b||"<="===c&&a<=b||"=="===c&&a==b||"==="===c&&a===b?!0:
!1):!0}function v(){var a=this,d=a.chart,b=a.options,f=a.points,g=a.hasRendered||0,t=d.renderer,q=b.dataLabels,v,u=q.animation;u=q.defer?r(d,u,a):{defer:0,duration:0};q=B(B(d.options.plotOptions&&d.options.plotOptions.series&&d.options.plotOptions.series.dataLabels,d.options.plotOptions&&d.options.plotOptions[a.type]&&d.options.plotOptions[a.type].dataLabels),q);n(this,"drawDataLabels");if(m(q)||q.enabled||a._hasPointLabels){var w=a.plotGroup("dataLabelsGroup","data-labels",g?"inherit":"hidden",q.zIndex||
6);w.attr({opacity:+g});!g&&(g=a.dataLabelsGroup)&&(a.visible&&w.show(!0),g[b.animation?"animate":"attr"]({opacity:1},u));f.forEach(function(f){v=l(B(q,f.dlOptions||f.options&&f.options.dataLabels));v.forEach(function(h,g){var l=h.enabled&&(!f.isNull||f.dataLabelOnNull)&&k(f,h),m=f.connectors?f.connectors[g]:f.connector,n=f.dataLabels?f.dataLabels[g]:f.dataLabel,p=e(h.distance,f.labelDistance),r=!n;if(l){var q=f.getLabelConfig();var v=e(h[f.formatPrefix+"Format"],h.format);q=J(v)?x(v,q,d):(h[f.formatPrefix+
"Formatter"]||h.formatter).call(q,h);v=h.style;var u=h.rotation;d.styledMode||(v.color=e(h.color,v.color,a.color,C.neutralColor100),"contrast"===v.color?(f.contrastColor=t.getContrast(f.color||a.color),v.color=!J(p)&&h.inside||0>p||b.stacking?f.contrastColor:C.neutralColor100):delete f.contrastColor,b.cursor&&(v.cursor=b.cursor));var B={r:h.borderRadius||0,rotation:u,padding:h.padding,zIndex:1};d.styledMode||(B.fill=h.backgroundColor,B.stroke=h.borderColor,B["stroke-width"]=h.borderWidth);c(B,function(a,
b){"undefined"===typeof a&&delete B[b]})}!n||l&&J(q)?l&&J(q)&&(n?B.text=q:(f.dataLabels=f.dataLabels||[],n=f.dataLabels[g]=u?t.text(q,0,-9999,h.useHTML).addClass("highcharts-data-label"):t.label(q,0,-9999,h.shape,null,null,h.useHTML,null,"data-label"),g||(f.dataLabel=n),n.addClass(" highcharts-data-label-color-"+f.colorIndex+" "+(h.className||"")+(h.useHTML?" highcharts-tracker":""))),n.options=h,n.attr(B),d.styledMode||n.css(v).shadow(h.shadow),n.added||n.add(w),h.textPath&&!h.useHTML&&(n.setTextPath(f.getDataLabelPath&&
f.getDataLabelPath(n)||f.graphic,h.textPath),f.dataLabelPath&&!h.textPath.enabled&&(f.dataLabelPath=f.dataLabelPath.destroy())),a.alignDataLabel(f,n,h,null,r)):(f.dataLabel=f.dataLabel&&f.dataLabel.destroy(),f.dataLabels&&(1===f.dataLabels.length?delete f.dataLabels:delete f.dataLabels[g]),g||delete f.dataLabel,m&&(f.connector=f.connector.destroy(),f.connectors&&(1===f.connectors.length?delete f.connectors:delete f.connectors[g])))})})}n(this,"afterDrawDataLabels")}function w(a,c,b,e,f,g){var d=this.chart,
h=c.align,k=c.verticalAlign,l=a.box?0:a.padding||0,m=c.x;m=void 0===m?0:m;var n=c.y;n=void 0===n?0:n;var p=(b.x||0)+l;if(0>p){"right"===h&&0<=m?(c.align="left",c.inside=!0):m-=p;var r=!0}p=(b.x||0)+e.width-l;p>d.plotWidth&&("left"===h&&0>=m?(c.align="right",c.inside=!0):m+=d.plotWidth-p,r=!0);p=b.y+l;0>p&&("bottom"===k&&0<=n?(c.verticalAlign="top",c.inside=!0):n-=p,r=!0);p=(b.y||0)+e.height-l;p>d.plotHeight&&("top"===k&&0>=n?(c.verticalAlign="bottom",c.inside=!0):n+=d.plotHeight-p,r=!0);r&&(c.x=m,
c.y=n,a.placed=!g,a.align(c,void 0,f));return r}function B(a,c){var b=[],d;if(m(a)&&!m(c))b=a.map(function(a){return g(a,c)});else if(m(c)&&!m(a))b=c.map(function(b){return g(a,b)});else if(m(a)||m(c))for(d=Math.max(a.length,c.length);d--;)b[d]=g(a[d],c[d]);else b=g(a,c);return b}function z(a,c,b,e,f){var d=this.chart,h=d.inverted,g=this.xAxis,k=g.reversed,l=h?c.height/2:c.width/2;a=(a=a.pointWidth)?a/2:0;c.startXPos=h?f.x:k?-l-a:g.width-l+a;c.startYPos=h?k?this.yAxis.height-l+a:-l-a:f.y;e?"hidden"===
c.visibility&&(c.show(),c.attr({opacity:0}).animate({opacity:1})):c.attr({opacity:1}).animate({opacity:0},void 0,c.hide);d.hasRendered&&(b&&c.attr({x:c.startXPos,y:c.startYPos}),c.placed=!0)}var t=[];a.compose=function(a){if(-1===t.indexOf(a)){var c=a.prototype;t.push(a);c.alignDataLabel=f;c.drawDataLabels=v;c.justifyDataLabel=w;c.setDataLabelStartPos=z}}})(f||(f={}));"";return f});M(a,"Series/Column/ColumnDataLabel.js",[a["Core/Series/DataLabel.js"],a["Core/Series/SeriesRegistry.js"],a["Core/Utilities.js"]],
function(a,w,C){var r=w.series,z=C.merge,x=C.pick,J;(function(u){function n(a,c,e,l,f){var g=this.chart.inverted,m=a.series,k=a.dlBox||a.shapeArgs,n=x(a.below,a.plotY>x(this.translatedThreshold,m.yAxis.len)),u=x(e.inside,!!this.options.stacking);k&&(l=z(k),0>l.y&&(l.height+=l.y,l.y=0),k=l.y+l.height-m.yAxis.len,0<k&&k<l.height&&(l.height-=k),g&&(l={x:m.yAxis.len-l.y-l.height,y:m.xAxis.len-l.x-l.width,width:l.height,height:l.width}),u||(g?(l.x+=n?0:l.width,l.width=0):(l.y+=n?l.height:0,l.height=0)));
e.align=x(e.align,!g||u?"center":n?"right":"left");e.verticalAlign=x(e.verticalAlign,g||u?"middle":n?"top":"bottom");r.prototype.alignDataLabel.call(this,a,c,e,l,f);e.inside&&a.contrastColor&&c.css({color:a.contrastColor})}var m=[];u.compose=function(g){a.compose(r);-1===m.indexOf(g)&&(m.push(g),g.prototype.alignDataLabel=n)}})(J||(J={}));return J});M(a,"Series/Bar/BarSeries.js",[a["Series/Column/ColumnSeries.js"],a["Core/Series/SeriesRegistry.js"],a["Core/Utilities.js"]],function(a,w,C){var r=this&&
this.__extends||function(){var a=function(r,n){a=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(a,g){a.__proto__=g}||function(a,g){for(var c in g)g.hasOwnProperty(c)&&(a[c]=g[c])};return a(r,n)};return function(r,n){function m(){this.constructor=r}a(r,n);r.prototype=null===n?Object.create(n):(m.prototype=n.prototype,new m)}}(),z=C.extend,x=C.merge;C=function(w){function u(){var a=null!==w&&w.apply(this,arguments)||this;a.data=void 0;a.options=void 0;a.points=void 0;return a}r(u,w);
u.defaultOptions=x(a.defaultOptions,{});return u}(a);z(C.prototype,{inverted:!0});w.registerSeriesType("bar",C);"";return C});M(a,"Series/Scatter/ScatterSeries.js",[a["Series/Column/ColumnSeries.js"],a["Series/Line/LineSeries.js"],a["Core/Series/SeriesRegistry.js"],a["Core/Utilities.js"]],function(a,w,C,E){var r=this&&this.__extends||function(){var a=function(m,g){a=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(a,e){a.__proto__=e}||function(a,e){for(var c in e)e.hasOwnProperty(c)&&
(a[c]=e[c])};return a(m,g)};return function(m,g){function c(){this.constructor=m}a(m,g);m.prototype=null===g?Object.create(g):(c.prototype=g.prototype,new c)}}(),x=E.addEvent,J=E.extend,u=E.merge;E=function(a){function m(){var g=null!==a&&a.apply(this,arguments)||this;g.data=void 0;g.options=void 0;g.points=void 0;return g}r(m,a);m.prototype.applyJitter=function(){var a=this,c=this.options.jitter,e=this.points.length;c&&this.points.forEach(function(g,f){["x","y"].forEach(function(l,m){var k="plot"+
l.toUpperCase();if(c[l]&&!g.isNull){var n=a[l+"Axis"];var r=c[l]*n.transA;if(n&&!n.isLog){var q=Math.max(0,g[k]-r);n=Math.min(n.len,g[k]+r);m=1E4*Math.sin(f+m*e);g[k]=q+(n-q)*(m-Math.floor(m));"x"===l&&(g.clientX=g.plotX)}}})})};m.prototype.drawGraph=function(){this.options.lineWidth?a.prototype.drawGraph.call(this):this.graph&&(this.graph=this.graph.destroy())};m.defaultOptions=u(w.defaultOptions,{lineWidth:0,findNearestPointBy:"xy",jitter:{x:0,y:0},marker:{enabled:!0},tooltip:{headerFormat:'<span style="color:{point.color}">\u25cf</span> <span style="font-size: 10px"> {series.name}</span><br/>',
pointFormat:"x: <b>{point.x}</b><br/>y: <b>{point.y}</b><br/>"}});return m}(w);J(E.prototype,{drawTracker:a.prototype.drawTracker,sorted:!1,requireSorting:!1,noSharedTooltip:!0,trackerGroups:["group","markerGroup","dataLabelsGroup"],takeOrdinalPosition:!1});x(E,"afterTranslate",function(){this.applyJitter()});C.registerSeriesType("scatter",E);"";return E});M(a,"Mixins/CenteredSeries.js",[a["Core/Globals.js"],a["Core/Series/Series.js"],a["Core/Utilities.js"]],function(a,w,C){var r=C.isNumber,z=C.pick,
x=C.relativeLength,J=a.deg2rad;return a.CenteredSeriesMixin={getCenter:function(){var a=this.options,n=this.chart,m=2*(a.slicedOffset||0),g=n.plotWidth-2*m,c=n.plotHeight-2*m,e=a.center,l=Math.min(g,c),f=a.size,r=a.innerSize||0;"string"===typeof f&&(f=parseFloat(f));"string"===typeof r&&(r=parseFloat(r));a=[z(e[0],"50%"),z(e[1],"50%"),z(f&&0>f?void 0:a.size,"100%"),z(r&&0>r?void 0:a.innerSize||0,"0%")];!n.angular||this instanceof w||(a[3]=0);for(e=0;4>e;++e)f=a[e],n=2>e||2===e&&/%$/.test(f),a[e]=
x(f,[g,c,l,a[2]][e])+(n?m:0);a[3]>a[2]&&(a[3]=a[2]);return a},getStartAndEndRadians:function(a,n){a=r(a)?a:0;n=r(n)&&n>a&&360>n-a?n:a+360;return{start:J*(a+-90),end:J*(n+-90)}}}});M(a,"Series/Pie/PiePoint.js",[a["Core/Animation/AnimationUtilities.js"],a["Core/Series/Point.js"],a["Core/Utilities.js"]],function(a,w,C){var r=this&&this.__extends||function(){var a=function(c,e){a=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(a,c){a.__proto__=c}||function(a,c){for(var e in c)c.hasOwnProperty(e)&&
(a[e]=c[e])};return a(c,e)};return function(c,e){function g(){this.constructor=c}a(c,e);c.prototype=null===e?Object.create(e):(g.prototype=e.prototype,new g)}}(),z=a.setAnimation,x=C.addEvent,J=C.defined;a=C.extend;var u=C.isNumber,n=C.pick,m=C.relativeLength;w=function(a){function c(){var c=null!==a&&a.apply(this,arguments)||this;c.labelDistance=void 0;c.options=void 0;c.series=void 0;return c}r(c,a);c.prototype.getConnectorPath=function(){var a=this.labelPosition,c=this.series.options.dataLabels,
f=this.connectorShapes,g=c.connectorShape;f[g]&&(g=f[g]);return g.call(this,{x:a.final.x,y:a.final.y,alignment:a.alignment},a.connectorPosition,c)};c.prototype.getTranslate=function(){return this.sliced?this.slicedTranslation:{translateX:0,translateY:0}};c.prototype.haloPath=function(a){var c=this.shapeArgs;return this.sliced||!this.visible?[]:this.series.chart.renderer.symbols.arc(c.x,c.y,c.r+a,c.r+a,{innerR:c.r-1,start:c.start,end:c.end})};c.prototype.init=function(){var c=this;a.prototype.init.apply(this,
arguments);this.name=n(this.name,"Slice");var g=function(a){c.slice("select"===a.type)};x(this,"select",g);x(this,"unselect",g);return this};c.prototype.isValid=function(){return u(this.y)&&0<=this.y};c.prototype.setVisible=function(a,c){var e=this,g=this.series,l=g.chart,k=g.options.ignoreHiddenPoint;c=n(c,k);a!==this.visible&&(this.visible=this.options.visible=a="undefined"===typeof a?!this.visible:a,g.options.data[g.data.indexOf(this)]=this.options,["graphic","dataLabel","connector","shadowGroup"].forEach(function(c){if(e[c])e[c][a?
"show":"hide"](a)}),this.legendItem&&l.legend.colorizeItem(this,a),a||"hover"!==this.state||this.setState(""),k&&(g.isDirty=!0),c&&l.redraw())};c.prototype.slice=function(a,c,f){var e=this.series;z(f,e.chart);n(c,!0);this.sliced=this.options.sliced=J(a)?a:!this.sliced;e.options.data[e.data.indexOf(this)]=this.options;this.graphic&&this.graphic.animate(this.getTranslate());this.shadowGroup&&this.shadowGroup.animate(this.getTranslate())};return c}(w);a(w.prototype,{connectorShapes:{fixedOffset:function(a,
c,e){var g=c.breakAt;c=c.touchingSliceAt;return[["M",a.x,a.y],e.softConnector?["C",a.x+("left"===a.alignment?-5:5),a.y,2*g.x-c.x,2*g.y-c.y,g.x,g.y]:["L",g.x,g.y],["L",c.x,c.y]]},straight:function(a,c){c=c.touchingSliceAt;return[["M",a.x,a.y],["L",c.x,c.y]]},crookedLine:function(a,c,e){c=c.touchingSliceAt;var g=this.series,f=g.center[0],n=g.chart.plotWidth,r=g.chart.plotLeft;g=a.alignment;var k=this.shapeArgs.r;e=m(e.crookDistance,1);n="left"===g?f+k+(n+r-f-k)*(1-e):r+(f-k)*e;e=["L",n,a.y];f=!0;if("left"===
g?n>a.x||n<c.x:n<a.x||n>c.x)f=!1;a=[["M",a.x,a.y]];f&&a.push(e);a.push(["L",c.x,c.y]);return a}}});return w});M(a,"Series/Pie/PieSeries.js",[a["Mixins/CenteredSeries.js"],a["Series/Column/ColumnSeries.js"],a["Core/Globals.js"],a["Core/Legend/LegendSymbol.js"],a["Core/Color/Palette.js"],a["Series/Pie/PiePoint.js"],a["Core/Series/Series.js"],a["Core/Series/SeriesRegistry.js"],a["Core/Renderer/SVG/Symbols.js"],a["Core/Utilities.js"]],function(a,w,C,E,z,x,J,u,n,m){var g=this&&this.__extends||function(){var a=
function(c,e){a=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(a,c){a.__proto__=c}||function(a,c){for(var e in c)c.hasOwnProperty(e)&&(a[e]=c[e])};return a(c,e)};return function(c,e){function f(){this.constructor=c}a(c,e);c.prototype=null===e?Object.create(e):(f.prototype=e.prototype,new f)}}(),c=a.getStartAndEndRadians;C=C.noop;var e=m.clamp,l=m.extend,f=m.fireEvent,r=m.merge,q=m.pick,k=m.relativeLength;m=function(a){function l(){var c=null!==a&&a.apply(this,arguments)||this;c.center=
void 0;c.data=void 0;c.maxLabelDistance=void 0;c.options=void 0;c.points=void 0;return c}g(l,a);l.prototype.animate=function(a){var c=this,e=c.points,f=c.startAngleRad;a||e.forEach(function(a){var b=a.graphic,d=a.shapeArgs;b&&d&&(b.attr({r:q(a.startR,c.center&&c.center[3]/2),start:f,end:f}),b.animate({r:d.r,start:d.start,end:d.end},c.options.animation))})};l.prototype.drawEmpty=function(){var a=this.startAngleRad,c=this.endAngleRad,e=this.options;if(0===this.total&&this.center){var f=this.center[0];
var d=this.center[1];this.graph||(this.graph=this.chart.renderer.arc(f,d,this.center[1]/2,0,a,c).addClass("highcharts-empty-series").add(this.group));this.graph.attr({d:n.arc(f,d,this.center[2]/2,0,{start:a,end:c,innerR:this.center[3]/2})});this.chart.styledMode||this.graph.attr({"stroke-width":e.borderWidth,fill:e.fillColor||"none",stroke:e.color||z.neutralColor20})}else this.graph&&(this.graph=this.graph.destroy())};l.prototype.drawPoints=function(){var a=this.chart.renderer;this.points.forEach(function(c){c.graphic&&
c.hasNewShapeType()&&(c.graphic=c.graphic.destroy());c.graphic||(c.graphic=a[c.shapeType](c.shapeArgs).add(c.series.group),c.delayedRendering=!0)})};l.prototype.generatePoints=function(){a.prototype.generatePoints.call(this);this.updateTotals()};l.prototype.getX=function(a,c,f){var h=this.center,d=this.radii?this.radii[f.index]||0:h[2]/2;a=Math.asin(e((a-h[1])/(d+f.labelDistance),-1,1));return h[0]+(c?-1:1)*Math.cos(a)*(d+f.labelDistance)+(0<f.labelDistance?(c?-1:1)*this.options.dataLabels.padding:
0)};l.prototype.hasData=function(){return!!this.processedXData.length};l.prototype.redrawPoints=function(){var a=this,c=a.chart,e=c.renderer,f=a.options.shadow,d,b,g,k;this.drawEmpty();!f||a.shadowGroup||c.styledMode||(a.shadowGroup=e.g("shadow").attr({zIndex:-1}).add(a.group));a.points.forEach(function(h){var l={};b=h.graphic;if(!h.isNull&&b){var m=void 0;k=h.shapeArgs;d=h.getTranslate();c.styledMode||(m=h.shadowGroup,f&&!m&&(m=h.shadowGroup=e.g("shadow").add(a.shadowGroup)),m&&m.attr(d),g=a.pointAttribs(h,
h.selected&&"select"));h.delayedRendering?(b.setRadialReference(a.center).attr(k).attr(d),c.styledMode||b.attr(g).attr({"stroke-linejoin":"round"}).shadow(f,m),h.delayedRendering=!1):(b.setRadialReference(a.center),c.styledMode||r(!0,l,g),r(!0,l,k,d),b.animate(l));b.attr({visibility:h.visible?"inherit":"hidden"});b.addClass(h.getClassName(),!0)}else b&&(h.graphic=b.destroy())})};l.prototype.sortByAngle=function(a,c){a.sort(function(a,e){return"undefined"!==typeof a.angle&&(e.angle-a.angle)*c})};l.prototype.translate=
function(a){this.generatePoints();var e=this.options,g=e.slicedOffset,h=g+(e.borderWidth||0),d=c(e.startAngle,e.endAngle),b=this.startAngleRad=d.start;d=(this.endAngleRad=d.end)-b;var l=this.points,m=e.dataLabels.distance;e=e.ignoreHiddenPoint;var n=l.length,r,v=0;a||(this.center=a=this.getCenter());for(r=0;r<n;r++){var u=l[r];var x=b+v*d;!u.isValid()||e&&!u.visible||(v+=u.percentage/100);var w=b+v*d;var B={x:a[0],y:a[1],r:a[2]/2,innerR:a[3]/2,start:Math.round(1E3*x)/1E3,end:Math.round(1E3*w)/1E3};
u.shapeType="arc";u.shapeArgs=B;u.labelDistance=q(u.options.dataLabels&&u.options.dataLabels.distance,m);u.labelDistance=k(u.labelDistance,B.r);this.maxLabelDistance=Math.max(this.maxLabelDistance||0,u.labelDistance);w=(w+x)/2;w>1.5*Math.PI?w-=2*Math.PI:w<-Math.PI/2&&(w+=2*Math.PI);u.slicedTranslation={translateX:Math.round(Math.cos(w)*g),translateY:Math.round(Math.sin(w)*g)};B=Math.cos(w)*a[2]/2;var z=Math.sin(w)*a[2]/2;u.tooltipPos=[a[0]+.7*B,a[1]+.7*z];u.half=w<-Math.PI/2||w>Math.PI/2?1:0;u.angle=
w;x=Math.min(h,u.labelDistance/5);u.labelPosition={natural:{x:a[0]+B+Math.cos(w)*u.labelDistance,y:a[1]+z+Math.sin(w)*u.labelDistance},"final":{},alignment:0>u.labelDistance?"center":u.half?"right":"left",connectorPosition:{breakAt:{x:a[0]+B+Math.cos(w)*x,y:a[1]+z+Math.sin(w)*x},touchingSliceAt:{x:a[0]+B,y:a[1]+z}}}}f(this,"afterTranslate")};l.prototype.updateTotals=function(){var a=this.points,c=a.length,e=this.options.ignoreHiddenPoint,f,d=0;for(f=0;f<c;f++){var b=a[f];!b.isValid()||e&&!b.visible||
(d+=b.y)}this.total=d;for(f=0;f<c;f++)b=a[f],b.percentage=0<d&&(b.visible||!e)?b.y/d*100:0,b.total=d};l.defaultOptions=r(J.defaultOptions,{center:[null,null],clip:!1,colorByPoint:!0,dataLabels:{allowOverlap:!0,connectorPadding:5,connectorShape:"fixedOffset",crookDistance:"70%",distance:30,enabled:!0,formatter:function(){return this.point.isNull?void 0:this.point.name},softConnector:!0,x:0},fillColor:void 0,ignoreHiddenPoint:!0,inactiveOtherPoints:!0,legendType:"point",marker:null,size:null,showInLegend:!1,
slicedOffset:10,stickyTracking:!1,tooltip:{followPointer:!0},borderColor:z.backgroundColor,borderWidth:1,lineWidth:void 0,states:{hover:{brightness:.1}}});return l}(J);l(m.prototype,{axisTypes:[],directTouch:!0,drawGraph:void 0,drawLegendSymbol:E.drawRectangle,drawTracker:w.prototype.drawTracker,getCenter:a.getCenter,getSymbol:C,isCartesian:!1,noSharedTooltip:!0,pointAttribs:w.prototype.pointAttribs,pointClass:x,requireSorting:!1,searchPoint:C,trackerGroups:["group","dataLabelsGroup"]});u.registerSeriesType("pie",
m);"";return m});M(a,"Series/Pie/PieDataLabel.js",[a["Core/Series/DataLabel.js"],a["Core/Globals.js"],a["Core/Color/Palette.js"],a["Core/Renderer/RendererUtilities.js"],a["Core/Series/SeriesRegistry.js"],a["Core/Utilities.js"]],function(a,w,C,E,z,x){var r=w.noop,u=E.distribute,n=z.series,m=x.arrayMax,g=x.clamp,c=x.defined,e=x.merge,l=x.pick,f=x.relativeLength,v;(function(q){function k(){var a=this,f=a.data,d=a.chart,b=a.options.dataLabels||{},g=b.connectorPadding,k=d.plotWidth,r=d.plotHeight,q=d.plotLeft,
v=Math.round(d.chartWidth/3),w=a.center,x=w[2]/2,B=w[1],z=[[],[]],D=[0,0,0,0],E=a.dataLabelPositioners,I,J,M,O,Z,A,U,N,W,X,Y,T;a.visible&&(b.enabled||a._hasPointLabels)&&(f.forEach(function(a){a.dataLabel&&a.visible&&a.dataLabel.shortened&&(a.dataLabel.attr({width:"auto"}).css({width:"auto",textOverflow:"clip"}),a.dataLabel.shortened=!1)}),n.prototype.drawDataLabels.apply(a),f.forEach(function(a){a.dataLabel&&(a.visible?(z[a.half].push(a),a.dataLabel._pos=null,!c(b.style.width)&&!c(a.options.dataLabels&&
a.options.dataLabels.style&&a.options.dataLabels.style.width)&&a.dataLabel.getBBox().width>v&&(a.dataLabel.css({width:Math.round(.7*v)+"px"}),a.dataLabel.shortened=!0)):(a.dataLabel=a.dataLabel.destroy(),a.dataLabels&&1===a.dataLabels.length&&delete a.dataLabels))}),z.forEach(function(e,f){var h=e.length,m=[],n;if(h){a.sortByAngle(e,f-.5);if(0<a.maxLabelDistance){var p=Math.max(0,B-x-a.maxLabelDistance);var t=Math.min(B+x+a.maxLabelDistance,d.plotHeight);e.forEach(function(a){0<a.labelDistance&&a.dataLabel&&
(a.top=Math.max(0,B-x-a.labelDistance),a.bottom=Math.min(B+x+a.labelDistance,d.plotHeight),n=a.dataLabel.getBBox().height||21,a.distributeBox={target:a.labelPosition.natural.y-a.top+n/2,size:n,rank:a.y},m.push(a.distributeBox))});p=t+n-p;u(m,p,p/5)}for(Y=0;Y<h;Y++){I=e[Y];A=I.labelPosition;O=I.dataLabel;X=!1===I.visible?"hidden":"inherit";W=p=A.natural.y;m&&c(I.distributeBox)&&("undefined"===typeof I.distributeBox.pos?X="hidden":(U=I.distributeBox.size,W=E.radialDistributionY(I)));delete I.positionIndex;
if(b.justify)N=E.justify(I,x,w);else switch(b.alignTo){case "connectors":N=E.alignToConnectors(e,f,k,q);break;case "plotEdges":N=E.alignToPlotEdges(O,f,k,q);break;default:N=E.radialDistributionX(a,I,W,p)}O._attr={visibility:X,align:A.alignment};T=I.options.dataLabels||{};O._pos={x:N+l(T.x,b.x)+({left:g,right:-g}[A.alignment]||0),y:W+l(T.y,b.y)-10};A.final.x=N;A.final.y=W;l(b.crop,!0)&&(Z=O.getBBox().width,p=null,N-Z<g&&1===f?(p=Math.round(Z-N+g),D[3]=Math.max(p,D[3])):N+Z>k-g&&0===f&&(p=Math.round(N+
Z-k+g),D[1]=Math.max(p,D[1])),0>W-U/2?D[0]=Math.max(Math.round(-W+U/2),D[0]):W+U/2>r&&(D[2]=Math.max(Math.round(W+U/2-r),D[2])),O.sideOverflow=p)}}}),0===m(D)||this.verifyDataLabelOverflow(D))&&(this.placeDataLabels(),this.points.forEach(function(c){T=e(b,c.options.dataLabels);if(J=l(T.connectorWidth,1)){var f;M=c.connector;if((O=c.dataLabel)&&O._pos&&c.visible&&0<c.labelDistance){X=O._attr.visibility;if(f=!M)c.connector=M=d.renderer.path().addClass("highcharts-data-label-connector highcharts-color-"+
c.colorIndex+(c.className?" "+c.className:"")).add(a.dataLabelsGroup),d.styledMode||M.attr({"stroke-width":J,stroke:T.connectorColor||c.color||C.neutralColor60});M[f?"attr":"animate"]({d:c.getConnectorPath()});M.attr("visibility",X)}else M&&(c.connector=M.destroy())}}))}function v(){this.points.forEach(function(a){var c=a.dataLabel,d;c&&a.visible&&((d=c._pos)?(c.sideOverflow&&(c._attr.width=Math.max(c.getBBox().width-c.sideOverflow,0),c.css({width:c._attr.width+"px",textOverflow:(this.options.dataLabels.style||
{}).textOverflow||"ellipsis"}),c.shortened=!0),c.attr(c._attr),c[c.moved?"animate":"attr"](d),c.moved=!0):c&&c.attr({y:-9999}));delete a.distributeBox},this)}function w(a){var c=this.center,d=this.options,b=d.center,e=d.minSize||80,k=null!==d.size;if(!k){if(null!==b[0])var l=Math.max(c[2]-Math.max(a[1],a[3]),e);else l=Math.max(c[2]-a[1]-a[3],e),c[0]+=(a[3]-a[1])/2;null!==b[1]?l=g(l,e,c[2]-Math.max(a[0],a[2])):(l=g(l,e,c[2]-a[0]-a[2]),c[1]+=(a[0]-a[2])/2);l<c[2]?(c[2]=l,c[3]=Math.min(f(d.innerSize||
0,l),l),this.translate(c),this.drawDataLabels&&this.drawDataLabels()):k=!0}return k}var x=[],z={radialDistributionY:function(a){return a.top+a.distributeBox.pos},radialDistributionX:function(a,c,d,b){return a.getX(d<c.top+2||d>c.bottom-2?b:d,c.half,c)},justify:function(a,c,d){return d[0]+(a.half?-1:1)*(c+a.labelDistance)},alignToPlotEdges:function(a,c,d,b){a=a.getBBox().width;return c?a+b:d-a-b},alignToConnectors:function(a,c,d,b){var e=0,f;a.forEach(function(a){f=a.dataLabel.getBBox().width;f>e&&
(e=f)});return c?e+b:d-e-b}};q.compose=function(c){a.compose(n);-1===x.indexOf(c)&&(x.push(c),c=c.prototype,c.dataLabelPositioners=z,c.alignDataLabel=r,c.drawDataLabels=k,c.placeDataLabels=v,c.verifyDataLabelOverflow=w)}})(v||(v={}));return v});M(a,"Extensions/OverlappingDataLabels.js",[a["Core/Chart/Chart.js"],a["Core/Utilities.js"]],function(a,w){function r(a,g){var c=!1;if(a){var e=a.newOpacity;a.oldOpacity!==e&&(a.alignAttr&&a.placed?(a[e?"removeClass":"addClass"]("highcharts-data-label-hidden"),
c=!0,a.alignAttr.opacity=e,a[a.isOld?"animate":"attr"](a.alignAttr,null,function(){g.styledMode||a.css({pointerEvents:e?"auto":"none"})}),z(g,"afterHideOverlappingLabel")):a.attr({opacity:e}));a.isOld=!0}return c}var E=w.addEvent,z=w.fireEvent,x=w.isArray,J=w.isNumber,u=w.objectEach,n=w.pick;E(a,"render",function(){var a=this,g=[];(this.labelCollectors||[]).forEach(function(a){g=g.concat(a())});(this.yAxis||[]).forEach(function(a){a.stacking&&a.options.stackLabels&&!a.options.stackLabels.allowOverlap&&
u(a.stacking.stacks,function(a){u(a,function(a){a.label&&"hidden"!==a.label.visibility&&g.push(a.label)})})});(this.series||[]).forEach(function(c){var e=c.options.dataLabels;c.visible&&(!1!==e.enabled||c._hasPointLabels)&&(e=function(c){return c.forEach(function(c){c.visible&&(x(c.dataLabels)?c.dataLabels:c.dataLabel?[c.dataLabel]:[]).forEach(function(e){var f=e.options;e.labelrank=n(f.labelrank,c.labelrank,c.shapeArgs&&c.shapeArgs.height);f.allowOverlap?(e.oldOpacity=e.opacity,e.newOpacity=1,r(e,
a)):g.push(e)})})},e(c.nodes||[]),e(c.points))});this.hideOverlappingLabels(g)});a.prototype.hideOverlappingLabels=function(a){var g=this,c=a.length,e=g.renderer,l,f,m,n=!1;var k=function(a){var c,f=a.box?0:a.padding||0,g=c=0,d;if(a&&(!a.alignAttr||a.placed)){var b=a.alignAttr||{x:a.attr("x"),y:a.attr("y")};var k=a.parentGroup;a.width||(c=a.getBBox(),a.width=c.width,a.height=c.height,c=e.fontMetrics(null,a.element).h);var l=a.width-2*f;(d={left:"0",center:"0.5",right:"1"}[a.alignValue])?g=+d*l:J(a.x)&&
Math.round(a.x)!==a.translateX&&(g=a.x-a.translateX);return{x:b.x+(k.translateX||0)+f-(g||0),y:b.y+(k.translateY||0)+f-c,width:a.width-2*f,height:a.height-2*f}}};for(f=0;f<c;f++)if(l=a[f])l.oldOpacity=l.opacity,l.newOpacity=1,l.absoluteBox=k(l);a.sort(function(a,c){return(c.labelrank||0)-(a.labelrank||0)});for(f=0;f<c;f++){var u=(k=a[f])&&k.absoluteBox;for(l=f+1;l<c;++l){var w=(m=a[l])&&m.absoluteBox;!u||!w||k===m||0===k.newOpacity||0===m.newOpacity||w.x>=u.x+u.width||w.x+w.width<=u.x||w.y>=u.y+u.height||
w.y+w.height<=u.y||((k.labelrank<m.labelrank?k:m).newOpacity=0)}}a.forEach(function(a){r(a,g)&&(n=!0)});n&&z(g,"afterHideAllOverlappingLabels")}});M(a,"Core/Responsive.js",[a["Core/Utilities.js"]],function(a){var r=a.extend,C=a.find,E=a.isArray,z=a.isObject,x=a.merge,J=a.objectEach,u=a.pick,n=a.splat,m=a.uniqueKey,g;(function(a){var c=[];a.compose=function(a){-1===c.indexOf(a)&&(c.push(a),r(a.prototype,g.prototype));return a};var g=function(){function a(){}a.prototype.currentOptions=function(a){function c(a,
f,g,k){var h;J(a,function(a,b){if(!k&&-1<e.collectionsWithUpdate.indexOf(b)&&f[b])for(a=n(a),g[b]=[],h=0;h<Math.max(a.length,f[b].length);h++)f[b][h]&&(void 0===a[h]?g[b][h]=f[b][h]:(g[b][h]={},c(a[h],f[b][h],g[b][h],k+1)));else z(a)?(g[b]=E(a)?[]:{},c(a,f[b]||{},g[b],k+1)):g[b]="undefined"===typeof f[b]?null:f[b]})}var e=this,f={};c(a,this.options,f,0);return f};a.prototype.matchResponsiveRule=function(a,c){var e=a.condition;(e.callback||function(){return this.chartWidth<=u(e.maxWidth,Number.MAX_VALUE)&&
this.chartHeight<=u(e.maxHeight,Number.MAX_VALUE)&&this.chartWidth>=u(e.minWidth,0)&&this.chartHeight>=u(e.minHeight,0)}).call(this)&&c.push(a._id)};a.prototype.setResponsive=function(a,c){var e=this,f=this.options.responsive,g=this.currentResponsive,l=[];!c&&f&&f.rules&&f.rules.forEach(function(a){"undefined"===typeof a._id&&(a._id=m());e.matchResponsiveRule(a,l)},this);c=x.apply(void 0,l.map(function(a){return C((f||{}).rules||[],function(c){return c._id===a})}).map(function(a){return a&&a.chartOptions}));
c.isResponsiveOptions=!0;l=l.toString()||void 0;l!==(g&&g.ruleIds)&&(g&&this.update(g.undoOptions,a,!0),l?(g=this.currentOptions(c),g.isResponsiveOptions=!0,this.currentResponsive={ruleIds:l,mergedOptions:c,undoOptions:g},this.update(c,a,!0)):this.currentResponsive=void 0)};return a}()})(g||(g={}));"";"";return g});M(a,"masters/highcharts.src.js",[a["Core/Globals.js"],a["Core/Utilities.js"],a["Core/DefaultOptions.js"],a["Core/Animation/Fx.js"],a["Core/Animation/AnimationUtilities.js"],a["Core/Renderer/HTML/AST.js"],
a["Core/FormatUtilities.js"],a["Core/Renderer/RendererUtilities.js"],a["Core/Renderer/SVG/SVGElement.js"],a["Core/Renderer/SVG/SVGRenderer.js"],a["Core/Renderer/HTML/HTMLElement.js"],a["Core/Renderer/HTML/HTMLRenderer.js"],a["Core/Axis/Axis.js"],a["Core/Axis/DateTimeAxis.js"],a["Core/Axis/LogarithmicAxis.js"],a["Core/Axis/PlotLineOrBand/PlotLineOrBand.js"],a["Core/Axis/Tick.js"],a["Core/Tooltip.js"],a["Core/Series/Point.js"],a["Core/Pointer.js"],a["Core/MSPointer.js"],a["Core/Legend/Legend.js"],a["Core/Chart/Chart.js"],
a["Core/Series/Series.js"],a["Core/Series/SeriesRegistry.js"],a["Series/Column/ColumnSeries.js"],a["Series/Column/ColumnDataLabel.js"],a["Series/Pie/PieSeries.js"],a["Series/Pie/PieDataLabel.js"],a["Core/Series/DataLabel.js"],a["Core/Responsive.js"],a["Core/Color/Color.js"],a["Core/Time.js"]],function(a,w,C,E,z,x,J,u,n,m,g,c,e,l,f,v,q,k,I,D,B,M,t,h,d,b,p,G,y,L,F,P,S){a.animate=z.animate;a.animObject=z.animObject;a.getDeferredAnimation=z.getDeferredAnimation;a.setAnimation=z.setAnimation;a.stop=z.stop;
a.timers=E.timers;a.AST=x;a.Axis=e;a.Chart=t;a.chart=t.chart;a.Fx=E;a.Legend=M;a.PlotLineOrBand=v;a.Point=I;a.Pointer=B.isRequired()?B:D;a.Series=h;a.SVGElement=n;a.SVGRenderer=m;a.Tick=q;a.Time=S;a.Tooltip=k;a.Color=P;a.color=P.parse;c.compose(m);g.compose(n);a.defaultOptions=C.defaultOptions;a.getOptions=C.getOptions;a.time=C.defaultTime;a.setOptions=C.setOptions;a.dateFormat=J.dateFormat;a.format=J.format;a.numberFormat=J.numberFormat;a.addEvent=w.addEvent;a.arrayMax=w.arrayMax;a.arrayMin=w.arrayMin;
a.attr=w.attr;a.clearTimeout=w.clearTimeout;a.correctFloat=w.correctFloat;a.createElement=w.createElement;a.css=w.css;a.defined=w.defined;a.destroyObjectProperties=w.destroyObjectProperties;a.discardElement=w.discardElement;a.distribute=u.distribute;a.erase=w.erase;a.error=w.error;a.extend=w.extend;a.extendClass=w.extendClass;a.find=w.find;a.fireEvent=w.fireEvent;a.getMagnitude=w.getMagnitude;a.getStyle=w.getStyle;a.inArray=w.inArray;a.isArray=w.isArray;a.isClass=w.isClass;a.isDOMElement=w.isDOMElement;
a.isFunction=w.isFunction;a.isNumber=w.isNumber;a.isObject=w.isObject;a.isString=w.isString;a.keys=w.keys;a.merge=w.merge;a.normalizeTickInterval=w.normalizeTickInterval;a.objectEach=w.objectEach;a.offset=w.offset;a.pad=w.pad;a.pick=w.pick;a.pInt=w.pInt;a.relativeLength=w.relativeLength;a.removeEvent=w.removeEvent;a.seriesType=d.seriesType;a.splat=w.splat;a.stableSort=w.stableSort;a.syncTimeout=w.syncTimeout;a.timeUnits=w.timeUnits;a.uniqueKey=w.uniqueKey;a.useSerialIds=w.useSerialIds;a.wrap=w.wrap;
p.compose(b);L.compose(h);l.compose(e);f.compose(e);y.compose(G);v.compose(e);F.compose(t);return a});a["masters/highcharts.src.js"]._modules=a;return a["masters/highcharts.src.js"]});
//# sourceMappingURL=highcharts.js.map

File diff suppressed because it is too large Load diff

Some files were not shown because too many files have changed in this diff Show more