Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion .dockerignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
.*

# ignore directories
docs/
tests/

# ignore venv when building locally
Expand Down
208 changes: 48 additions & 160 deletions .github/workflows/CI.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

on:
pull_request:
branches: [master]
branches: [master, dev/standalone] # TODO: remove dev/standalone ... temporarily allow PRs to this branch
types: [opened, synchronize, reopened]
push:
branches: [master]
Expand Down Expand Up @@ -37,176 +37,69 @@
build:
needs:
- setup_release
runs-on: ubuntu-20.04
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [windows-2019, ubuntu-20.04, macos-12]

Check failure on line 44 in .github/workflows/CI.yml

View workflow job for this annotation

GitHub Actions / Common Lint / Common Lint

label "macos-12" is unknown. available labels are "windows-latest", "windows-latest-8-cores", "windows-2025", "windows-2025-vs2026", "windows-2022", "windows-11-arm", "ubuntu-slim", "ubuntu-latest", "ubuntu-latest-4-cores", "ubuntu-latest-8-cores", "ubuntu-latest-16-cores", "ubuntu-24.04", "ubuntu-24.04-arm", "ubuntu-22.04", "ubuntu-22.04-arm", "macos-latest", "macos-latest-xlarge", "macos-latest-large", "macos-26-xlarge", "macos-26-large", "macos-26", "macos-15-intel", "macos-15-xlarge", "macos-15-large", "macos-15", "macos-14-xlarge", "macos-14-large", "macos-14", "self-hosted", "x64", "arm", "arm64", "linux", "macos", "windows", "windows-11-arm". if it is a custom label for self-hosted runner, set list of labels in actionlint.yaml config file

Check failure on line 44 in .github/workflows/CI.yml

View workflow job for this annotation

GitHub Actions / Common Lint / Common Lint

label "ubuntu-20.04" is unknown. available labels are "windows-latest", "windows-latest-8-cores", "windows-2025", "windows-2025-vs2026", "windows-2022", "windows-11-arm", "ubuntu-slim", "ubuntu-latest", "ubuntu-latest-4-cores", "ubuntu-latest-8-cores", "ubuntu-latest-16-cores", "ubuntu-24.04", "ubuntu-24.04-arm", "ubuntu-22.04", "ubuntu-22.04-arm", "macos-latest", "macos-latest-xlarge", "macos-latest-large", "macos-26-xlarge", "macos-26-large", "macos-26", "macos-15-intel", "macos-15-xlarge", "macos-15-large", "macos-15", "macos-14-xlarge", "macos-14-large", "macos-14", "self-hosted", "x64", "arm", "arm64", "linux", "macos", "windows", "windows-11-arm". if it is a custom label for self-hosted runner, set list of labels in actionlint.yaml config file

Check failure on line 44 in .github/workflows/CI.yml

View workflow job for this annotation

GitHub Actions / Common Lint / Common Lint

label "windows-2019" is unknown. available labels are "windows-latest", "windows-latest-8-cores", "windows-2025", "windows-2025-vs2026", "windows-2022", "windows-11-arm", "ubuntu-slim", "ubuntu-latest", "ubuntu-latest-4-cores", "ubuntu-latest-8-cores", "ubuntu-latest-16-cores", "ubuntu-24.04", "ubuntu-24.04-arm", "ubuntu-22.04", "ubuntu-22.04-arm", "macos-latest", "macos-latest-xlarge", "macos-latest-large", "macos-26-xlarge", "macos-26-large", "macos-26", "macos-15-intel", "macos-15-xlarge", "macos-15-large", "macos-15", "macos-14-xlarge", "macos-14-large", "macos-14", "self-hosted", "x64", "arm", "arm64", "linux", "macos", "windows", "windows-11-arm". if it is a custom label for self-hosted runner, set list of labels in actionlint.yaml config file
architecture: [x64]
include: # additional runs
- os: windows-2019

Check failure on line 47 in .github/workflows/CI.yml

View workflow job for this annotation

GitHub Actions / Common Lint / Common Lint

