diff --git a/.dockerignore b/.dockerignore
deleted file mode 100644
index 8f266283..00000000
--- a/.dockerignore
+++ /dev/null
@@ -1,11 +0,0 @@
-.git
-.github
-.gitignore
-contrib
-init-scripts
-package
-pylintrc
-snap
-*.md
-!CHANGELOG*.md
-start.bat
diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml
deleted file mode 100644
index 79319ae1..00000000
--- a/.github/FUNDING.yml
+++ /dev/null
@@ -1,3 +0,0 @@
-github: JonnyWong16
-patreon: Tautulli
-custom: ["https://bit.ly/2InPp15", "https://bit.ly/2WTq83m"]
\ No newline at end of file
diff --git a/.github/ISSUE_TEMPLATE/BUG-REPORT.yml b/.github/ISSUE_TEMPLATE/BUG-REPORT.yml
deleted file mode 100644
index 34f617df..00000000
--- a/.github/ISSUE_TEMPLATE/BUG-REPORT.yml
+++ /dev/null
@@ -1,103 +0,0 @@
-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.
diff --git a/.github/ISSUE_TEMPLATE/FEATURE-REQUEST.yml b/.github/ISSUE_TEMPLATE/FEATURE-REQUEST.yml
deleted file mode 100644
index 70e2ab33..00000000
--- a/.github/ISSUE_TEMPLATE/FEATURE-REQUEST.yml
+++ /dev/null
@@ -1,31 +0,0 @@
-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.
diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml
deleted file mode 100644
index 16aef760..00000000
--- a/.github/ISSUE_TEMPLATE/config.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-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.
diff --git a/.github/codeql-config.yml b/.github/codeql-config.yml
deleted file mode 100644
index 574f9b33..00000000
--- a/.github/codeql-config.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-name: CodeQL Config
-
-paths-ignore:
- - lib
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
deleted file mode 100644
index 1028cc5a..00000000
--- a/.github/dependabot.yml
+++ /dev/null
@@ -1,15 +0,0 @@
-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
diff --git a/.github/label-actions.yml b/.github/label-actions.yml
deleted file mode 100644
index ae236e9a..00000000
--- a/.github/label-actions.yml
+++ /dev/null
@@ -1,48 +0,0 @@
-# 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.
diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md
deleted file mode 100644
index 63ab24be..00000000
--- a/.github/pull_request_template.md
+++ /dev/null
@@ -1,26 +0,0 @@
-## 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
diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml
deleted file mode 100644
index e9c8e05d..00000000
--- a/.github/workflows/codeql.yml
+++ /dev/null
@@ -1,38 +0,0 @@
-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}}"
diff --git a/.github/workflows/issues-stale.yml b/.github/workflows/issues-stale.yml
deleted file mode 100644
index b805e266..00000000
--- a/.github/workflows/issues-stale.yml
+++ /dev/null
@@ -1,48 +0,0 @@
-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
diff --git a/.github/workflows/issues.yml b/.github/workflows/issues.yml
deleted file mode 100644
index a60987f5..00000000
--- a/.github/workflows/issues.yml
+++ /dev/null
@@ -1,15 +0,0 @@
-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 }}
diff --git a/.github/workflows/publish-docker.yml b/.github/workflows/publish-docker.yml
deleted file mode 100644
index 62c3f86c..00000000
--- a/.github/workflows/publish-docker.yml
+++ /dev/null
@@ -1,108 +0,0 @@
-name: Publish Docker
-
-on:
- workflow_dispatch: ~
- push:
- branches: [master, beta, nightly]
- tags: [v*]
-
-jobs:
- 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@v4
-
- - name: Prepare
- id: prepare
- run: |
- if [[ $GITHUB_REF == refs/tags/* ]]; then
- echo "tag=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT
- elif [[ $GITHUB_REF == refs/heads/master ]]; then
- echo "tag=latest" >> $GITHUB_OUTPUT
- else
- echo "tag=${GITHUB_REF#refs/heads/}" >> $GITHUB_OUTPUT
- fi
- 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 "branch=${GITHUB_REF#refs/heads/}" >> $GITHUB_OUTPUT
- fi
- 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
- with:
- version: latest
-
- - name: Cache Docker Layers
- uses: actions/cache@v4
- with:
- path: /tmp/.buildx-cache
- key: ${{ runner.os }}-buildx-${{ github.sha }}
- restore-keys: |
- ${{ runner.os }}-buildx-
-
- - name: Login to DockerHub
- uses: docker/login-action@v3
- if: success()
- with:
- username: ${{ secrets.DOCKER_USERNAME }}
- password: ${{ secrets.DOCKER_TOKEN }}
-
- - name: Login to GitHub Container Registry
- uses: docker/login-action@v3
- if: success()
- with:
- registry: ghcr.io
- username: ${{ secrets.DOCKER_USERNAME }}
- password: ${{ secrets.GHCR_TOKEN }}
-
- - 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
- with:
- webhook: ${{ secrets.DISCORD_WEBHOOK }}
- status: ${{ needs.build-docker.result == 'success' && 'success' || contains(needs.*.result, 'failure') && 'failure' || 'cancelled' }}
- title: ${{ github.workflow }}
- nofail: true
diff --git a/.github/workflows/publish-installers.yml b/.github/workflows/publish-installers.yml
deleted file mode 100644
index b4a66960..00000000
--- a/.github/workflows/publish-installers.yml
+++ /dev/null
@@ -1,178 +0,0 @@
-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
diff --git a/.github/workflows/publish-snap.yml b/.github/workflows/publish-snap.yml
deleted file mode 100644
index b3898a38..00000000
--- a/.github/workflows/publish-snap.yml
+++ /dev/null
@@ -1,78 +0,0 @@
-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
diff --git a/.github/workflows/pull-requests.yml b/.github/workflows/pull-requests.yml
deleted file mode 100644
index ac550fe2..00000000
--- a/.github/workflows/pull-requests.yml
+++ /dev/null
@@ -1,27 +0,0 @@
-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
diff --git a/.github/workflows/submit-winget.yml b/.github/workflows/submit-winget.yml
deleted file mode 100644
index efa6cee7..00000000
--- a/.github/workflows/submit-winget.yml
+++ /dev/null
@@ -1,44 +0,0 @@
-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$
diff --git a/.gitignore b/.gitignore
index 1e54132b..f3297290 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,7 +1,6 @@
# Compiled source #
###################
-__pycache__
*.pyc
*.py~
*.pyproj
@@ -13,34 +12,15 @@ __pycache__
*.db*
*.db-journal
*.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 #
##################
-/*.crt
-/*.key
-/*.csr
-/*.pem
-
-# Mergetool
-*.orgin
+*.crt
+*.key
+*.csr
# OS generated files #
######################
@@ -51,10 +31,7 @@ Icon?
Thumbs.db
#Ignore files generated by PyCharm
-*.idea/*
-
-#Ignore files generated by VSCode
-*.vscode/*
+.idea/*
#Ignore files generated by vi
*.swp
@@ -76,6 +53,7 @@ Thumbs.db
*.bak
*.cache
*.ilk
+*.log
[Bb]in
[Dd]ebug*/
*.lib
@@ -88,16 +66,3 @@ _ReSharper*/
/logs
.project
.pydevproject
-
-#Ignore files generated by pyinstaller
-/build
-/dist
-
-#snapcraft specifics
-/parts/
-/stage/
-/prime/
-*.snap
-.snapcraft
-*_source.tar.bz2
-snap/.snapcraft
\ No newline at end of file
diff --git a/API.md b/API.md
index 827c7c6b..ecdc127b 100644
--- a/API.md
+++ b/API.md
@@ -1,3 +1,80 @@
# API Reference
+The API is still pretty new and needs some serious cleaning up on the backend but should be reasonably functional. There are no error codes yet.
-Tautulli API documentation has been moved to the [wiki page](https://github.com/Tautulli/Tautulli/wiki/Tautulli-API-Reference).
\ No newline at end of file
+## General structure
+The API endpoint is `http://ip:port + HTTP_ROOT + /api?apikey=$apikey&cmd=$command`
+
+Response example
+```
+{
+ "response": {
+ "data": [
+ {
+ "loglevel": "INFO",
+ "msg": "Signal 2 caught, saving and exiting...",
+ "thread": "MainThread",
+ "time": "22-sep-2015 01:42:56 "
+ }
+ ],
+ "message": null,
+ "result": "success"
+ }
+}
+```
+
+General parameters:
+ out_type: 'xml',
+ callback: 'pong',
+ 'debug': 1
+
+
+## API methods
+
+### getLogs
+Possible params: sort='', search='', order='desc', regex='', start=0, end=0
+Returns the plexpy log
+
+### getApikey
+Possible params: username='', password='' (required if auth is enabled)
+Returns the apikey
+
+### getSettings
+No params
+Returns the config file
+
+### getVersion
+No params
+Returns some version information: git_path, install_type, current_version, installed_version, commits_behind
+
+### getHistory
+possible params: user=None, user_id=None, ,rating_key='', parent_rating_key='', grandparent_rating_key='', start_date=''
+Returns
+
+### getMetadata
+Required params: rating_key
+Returns metadata about a file
+
+### getSync
+Possible params: machine_id=None, user_id=None,
+Returns
+
+### getUserips
+Possible params: user_id=None, user=None
+
+### getPlayby
+Possible params: time_range=30, y_axis='plays', playtype='total_plays_per_month'
+
+### checkGithub
+Updates the version information above and returns getVersion data
+
+### shutdown
+No params
+Shut down plexpy
+
+### restart
+No params
+Restart plexpy
+
+### update
+No params
+Update plexpy - you may want to check the install type in get version and not allow this if type==exe
diff --git a/CHANGELOG.md b/CHANGELOG.md
index b349b355..958a8c44 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,2762 +1,5 @@
# 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:
- * Tautulli now supports Python 3!
- * Python 2 is still supported for the time being, but it is recommended to upgrade to Python 3.
-* Notifications:
- * Fix: Error uploading images to Cloudinary on Python 2.
- * Fix: Testing browser notifications alert not disappearing.
- * Change: Default recently added notification delay set to 300 seconds.
-* UI:
- * Fix: MacOS menu bar icon causing Tautulli to fail to start.
- * Fix: Unable to login to Tautulli on Python 2.
- * New: Windows and MacOS setting to enable Tautulli to start automatically when you login.
- * New: Added menu bar icon for MacOS.
- * New: Ability to import a Tautulli database in the settings.
- * New: Added Tautulli news area on the settings page.
- * New: Added platform icon for LG devices.
- * Remove: Ability to login to Tautulli using a Plex username and password has been removed. Login using a Plex.tv account is only supported via OAuth.
-* Mobile App:
- * Fix: Improved API security and validation when registering the Android app.
-* Docker:
- * Fix: Docker container not respecting the PUID and PGID environment variables.
-* Other:
- * Fix: Error creating self-signed certificates on Python 3.
- * Fix: Tautulli login session cookie not set on the HTTP root path.
- * New: Windows and MacOS app installers to install Tautulli without needing Python installed.
-
-
-## v2.2.4 (2020-05-16)
-
-* Monitoring:
- * Fix: Show "None" as the subtitle source on the activity card for user selected subtitles.
-* UI:
- * Fix: Deleted libraries were showing up on the homepage library cards.
- * Fix: Libraries could get stuck as inactive in the database in some instances.
-* API:
- * Fix: Incorrect title was being returned for the get_history API command.
-* Other:
- * Fix: Plex remote access check was not being rescheduled after changing the settings.
-
-
-## v2.2.3 (2020-05-01)
-
-* Notifications:
- * Fix: Notification grouping by season/album and show/artist not enabled by default.
- * Fix: The rating key notification parameter was being overwritten when 3rd party lookup was enabled.
- * Fix: Missing artist value for Musicbrainz lookup in certain situations.
- * New: Added notification trigger for Tautulli database corruption.
- * New: Added TAUTULLI_PYTHON_VERSION to script notification environment variables.
- * New: Added Plex Android / iOS App notification agent.
- * New: Added bandwidth notification parameters.
- * New: Added user thumb to notification parameters.
- * New: Added initial stream notification parameter and threshold setting to determine if a stream is the first stream of a continuous streaming session.
- * New: Added Plex remote access notification parameters.
- * Change: The file size notification parameter is now reported in SI units. (Thanks @aaronldunlap)
-* UI:
- * Fix: Delete lookup info from the media info page failing.
- * Fix: XBMC platform icon not being redirected to the Kodi platform icon.
- * Fix: History table was not being refreshed after deleting entries.
- * New: Added icon on the users table to indicate if the user is not on the Plex server.
- * New: Added icon on the libraries table to indicate if the library is not on the Plex server.
- * Change: Improved deleting libraries so libraries with the same section ID are not also deleted.
-* Mobile App:
- * Fix: Temporary device token was not being invalidated after cancelling device registration.
-* API:
- * Fix: Returning XML from the API failing due to unicode characters.
- * Fix: Grouping parameter for various API commands not falling back to default setting.
- * New: Added time_queries parameter to get_library_watch_time_stats and get_user_watch_time_stats API command. (Thanks @KaasKop97)
- * New: Added an "is_active" return value to the get_user, get_users, get_library, and get_libraries API commands which indicates if the user or library is on the Plex server.
- * New: Added delete_history API command.
- * Change: Added optional parameter for row_ids for delete_library, delete_user, delete_all_library_history, and delete_all_user_history API commands.
-* Other:
- * Fix: Update failing on CentOS due to an older git version.
- * Fix: Manifest file for creating a web app had incorrect info.
- * Fix: Auto-updater was not scheduled when enabling the setting unless Tautulli was restarted.
- * New: Docker images updated to support ARM platforms.
- * Change: Remove the unnecessary optional Plex logs volume from the Docker image.
- * Change: Use Plex.tv for GeoIP lookup instead of requiring the MaxMind GeoLite2 database.
-
-
-## v2.2.1 (2020-03-28)
-
-* Notifications:
- * Fix: File size notification parameter incorrectly truncated to an integer.
- * Fix: Notification grouping by season/album not enabled by default.
- * New: Added transcode decision counts to notification parameters.
- * Change: Tags (<>) are no longer stripped from from Webhook notification text.
-* Newsletter:
- * New: Added favicon to newsletter template when viewing as a web page.
-* UI:
- * Fix: Username missing from the Synced Items table.
- * Fix: Windows system tray icon not enabled by default.
- * Fix: Saving a mobile device with a blank friendly name caused an error.
- * New: Added IMDb and Rotten Tomato Ratings to info pages.
- * New: Added button in settings to delete all 3rd party metadata lookup info in the database.
- * New: Added button in settings to flush recently added items in the database.
-* API:
- * New: Added delete_recenly_added API command to flush recently added items.
- * Change: Updated delete_lookup_info API command parameters to allow deleteing all 3rd party metadata lookup info.
-
-
-## v2.2.0 (2020-03-08)
-
-* Important Note!
- * All Live TV changes requires Plex Media Server 1.18.7 or higher.
-* Monitoring:
- * Fix: Improved IPv6 display on the activity cards. (Thanks @felixbuenemann)
- * New: Added Live TV metadata and posters to the activity cards.
- * Change: Show bandwidth in Gbps when greater than 1000 Mbps.
-* History:
- * New: Added history logging for Live TV sessions.
- * New: Added a fake "Live TV" library to collect Live TV history.
- * Note: This library will show up the first time that Live TV is played.
- * New: Added the ability to filter history by Live TV.
-* Graphs:
- * New: Added Live TV series to the "Plays by Period" and "Play Totals" graphs.
- * Change: Media type series on the graphs are only shown if the corresponding library type is present.
-* Notifications:
- * Fix: Race condition causing stream count to be incorrect for playback stop notifications.
- * New: Added Live TV channel notification parameters.
- * New: Added Plex background art notification parameter.
- * Note: This is the Plex API endpoint to retrieve the background art, not the actual image.
- * New: Added poster images for clip notifications.
- * Change: Default Webhook notification method to POST.
-* UI:
- * Fix: Windows platform showing up twice on the Most Active Platforms statistics card.
- * New: Added option to change the background art for library sections when editing a library.
- * New: Added button to reset Tautulli git installation in settings to fix failed git updates.
-* API:
- * New: Added ability to filter history using a "live" media type and by guid for the get_history API command.
- * New: Added cutsom_art parameter to the edit_library API command.
-* Other:
- * Change: Add crossorigin use-credentials attribute to manifest tags. (Thanks @pkoenig10)
- * Change: Disable automatic updates for Docker containers. Updates are now handled by updating the Docker container.
- * Note: If you are using an old Docker container created before v2.2.0, then you may need to completely remove and recreate the container to update for the first time.
- * Note: Use the ":latest" Docker tag for the newest stable release, or the ":beta" or ":nightly" tags to access the beta or nightly branches.
-
-
-## v2.1.44 (2020-02-05)
-
-* Monitoring:
- * Fix: SDR source video being identified as HDR stream video.
-* Notifications:
- * Fix: Unable to select condition operator for video color parameters.
-* UI:
- * Fix: Capitalization for platforms on history tables.
-
-
-## v2.1.43 (2020-02-03)
-
-* Monitoring:
- * New: Added HDR indicator on activity card.
- * New: Added dynamic range to history steam info modal.
-* Notifications:
- * Fix: Webhook notification body sent as incorrect data type when Content-Type header is overridden.
- * Fix: Telegram notification character limit incorrect for unicode characters.
- * New: Added color and dynamic range notification parameters.
-* Newsletters:
- * Fix: Episodes and Albums plural spelling on recently added newsletter section headers.
-* UI:
- * Fix: Windows and macOS platform capitalization.
- * Fix: Season number 0 not shown for episodes on history tables.
-* Other:
- * Change: Mask email addresses in logs.
- * Change: Update deprecated GitHub access token URL parameter to Authorization header.
-
-
-## v2.1.42 (2020-01-04)
-
-* Other:
- * Fix: SSL certificate error when installing GeoLite2 database.
- * Change: Verify MaxMind license key and GeoLite2 database path before installing.
- * Change: Disable GeoLite2 database uninstall button when it is not installed.
-
-
-## v2.1.41 (2019-12-30)
-
-* Other:
- * Fix: Failing to extract the GeoLite2 database on Windows.
-
-
-## v2.1.40 (2019-12-30)
-
-* UI:
- * Change: Moved 3rd Party API settings to new tab in the settings.
-* Graphs:
- * Change: Improve calculating month ranges for Play Totals graphs.
-* Other:
- * Fix: Failing to verify a Plex Media Server using a hostname.
- * Change: A license key is now required to install the MaxMind GeoLite2 database for IP geolocation. Please follow the guide in the wiki to reinstall the GeoLite2 database.
- * Change: The GeoLite2 database will now automatically update periodically if installed.
-
-
-## v2.1.39 (2019-12-08)
-
-* UI:
- * New: Added creating admin username and password to setup wizard.
-* API:
- * Change: Remove default notification subject and body for notify API command.
-* Other:
- * Change: Check for database corruption when making backup.
-
-
-## v2.1.38 (2019-11-17)
-
-* Notifications:
- * New: Added custom JSON headers to the webhook notification agent.
-* UI:
- * Fix: Homepage recently watched card not showing grouped history.
-* Other:
- * New: Added GitHub sponsor donation option.
- * Change: Improve resolving hostnames.
-
-
-## v2.1.37 (2019-10-11)
-
-* Notifications:
- * Fix: Last.fm URLs linking to artist page instead of the album page.
- * New: Added option for MusicBrainz lookup for music notifications. Option must be enabled under 3rd Party APIs in the settings.
- * New: Added MusicBrainz ID and MusicBrainz URL notification parameters.
- * Change: Automatically truncate Discord description summary to 2048 characters.
-
-
-## v2.1.36-beta (2019-10-05)
-
-* Monitoring:
- * Fix: Activity card title not updating after pre-rolls or auto-play.
-* History:
- * Fix: Display correct interlaced or progressive video scan type on stream data modal.
-* Graphs:
- * New: Separate interlaced and progressive video scan type on source and stream resolution graphs.
-* API:
- * New: Added parent_guid and grandparent_guid to get_activity and get_metadata commands.
-
-
-## v2.1.35-beta (2019-09-24)
-
-* Monitoring:
- * Fix: Audio shown as blank on activity cards when changing audio tracks during direct play.
- * Fix: Display correct interlaced or progressive video scan type on activity cards.
- * New: Added flag for Nvidia hardware decoding on activity cards.
-* Notifications:
- * Fix: Notification parameter prefix and suffix were not substituted correctly.
- * Fix: Release Date notification parameter was incorrectly casted to an integer instead of a string.
- * New: Added video scan type and full resolution notification parameters.
-* UI:
- * Fix: Movies with the same title but different year being grouped on the homepage stats cards.
-* API:
- * New: Added video scan type and full resolution values to get_activity command.
-* Other:
- * Fix: Tautulli logging out every time after saving settings and restarting.
-
-
-## v2.1.34 (2019-09-03)
-
-* History:
- * New: Added Product column to history tables.
-* Notifications:
- * Fix: IMDB/TMDb/TVDB/TVmaze ID notification parameters showing blank values after lookup.
-* UI:
- * Fix: Libraries and Users tables did not respect the group history setting.
-* API:
- * Fix: Title field was not searchable in get_library_media_info command.
- * New: Added grouping option to get_libraries_table and get_users_table commands.
- * New: Added product value to get_history command.
-* Other:
- * Fix: Could not verify Plex Media Server with unpublished hostnames.
- * Change: Automatically logout all Tautulli instances when changing the admin password.
-
-
-## v2.1.33 (2019-07-27)
-
-* Notifications:
- * Change: Mask notification agent password fields.
- * Change: Enable searching by email address in dropdown menu.
-* Other:
- * Fix: Version number being overwritten with "None" which prevented updating in some instances.
- * Change: Update Plex OAuth request headers.
-
-
-## v2.1.32 (2019-06-26)
-
-* Newsletters:
- * Fix: Newsletter scheduler issue for QNAP devices using an invalid "local" timezone preventing Tautulli from starting.
-
-
-## v2.1.31 (2019-06-24)
-
-* No additional changes from v2.1.31-beta.
-
-
-## v2.1.31-beta (2019-06-13)
-
-* Monitoring:
- * Fix: Synced content showing incorrect stream info.
-* Other:
- * Fix: Unable to view database status when authentication is enabled.
- * Change: Default database synchronous mode changed to prevent database corruption. Database response may be slower.
-
-
-## v2.1.30-beta (2019-05-11)
-
-* Monitoring:
- * Fix: Activity crashing with Plex's Artist TV feature.
- * New: Added setting for Plex Media Server Update Check Interval. (Thanks @abiacco)
-* Notifications:
- * New: Added secure and relayed connection notification parameters.
- * New: Added PLEX_USER_TOKEN to script environment variables.
- * Change: Schedule notifications using UTC to prevent missing notifications due to misconfigured timezones.
-* API:
- * New: Added status API command to check the status of Tautulli.
-
-
-## v2.1.29 (2019-05-11)
-
-* No additional changes from v2.1.29-beta.
-
-
-## v2.1.29-beta (2019-04-14)
-
-* Monitoring:
- * Change: "Required Bandwidth" changed to "Reserved Bandwidth" in order to match the Plex dashboard.
-* Notifications:
- * New: Added prefix and suffix notification text modifiers. See the "Notification Text Modifiers" help modal for details.
-* UI:
- * New: Added "Undelete" button to the edit library and edit user modals.
- * Fix: User IP address history table showing incorrect "Last Seen" values.
-* API:
- * Fix: Search API only returning 3 results.
- * Fix: Terminate stream API failing when both session_key and session_id were provided.
- * Change: Improved API response HTTP status codes and error messages.
-
-
-## v2.1.28 (2019-03-10)
-
-* Monitoring:
- * New: Added secure/insecure connection icon on the activity cards. Requires Plex Media Server v1.15+.
-* Other:
- * Change: Improved mass deleting of all images from Cloudinary. Requires all previous images on Cloudinary to be manually tagged with "tautulli". New uploads are automatically tagged.
-
-
-## v2.1.27-beta (2019-03-03)
-
-* Monitoring:
- * Fix: Error when playing synced optimized versions.
- * Change: Show message to complete the setup wizard instead of error communicating with server message.
- * Change: URL changed on Plex.tv for Plex Media Server beta updates.
-* Notifications:
- * New: Show the media type exclusion tags in the text preview modal.
- * Fix: Unicode error in the Email notification failed response message.
- * Fix: Error when a notification agent response is missing the "Content-Type" header.
-* UI:
- * Fix: Usernames were not being sanitized in dropdown selectors.
- * Change: Different display of "All" recently added items on the homepage due to change in the Plex Media Server v1.15+ API.
-* API:
- * New: Added current Tautulli version to update_check API response.
- * Change: API no longer returns sanitized HTML response data.
-* Other:
- * New: Added auto-restart to systemd init script.
- * Fix: Patreon donation URL.
- * Remove: Crypto donation options.
-
-
-## v2.1.26 (2018-12-01)
-
-* Monitoring:
- * Fix: Resume event not being triggered after buffering.
-* Notifications:
- * New: Added user email as a notification parameter.
-* Graphs:
- * Fix: History model showing no results for stream info graph.
-* API:
- * Fix: API returning error when missing a cmd.
-
-
-## v2.1.25 (2018-11-03)
-
-* Monitoring:
- * Fix: Audio and video codec showing up as * on the activity cards.
- * New: Poster and background image on the activity cards for live TV.
-* UI:
- * Fix: Alert message for invalid Tautulli Public Domain setting.
-
-
-## v2.1.24-beta (2018-10-29)
-
-* Monitoring:
- * Fix: Transcode change events creating invalid sessions in the database.
-* Notifications:
- * Change: Update Telegram character limit to 1024.
-* History:
- * Fix: Save history table states separately for multiple Tautulli instances.
-* Graphs:
- * Fix: Save graphs states separately for multiple Tautulli instances.
- * Change: Version graphs to bypass browser cache.
-* UI:
- * New: Added queued tasks modals to the scheduled tasks table for debugging.
-* Other:
- * Change: Updated timezone info and display in configuration table.
-
-
-## v2.1.23-beta (2018-10-14)
-
-* Monitoring:
- * Fix: Buffer events not being triggered properly.
- * Fix: Watched progress sometimes not saved correctly. (Thanks @Sheigutn)
-* Notifications:
- * New: Added notification trigger for transcode decision change.
- * Fix: Multiple buffer notifications being triggered within the same second.
- * Change: Default buffer notification threshold changed to 10 for buffer thresholds less than 10.
-* Newsletter:
- * New: Added Other Video libraries to the newsletter.
-* Homepage:
- * New: Added Other Video type to recently added on the homepage.
- * Change: Save homepage recently added media type toggle state.
- * Change: Save homepage stats config to local storage instead of the server.
-* History:
- * Change: Save history table media type toggle state.
-* Graphs:
- * Change: Save series visibility state when toggling the legend.
- * Change: Save graph config to local storage instead of the server.
-* UI:
- * New: Show the remote app device token and id in the edit device modal.
- * Change: Lock certain settings if using the Tautulli docker container.
-* API:
- * Fix: download_config, download_database, download_log, and download_plex_log API commands not working.
- * Change: get_recently_added command 'type' parameter renamed to 'media_type'. Backwards compatibility is maintained.
- * Change: get_home_stats command 'stats_type' parameter change to string 'plays' or 'duration'. Backwards compatibility is maintained.
-
-
-## v2.1.22 (2018-10-05)
-
-* Notifications:
- * Fix: Notification agent settings not loading when failed to retrieve some data.
-* UI:
- * Fix: Incorrectly showing localhost server in the setup wizard.
-* Other:
- * Fix: Incorrect redirect to HTTP when HTTPS proxy header is present.
- * Fix: Websocket not connecting automatically after the setup wizard.
-
-
-## v2.1.21 (2018-09-21)
-
-* Notifications:
- * Fix: Content Rating notification condition always evaluating to True. (Thanks @Arcanemagus)
- * Fix: Script arguments not showing substituted values in the notification logs.
-* UI:
- * New: Unsupported browser warning when using IE or Edge.
- * Fix: Misaligned refresh image icon in album search results. (Thanks @Sheigutn)
- * Fix: Music history showing as pre-Tautulli in stream info modal.
-* Other:
- * Fix: Typo in Systemd init script group value. (Thanks @ldumont)
- * Fix: Execute permissions in Fedora/CentOS and Systemd init scripts. (Thanks @wilmardo)
- * Fix: Systemd init script instructions per Linux distro. (Thanks @samwiseg00)
- * Change: Fallback to Tautulli data directory if logs/backup/cache/newsletter directories are not writable.
- * Change: Check for alternative reverse proxy headers if X-Forwarded-Host is missing.
-
-
-## v2.1.20 (2018-09-05)
-
-* No additional changes from v2.1.20-beta.
-
-
-## v2.1.20-beta (2018-09-02)
-
-* Monitoring:
- * Fix: Fetch messing season info when "Hide Seasons" is enabled for a show.
- * Fix: Video and Audio details sometimes missing on activity cards.
-* Notifications:
- * New: Added UTC timestamp to notification parameters. (Thanks @samwiseg00)
- * New: Added TAUTULLI_PUBLIC_URL to script environment variables. (Thanks @samwiseg00)
-* UI:
- * Change: Automatically redirect '/' to HTTP root if enabled.
-* API:
- * New: Added return_hash parameter to pms_image_proxy command.
- * New: Added session_id parameter to get_activity command.
-* Other:
- * Change: Linux systemd startup script to use the "tautulli" group permission. (Thanks @samwiseg00)
-
-
-## v2.1.19-beta (2018-08-19)
-
-* Notifications:
- * New: Added Webhook notification agent.
- * Fix: Scripts failing due to unicode characters in substituted script arguments.
- * Change: Ability to override PYTHONPATH for scripts.
- * Remove: Notify My Android notification agent.
-* Newsletters:
- * New: Added option for threaded newsletter emails.
- * Fix: Missing space in newsletter format.
-* UI:
- * New: Added Windows system tray icon.
- * Fix: Plex OAuth not working with Plex remote access disabled. (Thanks @samwiseg00)
-* API:
- * Fix: SQL command creating a database backup every time. (Thanks @samwiseg00)
-
-
-## v2.1.18 (2018-07-27)
-
-* Monitoring:
- * Fix: Progress bar on activity cards showing incorrect 100% when starting a stream.
-* Notifications:
- * Fix: Notification text boxes scrolling to top when inputting text.
- * Change: Skip formatting invalid notification parameters instead of returning default text.
-* UI:
- * Fix: Padding around search bar causing the navigation bar to break on smaller screens.
-
-
-## v2.1.17-beta (2018-07-22)
-
-* Notifications:
- * Change: Use default selected stream for media info in notifications.
-* UI:
- * New: Automatically discover localhost Plex servers in server selection dropdown.
- * Change: Save Datatables state indefinitely.
-
-
-## v2.1.16-beta (2018-07-06)
-
-* Monitoring:
- * Fix: Plex server not detected as down during sudden network loss.
-* Notifications:
- * Fix: Incorrect rounding of percentages in some cases.
- * Fix: Incorrect stream duration value for playback start notifications.
- * New: Added critic rating parameter for Rotten Tomatoes ratings.
-* Newsletters:
- * Fix: Typo in "seasons" when there is only one additional season.
-* UI:
- * New: Added ability to use Plex OAuth to login to Tautulli.
-* API:
- * Fix: Unicode characters causing get_logs command to return bad data.
- * New: Added rating_image and audience_rating_image to get_activity and get_metadata commands.
-
-
-## v2.1.15-beta (2018-07-01)
-
-* Monitoring:
- * Fix: Progress percent displaying NaN for live TV.
- * Fix: Unable to terminate sessions with unicode characters in the message.
- * Change: Tizen platform to display the Samsung icon.
-* Notifications:
- * New: Added PYTHONPATH to script environment variables so scripts can automatically import from Tautulli libraries.
- * Fix: Proper handling of unicode script arguments.
- * Fix: Incorrect TAUTULLI_URL environment variable if the HTTP host setting is changed.
- * Fix: Email addresses selectize box not expanding.
-* Newsletters:
- * Change: HTTPS URLS for images hosted on tautulli.com.
-* Graphs:
- * Fix: SD resolution sometimes not grouped together.
-
-
-## v2.1.14 (2018-06-21)
-
-* Notifications:
- * Fix: Parsing script arguments in quotes.
-* UI:
- * Fix: Slow loading due to Font Awesome 5 javascript.
- * Change: Play counts on user an library pages now respect the history grouping setting.
-* API:
- * New: Added optional grouping parameter to user and library watch statistics.
-
-
-## v2.1.13 (2018-06-16)
-
-* Monitoring:
- * Fix: Soft crash when viewing photos not in an album.
-* Notifications:
- * New: Added current date and time notification parameters.
-* UI:
- * New: Added support page with embedded Discord chat using WidgetBot.
-
-
-## v2.1.12 (2018-06-08)
-
-* Notifications:
- * Change: Blank notification link source means disabled instead of default.
-* Newsletters:
- * New: Make collection tags available in the raw newsletter data for custom templates.
-* API:
- * New: Ability to terminate a stream using the session key.
-
-
-## v2.1.11-beta (2018-06-02)
-
-* Monitoring:
- * Fix: Activity progress bar not updating in some cases.
- * Fix: Monitory Remote Access setting disabled due to Plex Media Server API changes.
- * Change: Improved logic for grouping history items without being successive plays.
-* Notifications:
- * New: Added filename to notification parameters.
-* Other:
- * Fix: Update metadata failing for tracks without track numbers.
-
-
-## v2.1.10-beta (2018-05-28)
-
-* Monitoring:
- * Fix: Improved monitoring of live tv sessions.
- * Change: Use track artist instead of album artist.
-* Notifications:
- * New: Added timestamp to Discord notification embeds. (Thanks @samwiseg00)
- * New: Enable notifications for "clip" media types.
- * Fix: Actually add the "live" notification parameter.
- * Change: Update Twitter for 280 characters.
- * Change: Use HTTPS url for Cloudinary images.
-* Newsletters:
- * Fix: Artist summaries not showing up on newsletter cards.
- * Change: Do not send the newsletter if the template fails to render.
-
-
-## v2.1.9 (2018-05-21)
-
-* Notifications:
- * New: Added "live" to notification parameters.
-
-
-## v2.1.8-beta (2018-05-19)
-
-* Newsletters:
- * New: Added authentication options for self-hosted newsletters.
- * Change: Check if the Tautulli footer has been removed in custom newsletter templates.
-* Notifications:
- * Fix: Cloudinary images not working for Twitter notifications.
-* API:
- * Fix: Return proper HTTP status codes for errors.
-
-
-## v2.1.7-beta (2018-05-13)
-
-* Newsletters:
- * New: Option to toggle between inline or internal CSS style templates.
- * New: Button to delete all uploaded images from Imgur/Cloudinary.
- * Fix: Long titles overflowing the newsletter cards.
- * Change: Self-hosted images on newsletters to use the /image endpoint instead of proxying through /newsletter/image.
- * Change: Strip whitespace from newsletter for smaller file size before sending to email.
-* API:
- * New: Added get_stream_data command to API.
- * New: Added newsletter API commands to documentation.
-
-
-## v2.1.6-beta (2018-05-09)
-
-* Newsletters:
- * Change: Setting to specify static URL ID name instead of using the newsletter ID number.
- * Change: Reorganize newsletter config options.
-
-
-## v2.1.5-beta (2018-05-07)
-
-* Newsletters:
- * New: Added setting for a custom newsletter template folder.
- * New: Added option to enable static newsletter URLs to retrieve the last sent scheduled newsletter.
- * New: Added ability to change the newsletter output directory and filenames.
- * New: Added option to save the newsletter file without sending it to a notification agent.
- * Fix: Check for disabled image hosting setting.
- * Fix: Cache newsletter images when refreshing the page.
- * Fix: Refresh image from the Plex server when uploading to image hosting.
- * Change: Allow all image hosting options with self-hosted newsletters.
-* UI:
- * Change: Don't retrieve recently added on the homepage if the Plex Cloud server is sleeping.
-* Other:
- * Fix: Imgur database upgrade migration.
-
-
-## v2.1.4 (2018-05-05)
-
-* Newsletters:
- * Fix: Newsletter URL without an HTTP root.
-
-
-## v2.1.3-beta (2018-05-04)
-
-* Newsletters:
- * Fix: HTTP root doubled in newsletter URL.
- * Fix: Configuration would not open with failed hostname resolution.
- * Fix: Schedule one day off when using weekday names in cron.
- * Fix: Images not refreshing when changed in Plex.
- * Fix: Cloudinary upload with non-ASCII image titles.
-* Other:
- * Fix: Potential XSS vulnerability in search.
-
-
-## v2.1.2-beta (2018-05-01)
-
-* Newsletters:
- * New: Added Cloudinary option for image hosting.
-* Notifications:
- * New: Added Message-ID to Email header (Thanks @Dam64)
- * Fix: Posters not showing up on Twitter with self-hosted images.
- * Fix: Incorrect action parameter for new device notifications.
- * Change: Hardcode Pushover sound list instead of fetching the list every time.
-* API:
- * Fix: Success result for empty response data.
- * Change: Do not send notification when checking for Tautulli updates via the API.
-
-
-## v2.1.1-beta (2018-04-11)
-
-* Monitoring:
- * Fix: Live TV transcoding showing incorrectly as direct play.
-* Newsletters:
- * New: Added week number as parameter. (Thanks @samip5)
- * Fix: Fallback to cover art on the newsletter cards.
- * Change: Option to set newsletter time frame by calendar days or hours.
-* Notifications:
- * New: Added week number as parameter. (Thanks @samip5)
-* Other:
- * New: Added plexapi library for custom scripts.
-
-
-## v2.1.0-beta (2018-04-07)
-
-* Newsletters:
- * New: A completely new scheduled newsletter system.
- * Beautiful HTML formatted newsletter for recently added movies, TV shows, or music.
- * Send newsletters on a daily, weekly, or monthly schedule to your users.
- * Customize the number of days of recently added content and the libraries to include on the newsletter.
- * Add a custom message to be included on the newsletter.
- * Option to either send an HTML formatted email, or a link to a self-hosted newsletter on your own domain to any notification agent.
-* Notifications:
- * New: Ability to use self-hosted images on your own domain instead of using Imgur.
-
-
-## v2.0.28 (2018-04-02)
-
-* Monitoring:
- * Fix: Homepage activity header text.
-
-
-## v2.0.27 (2018-04-02)
-
-* Monitoring:
- * Change: Move activity refresh interval setting to the settings page.
-
-
-## v2.0.26-beta (2018-03-30)
-
-* Monitoring:
- * New: Setting to change the refresh interval on the homepage.
- * Fix: Identify extras correctly on the activity cards.
-* Notifications:
- * Change: Send Telegram image and text separately if the caption is longer than 200 characters.
-* UI:
- * Fix: Error when clicking on synced playlist links.
-
-
-## v2.0.25 (2018-03-22)
-
-* Monitoring:
- * Fix: Websocket not reconnecting causing activity monitoring and notifications to not work.
- * Fix: Error checking for synced streams without Plex Pass.
-
-
-## v2.0.24 (2018-03-18)
-
-* Monitoring:
- * Fix: Fix stream data not showing for history recorded before v2.
-* Notifications:
- * Fix: Set all environment variables for scripts.
- * Change: Moved all notification agent instructions to the wiki.
- * Change: XBMC notification agent renamed to Kodi.
- * Change: OSX Notify notification agent renamed to macOS Notification Center.
-
-
-## v2.0.23-beta (2018-03-16)
-
-* Monitoring:
- * Fix: Certain transcode stream showing incorrectly as direct play in history. Fix is not retroactive.
-* Notifications:
- * New: Added season/episode/album/track count to notification parameters.
- * New: Added "Value 3" setting for IFTTT notifications.
- * New: Set PLEX_URL, PLEX_TOKEN, TAUTULLI_URL, and TAUTULLI_APIKEY environment variables for scripts.
- * Fix: Notifications failing to send with invalid custom conditions json.
- * Fix: Email notifications failing with unicode username/passwords.
- * Change: Facebook Graph API version updated to v2.12.
-* UI:
- * New: Show the Plex Server URL in the settings.
- * Fix: Incorrect info displayed in the Tautulli login logs.
-* API:
- * Fix: API returning empty data if a message was in the original data.
- * Change: get_server_id command returns json instead of string.
-* Other:
- * Fix: Forgot git pull when changing branches in the web UI.
-
-
-## v2.0.22 (2018-03-10)
-
-* Tautulli v2 release!
-
-
-## v2.0.22-beta (2018-03-09)
-
-* Notifications:
- * Fix: Pushover notifications failing with priority 2 is set.
- * Fix: Expanding selectize box for some notification agent settings.
-* Other:
- * Fix: Update check failing when an update is available.
- * Fix: Item count incorrect for photo libraries.
-
-
-## v2.0.21-beta (2018-03-04)
-
-* Monitoring:
- * New: Identify if a stream is using Plex Relay.
- * Change: Don't ping the Plex server if the websocket is disconnected.
-* Notifications:
- * Fix: Pause/resume state not being sent correctly in some instances.
-* Other:
- * New: Add Patreon donation method.
- * Fix: Catch failure to send analytics.
- * Fix: IP address connection lookup error when the country is missing.
- * Change: Updated all init scripts to Tautulli.
- * Change: Move database to tautulli.db.
- * Change: Move logs to tautulli.log.
- * Change: Move startup file to Tautulli.py.
-
-
-## v2.0.20-beta (2018-02-24)
-
-* Notifications:
- * New: Add poster support for Pushover notifications.
- * New: Add poster support for Pushbullet notifications.
- * Fix: Incorrect Plex/Tautulli update notification parameter types.
- * Change: Poster and text sent as a single message for Telegram.
- * Change: Posters uploaded directly to Telegram without Imgur.
-* UI:
- * New: Add "Delete" button to synced items table on user pages.
- * Fix: Button spacing/positioning on mobile site.
- * Fix: Music statistic cards not using the fallback thumbnail.
- * Fix: Logo not showing up when using an SVG.
- * Change: Graphs now respect the "Group History" setting.
-* API:
- * New: Add grouping to graph API commands.
-* Other:
- * New: Added Google Analytics to collect installation metrics.
- * Fix: Reconnecting to the Plex server when server settings are not changed.
-
-
-## v2.0.19-beta (2018-02-16)
-
-* Monitoring:
- * Fix: Connect to Plex Cloud server without keeping it awake.
- * Fix: Reconnect to Plex Cloud server after the server wakes up from sleeping.
-* Notifications:
- * Fix: Don't send Plex Server Up/Down notifications when Tautulli starts up.
- * Change: Better handling of Watched notifications.
-* UI:
- * New: Added Plex server selection dropdown in the settings.
- * Fix: Libraries and Users tables not refreshing properly.
- * Change: Updated the masked info shown to guests.
- * Change: Check for updates without refreshing to the homepage.
-* API:
- * New: Added update_check to the API.
- * Fix: delete_media_info_cache not deleting the cache.
- * Change: Document "refresh" parameter for get_library_media_info.
-* Other:
- * Fix: Show the full changelog since v2 on a fresh install.
-
-
-## v2.0.18-beta (2018-02-12)
-
-* Notifications:
- * Fix: Default text for Tautulli update notifications using the wrong parameter.
- * Fix: Playback pause and resume notifications only triggering once.
- * Change: Negative operators for custom conditions now use "and" instead of "or".
-* UI:
- * New: Added button to delete the 3rd party lookup info from the info pages.
- * Fix: Missing host info in the login logs when logging in using Firefox.
- * Change: Cleaned up settings. Advanced settings are now hidden behind a toggle.
-* API:
- * New: Updated API documentation for v2.
-* Other:
- * Fix: DeprecationWarning when using HTTPS with self-signed certificates.
- * Change: Deleting the Imgur poster URL also deletes the poster from Imgur (only available for new uploads).
- * Change: GitHub repository moved to Tautulli/Tautulli. Old GitHub URLs will still work.
-
-
-## v2.0.17-beta (2018-02-03)
-
-* Notifications:
- * Fix: Unable to use @ mentions tags for Discord and Slack.
- * New: Added Zapier notification agent.
-* API:
- * Fix: get_synced_items returning no results.
- * Fix: get_library_media_info returning incorrect media type for photo albums.
- * Fix: get_library_media_info not being able to sort by title.
-
-
-## v2.0.16-beta (2018-01-30)
-
-* Monitoring:
- * Fix: Timestamp sometimes showing as "0:60" on the activity cards.
- * Fix: Incorrect session information being shown for playback of synced content.
- * Fix: Sessions not being stopped when "Playback Stopped" notifications were enabled.
-* UI:
- * Fix: Stream resolution showing up as "unknown" on the graphs.
- * New: Added user filter to the Synced Items table.
-* Other:
- * New: Option to use the Plex server update channel when checking for updates.
-
-
-## v2.0.15-beta (2018-01-27)
-
-* Monitoring:
- * Fix: Live TV sessions not being stopped in History.
- * Fix: Stream location showing as "unknown" on the activity cards.
- * New: Improved Live TV details on the activity cards.
-* Notifications:
- * New: Added labels and collections to notification parameters.
- * New: Added more server details to notification parameters.
- * Change: Renamed "PlexPy" update notification parameters to "Tautulli".
-
-
-## v2.0.14-beta (2018-01-20)
-
-* Monitoring:
- * Change: Added "Cellular" bandwidth to "WAN" in activity header.
-* Notifications:
- * Fix: Plex Web URL for tracks now go to the album page.
- * Fix: Recently added notifications being sent for the entire library when DVR EPG data was refreshed.
- * Fix: Notifier settings not loading with an apostrophe in the custom condition values.
- * Fix: Custom email addresses not being saved when closing the notifier settings.
- * Change: Re-enabled Browser notifications.
- * Change: Renamed "PlexPy" update notification parameters to "Tautulli".
- * Change: Emails no longer automatically insert HTML line breaks.
- * Change: "Date" header added to email notifications.
-* UI:
- * Change: Show all changelogs since the previous version when updating.
-
-
-## v2.0.13-beta (2018-01-13)
-
-* Notifications:
- * New: Added dropdown selection for email addresses of shared users.
- * New: Added more notification options for Join.
- * Change: Show "OR" between custom condition values.
-* Other:
- * New: Use JSON Web Tokens for authentication. Login now works with SSO applications.
- * New: Allow the Plex server admin to login as a Tautulli admin using their Plex.tv account.
-
-
-## v2.0.12-beta (2018-01-07)
-
-* Notifications:
- * Fix: Incorrect Plex URL parameter value.
- * Change: Custom condition logic is now optional. An implicit "and" is applied between all conditions if the logic is blank.
-* UI:
- * New: Added separate required LAN/WAN bandwidth in the activity header.
-* API:
- * Fix: Notify API command not sending notifications.
-
-
-## v2.0.11-beta (2018-01-05)
-
-* Notifications:
- * Fix: Some notification parameters showing up blank.
-* UI:
- * Fix: Stream data showing up as "None" for pre-v2 history.
-* Other:
- * Fix: Ability to login using the hashed password.
-
-
-## v2.0.10-beta (2018-01-04)
-
-* Monitoring:
- * Fix: HW transcoding indicator on activity cards incorrect after refreshing.
-* Notifications:
- * Remove: Notification toggles from library and user settings. Use custom conditions to filter out notifications instead.
-* UI:
- * Fix: Incorrect examples for some date format options. Also added a few missing date format options. (Thanks @Tommatheussen)
-
-
-## v2.0.9-beta (2018-01-03)
-
-* Notifications:
- * Fix: Notifications failing due to incorrect season/episode number types.
-
-
-## v2.0.8-beta (2018-01-03)
-
-* Monitoring:
- * Fix: Incorrect HW transcoding indicator on activity cards.
- * Fix: Long product/player names hidden behind platform icon on activity cards.
-* Notifications:
- * Fix: Notifications failing due to some missing notification parameters.
-
-
-## v2.0.7-beta (2018-01-01)
-
-* Monitoring:
- * Fix: Incorrect LAN/WAN location on activity cards.
- * Fix: Paused time not recording correctly.
-* Other:
- * Fix: Failed to retrieve synced items when there are special characters in the title.
-
-
-## v2.0.6-beta (2017-12-31)
-
-* Monitoring:
- * New: Beta Plex Cloud support.
- * Fix: Update paused time while still paused.
-* UI:
- * Fix: Stopped time showing as "n/a" on history table.
-
-
-## v2.0.5-beta (2017-12-31)
-
-* Monitoring:
- * Fix: IPv6 addresses overflowing on the activity cards.
-* Notifications:
- * Fix: Error sending Join notifications.
-* UI:
- * New: Added total required bandwidth in the activity header.
-* Other:
- * Fix: Failing to retrieve releases from GitHub.
- * Fix: CherryPy SSL connection warning. (Thanks @felixbuenemann)
- * Fix: Sanitize script output in logs.
- * Change: Login sessions persists across server restarts.
-
-
-## v2.0.4-beta (2017-12-29)
-
-* Monitoring:
- * Fix: Current activity cards duplicating on the homepage.
-* Notifications:
- * Fix: Concurrent stream notifications being sent when there is an incorrect number of streams.
-* UI:
- * New: Info pages for collections.
- * New: Button to test Plex Web URL override.
- * Fix: Library and User pages return to the correct tab when pressing back.
-
-
-## v2.0.3-beta (2017-12-25)
-
-* Monitoring:
- * Fix: Missing sync ID error causing logging to crash.
- * Fix: Incorrect optimized version title column name causing logging to crash.
-* Notifications:
- * Fix: Report correct beta version for Tautulli update notifications.
-* UI:
- * Fix: Missing CSS for stream info modal.
-
-
-## v2.0.2-beta (2017-12-24)
-
-* Monitoring:
- * Fix: Websocket connection fails to start with existing streams when upgrading to v2.
- * Fix: Long request URI for refreshing current activity on the homepage.
- * Fix: Missing subtitle database columns.
- * Fix: Details for synced and optimized versions reporting incorrectly.
-* Notifications:
- * Fix: Recently added notifications sending for previously added items. It is now limited to past 24 hours only.
- * Fix: Source video/audio/subtitle parameters showing up as blank.
- * Change: Validate condition logic when saving a notification agent.
-* API:
- * Change: API is enabled by default on new installs.
-* UI:
- * New: Add logo svg files. (Thanks @Fish2)
- * New: Updated stream info modal.
- * Change: Media info tables sort by sort title instead of title.
-* Other:
- * Fix: Updating library IDs message on libraries page.
- * Fix: Wtched percentage settings not saving after restart.
- * Remove: Video Preview Thumbnails setting no longer used.
- * Change: Add back HTTP Proxy setting under the Web Interface settings tab.
- * Change: "Group Table and Watch Statistics History" and "Current Activity in History Tables" enabled by default on new installs.
-
-
-## v2.0.1-beta (2017-12-19)
-
-* Monitoring:
- * Fix: Missing video_height database column.
-* Notifications:
- * Fix: Join API key.
- * Change: Temporarily disable broken browser notifications.
-* UI:
- * Fix: Incorrect fallback image for music watch statistics.
-
-
-## v2.0.0-beta (2017-12-18)
-
-* Monitoring:
- * New: More detailed stream info including subtitles, bitrates, bandwidth, and quality profiles.
- * New: Terminate sessions from the current activity (Plex Pass only).
- * Change: Monitoring uses websockets only now.
-* Notifications:
- * New: Completely new notification system.
- * Allow adding multiple of the same notification agent and/or duplicating existing notification agents.
- * Each notification agent has it's own notification triggers and notification text.
- * Notification agents are stored in the database instead of the config file. Some notification configurations may have been lost in the transfer. Sorry.
- * New: Discord notification agent.
- * New: GroupMe notification agent.
- * New: MQTT notification agent.
- * New: More customizable info cards for Discord, Facebook, Hipchat, and Slack.
- * New: Script notifications are configured individually per script with separate arguments for each notification action.
- * New: Icon and duration options for Plex Home Theater and XBMC notifications.
- * New: Notification for Tautulli updates.
- * New: Added <show>, <season>, <artist>, and <album> notification exclusion tags.
- * <tv> is renamed to <episode>, and <music> is renamed to <track>
- * New: Preview notification text in the notifier settings.
- * New: Properly group recently added notifications when adding a batch of media.
- * The {season_num}, {episode_num}, and {track_num} parameters will be substituted with the range (e.g. 06-10)
- * New: Option to group recently added notifications by show/artist or season/album.
- * New: More detailed media info (video, audio, subtitle, file, etc.) notification options available.
- * New: Added notification text modifiers to change case and slice lists.
- * New: Custom notification conditions using parameters to filter notifications.
- * New: Button to trigger manual recently added notifications from the info pages.
- * New: Lookup TVMaze and TheMovieDatabase links.
- * Remove: The shared Imgur client ID has been removed. Please enter your own client ID in the settings to continue uploading posters.
- * Change: Notifications with a blank subject or body will no longer be sent at all.
- * Change: Line breaks inserted automatically in Email notification text.
- * Change: Notifications for season/episodes now use the season poster and album/track now use the album art.
- * Change: The {action} parameter is no longer capitalized.
- * Change: Notification success or failure added to notification logs.
-* API:
- * New: Added check for Plex Media Server updates with the Tautulli API.
- * New: Added show/artist and episode/track titles to the "get_history" API command.
- * New: Added manual trigger for recently added notifications.
- * Remove: Defunct API v1.
- * Change: The "notify" API command now requires a notifier_id instead of an agent_id. The notifier ID can be found in the settings for each notification agent.
- * Change: The returned json for the "get_metadata" API command is no longer nested under the "metadata" key.
-* UI:
- * New: Updated current activity, watch statistics, and library statistics cards on the home page.
- * New: Toggle stats and recently added categories directly on the homepage.
- * New: Ability to delete synced items from the Synced Items page.
- * New: Updated platform icons to a uniform style.
- * Remove: Setting for number of top items for watch statistic cards.
- * Change: Separate API and websocket logs.
-* Android Tautulli Remote App (beta):
- * New: Download the Tautulli Remote app on Google Play!
- * Link the app using a QR code in the Tautulli settings.
- * New: Push notifications directly to the Tautulli Remote app.
-* Other:
- * New: Option to update Tautulli automatically when an update is available.
- * New: Option to switch the tracking git remote and branch.
- * New: Option to change the path to your git environment variable.
- * New: Option to use a HTTPS certificate chain.
- * New: Option to override the Plex Web URL for click-through links.
- * New: Separate watched percentage for movies, episodes, and tracks.
- * New: Show changelog after updating Tautulli.
- * New: Support for IPv6 geolocation lookup.
- * New: Download the Tautulli configuration file or database from the settings.
- * New: Log failed Tautulli login attempts.
- * Fix: Modal popups not working on mobile Safari.
- * Fix: Prevent password managers from autofilling the password in the settings.
- * Fix: Unable to search with special characters.
- * Remove: Some unused options have been removed from the settings page.
- * Change: The database schema has been changed, and reverting back to PlexPy v1 will not work.
- * Change: The dev branch has been depreciated. A master/beta/nightly system is used instead.
-
-
-## v1.4.25 (2017-10-02)
-
-* Fix: Tab instead of spaces preventing startup.
-
-
-## v1.4.24 (2017-10-01)
-
-* Fix: New Plex Web urls. (Thanks @Joshua1337)
-* Fix: Fallback to the product name if the player title is blank.
-* New: Added no forking option to startup arguments. (Thanks @Vashypooh)
-
-
-## v1.4.23 (2017-09-30)
-
-* Fix: Playstation 4 platform name.
-* Fix: PlexWatch and Plexivity import.
-* Fix: Pushbullet authorization header.
-
-
-## v1.4.22 (2017-08-19)
-
-* Fix: Cleaning up of old config backups.
-* Fix: Temporary fix for incorrect source media info.
-
-
-## v1.4.21 (2017-07-01)
-
-* New: Updated donation methods.
-
-
-## v1.4.20 (2017-06-24)
-
-* New: Added platform image for the PlexTogether player.
-* Fix: Corrected math used to calculate human duration. (Thanks @senepa)
-* Fix: Sorting of 4k in media info tables.
-* Fix: Update file sizes when refreshing media info tables.
-* Fix: Support a custom port for Mattermost (Slack) notifications.
-
-
-## v1.4.19 (2017-05-31)
-
-* Fix: Video resolution not showing up for transcoded streams on PMS 1.7.x.
-
-
-## v1.4.18 (2017-04-22)
-
-* New: Added some new Arnold quotes. (Thanks @senepa)
-* Fix: Text wrapping in datatable footers.
-* Fix: API command get_apikey. (Thanks @Hellowlol)
-
-
-## v1.4.17 (2017-03-04)
-
-* New: Configurable month range for the Plays by month graph. (Thanks @Pbaboe)
-* New: Option to chanage the week to start on Monday for the the Plays by day of week graph. (Thanks @Pbaboe)
-* Fix: Invalid iOS icon file paths. (Thanks @demonbane)
-* Fix: Plex Web 3.0 URLs on info pages and notifications.
-* Fix: Update bitcoin donation link to Coinbase.
-* Fix: Update init scripts. (Thanks @ampsonic)
-
-
-## v1.4.16 (2016-11-25)
-
-* Fix: Websocket for new json response on PMS 1.3.0.
-* Fix: Update stream and transcoder tooltip percent.
-* Fix: Typo in the edit user modal.
-
-
-## v1.4.15 (2016-11-11)
-
-* New: Add stream and transcoder progress percent to the current activity tooltip.
-* Fix: Refreshing of images in the cache when authentication is disabled.
-* Fix: Plex.tv authentication with special characters in the username or password.
-* Fix: Line breaks in the info page summaries.
-* Fix: Redirect to the proper http root when restarting.
-* Fix: API result type and responses showing incorrectly. (Thanks @Hellowlol)
-* Change: Use https URL for app.plex.tv.
-* Change: Show API traceback errors in the browser with debugging enabled. (Thanks @Hellowlol)
-* Change: Increase table width on mobile devices and max width set to 1750px. (Thanks @XusBadia)
-
-
-## v1.4.14 (2016-10-12)
-
-* Fix: History logging locking up if media is removed from Plex before PlexPy can save the session.
-* Fix: Unable to save API key in the settings.
-* Fix: Some typos in the settings. (Thanks @Leafar3456)
-* Change: Disable script timeout by setting timeout to 0 seconds.
-
-
-## v1.4.13 (2016-10-08)
-
-* New: Option to set the number of days to keep PlexPy backups.
-* New: Option to add a supplementary url to Pushover notifications.
-* New: Option to set a timeout duration for script notifications.
-* New: Added flush temporary sessions button to extra settings for emergency use.
-* New: Added pms_image_proxy to the API.
-* Fix: Insanely long play durations being recorded when connection to the Plex server is lost.
-* Fix: Script notification output not being sent to the logger.
-* Fix: New libraries not being added to homepage automatically.
-* Fix: Success message shown incorrectly when sending a test notification.
-* Fix: PlexPy log level filter not working.
-* Fix: Admin username not shown in login logs.
-* Fix: FeatHub link in readme document.
-* Change: Posters disabled by default for all notification agents.
-* Change: Disable manual changing of the PlexPy API key.
-* Change: Force refresh the Plex.tv token when fetching a new token.
-* Change: Script notifications run in a new thread with the timeout setting.
-* Change: Watched percent moved to general settings.
-* Change: Use human readable file sizes to the media info tables. (Thanks @logaritmisk)
-* Change: Update pytz library.
-
-
-## v1.4.12 (2016-09-18)
-
-* Fix: PMS update check not working for MacOSX.
-* Fix: Square covers for music stats on homepage.
-* Fix: Card width on the homepage for iPhone 6/7 Plus. (Thanks @XusBadia)
-* Fix: Check for running PID when starting PlexPy. (Thanks @spolyack)
-* Fix: FreeBSD service script not stopping PlexPy properly.
-* Fix: Some web UI cleanup.
-* Change: GitHub repostitory moved.
-
-
-## v1.4.11 (2016-09-02)
-
-* Fix: PlexWatch and Plexivity import errors.
-* Fix: Searching in history datatables.
-* Fix: Notifications not sending for Local user.
-
-
-## v1.4.10 (2016-08-15)
-
-* Fix: Missing python ipaddress module preventing PlexPy from starting.
-
-
-## v1.4.9 (2016-08-14)
-
-* New: Option to include current activity in the history tables.
-* New: ISP lookup info in the IP address modal.
-* New: Option to disable web page previews for Telegram notifications.
-* Fix: Send correct JSON header for Slack/Mattermost notifications.
-* Fix: Twitter and Facebook test notifications incorrectly showing as "failed".
-* Fix: Current activity progress bars extending past 100%.
-* Fix: Typo in the setup wizard. (Thanks @wopian)
-* Fix: Update PMS server version before checking for a new update.
-* Change: Compare distro and build when checking for server updates.
-* Change: Nicer y-axis intervals when viewing "Play Duration" graphs.
-
-
-## v1.4.8 (2016-07-16)
-
-* New: Setting to specify PlexPy backup interval.
-* Fix: User Concurrent Streams Notifications by IP Address checkbox not working.
-* Fix: Substitute {update_version} in fallback PMS update notification text.
-* Fix: Check version for automatic IP logging setting.
-* Fix: Use library refresh interval.
-
-
-## v1.4.7 (2016-07-14)
-
-* New: Use MaxMind GeoLite2 for IP address lookup.
- * Note: The GeoLite2 database must be installed from the settings page.
-* New: Check for Plex updates using plex.tv downloads instead of the server API.
- * Note: Check for Plex updates has been disabled and must be re-enabled in the settings.
-* New: More notification options for Plex updates.
-* New: Notifications for concurrent streams by a single user.
-* New: Notifications for user streaming from a new device.
-* New: HipChat notification agent. (Thanks @aboron)
-* Fix: Username showing as blank when friendly name is blank.
-* Fix: Direct stream count wrong in the current activity header.
-* Fix: Current activity reporting direct stream when reducing the stream quality switches to transcoding.
-* Fix: Apostophe in an Arnold quote causing the shutdown/restart page to crash.
-* Fix: Disable refreshing posters in guest mode.
-* Fix: PlexWatch/Plexivity import unable to select the "grouped" database table.
-* Change: Updated Facebook notification instructions.
-* Change: Subject line optional for Join notifications.
-* Change: Line break between subject and body text instead of a colon for Facebook, Slack, Twitter, and Telegram.
-* Change: Allow Mattermost notifications using the Slack config.
-* Change: Better formatting for Slack poster notifications.
-* Change: Telegram only notifies once instead of twice when posters are enabled.
-* Change: Host Open Sans font locally instead of querying Google Fonts.
-
-
-## v1.4.6 (2016-06-11)
-
-* New: Added User and Library statistics to the API.
-* New: Ability to refresh individual poster images without clearing the entire cache. (Thanks @Hellowlol)
-* New: Added {added_date}, {updated_date}, and {last_viewed_date} to metadata notification options.
-* New: Log level filter for Plex logs. (Thanks @sanderploegsma)
-* New: Log level filter for PlexPy logs.
-* New: Button to download Plex logs directly from the web interface.
-* New: Advanced setting in the config file to change the number of Plex log lines retrieved.
-* Fix: FreeBSD and FreeNAS init scripts to reflect the path in the installation guide. (Thanks @nortron)
-* Fix: Monitoring crashing when failed to retrieve current activity.
-
-
-## v1.4.5 (2016-05-25)
-
-* Fix: PlexPy unable to start if failed to get shared libraries for a user.
-* Fix: Matching port number when retrieving the PMS url.
-* Fix: Extract mapped IPv4 address in Plexivity import.
-* Change: Revert back to internal url when retrieving PMS images.
-
-
-## v1.4.4 (2016-05-24)
-
-* Fix: Image queries crashing the PMS when playing clips from channels.
-* Fix: Plexivity import if IP address is missing.
-* Fix: Tooltips shown behind the datatable headers.
-* Fix: Current activity instances rendered in a random order causing them to jump around.
-
-
-## v1.4.3 (2016-05-22)
-
-* Fix: PlexPy not starting without any authentication method.
-
-
-## v1.4.2 (2016-05-22)
-
-* New: Option to use HTTP basic authentication instead of the HTML login form.
-* Fix: Unable to save settings when enabling the HTTP proxy setting.
-* Change: Match the PMS port when retrieving the PMS url.
-
-
-## v1.4.1 (2016-05-20)
-
-* New: HTTP Proxy checkbox in the settings. Enable this if using an SSL enabled reverse proxy in front of PlexPy.
-* Fix: Check for blank username/password on login.
-* Fix: Persist current activity artwork blur across refreshes when transcoding details are visible.
-* Fix: Send notifications to multiple XBMC/Plex Home Theater devices.
-* Fix: Reset PMS identifier when clicking verify server button in settings.
-* Fix: Crash when trying to group current activity session in database.
-* Fix: Check current activity returns sessions when refreshing.
-* Fix: Logs sorted out of order.
-* Fix: Resolution reported incorrectly in the stream info modal.
-* Fix: PlexPy crashing when hashing password in the config file.
-* Fix: CherryPy doubling the port number when accessing PlexPy locally with http_proxy enabled.
-* Change: Sort by most recent for ties in watch statistics.
-* Change: Refresh Join devices when changing the API key.
-* Change: Format the Join device IDs.
-* Change: Join notifications now sent with Python Requests module.
-* Change: Add paging for recently added in the API.
-
-
-## v1.4.0 (2016-05-15)
-
-* New: An HTML form login page with sessions support.
-* New: Guest access control for shared users using Plex.tv authentication.
- * Enable the option in the settings and toggle guest access per user from Users > Edit mode.
- * Guests can only view their own user data. Other user info is removed/masked.
- * Guests can only view media from libraries that are shared with them (content rating and label filters are respected). Other libraries are removed/masked.
- * All settings and admin controls are restricted from guests.
- * All current activity on the server is shown, but with masked user/metadata info.
-* New: Login logs table on the User and Logs pages.
-* New: Filter the history table by user.
-* New: Filter the graphs by user. (Thanks @Otger)
-* New: Option to hash the admin passowrd in the config file.
-* New: Options to enable/disable/rearrange each section on the homepage
-* New: Toggle media types for recently added items on the homepage.
-* New: Option to enter an Imgur API client ID for uploading posters.
- * Note: The shared Imgur client id will be removed in a future PlexPy update! Please enter your own client id in the settings to continue uploading posters!
-* New: HTML support for Email.
-* New: Posters and HTML support for Telegram.
-* New: Poster support for Slack.
-* New: Poster support for Twitter.
-* New: Re-added Plex Home Theater notification agent.
-* New: Browser notification agent (experimental).
-* New: Added {plex_url} as a notification option.
-* New: Added transcode decision to the activity header.
-* New: Documentation for APIv2 (see API.md for details).
-* New: Import a Plexivity database into PlexPy.
-* New: Prettier fallback image for art/episodes.
-* New: Prettier confirm modal dialogues.
-* New: Cache images to reduce Plex API calls. This can be disabled in the under Settings > Extra Settings. (Thanks @Hellowlol)
-* New: Scheduled backups of the config file.
-* New: Button to clear the PlexPy cache/images in the settings.
-* New: Button to manually backup the PlexPy database/config in the settings.
-* New: Button to clear the PlexPy logs in the settings.
-* New: Button to download PlexPy log file on the Logs tab.
-* New: Advanced setting in config file to change the Plex API timeout value.
-* Fix: Mixed content HTTP request in settings (for reverse proxies with SSL).
-* Fix: Rename recently "watched" music to "played".
-* Change: Current activity details now persists across refreshes.
-* Change: Smoother transitions between preview thumbnails in current activity.
-* Change: Datatables now display all columns and scroll horizontally on smaller screens.
-* Change: Ability to change the base URL for reverse proxies in the web interface.
-* Change: Added a "Verify Server" button in the settings.
-* Change: Added request status code in the logs for notifer errors.
-* Change: Remove in-memory logs and read lines from log file instead. (Thanks @Hellowlol)
-* Change: Limit number of failed attempts to write sessions to history. Default is 5 attempts.
-* Change: A bunch of UI updates.
-* Change: A bunch of backend code cleanup.
-* Removed: All unused Python packages.
-
-
-## v1.3.16 (2016-05-01)
-
-* Fix: Viewing photos crashing PlexPy.
-* Fix: Persist Users > Edit mode on datatable page change.
-* Fix: PMS update notifications broken.
-* Change: Cache notifications poster with thread ID to avoid overwritting images.
-
-
-## v1.3.15 (2016-04-18)
-
-* Fix: Slack notifications failing when using and icon URL.
-* Fix: 127.0.0.1 showing as an external IP address on the history tables.
-* Fix: Regression file sizes not shown in the media info table footer.
-* Fix: Retrieving proper PMS URL when multiple connections are published to plex.tv.
-* Fix: Some typos in the logger.
-* Fix: Some other typos in the WebUI. (Thanks @xtjoeytx)
-* Change: Optimized mobile web app icons and spash screens. (Thanks @alotufo)
-
-
-## v1.3.14 (2016-03-29)
-
-* Fix: Regression for missing notify_action for script notifications.
-* Fix: Typo for home stats cards in the settings.
-
-
-## v1.3.13 (2016-03-27)
-
-* Fix: Only mask strings longer than 5 characters in logs.
-
-
-## v1.3.12 (2016-03-27)
-
-* Fix: "Check GitHub for updates" not rescheduling when toggling setting.
-* Fix: Bug where notifications would fail if metadata is not found.
-* Fix: Bug where notifications would fail if unable to upload poster to Imgur.
-* Fix: PlexPy will now start properly for different Python environment variables.
-* New: Feature requests moved to FeatHub.
-* New: Ability to specify a GitHub API token for updates (optional).
-* New: Mask out sensitive information from the logs.
-* New: New and updated Arnold quotes. (Thanks @Vilsol & @Chrisophogus)
-* New: "First" and "Last" page buttons to datatables.
-* New: Access log file from the "Help & Info" page.
-* New: CherryPy environment options (for development). (Thanks @codedecay)
-* New: PlexPy development environment (for development only).
-* Change: Facebook posts with a posters now include a summary.
-* Change: Facebook posts now use a default poster if the poster is not found or unable to upload to Imgur.
-* Change: IFTTT events can be fromatted with the {action} name.
-* Change: Logs now use ISO date format to avoid locale encoding errors. (Thanks @alshain)
-* Remove: Non-functioning Plex notification agent.
-
-
-## v1.3.11 (2016-03-15)
-
-* Fix: Typo preventing history logging for websockets.
-
-
-## v1.3.10 (2016-03-12)
-
-* Fix: Actually allow HTML tags for Pushover.
-* Fix: PlexPy not restarting on Windows if there is a space in the folder path.
-* Fix: Reconnect websocket when changing PMS SSL setting.
-* Fix: Datatables not loading when view_offset or duration is blank.
-* Fix: Bug when checking the PMS version in the settings.
-* Fix: Auto-refreshing of log tables.
-* Fix: Logging of IPv6 addresses. (PMS version >0.9.14 only.)
-* Fix: Hide days selection from the Play Totals graph page.
-* Fix: PlexPy overwriting user's own SSL certificate/key.
-* Fix: Multiple watched notifications when using websocket.
-* Fix: Some missing python library imports.
-* Fix: Some typos in settings and PlexWatch importer.
-* New: Ability to get notified of PMS updates.
-* New: Ability to disable the link to Plex Web with Facebook notifications and use IMDB, TVDB, TMDb, or Last.fm instead.
-* New: Ability to reset Imgur poster url from the info page if the poster is changed.
-* New: Tooltips on the current activity progress bars.
-* New: Side scrolling of Recently Added/Recently Played items.
-* New: Document all date/time format options.
-* New: Button to clear notification logs.
-* New: Customizable backup, cache, and log directories.
-* Change: Retry writing sessions to history if it fails, so sessions don't get lost. (Activity pinger only, not availble for websocket.)
-* Change: Save any unknown sessions to the "Local" user.
-* Change: History table modal is filtered depending on which graph series is clicked.
-* Change: Revert back to saving the state of datatables (search, sorting, entries per page, etc.).
-* Change: Newlines are not longer stripped from notification text which allows for finer control of how notifications look.
-* Change: Updated FreeNAS/FreeBSD init scripts. (Must have updated jails.) (Thanks @chiviak)
-
-
-## v1.3.9 (2016-02-21)
-
-* Fix: Recently added notification not sent to all notification agents.
-* New: Pushover HTML support. (Thanks @elseym)
-
-
-## v1.3.8 (2016-02-21)
-
-* Fix: Regression unable to clear HTTP password.
-* Fix: Remove media tags from script arguments for server notifications.
-* Fix: Encode poster titles to UTF-8 for Imgur upload.
-* Fix: Allow notifications to send without poster if Imgur upload fails.
-* New: Notification Logs table in the Logs tab.
-* New: Toggle in settings to enable posters in notifications. (Disabled by default.)
-* Change: Save Imgur poster URL to database so upload is not needed every time.
-* Change: Notify log in database to log each event as a separate entry.
-* Change: Monitor remote access is unchecked if remote access is disabled on server.
-
-
-## v1.3.7 (2016-02-20)
-
-* Fix: Verifying server with SSL enabled.
-* Fix: Regression where {stream_duration} reported as 0.
-* Fix: Video metadata flags showing up for track info.
-* Fix: Custom library icons not applied to Library Statistics.
-* Fix: Typos in the Web UI.
-* New: ETA to Current Activity overlay.
-* New: Total duration to Libraries and Users tables.
-* New: {machine_id} to notification options.
-* New: IMDB, TVDB, TMDb, Last.fm, and Trackt IDs/URLs to notification options.
-* New: {poster_url} to notification options using Imgur.
-* New: Poster and link for Facebook notifications.
-* New: Log javascript errors from the Web UI.
-* New: Configuration and Scheduler info to the settings page.
-* New: Schedule background task to backup the PlexPy database.
-* New: URL anonymizer for external links.
-* New: Plex Media Scanner log file to Log viewer.
-* New: API v2 (sill very experimental). (Thanks @Hellowlol)
-* Change: Allow secure websocket connections.
-* Change: History grouping now accounts for the view offset.
-* Change: Subject line can be toggled off for Facebook, Slack, Telegram, and Twitter.
-* Change: Create self-signed SSL certificates when enabling HTTPS.
-* Change: Revert homepage "Last Played" to "Last Watched".
-* Change: Disable monitor remote access checkbox if remote access is not enabled on the PMS.
-* Change: Disable IP logging checkbox if PMS version is 0.9.14 or greater.
-
-
-## v1.3.6 (2016-02-03)
-
-* Fix: Regression where {duration} not reported in minutes.
-* Fix: Proper daemonizing in FreeBSD and FreeNAS init scripts.
-* Change: Update readme documentation.
-
-
-## v1.3.5 (2016-02-02)
-
-* Fix: Removing unique constraints from database.
-* Fix: Unable to expand media info table when missing "Added At" date.
-* Fix: Server verification for unpublished servers.
-* Fix: Updating PMS identifier for server change.
-* New: {stream_time}, {remaining_time}, and {progress_time} to notification options.
-* New: Powershell script support. (Thanks @Hellowlol)
-* New: Method to delete duplicate libraries.
-* Change: Daemonize before running start up tasks.
-
-
-## v1.3.4 (2016-01-29)
-
-* Fix: Activity checker not starting with library update (history not logging).
-* Fix: Libraries duplicated in database.
-* Fix: Buffer notifications even when disabled when using websockets.
-* Fix: Libraries and Users lists not refreshing.
-* Fix: Server verification in settings.
-* Fix: Empty libraries not added to database.
-* New: Unique identifiers to notification options.
-* Remove: Requirement of media type toggles for recently added notifications.
-* Remove: Built in Twitter key and secret.
-* Change: Unnecessary quoting of script arguments.
-* Change: Facebook notification instructions.
-
-
-## v1.3.3 (2016-01-26)
-
-* Fix: Plays by Month graph not loading.
-* Change: Disable caching for datatables.
-* Change: Improved updating library data in the database again.
-
-
-## v1.3.2 (2016-01-24)
-
-* Fix: 'datestamp' and 'timestamp' for server notifications.
-* Change: New method for updating library data in database.
-
-
-## v1.3.1 (2016-01-23)
-
-* Fix: Notifiers authorization popups for reverse proxies.
-* Fix: Empty brackets in titles on tables.
-* Fix: Star rating overlapping text.
-* Fix: Unable to startup when library refresh fails.
-* Fix: Unable to parse 'datestamp' and 'timestamp' format.
-* Change: Rename "Last Watched" to "Last Played".
-* Change: More descriptive libraries updating message.
-
-
-## v1.3.0 (2016-01-23)
-
-* New: Brand new Libraries section.
-* New: Lots of new library statistics.
-* New: Media info table for libraries.
-* New: Web app for Android and iOS. (Thanks @zobe123)
-* New: Slack notification agent. (Thanks @richipargo)
-* New: Facebook notification agent.
-* New: Custom script notification agent. (Thanks @Hellowlol)
-* New: Custom "From Name" to email notification agent.
-* New: Ability to test notifications / send custom one-off notifications.
-* New: 'datestamp' and 'timestamp' notification options.
-* New: More concurrent stream statistics.
-* New: Media info flags on the info pages.
-* New: Ability to fix broken metadata if the item has been moved in Plex.
-* New: Ability to rearrange the homepage statistics cards.
-* New: CentOS startup script (Thanks @PHoSawyer)
-* Fix: Server name blank after first run wizard.
-* Fix: Incorrect duration for grouped home stats.
-* Fix: Allow SSL when verifying server in settings.
-* Fix: Metadata for grouped recently added notifications.
-* Fix: Unable to access settings with missing changelog file.
-* Fix: Month name localization on play totals graphs.
-* Fix: Get new PMS identifier when changing servers.
-* Fix: Websocket log spam when there is no active session.
-* Fix: Logs and cache folder not created in the data directory.
-* Fix: Title links on sync table.
-* Fix: Other various minor bugs and graphical glitches.
-* Change: Prettier thumbnail popovers on tables.
-* Change: Star ratings to use css/font-awesome.
-* Change: More detailed logging info to warnings and errors.
-* Change: Better PlexPy process restart handling (Thanks @jackwilsdon)
-* Change: Massive behind the scenes code cleanup.
-* Remove: Built in Pushover API token (User's own API token is now required).
-
-
-## v1.2.16 (2015-12-22)
-
-* Fix Most Concurrent stream stat for emtpy databases
-* Change logs to 50 lines by default
-
-
-## v1.2.15 (2015-12-20)
-
-* Fix navbar covering current activity on smaller screens.
-* Fix metadata for grouped recently added notifications.
-* Fix Growl notification agent not working.
-* Change graph days selection.
-* Change watch statistics to match table history grouping.
-* Add automatic discovery of Pushbullet devices.
-* Add Most Concurrent Streams watch statistic.
-* Add precentage to current activity progress bars.
-* Add a bunch of stream details to notification options.
-* Add notification for Plex Remote Access/Plex Media Server back up.
-* Add CC/BCC and multiple recipients to email notification agent.
-* Add total watch time to history table footer.
-
-
-## v1.2.14 (2015-12-07)
-
-* Fix regression with PlexWatch db importer and buffer warnings.
-
-
-## v1.2.13 (2015-12-06)
-
-* Fix match newlines between tags in notification text.
-* Fix current activity not showing on PMS 0.9.12.
-
-
-## v1.2.12 (2015-12-06)
-
-* Fix for "too many open files" error.
-
-
-## v1.2.11 (2015-12-06)
-
-* Fix more regressions (sorry).
-
-
-## v1.2.10 (2015-12-06)
-
-* Fix broken count graphs regression.
-
-
-## v1.2.9 (2015-12-06)
-
-* Fix and improve text sanitization.
-
-
-## v1.2.8 (2015-12-06)
-
-* Fix sanitize player names
-* Fix recently added notification delay
-* Fix recently added metadata queries
-* Fix multiple lines in notification body text
-* Fix UTF-8 encoding in Prowl notifications subject line
-* Change to only log IPv4 addresses
-* Add global toggle for recently added notifcations
-* Add feature to delete users
-* Add channel support for Telegram notification agent
-* Add icon for Apple tvOS
-* Add icon for Microsoft Edge
-
-
-## v1.2.7 (2015-11-27)
-
-* Fix IP address option in notifications
-
-
-## v1.2.6 (2015-11-27)
-
-* Fixes for IP logging in PMS < 0.9.14.x.
-* Fix issue in plexWatch importer when trying to import item with no ratingKey.
-
-
-## v1.2.5 (2015-11-25)
-
-* Add video_decision and audio_decision to notification options
-* Fix IP address logging
-* Fix log spam if notifications disabled
-
-
-## v1.2.4 (2015-11-24)
-
-* Add filtering by media type in the history table
-* Add IFTTT notification agent
-* Add Telegram notification agent
-* Add notifications for recently added media
-* Add notifications for server down and remote access down
-* Add more metadata to notifications options
-* Add IP address to notification options (for PMS 0.9.14 and above)
-* Add server uptime to notification options
-* Add IP address to current activity
-* Add IPv6 address logging
-* Add PMS server name to the page title
-* Fix bug in "Last Watched" statistic
-* Fix bug in search query
-* Fix bug on user pages for usernames with single quotes
-* Fix name for new Plex Media Center
-* Fix Pushover notifications with unicode characters
-* Fix bug with showing old usernames in datatables
-* Fix bug with "Please verify your server" in settings
-* Change IP lookup provider
-* Change notifications custom body text to larger text box
-* Change movie/tv logging and notifications into individual options
-
-
-## v1.2.3 (2015-10-18)
-
-* Added "remaining time" as notification substitution.
-* Fix bug on home stats cards.
-* Fix visual bug on user page.
-
-
## v1.2.2 (2015-10-12)
* Add server discovery on first run.
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 46a644e5..146b1cfe 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -1,20 +1,28 @@
-# Contributing to Tautulli
+# Contributing to PlexPy
+
+## Issues
+In case you read this because you are posting an issue, please take a minute and conside the things below. The issue tracker is not a support forum. It is primarily intended to submit bugs, improvements or feature requests. However, we are glad to help you, and make sure the problem is not caused by PlexPy, but don't expect step-by-step answers.
+
+* Use the search function. Chances are that your problem is already discussed. Do not append to (closed) issues if your problem does not fit the discussion.
+* Visit the [Troubleshooting](../../wiki/TroubleShooting) wiki first.
+* Use [proper formatting](https://help.github.com/articles/github-flavored-markdown/). Paste your logs in code blocks.
+* Close your issue if you resolved it.
## Pull Requests
-If you think you can contribute code to the Tautulli repository, do not hesitate to submit a pull request.
+If you think you can contribute code to the PlexPy repository, do not hesitate to submit a pull request.
### Branches
-All pull requests should be based on the `nightly` branch, to minimize cross merges. When you want to develop a new feature, clone the repository with `git clone origin/nightly -b FEATURE_NAME`. Use meaningful commit messages.
+All pull requests should be based on the `dev` branch, to minimize cross merges. When you want to develop a new feature, clone the repository with `git clone origin/dev -b FEATURE_NAME`. Use meaningful commit messages.
### Python Code
#### Compatibility
-The code should work with Python 3.8+. Note that Tautulli runs on many different platforms.
+The code should work with Python 2.6 and 2.7. Note that PlexPy runs on different platforms, including Network Attached Storage devices such as Synology.
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 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):
+Although PlexPy 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):
* 4 space indentation
* 80 characters per line
@@ -29,13 +37,16 @@ Although Tautulli did not adopt a code convention in the past, we try to follow
#### Documentation
Document your code. Use docstrings See [PEP-257](https://www.python.org/dev/peps/pep-0257/) for more information.
+#### Continuous Integration
+PlexPy has a configuration file for [travis-ci](https://travis-ci.org/). You can add your forked repo to Travis to have it check your code against PEP8, PyLint, and PyFlakes for you. Your pull request will show a green check mark or a red cross on each tested commit, depending on if linting passes.
+
### HTML/Template code
#### Compatibility
-HTML5 compatible browsers are targeted.
+HTML5 compatible browsers are targetted. There is no specific mobile version of PlexPy yet.
#### Conventions
* 4 space indentation
* `methodName`
* `variableName`
-* `ClassName`
+* `ClassName`
\ No newline at end of file
diff --git a/Dockerfile b/Dockerfile
deleted file mode 100644
index 8d8c324b..00000000
--- a/Dockerfile
+++ /dev/null
@@ -1,28 +0,0 @@
-FROM ghcr.io/tautulli/tautulli-baseimage:python3
-
-LABEL maintainer="Tautulli"
-
-ARG BRANCH
-ARG COMMIT
-
-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
-
-RUN \
- mkdir /config && \
- touch /config/DOCKER
-VOLUME /config
-
-CMD [ "python", "Tautulli.py", "--datadir", "/config" ]
-ENTRYPOINT [ "./start.sh" ]
-
-EXPOSE 8181
-HEALTHCHECK --start-period=90s CMD curl -ILfks https://localhost:8181/status > /dev/null || curl -ILfs http://localhost:8181/status > /dev/null || exit 1
diff --git a/PlexPy.py b/PlexPy.py
index eb9ceea4..cafb7804 100755
--- a/PlexPy.py
+++ b/PlexPy.py
@@ -1,24 +1,232 @@
#!/usr/bin/env python
-
# -*- coding: utf-8 -*-
-# This file is part of Tautulli.
+# This file is part of PlexPy.
#
-# Tautulli is free software: you can redistribute it and/or modify
+# PlexPy is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
-# Tautulli is distributed in the hope that it will be useful,
+# PlexPy is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
-# along with Tautulli. If not, see .
+# along with PlexPy. If not, see .
-from Tautulli import main
+import os
+import sys
-# Call main() from Tautulli.py
+# Ensure lib added to path, before any other imports
+sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'lib/'))
+
+from plexpy import webstart, logger, web_socket
+
+import locale
+import time
+import signal
+import argparse
+import plexpy
+
+# Register signals, such as CTRL + C
+signal.signal(signal.SIGINT, plexpy.sig_handler)
+signal.signal(signal.SIGTERM, plexpy.sig_handler)
+
+
+def main():
+ """
+ PlexPy application entry point. Parses arguments, setups encoding and
+ initializes the application.
+ """
+
+ # Fixed paths to PlexPy
+ if hasattr(sys, 'frozen'):
+ plexpy.FULL_PATH = os.path.abspath(sys.executable)
+ else:
+ plexpy.FULL_PATH = os.path.abspath(__file__)
+
+ plexpy.PROG_DIR = os.path.dirname(plexpy.FULL_PATH)
+ plexpy.ARGS = sys.argv[1:]
+
+ # From sickbeard
+ plexpy.SYS_PLATFORM = sys.platform
+ plexpy.SYS_ENCODING = None
+
+ try:
+ locale.setlocale(locale.LC_ALL, "")
+ plexpy.SYS_ENCODING = locale.getpreferredencoding()
+ except (locale.Error, IOError):
+ pass
+
+ # for OSes that are poorly configured I'll just force UTF-8
+ if not plexpy.SYS_ENCODING or plexpy.SYS_ENCODING in ('ANSI_X3.4-1968', 'US-ASCII', 'ASCII'):
+ plexpy.SYS_ENCODING = 'UTF-8'
+
+ # Set up and gather command line arguments
+ parser = argparse.ArgumentParser(
+ description='A Python based monitoring and tracking tool for Plex Media Server.')
+
+ parser.add_argument(
+ '-v', '--verbose', action='store_true', help='Increase console logging verbosity')
+ parser.add_argument(
+ '-q', '--quiet', action='store_true', help='Turn off console logging')
+ parser.add_argument(
+ '-d', '--daemon', action='store_true', help='Run as a daemon')
+ parser.add_argument(
+ '-p', '--port', type=int, help='Force PlexPy to run on a specified port')
+ parser.add_argument(
+ '--datadir', help='Specify a directory where to store your data files')
+ parser.add_argument('--config', help='Specify a config file to use')
+ parser.add_argument('--nolaunch', action='store_true',
+ help='Prevent browser from launching on startup')
+ parser.add_argument(
+ '--pidfile', help='Create a pid file (only relevant when running as a daemon)')
+
+ args = parser.parse_args()
+
+ if args.verbose:
+ plexpy.VERBOSE = True
+ if args.quiet:
+ plexpy.QUIET = True
+
+ # Do an intial setup of the logger.
+ logger.initLogger(console=not plexpy.QUIET, log_dir=False,
+ verbose=plexpy.VERBOSE)
+
+ if args.daemon:
+ if sys.platform == 'win32':
+ sys.stderr.write(
+ "Daemonizing not supported under Windows, starting normally\n")
+ else:
+ plexpy.DAEMON = True
+ plexpy.QUIET = True
+
+ if args.pidfile:
+ plexpy.PIDFILE = str(args.pidfile)
+
+ # If the pidfile already exists, plexpy may still be running, so
+ # exit
+ if os.path.exists(plexpy.PIDFILE):
+ raise SystemExit("PID file '%s' already exists. Exiting." %
+ plexpy.PIDFILE)
+
+ # The pidfile is only useful in daemon mode, make sure we can write the
+ # file properly
+ if plexpy.DAEMON:
+ plexpy.CREATEPID = True
+
+ try:
+ with open(plexpy.PIDFILE, 'w') as fp:
+ fp.write("pid\n")
+ except IOError as e:
+ raise SystemExit("Unable to write PID file: %s", e)
+ else:
+ logger.warn("Not running in daemon mode. PID file creation " \
+ "disabled.")
+
+ # Determine which data directory and config file to use
+ if args.datadir:
+ plexpy.DATA_DIR = args.datadir
+ else:
+ plexpy.DATA_DIR = plexpy.PROG_DIR
+
+ if args.config:
+ config_file = args.config
+ else:
+ config_file = os.path.join(plexpy.DATA_DIR, 'config.ini')
+
+ # Try to create the DATA_DIR if it doesn't exist
+ if not os.path.exists(plexpy.DATA_DIR):
+ try:
+ os.makedirs(plexpy.DATA_DIR)
+ except OSError:
+ raise SystemExit(
+ '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):
+ raise SystemExit(
+ 'Cannot write to the data directory: ' + plexpy.DATA_DIR + '. Exiting...')
+
+ # Put the database in the DATA_DIR
+ plexpy.DB_FILE = os.path.join(plexpy.DATA_DIR, 'plexpy.db')
+
+ # Read config and start logging
+ plexpy.initialize(config_file)
+
+ if plexpy.DAEMON:
+ plexpy.daemonize()
+
+ # Force the http port if neccessary
+ if args.port:
+ http_port = args.port
+ logger.info('Using forced web server port: %i', http_port)
+ else:
+ 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.
+ web_config = {
+ 'http_port': http_port,
+ 'http_host': plexpy.CONFIG.HTTP_HOST,
+ 'http_root': plexpy.CONFIG.HTTP_ROOT,
+ 'http_proxy': plexpy.CONFIG.HTTP_PROXY,
+ 'enable_https': plexpy.CONFIG.ENABLE_HTTPS,
+ 'https_cert': plexpy.CONFIG.HTTPS_CERT,
+ 'https_key': plexpy.CONFIG.HTTPS_KEY,
+ 'http_username': plexpy.CONFIG.HTTP_USERNAME,
+ 'http_password': plexpy.CONFIG.HTTP_PASSWORD,
+ }
+ webstart.initialize(web_config)
+
+ # Start the background threads
+ plexpy.start()
+
+ # Open connection for websocket
+ if plexpy.CONFIG.MONITORING_USE_WEBSOCKET:
+ try:
+ web_socket.start_thread()
+ except:
+ logger.warn(u"Websocket :: Unable to open connection.")
+ # Fallback to polling
+ plexpy.POLLING_FAILOVER = True
+ plexpy.initialize_scheduler()
+
+ # Open webbrowser
+ if plexpy.CONFIG.LAUNCH_BROWSER and not args.nolaunch:
+ plexpy.launch_browser(plexpy.CONFIG.HTTP_HOST, http_port,
+ plexpy.CONFIG.HTTP_ROOT)
+
+ # Wait endlessy for a signal to happen
+ while True:
+ if not plexpy.SIGNAL:
+ try:
+ time.sleep(1)
+ except KeyboardInterrupt:
+ plexpy.SIGNAL = 'shutdown'
+ else:
+ logger.info('Received signal: %s', plexpy.SIGNAL)
+
+ if plexpy.SIGNAL == 'shutdown':
+ plexpy.shutdown()
+ elif plexpy.SIGNAL == 'restart':
+ plexpy.shutdown(restart=True)
+ else:
+ plexpy.shutdown(restart=True, update=True)
+
+ plexpy.SIGNAL = None
+
+# Call main()
if __name__ == "__main__":
main()
diff --git a/README.md b/README.md
index 37829290..3bbd6a6c 100644
--- a/README.md
+++ b/README.md
@@ -1,163 +1,125 @@
-# Tautulli
+#PlexPy
-A python based web application for monitoring, analytics and notifications for
-[Plex Media Server](https://plex.tv).
+[](https://gitter.im/drzoidberg33/plexpy?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
-This project is based on code from [Headphones](https://github.com/rembo10/headphones)
-and [PlexWatchWeb](https://github.com/ecleese/plexWatchWeb).
+A python based web application for monitoring, analytics and notifications for Plex Media Server (www.plex.tv).
-## Features
+This project is based on code from Headphones (https://github.com/rembo10/headphones) and PlexWatchWeb (https://github.com/ecleese/plexWatchWeb).
-- 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!!
+* plexPy forum thread: https://forums.plex.tv/discussion/169591/plexpy-another-plex-monitoring-program
-## Preview
+If you'd like to buy me a beer, hit the donate button below. All donations go to the project maintainer (primarily for the procurement of liquid refreshment).
-[Full preview gallery available on our website][Tautulli]
+[](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=G9HZK9BDJLKT6)
-
-## Installation
+###Support
+-----------
+* PlexPy Wiki: https://github.com/drzoidberg33/plexpy/wiki
-[![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
+###Features
+-----------
+* Responsive web design viewable on desktop, tablet and mobile web browsers
-| Status | Branch: `master` | Branch: `beta` | Branch: `nightly` |
-| --- | --- | --- | --- |
-| Release | [![Release@master][badge-release-master]][Releases Latest] [![Release Date@master][badge-release-master-date]][Releases Latest] | [![Release@beta][badge-release-beta]][Releases] [![Commits@beta][badge-release-beta-commits]][Commits Beta] | [![Last Commits@nightly][badge-release-nightly-last-commit]][commits Nightly] [![Commits@nightly][badge-release-nightly-commits]][Commits Nightly] |
-| Docker | [![Docker@master][badge-docker-master]][DockerHub] [![Docker Build@master][badge-docker-master-ci]][Publish Docker Master] | [![Docker@beta][badge-docker-beta]][DockerHub] [![Docker Build@beta][badge-docker-beta-ci]][Publish Docker Beta] | [![Docker@nightly][badge-docker-nightly]][DockerHub] [![Docker Build@nightly][badge-docker-nightly-ci]][Publish Docker Nightly] |
-| Snap | [![Snap@master][badge-snap-master]][Snapcraft] [![Snap Build@master][badge-snap-master-ci]][Publish Snap Master] | [![Snap@beta][badge-snap-beta]][Snapcraft] [![Snap Build@beta][badge-snap-beta-ci]][Publish Snap Beta] | [![Snap@nightly][badge-snap-nightly]][Snapcraft] [![Snap Build@nightly][badge-snap-nightly-ci]][Publish Snap Nightly] |
-| Installer | [![Windows@master][badge-installer-master-win]][Releases Latest] [![MacOS@master][badge-installer-master-macos]][Releases Latest] [![Installer Build@master][badge-installer-master-ci]][Publish Installer Master] | [![Windows@beta][badge-installer-beta-win]][Releases] [![MacOS@beta][badge-installer-beta-macos]][Releases] [![Installer Build@beta][badge-installer-beta-ci]][Publish Installer Beta] | [![Installer Build@nightly][badge-installer-nightly-ci]][Publish Installer Nightly] |
+* Themed to complement Plex/Web
-Read the [Installation Guides][Installation] for instructions on how to install Tautulli.
+* Easy configuration setup via html form
-[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
+* Current Plex Media Server viewing activity including:
+ * number of current users
+ * title
+ * progress
+ * platform
+ * user
+ * state (playing, paused, buffering, etc)
+ * stream type (direct, transcoded)
+ * video type & resolution
+ * audio type & channel count.
+
+* Top statistics on home page with configurable duration and measurement metric:
+ * Most watched TV
+ * Most popular TV
+ * Most watched Movie
+ * Most popular Movie
+ * Most active user
+ * Most active platform
-## Support
+* Recently added media and how long ago it was added
-[![Wiki][badge-wiki]][Wiki]
-[![Discord][badge-discord]][Discord]
-[![Reddit][badge-reddit]][Reddit]
-[![Plex Forums][badge-forums]][Plex Forums]
-[![Issues][badge-issues]][Issues]
+* Global watching history with search/filtering & dynamic column sorting
+ * date
+ * user
+ * platform
+ * ip address
+ * title
+ * stream information details
+ * start time
+ * paused duration length
+ * stop time
+ * duration length
+ * watched progress
+ * show/hide columns
+ * delete mode - allows deletion of specific history items
-[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
+* Full user list with general information and comparison stats
-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:
+* Individual user information
+ * username and gravatar (if available)
+ * daily, weekly, monthly, all time stats for play count and duration length
+ * individual platform stats for each user
+ * public ip address history with last seen date and geo tag location
+ * recently watched content
+ * watching history
+ * synced items
+ * assign users custom friendly names within PlexPy
+ * assign users custom avatar URL within PlexPy
+ * disable history logging per user
+ * disable notifications per user
+ * option to purge all history per user.
-- 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.
+* Rich analytics presented using Highcharts graphing
+ * user-selectable time periods of 30, 90 or 365 days
+ * daily watch count and duration
+ * totals by day of week and hours of the day
+ * totals by top 10 platform
+ * totals by top 10 users
+ * detailed breakdown by transcode decision
+ * source and stream resolutions
+ * transcode decision counts by user and platform
+ * total monthly counts
+
+* Content information pages
+ * movies (includes watching history)
+ * tv shows (includes watching history)
+ * tv seasons
+ * tv episodes (includes watching history)
-**If nothing has worked:**
+* Full sync list data on all users syncing items from your library
-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.
+## Installation and Notes
-## Feature Requests
+* [Installation page](../../wiki/Installation) shows you how to install PlexPy.
+* [Usage guide](../../wiki/Usage-guide) introduces you to PlexPy.
+* [Troubleshooting page](../../wiki/TroubleShooting) in the wiki can help you with common problems.
-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.
+**Issues** can be reported on the GitHub issue tracker considering these rules:
+
+1. Analyze your log, you just might find the solution yourself!
+2. You read the wiki and searched existing issues, but this is not solving your problem.
+3. Post the issue with a clear title, description and the HP log and use [proper markdown syntax](https://help.github.com/articles/github-flavored-markdown) to structure your text (code/log in code blocks).
+4. Close your issue when it's solved! If you found the solution yourself please comment so that others benefit from it.
+
+**Feature requests** can be reported on the GitHub issue tracker too:
+
+1. Search for similar existing 'issues', feature requests can be recognized by the label 'Request'.
+2. If a similar Request exists, post a comment (+1, or add a new idea to the existing request), otherwise you can create a new one.
+
+If you **comply with these rules** you can [post your request/issue](http://github.com/drzoidberg33/plexpy/issues).
+
+**Support** the project by implementing new features, solving support tickets and provide bug fixes.
## 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.
-[![License][badge-license]][License]
-
-[badge-license]: https://img.shields.io/github/license/Tautulli/Tautulli?style=flat-square
-
-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
+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.
diff --git a/Tautulli.py b/Tautulli.py
deleted file mode 100755
index b3cf4736..00000000
--- a/Tautulli.py
+++ /dev/null
@@ -1,342 +0,0 @@
-#!/usr/bin/env python
-
-# -*- coding: utf-8 -*-
-
-# This file is part of Tautulli.
-#
-# Tautulli is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# Tautulli is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with Tautulli. If not, see .
-
-import os
-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'))
-
-
-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
-if common.PLATFORM == 'Windows':
- from plexpy import windows
-elif common.PLATFORM == 'Darwin':
- from plexpy import macos
-
-# Register signals, such as CTRL + C
-signal.signal(signal.SIGINT, plexpy.sig_handler)
-signal.signal(signal.SIGTERM, plexpy.sig_handler)
-
-
-def main():
- """
- Tautulli application entry point. Parses arguments, setups encoding and
- initializes the application.
- """
-
- # Fixed paths to Tautulli
- if hasattr(sys, 'frozen') and hasattr(sys, '_MEIPASS'):
- plexpy.FROZEN = True
- plexpy.FULL_PATH = os.path.abspath(sys.executable)
- plexpy.PROG_DIR = sys._MEIPASS
- else:
- plexpy.FULL_PATH = os.path.abspath(__file__)
- plexpy.PROG_DIR = os.path.dirname(plexpy.FULL_PATH)
-
- plexpy.ARGS = sys.argv[1:]
-
- # From sickbeard
- plexpy.SYS_PLATFORM = sys.platform
- plexpy.SYS_ENCODING = None
-
- try:
-
- # 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
-
- # for OSes that are poorly configured I'll just force UTF-8
- if not plexpy.SYS_ENCODING or plexpy.SYS_ENCODING in ('ANSI_X3.4-1968', 'US-ASCII', 'ASCII'):
- plexpy.SYS_ENCODING = 'UTF-8'
-
- # Set up and gather command line arguments
- parser = argparse.ArgumentParser(
- description='A Python based monitoring and tracking tool for Plex Media Server.')
-
- parser.add_argument(
- '-v', '--verbose', action='store_true', help='Increase console logging verbosity')
- parser.add_argument(
- '-q', '--quiet', action='store_true', help='Turn off console logging')
- parser.add_argument(
- '-d', '--daemon', action='store_true', help='Run as a daemon')
- parser.add_argument(
- '-p', '--port', type=int, help='Force Tautulli to run on a specified port')
- parser.add_argument(
- '--dev', action='store_true', help='Start Tautulli in the development environment')
- parser.add_argument(
- '--datadir', help='Specify a directory where to store your data files')
- parser.add_argument(
- '--config', help='Specify a config file to use')
- parser.add_argument(
- '--nolaunch', action='store_true', help='Prevent browser from launching on startup')
- parser.add_argument(
- '--pidfile', help='Create a pid file (only relevant when running as a daemon)')
- parser.add_argument(
- '--nofork', action='store_true', help='Start Tautulli as a service, do not fork when restarting')
-
- args = parser.parse_args()
-
- if args.verbose:
- plexpy.VERBOSE = True
- if args.quiet:
- plexpy.QUIET = True
-
- # 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)
-
- try:
- plexpy.SYS_TIMEZONE = tzlocal.get_localzone()
- except (pytz.UnknownTimeZoneError, LookupError, ValueError) as e:
- logger.error("Could not determine system timezone: %s" % e)
- plexpy.SYS_TIMEZONE = pytz.UTC
-
- plexpy.SYS_UTC_OFFSET = datetime.datetime.now(plexpy.SYS_TIMEZONE).strftime('%z')
-
- 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
- logger.debug("Tautulli is running in the dev environment.")
-
- if args.daemon:
- if sys.platform == 'win32':
- logger.warn("Daemonizing not supported under Windows, starting normally")
- else:
- plexpy.DAEMON = True
- plexpy.QUIET = True
-
- if args.nofork:
- plexpy.NOFORK = True
- logger.info("Tautulli is running as a service, it will not fork when restarted.")
-
- if args.pidfile:
- plexpy.PIDFILE = str(args.pidfile)
-
- # If the pidfile already exists, plexpy may still be running, so
- # exit
- if os.path.exists(plexpy.PIDFILE):
- try:
- with open(plexpy.PIDFILE, 'r') as fp:
- pid = int(fp.read())
- 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 "
- "not running. Ignoring PID file." %
- (plexpy.PIDFILE, pid))
- else:
- # The pidfile exists and points to a live PID. plexpy may
- # still be running, so exit.
- raise SystemExit("PID file '%s' already exists. Exiting." %
- plexpy.PIDFILE)
-
- # The pidfile is only useful in daemon mode, make sure we can write the
- # file properly
- if plexpy.DAEMON:
- plexpy.CREATEPID = True
-
- try:
- with open(plexpy.PIDFILE, 'w') as fp:
- fp.write("pid\n")
- except IOError as e:
- raise SystemExit("Unable to write PID file: %s", e)
- else:
- logger.warn("Not running in daemon mode. PID file creation " \
- "disabled.")
-
- # Determine which data directory and config file to use
- if args.datadir:
- plexpy.DATA_DIR = args.datadir
- elif plexpy.FROZEN:
- 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:
- config_file = os.path.join(plexpy.DATA_DIR, config.FILENAME)
-
- # Try to create the DATA_DIR if it doesn't exist
- if not os.path.exists(plexpy.DATA_DIR):
- try:
- os.makedirs(plexpy.DATA_DIR)
- except OSError:
- raise SystemExit(
- 'Could not create data directory: ' + plexpy.DATA_DIR + '. Exiting....')
-
- # Make sure the DATA_DIR is writeable
- 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)
-
- # Move 'plexpy.db' to 'tautulli.db'
- if os.path.isfile(os.path.join(plexpy.DATA_DIR, 'plexpy.db')) and \
- not os.path.isfile(os.path.join(plexpy.DATA_DIR, plexpy.DB_FILE)):
- try:
- os.rename(os.path.join(plexpy.DATA_DIR, 'plexpy.db'), plexpy.DB_FILE)
- except OSError as e:
- raise SystemExit("Unable to rename plexpy.db to tautulli.db: %s", e)
-
- if plexpy.DAEMON:
- plexpy.daemonize()
-
- # Read config and start logging
- plexpy.initialize(config_file)
-
- # Start the background threads
- plexpy.start()
-
- # 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)
-
- # Try to start the server. Will exit here is address is already in use.
- webstart.start()
-
- if common.PLATFORM == 'Windows':
- if plexpy.CONFIG.SYS_TRAY_ICON:
- plexpy.WIN_SYS_TRAY_ICON = windows.WindowsSystemTray()
- plexpy.WIN_SYS_TRAY_ICON.start()
- windows.set_startup()
- elif common.PLATFORM == 'Darwin':
- macos.set_startup()
-
- # Open webbrowser
- if plexpy.CONFIG.LAUNCH_BROWSER and not args.nolaunch and not plexpy.DEV:
- plexpy.launch_browser(plexpy.CONFIG.HTTP_HOST, plexpy.HTTP_PORT,
- plexpy.HTTP_ROOT)
-
- if common.PLATFORM == 'Darwin' and plexpy.CONFIG.SYS_TRAY_ICON:
- if not macos.HAS_PYOBJC:
- logger.warn("The pyobjc module is missing. Install this "
- "module to enable the MacOS menu bar icon.")
- plexpy.CONFIG.SYS_TRAY_ICON = False
-
- 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
- thread = threading.Thread(target=wait)
- thread.daemon = True
- thread.start()
-
- plexpy.MAC_SYS_TRAY_ICON = macos.MacOSSystemTray()
- plexpy.MAC_SYS_TRAY_ICON.start()
- else:
- wait()
- else:
- wait()
-
-
-def wait():
- logger.info("Tautulli is ready!")
-
- # Wait endlessly for a signal to happen
- while True:
- if not plexpy.SIGNAL:
- try:
- time.sleep(1)
- except KeyboardInterrupt:
- plexpy.SIGNAL = 'shutdown'
- else:
- logger.info('Received signal: %s', plexpy.SIGNAL)
-
- if plexpy.SIGNAL == 'shutdown':
- plexpy.shutdown()
- elif plexpy.SIGNAL == 'restart':
- plexpy.shutdown(restart=True)
- elif plexpy.SIGNAL == 'checkout':
- plexpy.shutdown(restart=True, checkout=True)
- elif plexpy.SIGNAL == 'reset':
- plexpy.shutdown(restart=True, reset=True)
- elif plexpy.SIGNAL == 'update':
- plexpy.shutdown(restart=True, update=True)
- else:
- logger.error('Unknown signal. Shutting down...')
- plexpy.shutdown()
-
- plexpy.SIGNAL = None
-
-
-if __name__ == "__main__":
- main()
diff --git a/contrib/clean_pyc.bat b/contrib/clean_pyc.bat
deleted file mode 100755
index e4436dea..00000000
--- a/contrib/clean_pyc.bat
+++ /dev/null
@@ -1,11 +0,0 @@
-@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"
\ No newline at end of file
diff --git a/contrib/clean_pyc.sh b/contrib/clean_pyc.sh
index ea555159..e3d47e44 100755
--- a/contrib/clean_pyc.sh
+++ b/contrib/clean_pyc.sh
@@ -1,11 +1,9 @@
-#!/usr/bin/env bash
+#!/bin/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 *.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 {} \;
\ No newline at end of file
+# Remove the *.pyc
+find "`dirname $0`/.." -type f -name "*.pyc" -exec rm -rf {} \;
\ No newline at end of file
diff --git a/contrib/downgrade.sh b/contrib/downgrade.sh
index e4822c46..edd4779e 100755
--- a/contrib/downgrade.sh
+++ b/contrib/downgrade.sh
@@ -1,4 +1,4 @@
-#!/usr/bin/env bash
+#!/bin/bash
# Parameter check
if [ -z "$1" ]; then
diff --git a/data/interfaces/default/app_import.html b/data/interfaces/default/app_import.html
deleted file mode 100644
index 74af4313..00000000
--- a/data/interfaces/default/app_import.html
+++ /dev/null
@@ -1,201 +0,0 @@
-
-
-
-
-
Import ${app} Database
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/data/interfaces/default/base.html b/data/interfaces/default/base.html
index d6c9f859..8d721dad 100644
--- a/data/interfaces/default/base.html
+++ b/data/interfaces/default/base.html
@@ -1,76 +1,46 @@
<%
- import plexpy
- from plexpy import version
- from plexpy.helpers import anon_url
- from plexpy.notifiers import BROWSER_NOTIFIERS
+import plexpy
+from plexpy import version
%>
- Tautulli - ${title} | ${server_name}
+ PlexPy - ${title}
-
-
-
-
-
-
-
-
-
+
+
+
+
${next.headIncludes()}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
- % if _session['user_group'] == 'admin':
- % if plexpy.CONFIG.CHECK_GITHUB and plexpy.UPDATE_AVAILABLE is not False:
+ % if plexpy.CONFIG.CHECK_GITHUB and not plexpy.CURRENT_VERSION:
- % if plexpy.UPDATE_AVAILABLE is None:
- You are running an unknown version of Tautulli.
- % elif plexpy.UPDATE_AVAILABLE == 'release':
- A
- new release (${plexpy.LATEST_RELEASE}) of Tautulli is available!
- % elif plexpy.UPDATE_AVAILABLE == 'commit':
- A
- newer version of Tautulli is available!
- You are ${plexpy.COMMITS_BEHIND} commit${'s' if plexpy.COMMITS_BEHIND > 1 else ''} behind.
- % endif
- % if plexpy.INSTALL_TYPE == 'docker':
- Update your Docker container or Dismiss
- % elif plexpy.INSTALL_TYPE == 'snap':
- Update your Snap package or Dismiss
- % elif plexpy.INSTALL_TYPE in ('windows', 'macos'):
- Download and install the latest version or Dismiss
- % else:
- Update or Dismiss
- % endif
+ You're running an unknown version of PlexPy. Update or
+ Close
+
+ % elif plexpy.CONFIG.CHECK_GITHUB and plexpy.CURRENT_VERSION != plexpy.LATEST_VERSION and plexpy.COMMITS_BEHIND > 0 and plexpy.INSTALL_TYPE != 'win':
+
There was an error communicating with your Plex Server. Please check your settings.
+
+% endif
diff --git a/data/interfaces/default/current_activity_header.html b/data/interfaces/default/current_activity_header.html
index 042450b1..897a99af 100644
--- a/data/interfaces/default/current_activity_header.html
+++ b/data/interfaces/default/current_activity_header.html
@@ -15,24 +15,11 @@ DOCUMENTATION :: END
%doc>
% if data != None:
-<%
- s = '('
- if data['direct_play']:
- s += str(data['direct_play']) + ' direct play' + ('s' if data['direct_play'] > 1 else '') + ', '
- if data['direct_stream']:
- s += str(data['direct_stream']) + ' direct stream' + ('s' if data['direct_stream'] > 1 else '') + ', '
- if data['transcode']:
- s += str(data['transcode']) + ' transcode' + ('s' if data['transcode'] > 1 else '') + ', '
- s = s.rstrip(', ')
- s += ')'
-%>
- % if data['stream_count'] == '0':
-
Activity
- % elif data['stream_count'] == '1':
-
Activity ${data['stream_count']} stream ${s}
- % else:
-
Activity ${data['stream_count']} streams ${s}
- % endif
+% if data == '0':
+
Activity
+% else:
+
Activity ${data} stream(s)
+% endif
% else:
Activity
-% endif
+% endif
\ No newline at end of file
diff --git a/data/interfaces/default/current_activity_instance.html b/data/interfaces/default/current_activity_instance.html
deleted file mode 100644
index 64d6f25e..00000000
--- a/data/interfaces/default/current_activity_instance.html
+++ /dev/null
@@ -1,550 +0,0 @@
-<%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: current_activity_instance.html
-Version: 0.1
-Variable names: data {dict}
-
-data :: Usable parameters
-
-== Global keys ==
-session_key Returns a unique session id for the active stream
-rating_key Returns the unique identifier for the media item.
-media_index Returns the index of the media item.
-parent_media_index Returns the index of the media item's parent.
-media_type Returns the type of session. Either 'track', 'episode' or 'movie'.
-thumb Returns the location of the item's thumbnail. Use with pms_image_proxy.
-bif_thumb Returns the location of the item's bif thumbnail. Use with pms_image_proxy.
-art Returns the location of the item's artwork
-progress_percent Returns the current progress of the item. 0 to 100.
-user Returns the name of the user owning the session.
-user_id Returns the Plex user id if available.
-machine_id Returns the machine id of the players being used.
-friendly_name Returns the friendlly name of the user owning the session.
-user_thumb Returns the profile picture of the user owning the session.
-state Returns the state of the current session. Either 'playing', 'paused' or 'buffering'.
-title Returns the name of the episode, movie or music track.
-year Returns the year of the episode, movie, or clip.
-ip_address Returns the ip address of the stream.
-player Returns the name of the platform used to play the stream.
-platform Returns the type of platform used to play the stream.
-transcode_throttled Returns true if the transcode session is throttled.
-transcode_progress Returns the current transcode progress of the item. 0 to 100.
-transcode_speed Returns the current transcode speed of the item.
-audio_decision Returns the audio transcode decision. Either 'transcode', 'copy' or 'direct play'.
-audio_codec Returns the name of the audio codec.
-audio_channels Returns the number of audio channels.
-grandparent_title Returns the title of the item's grandparent.
-parent_title Returns the title of the item's parent.
-video_decision Returns the video transcode decision. Either 'transcode', 'copy' or 'direct play'.
-video_codec Returns the name of the video codec.
-height Returns the value of the video height.
-width Returns the value of the video width.
-container Returns the value of the media container.
-bitrate Returns the value of the media bitrate.
-video_resolution Returns the value of the video resolution.
-video_framerate Returns the value of the video framerate.
-video_aspect_ratio Returns the value of the video aspect ratio.
-transcode_audio_channels Returns the amount of audio channels if there is a transcode session.
-transcode_audio_codec Returns the name of the audio codec if there is a transcode session.
-transcode_video_codec Returns the name of the video codec if there is a transcode session.
-transcode_width Returns the video width if there is a transcode session.
-transcode_height Returns the video height if there is a transcode session.
-transcode_container Returns the value of media container if there is a transcode session.
-transcode_protocol Returns the value of media protocol if there is a transcode session.
-indexes Returns true if the media has media indexes and are enabled
-
-DOCUMENTATION :: END
-%doc>
-
-% if session is not None:
-<%
- from collections import defaultdict
- 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
-%>
-<%
- data = defaultdict(lambda: 'Unknown', **session)
- sk = data['session_key']
-
- href = page('info', data['rating_key'])
- 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'])
-%>
-
- <%
- if not _session['user_group'] == 'admin' or not data['session_id']:
- no_terminate = '-no-terminate'
- else:
- no_terminate = ''
- %>
-
- % if _session['user_group'] == 'admin' and plexpy.CONFIG.PMS_PLEXPASS and data['session_id']:
-
-% endif
diff --git a/data/interfaces/default/edit_library.html b/data/interfaces/default/edit_library.html
deleted file mode 100644
index 8e6d38b1..00000000
--- a/data/interfaces/default/edit_library.html
+++ /dev/null
@@ -1,127 +0,0 @@
-<%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: edit_library.html
-Version: 0.1
-Variable names: data [list]
-
-data :: Usable parameters
-
-== Global keys ==
-section_id Returns the library id of the library.
-section_name Returns the name of the library.
-section_type Returns the type of the library.
-library_thumb Returns the thumbnail for the library.
-custom_thumb Returns the custom thumbnail for the library.
-library_art Returns the artwork for the library.
-count Returns the item count for the library.
-parent_count Returns the parent item count for the library.
-child_count Returns the child item count for the library.
-do_notify Returns bool value for whether to send notifications for the library.
-keep_history Returns bool value for whether to keep history for the library.
-deleted_section Returns bool value for whether the library is marked as deleted.
-
-DOCUMENTATION :: END
-%doc>
-
-<%!
- from plexpy import helpers
-%>
-
-% if data != None:
-
-
-
-
-
Edit library ${data['section_name']}
-
-
-
-
-
-
-
-
-% endif
\ No newline at end of file
diff --git a/data/interfaces/default/edit_user.html b/data/interfaces/default/edit_user.html
index ebb18867..1e19b66e 100644
--- a/data/interfaces/default/edit_user.html
+++ b/data/interfaces/default/edit_user.html
@@ -10,32 +10,21 @@ Variable names: data [list]
data :: Usable parameters
== Global keys ==
-user_id Returns the user id of the user.
-username Returns the user's username.
-friendly_name Returns the friendly name of the user.
-email Returns the user's email address.
-user_thumb Returns the thumbnail for the user.
-is_home_user Returns bool value for whether the user is part of a Plex Home.
-is_allow_sync Returns bool value for whether the user has sync rights.
-is_restricted Returns bool value for whether the user account is restricted.
-do_notify Returns bool value for whether to send notifications for the user.
-keep_history Returns bool value for whether to keep history for the user.
-allow_guest Returns bool value for whether to allow guest access for the user.
-deleted_user Returns bool value for whether the user is marked as deleted.
+user Return the real Plex username
+user_id Return the Plex user_id
+friendly_name Returns the friendly edited Plex username
+do_notify Returns bool value for whether the user should trigger notifications
+keep_history Returns bool value for whether the user's activity should be logged
DOCUMENTATION :: END
%doc>
-<%!
- from plexpy import helpers
-%>
-
-% if data != None:
+% if data is not None:
-
Edit user ${data['username']}
+
Edit user ${data['user']}
-
Replace all occurrences of the username with this name.
+
Replace all occurances of the username with this name.
-
+
-
Change the users profile picture in Tautulli. To reset to default, leave this field empty and save.
+
Change the users profile picture in PlexPy. To reset to default, leave this field empty and save then perform a user refresh.
-
Uncheck this if you do not want to keep any history on this user's activity.
+
Uncheck this if you do not want to receive notifications for this user's activity.
-
Uncheck this if you do not want to allow this user to login to Tautulli.
+
Uncheck this if you do not want this keep any history on this user's activity.
% if data['user_id']:
@@ -75,64 +64,120 @@ DOCUMENTATION :: END
DANGER ZONE! Click the purge button to remove all history logged for this user. This is permanent!
% endif
- % if data['deleted_user']:
-
-
-
Click to re-add the user to the Tautulli users list.
-
- % endif
+
+
+
+
+
+
+
+
Confirm Purge
+
+
+
Are you REALLY sure you want to purge all history for this user?
+
This is permanent and cannot be undone!
+
+
+
% endif
\ No newline at end of file
diff --git a/data/interfaces/default/export_modal.html b/data/interfaces/default/export_modal.html
deleted file mode 100644
index 390ee268..00000000
--- a/data/interfaces/default/export_modal.html
+++ /dev/null
@@ -1,310 +0,0 @@
-<%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]])
-%>
-
-
-
-
-
- ${title}
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/data/interfaces/default/fonts/FontAwesome.otf b/data/interfaces/default/fonts/FontAwesome.otf
new file mode 100644
index 00000000..681bdd4d
Binary files /dev/null and b/data/interfaces/default/fonts/FontAwesome.otf differ
diff --git a/data/interfaces/default/fonts/Open-Sans-600/LICENSE.txt b/data/interfaces/default/fonts/Open-Sans-600/LICENSE.txt
deleted file mode 100644
index d6456956..00000000
--- a/data/interfaces/default/fonts/Open-Sans-600/LICENSE.txt
+++ /dev/null
@@ -1,202 +0,0 @@
-
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "[]"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright [yyyy] [name of copyright owner]
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
diff --git a/data/interfaces/default/fonts/Open-Sans-600/Open-Sans-600.eot b/data/interfaces/default/fonts/Open-Sans-600/Open-Sans-600.eot
deleted file mode 100644
index cbbfa5b0..00000000
Binary files a/data/interfaces/default/fonts/Open-Sans-600/Open-Sans-600.eot and /dev/null differ
diff --git a/data/interfaces/default/fonts/Open-Sans-600/Open-Sans-600.svg b/data/interfaces/default/fonts/Open-Sans-600/Open-Sans-600.svg
deleted file mode 100644
index 7a3f2dd9..00000000
--- a/data/interfaces/default/fonts/Open-Sans-600/Open-Sans-600.svg
+++ /dev/null
@@ -1,1637 +0,0 @@
-
-
-
diff --git a/data/interfaces/default/fonts/Open-Sans-600/Open-Sans-600.ttf b/data/interfaces/default/fonts/Open-Sans-600/Open-Sans-600.ttf
deleted file mode 100644
index 314e983a..00000000
Binary files a/data/interfaces/default/fonts/Open-Sans-600/Open-Sans-600.ttf and /dev/null differ
diff --git a/data/interfaces/default/fonts/Open-Sans-600/Open-Sans-600.woff b/data/interfaces/default/fonts/Open-Sans-600/Open-Sans-600.woff
deleted file mode 100644
index c7cdaffa..00000000
Binary files a/data/interfaces/default/fonts/Open-Sans-600/Open-Sans-600.woff and /dev/null differ
diff --git a/data/interfaces/default/fonts/Open-Sans-600/Open-Sans-600.woff2 b/data/interfaces/default/fonts/Open-Sans-600/Open-Sans-600.woff2
deleted file mode 100644
index 4001c52a..00000000
Binary files a/data/interfaces/default/fonts/Open-Sans-600/Open-Sans-600.woff2 and /dev/null differ
diff --git a/data/interfaces/default/fonts/Open-Sans-regular/LICENSE.txt b/data/interfaces/default/fonts/Open-Sans-regular/LICENSE.txt
deleted file mode 100644
index d6456956..00000000
--- a/data/interfaces/default/fonts/Open-Sans-regular/LICENSE.txt
+++ /dev/null
@@ -1,202 +0,0 @@
-
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "[]"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright [yyyy] [name of copyright owner]
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
diff --git a/data/interfaces/default/fonts/Open-Sans-regular/Open-Sans-regular.eot b/data/interfaces/default/fonts/Open-Sans-regular/Open-Sans-regular.eot
deleted file mode 100644
index 1d98e6ea..00000000
Binary files a/data/interfaces/default/fonts/Open-Sans-regular/Open-Sans-regular.eot and /dev/null differ
diff --git a/data/interfaces/default/fonts/Open-Sans-regular/Open-Sans-regular.svg b/data/interfaces/default/fonts/Open-Sans-regular/Open-Sans-regular.svg
deleted file mode 100644
index 052c59ff..00000000
--- a/data/interfaces/default/fonts/Open-Sans-regular/Open-Sans-regular.svg
+++ /dev/null
@@ -1,1637 +0,0 @@
-
-
-
diff --git a/data/interfaces/default/fonts/Open-Sans-regular/Open-Sans-regular.ttf b/data/interfaces/default/fonts/Open-Sans-regular/Open-Sans-regular.ttf
deleted file mode 100644
index 0dae9c3b..00000000
Binary files a/data/interfaces/default/fonts/Open-Sans-regular/Open-Sans-regular.ttf and /dev/null differ
diff --git a/data/interfaces/default/fonts/Open-Sans-regular/Open-Sans-regular.woff b/data/interfaces/default/fonts/Open-Sans-regular/Open-Sans-regular.woff
deleted file mode 100644
index ac2b2c65..00000000
Binary files a/data/interfaces/default/fonts/Open-Sans-regular/Open-Sans-regular.woff and /dev/null differ
diff --git a/data/interfaces/default/fonts/Open-Sans-regular/Open-Sans-regular.woff2 b/data/interfaces/default/fonts/Open-Sans-regular/Open-Sans-regular.woff2
deleted file mode 100644
index 402dfd77..00000000
Binary files a/data/interfaces/default/fonts/Open-Sans-regular/Open-Sans-regular.woff2 and /dev/null differ
diff --git a/data/interfaces/default/fonts/font-awesome/fa-brands-400.eot b/data/interfaces/default/fonts/font-awesome/fa-brands-400.eot
deleted file mode 100644
index f8e48185..00000000
Binary files a/data/interfaces/default/fonts/font-awesome/fa-brands-400.eot and /dev/null differ
diff --git a/data/interfaces/default/fonts/font-awesome/fa-brands-400.svg b/data/interfaces/default/fonts/font-awesome/fa-brands-400.svg
deleted file mode 100644
index 68eb65a1..00000000
--- a/data/interfaces/default/fonts/font-awesome/fa-brands-400.svg
+++ /dev/null
@@ -1,1127 +0,0 @@
-
-
-
diff --git a/data/interfaces/default/fonts/font-awesome/fa-brands-400.ttf b/data/interfaces/default/fonts/font-awesome/fa-brands-400.ttf
deleted file mode 100644
index 2b00dae7..00000000
Binary files a/data/interfaces/default/fonts/font-awesome/fa-brands-400.ttf and /dev/null differ
diff --git a/data/interfaces/default/fonts/font-awesome/fa-brands-400.woff b/data/interfaces/default/fonts/font-awesome/fa-brands-400.woff
deleted file mode 100644
index 9e4b7e1c..00000000
Binary files a/data/interfaces/default/fonts/font-awesome/fa-brands-400.woff and /dev/null differ
diff --git a/data/interfaces/default/fonts/font-awesome/fa-brands-400.woff2 b/data/interfaces/default/fonts/font-awesome/fa-brands-400.woff2
deleted file mode 100644
index b9e58c5e..00000000
Binary files a/data/interfaces/default/fonts/font-awesome/fa-brands-400.woff2 and /dev/null differ
diff --git a/data/interfaces/default/fonts/font-awesome/fa-regular-400.eot b/data/interfaces/default/fonts/font-awesome/fa-regular-400.eot
deleted file mode 100644
index 5217c95f..00000000
Binary files a/data/interfaces/default/fonts/font-awesome/fa-regular-400.eot and /dev/null differ
diff --git a/data/interfaces/default/fonts/font-awesome/fa-regular-400.svg b/data/interfaces/default/fonts/font-awesome/fa-regular-400.svg
deleted file mode 100644
index 5f495431..00000000
--- a/data/interfaces/default/fonts/font-awesome/fa-regular-400.svg
+++ /dev/null
@@ -1,467 +0,0 @@
-
-
-
diff --git a/data/interfaces/default/fonts/font-awesome/fa-regular-400.ttf b/data/interfaces/default/fonts/font-awesome/fa-regular-400.ttf
deleted file mode 100644
index cefbd50f..00000000
Binary files a/data/interfaces/default/fonts/font-awesome/fa-regular-400.ttf and /dev/null differ
diff --git a/data/interfaces/default/fonts/font-awesome/fa-regular-400.woff b/data/interfaces/default/fonts/font-awesome/fa-regular-400.woff
deleted file mode 100644
index 954b0593..00000000
Binary files a/data/interfaces/default/fonts/font-awesome/fa-regular-400.woff and /dev/null differ
diff --git a/data/interfaces/default/fonts/font-awesome/fa-regular-400.woff2 b/data/interfaces/default/fonts/font-awesome/fa-regular-400.woff2
deleted file mode 100644
index bd35950e..00000000
Binary files a/data/interfaces/default/fonts/font-awesome/fa-regular-400.woff2 and /dev/null differ
diff --git a/data/interfaces/default/fonts/font-awesome/fa-solid-900.eot b/data/interfaces/default/fonts/font-awesome/fa-solid-900.eot
deleted file mode 100644
index cc691d63..00000000
Binary files a/data/interfaces/default/fonts/font-awesome/fa-solid-900.eot and /dev/null differ
diff --git a/data/interfaces/default/fonts/font-awesome/fa-solid-900.svg b/data/interfaces/default/fonts/font-awesome/fa-solid-900.svg
deleted file mode 100644
index 1534b64b..00000000
--- a/data/interfaces/default/fonts/font-awesome/fa-solid-900.svg
+++ /dev/null
@@ -1,2231 +0,0 @@
-
-
-
diff --git a/data/interfaces/default/fonts/font-awesome/fa-solid-900.ttf b/data/interfaces/default/fonts/font-awesome/fa-solid-900.ttf
deleted file mode 100644
index 618136ab..00000000
Binary files a/data/interfaces/default/fonts/font-awesome/fa-solid-900.ttf and /dev/null differ
diff --git a/data/interfaces/default/fonts/font-awesome/fa-solid-900.woff b/data/interfaces/default/fonts/font-awesome/fa-solid-900.woff
deleted file mode 100644
index af476578..00000000
Binary files a/data/interfaces/default/fonts/font-awesome/fa-solid-900.woff and /dev/null differ
diff --git a/data/interfaces/default/fonts/font-awesome/fa-solid-900.woff2 b/data/interfaces/default/fonts/font-awesome/fa-solid-900.woff2
deleted file mode 100644
index 9ef566a9..00000000
Binary files a/data/interfaces/default/fonts/font-awesome/fa-solid-900.woff2 and /dev/null differ
diff --git a/data/interfaces/default/fonts/fontawesome-webfont.eot b/data/interfaces/default/fonts/fontawesome-webfont.eot
new file mode 100644
index 00000000..a30335d7
Binary files /dev/null and b/data/interfaces/default/fonts/fontawesome-webfont.eot differ
diff --git a/data/interfaces/default/fonts/fontawesome-webfont.svg b/data/interfaces/default/fonts/fontawesome-webfont.svg
new file mode 100644
index 00000000..6fd19abc
--- /dev/null
+++ b/data/interfaces/default/fonts/fontawesome-webfont.svg
@@ -0,0 +1,640 @@
+
+
+
\ No newline at end of file
diff --git a/data/interfaces/default/fonts/fontawesome-webfont.ttf b/data/interfaces/default/fonts/fontawesome-webfont.ttf
new file mode 100644
index 00000000..d7994e13
Binary files /dev/null and b/data/interfaces/default/fonts/fontawesome-webfont.ttf differ
diff --git a/data/interfaces/default/fonts/fontawesome-webfont.woff b/data/interfaces/default/fonts/fontawesome-webfont.woff
new file mode 100644
index 00000000..6fd4ede0
Binary files /dev/null and b/data/interfaces/default/fonts/fontawesome-webfont.woff differ
diff --git a/data/interfaces/default/fonts/fontawesome-webfont.woff2 b/data/interfaces/default/fonts/fontawesome-webfont.woff2
new file mode 100644
index 00000000..5560193c
Binary files /dev/null and b/data/interfaces/default/fonts/fontawesome-webfont.woff2 differ
diff --git a/data/interfaces/default/graphs.html b/data/interfaces/default/graphs.html
index 7201c35f..8f114b67 100644
--- a/data/interfaces/default/graphs.html
+++ b/data/interfaces/default/graphs.html
@@ -1,9 +1,8 @@
<%inherit file="base.html"/>
<%def name="headIncludes()">
-
-
-
+
+
%def>
<%def name="body()">
@@ -12,49 +11,47 @@