label "windows-2019" is unknown. available labels are "windows-latest", "windows-latest-8-cores", "windows-2025", "windows-2025-vs2026", "windows-2022", "windows-11-arm", "ubuntu-slim", "ubuntu-latest", "ubuntu-latest-4-cores", "ubuntu-latest-8-cores", "ubuntu-latest-16-cores", "ubuntu-24.04", "ubuntu-24.04-arm", "ubuntu-22.04", "ubuntu-22.04-arm", "macos-latest", "macos-latest-xlarge", "macos-latest-large", "macos-26-xlarge", "macos-26-large", "macos-26", "macos-15-intel", "macos-15-xlarge", "macos-15-large", "macos-15", "macos-14-xlarge", "macos-14-large", "macos-14", "self-hosted", "x64", "arm", "arm64", "linux", "macos", "windows", "windows-11-arm". if it is a custom label for self-hosted runner, set list of labels in actionlint.yaml config file
architecture: x86

steps:
- name: Checkout
uses: actions/checkout@v4
with:
path: Themerr-plex.bundle
submodules: recursive

- name: Set up Python
uses: LizardByte/setup-python-action@v2024.609.5111
- name: Setup Python
uses: actions/setup-python@v5
with:
python-version: '2.7'
python-version: '3.12'
architecture: ${{ matrix.architecture }}

- name: Patch third-party deps
if: false # disabled
shell: bash
working-directory: Themerr-plex.bundle/third-party
- name: Setup Python Dependencies
run: |
patch_dir=${{ github.workspace }}/Themerr-plex.bundle/patches

# youtube-dl patches
pushd youtube-dl
git apply -v "${patch_dir}/youtube_dl-compat.patch"
popd

- name: Set up Python Dependencies
shell: bash
working-directory: Themerr-plex.bundle
run: |
echo "Installing Requirements"
python --version
python -m pip --no-python-version-warning --disable-pip-version-check install --upgrade pip setuptools

# install dev requirements
python -m pip install --upgrade \
-r requirements-build.txt \
-r requirements-dev.txt

python -m pip install --upgrade --target=./Contents/Libraries/Shared \
-r requirements.txt --no-warn-script-location
python -m pip install --upgrade pip setuptools wheel
python -m pip install -r requirements-dev.txt

- name: Compile Locale Translations
working-directory: Themerr-plex.bundle
run: |
python ./scripts/_locale.py --compile

- name: Install npm packages
working-directory: Themerr-plex.bundle
shell: bash
run: |
# install node_modules
npm install
mv ./node_modules ./Contents/Resources/web

- name: Build plist
shell: bash
working-directory: Themerr-plex.bundle
env:
BUILD_VERSION: ${{ needs.setup_release.outputs.release_tag }}
# move node_modules directory to web directory
mv -f ./node_modules/ ./web/

- name: Compile Docs
working-directory: docs
run: |
make html

- name: Build pyinstaller package
run: |
python ./scripts/build_plist.py
python ./scripts/build.py

- name: Package Release
shell: bash
run: |
7z \
"-xr!*.git*" \
"-xr!*.pyc" \
"-xr!__pycache__" \
"-xr!plexhints*" \
"-xr!Themerr-plex.bundle/.*" \
"-xr!Themerr-plex.bundle/cache.sqlite" \
"-xr!Themerr-plex.bundle/codecov.yml" \
"-xr!Themerr-plex.bundle/crowdin.yml" \
"-xr!Themerr-plex.bundle/DOCKER_README.md" \
"-xr!Themerr-plex.bundle/Dockerfile" \
"-xr!Themerr-plex.bundle/docs" \
"-xr!Themerr-plex.bundle/patches" \
"-xr!Themerr-plex.bundle/scripts" \
"-xr!Themerr-plex.bundle/tests" \
a "./Themerr-plex.bundle.zip" "Themerr-plex.bundle"
7z a "./Themerr-plex_${{ runner.os }}_${{ matrix.architecture }}.zip" "dist"

mkdir artifacts
mv ./Themerr-plex.bundle.zip ./artifacts/
mv "./Themerr-plex_${{ runner.os }}_${{ matrix.architecture }}.zip" ./artifacts/

- name: Upload Artifacts
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v4 # https://github.com/actions/upload-artifact
with:
name: Themerr-plex.bundle
name: Themerr-plex_${{ runner.os }}_${{ matrix.architecture }}
if-no-files-found: error # 'warn' or 'ignore' are also available, defaults to `warn`
path: |
${{ github.workspace }}/artifacts

- name: Create/Update GitHub Release
if: ${{ needs.setup_release.outputs.publish_release == 'true' }}
uses: LizardByte/create-release-action@v2024.919.143026
with:
allowUpdates: true
body: ${{ needs.setup_release.outputs.release_body }}
generateReleaseNotes: ${{ needs.setup_release.outputs.release_generate_release_notes }}
name: ${{ needs.setup_release.outputs.release_tag }}
prerelease: true
tag: ${{ needs.setup_release.outputs.release_tag }}
token: ${{ secrets.GH_BOT_TOKEN }}

pytest:
needs: [build]
strategy:
fail-fast: false
matrix:
os: [windows-latest, ubuntu-latest, macos-latest]

runs-on: ${{ matrix.os }}
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Download artifacts
uses: actions/download-artifact@v4
with:
name: Themerr-plex.bundle

- name: Extract artifacts zip
shell: bash
run: |
# extract zip
7z x Themerr-plex.bundle.zip -o.

# move all files from "Themerr-plex.bundle" to root, with no target directory
cp -r ./Themerr-plex.bundle/. .

# remove zip
rm Themerr-plex.bundle.zip

- name: Set up Python
uses: LizardByte/setup-python-action@v2024.609.5111
with:
python-version: '2.7'

- name: Bootstrap Plex server
env:
PLEXAPI_PLEXAPI_TIMEOUT: "60"
id: bootstrap
uses: LizardByte/plexhints@v2024.809.14117
with:
additional_server_queries: >-
put|/system/agents/com.plexapp.agents.imdb/config/1?order=com.plexapp.agents.imdb%2Cdev.lizardbyte.themerr-plex
put|/system/agents/com.plexapp.agents.themoviedb/config/1?order=com.plexapp.agents.themoviedb%2Cdev.lizardbyte.themerr-plex
put|/system/agents/com.plexapp.agents.themoviedb/config/2?order=com.plexapp.agents.themoviedb%2Cdev.lizardbyte.themerr-plex
put|/system/agents/com.plexapp.agents.thetvdb/config/2?order=com.plexapp.agents.thetvdb%2Cdev.lizardbyte.themerr-plex
get|/:/plugins/dev.lizardbyte.themerr-plex/prefs/set?bool_overwrite_plex_provided_themes=true
plugin_bundles_to_install: >-
Themerr-plex.bundle
without_music: true
without_photos: true

- name: Install python dependencies
shell: bash
run: |
python -m pip --no-python-version-warning --disable-pip-version-check install --upgrade \
pip setuptools wheel
python -m pip --no-python-version-warning --disable-pip-version-check install --no-build-isolation \
-r requirements-dev.txt

- name: Test with pytest
env:
PLEX_PLUGIN_LOG_PATH: ${{ steps.bootstrap.outputs.PLEX_PLUGIN_LOG_PATH }}
PLEXAPI_AUTH_SERVER_BASEURL: ${{ steps.bootstrap.outputs.PLEX_SERVER_BASEURL }}
PLEXAPI_AUTH_SERVER_TOKEN: ${{ steps.bootstrap.outputs.PLEXTOKEN }}
PLEXAPI_PLEXAPI_TIMEOUT: "60"
PLEXTOKEN: ${{ steps.bootstrap.outputs.PLEXTOKEN }}
id: test
shell: bash
run: |
Expand All @@ -215,30 +108,25 @@
--tb=native \
--verbose \
--color=yes \
--cov=Contents/Code \
--cov=src \
tests

- name: Debug log file
if: always()
shell: bash
run: |
echo "Debugging log file"
if [[ "${{ runner.os }}" == "Windows" ]]; then
log_file=$(cygpath.exe -u \
"${{ steps.bootstrap.outputs.PLEX_PLUGIN_LOG_PATH }}/dev.lizardbyte.themerr-plex.log")
else
log_file="${{ steps.bootstrap.outputs.PLEX_PLUGIN_LOG_PATH }}/dev.lizardbyte.themerr-plex.log"
fi
cat "${log_file}"

- name: Upload coverage
# any except canceled or skipped
if: >-
always() &&
(steps.test.outcome == 'success' || steps.test.outcome == 'failure') &&
startsWith(github.repository, 'LizardByte/')
uses: codecov/codecov-action@v4
with:
fail_ci_if_error: true
flags: ${{ runner.os }}
flags: "${{ runner.os }}-${{ matrix.architecture }}"
token: ${{ secrets.CODECOV_TOKEN }}
verbose: true

- name: Create/Update GitHub Release
if: ${{ needs.setup_release.outputs.publish_release == 'true' }}
uses: LizardByte/create-release-action@v2024.919.143026
with:
allowUpdates: true
body: ${{ needs.setup_release.outputs.release_body }}
generateReleaseNotes: ${{ needs.setup_release.outputs.release_generate_release_notes }}
name: ${{ needs.setup_release.outputs.release_tag }}
prerelease: true
tag: ${{ needs.setup_release.outputs.release_tag }}
token: ${{ secrets.GH_BOT_TOKEN }}
28 changes: 13 additions & 15 deletions .github/workflows/localize.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@
branches: [master]
paths: # prevents workflow from running unless these files change
- '.github/workflows/localize.yml'
- 'Contents/Strings/Themerr-plex.po'
- 'Contents/Code/**.py'
- 'Contents/Resources/web/templates/**'
- 'locale/themerr-plex.po'
- 'src/**.py'
- 'web/templates/**'
workflow_dispatch:

jobs:
Expand All @@ -19,49 +19,47 @@
steps:
- name: Checkout
uses: actions/checkout@v4
with:
submodules: recursive

- name: Set up Python
uses: LizardByte/setup-python-action@v2024.609.5111
- name: Install Python
uses: actions/setup-python@v5 # https://github.com/actions/setup-python
with:
python-version: '2.7'
python-version: '3.12'

- name: Set up Python Dependencies
- name: Setup Python Dependencies
run: |
python -m pip install --upgrade pip setuptools requests
python -m pip install -r requirements.txt # requests is required to install python-plexapi
python -m pip install --upgrade pip setuptools wheel
python -m pip install -r requirements.txt

- name: Update Strings
run: |
python ./scripts/_locale.py --extract

- name: git diff
run: |

Check failure on line 38 in .github/workflows/localize.yml

View workflow job for this annotation

GitHub Actions / Common Lint / Common Lint

shellcheck reported issue in this script: SC2086:info:9:30: Double quote to prevent globbing and word splitting
# disable the pager
git config --global pager.diff false

# print the git diff
git diff Contents/Strings/themerr-plex.po
git diff locale/themerr-plex.po

# set the variable with minimal output, replacing `\t` with ` `
OUTPUT=$(git diff --numstat Contents/Strings/themerr-plex.po | sed -e "s#\t# #g")
OUTPUT=$(git diff --numstat locale/themerr-plex.po | sed -e "s#\t# #g")
echo "git_diff=${OUTPUT}" >> $GITHUB_ENV

- name: git reset
if: ${{ env.git_diff == '1 1 Contents/Strings/themerr-plex.po' }} # only run if more than 1 line changed
if: ${{ env.git_diff == '1 1 locale/themerr-plex.po' }} # only run if more than 1 line changed
run: |
git reset --hard

- name: Get current date
id: date
run: echo "date=$(date +'%Y-%m-%d')" >> $GITHUB_OUTPUT

Check failure on line 56 in .github/workflows/localize.yml

View workflow job for this annotation

GitHub Actions / Common Lint / Common Lint

shellcheck reported issue in this script: SC2086:info:1:36: Double quote to prevent globbing and word splitting

- name: Create/Update Pull Request
uses: peter-evans/create-pull-request@v7
with:
add-paths: |
Contents/Strings/*.po
locale/*.po
token: ${{ secrets.GH_BOT_TOKEN }} # must trigger PR tests
commit-message: "chore(l10n): new babel updates"
branch: localize/update
Expand Down
25 changes: 5 additions & 20 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -101,15 +101,7 @@ ipython_config.py
# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
#poetry.lock

# pdm
# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
#pdm.lock
# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
# in version control.
# https://pdm.fming.dev/#use-with-ide
.pdm.toml

# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
# PEP 582; used by e.g. github.com/David-OConnor/pyflow
__pypackages__/

# Celery stuff
Expand Down Expand Up @@ -159,16 +151,9 @@ cython_debug/
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
.idea/

# Remove the agent Info.plist since we are building it
Contents/Info.plist

# Remove plexhints files
plexhints-temp
*cache.sqlite

# Remove python modules
Contents/Libraries/Shared/

# npm
node_modules/
package-lock.json
*package-lock.json

# project files and directories
config/
4 changes: 0 additions & 4 deletions .gitmodules

This file was deleted.

Loading
Loading