Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
128 commits
Select commit Hold shift + click to select a range
d094d4e
Add web client and media/metadata server work
ReenigneArcher Apr 22, 2026
c838823
Add user profile fields & settings UI updates
ReenigneArcher Apr 23, 2026
4d6caea
Add TheTVDB provider and library scan UI
ReenigneArcher Apr 24, 2026
37be86d
Integrate tmdb_client and enhance metadata UI
ReenigneArcher Apr 24, 2026
9320c1e
Support localized metadata, provider attribution
ReenigneArcher Apr 24, 2026
80ec60b
Add browse-detail, home preview & metadata fields
ReenigneArcher Apr 25, 2026
58b7afa
Add playlists, UI/gamepad UX, and TVDB language
ReenigneArcher Apr 25, 2026
c07eaa4
Improve search UI, page backdrops, metadata IDs
ReenigneArcher Apr 25, 2026
05a2287
Update home feature & shelf header styles
ReenigneArcher Apr 25, 2026
d5e5891
Use solid backgrounds to prevent bleed-through
ReenigneArcher Apr 25, 2026
892a4ca
Refine home-feature overlays and rail styles
ReenigneArcher Apr 25, 2026
60ea3f3
Add playback sessions, transcode & player UI
ReenigneArcher Apr 26, 2026
a60716f
Support resumable playback and start_ms streaming
ReenigneArcher Apr 26, 2026
ae47e0e
Add audio track selection and ranged streaming
ReenigneArcher Apr 26, 2026
5cae0c6
Audio stream selection, ranged responses, FFmpeg
ReenigneArcher Apr 26, 2026
deed2de
Improve audio track menu accessibility and behavior
ReenigneArcher Apr 26, 2026
e2c1ca2
Improve player controls (seek escalation & wheel)
ReenigneArcher Apr 26, 2026
0f9888a
Manage active transcode tasks
ReenigneArcher Apr 26, 2026
8f85fd2
Add normalized metadata people & person pages
ReenigneArcher Apr 26, 2026
765db9e
Add collapsible text for long descriptions
ReenigneArcher Apr 26, 2026
593750d
Add metadata response cache and clear endpoint
ReenigneArcher Apr 26, 2026
fc99cb4
Async library loading; enhance metadata parsing
ReenigneArcher Apr 27, 2026
48526e3
Refactor metadata providers and normalize IDs
ReenigneArcher Apr 27, 2026
978207d
Remove provider_payload_json and store asset DB paths
ReenigneArcher Apr 27, 2026
ca9f531
Add provider roles, per-library languages & access
ReenigneArcher Apr 28, 2026
b4b3feb
Store and use theme_song_url across server and client
ReenigneArcher Apr 28, 2026
0f1a5f4
Support generic provider theme-song lookups
ReenigneArcher Apr 28, 2026
348b95e
Support collection theme songs & normalize DB
ReenigneArcher Apr 28, 2026
7656192
Make metadata collection name nullable
ReenigneArcher Apr 28, 2026
2fec723
Adjust metadata-attribution image size
ReenigneArcher Apr 28, 2026
c2dd418
Normalize YouTube URLs and add YouTube theme player
ReenigneArcher Apr 28, 2026
b627d23
Stream start only for transcode; client seek
ReenigneArcher Apr 28, 2026
2079aaa
Associate preview highlights with parent show
ReenigneArcher Apr 28, 2026
66e0e50
Add person credit hierarchy and UI trays
ReenigneArcher Apr 28, 2026
e0fd385
Add collection detail page and styles
ReenigneArcher Apr 28, 2026
f3ebb14
Serve SPA assets via URI segments; update home-tab
ReenigneArcher Apr 28, 2026
fa3f482
Add category & playlist browse detail views
ReenigneArcher Apr 28, 2026
703c4c5
Add collection previews and home backdrops
ReenigneArcher Apr 28, 2026
5772778
Add collection rails to item page
ReenigneArcher Apr 28, 2026
2762013
Prefer YouTube trailers in TVDB metadata
ReenigneArcher Apr 29, 2026
61b29de
Refactor trailer header into chrome overlay
ReenigneArcher Apr 29, 2026
c9e5218
Add YouTube trailer player UI and controls
ReenigneArcher Apr 29, 2026
8744ea1
Add YouTube chrome mask overlay for trailers
ReenigneArcher Apr 29, 2026
5cda045
Add progressive skip & refactor trailer player
ReenigneArcher Apr 29, 2026
b38cf18
Display item logo in trailer overlay
ReenigneArcher Apr 29, 2026
4a36c71
Add TrailerDB provider and secondary metadata support
ReenigneArcher Apr 29, 2026
4e8b7c4
Clamp trailer chrome mask heights to 90px
ReenigneArcher Apr 29, 2026
99aa7ce
Store runtime settings in app_settings table
ReenigneArcher Apr 29, 2026
b8255e0
Support missing-media trash & cleanup
ReenigneArcher Apr 29, 2026
eccdd62
Set retry backoff step to 1ms and handle errors
ReenigneArcher Apr 29, 2026
890b4cc
Spawn background task for library metadata refresh
ReenigneArcher Apr 29, 2026
c50ba0b
Add DB upserts and dedupe metadata refreshes
ReenigneArcher Apr 30, 2026
e51308b
Add per-locale metadata support
ReenigneArcher Apr 30, 2026
6cbe507
Add user profile image upload and serving
ReenigneArcher Apr 30, 2026
55dd78e
Refactor recommended sorting and add tests
ReenigneArcher Apr 30, 2026
b808451
Per-library metadata settings and async linking
ReenigneArcher Apr 30, 2026
005163a
TVDB: language-aware search & translation
ReenigneArcher Apr 30, 2026
366118e
Preserve raw search input; trim only for visibility
ReenigneArcher Apr 30, 2026
8d092b6
Include search results in home preview
ReenigneArcher Apr 30, 2026
bd2e47d
Clear home search on navigation/tab change
ReenigneArcher Apr 30, 2026
5fe2969
Add clear-search toggle to home navbar
ReenigneArcher Apr 30, 2026
ebd85c1
Add provider attribution renderer with logo/alt
ReenigneArcher Apr 30, 2026
c0ee18d
Apply casing penalty for TMDB/TVDB results
ReenigneArcher Apr 30, 2026
7c677ec
Remove library_id from search API and calls
ReenigneArcher Apr 30, 2026
2442a3e
Add mixed search results (collections & people)
ReenigneArcher May 1, 2026
2f6d825
Lazy-load home shelves and remove 12-item cap
ReenigneArcher May 1, 2026
333e7df
Update shelf scroll controls and styles
ReenigneArcher May 1, 2026
b7fa489
Prefer SVG images for metadata artwork
ReenigneArcher May 2, 2026
e9b7f32
Introduce media_file_libraries membership table
ReenigneArcher May 2, 2026
1fd8f72
Add scheduled tasks runner and settings UI
ReenigneArcher May 2, 2026
543e176
Refactor scheduled tasks into modular task system
ReenigneArcher May 2, 2026
f5488f4
Add external_media and metadata_extras
ReenigneArcher May 2, 2026
2f19c32
Add media 'extras' support to API and UI
ReenigneArcher May 2, 2026
e0f45f1
Materialize missing show seasons/episodes
ReenigneArcher May 2, 2026
d985584
Add library scanner & file_hash support
ReenigneArcher May 3, 2026
3fa2bba
chore: cargo fmt
ReenigneArcher May 3, 2026
21dfe2d
Refactor metadata refresh and drop library monitor
ReenigneArcher May 3, 2026
68620b7
Add AGENTS.md: use cargo +nightly fmt
ReenigneArcher May 3, 2026
1f1098c
Add DOM-preserving render patcher
ReenigneArcher May 3, 2026
833adda
Sync visible spinners after appending shelf items
ReenigneArcher May 3, 2026
8d414b5
Optional person detail fetching & refresh recovery
ReenigneArcher May 5, 2026
80347a3
Handle TMDB guest_stars in metadata
ReenigneArcher May 5, 2026
d950a35
Expose available season counts for shows
ReenigneArcher May 5, 2026
bd3329f
Inherit theme song URL for item details
ReenigneArcher May 5, 2026
93c8953
Track watch counts & add playback targets
ReenigneArcher May 5, 2026
b73dc2c
Refactor continue-watching logic; UI tweaks
ReenigneArcher May 5, 2026
f4409a4
Show episodes with season artwork & subtitles
ReenigneArcher May 5, 2026
1c07c6b
Persist metadata provider API keys to secret store
ReenigneArcher May 6, 2026
c02dbf6
Normalize person external IDs; remove identity_key
ReenigneArcher May 27, 2026
ad97deb
Update LICENSE
ReenigneArcher Jun 11, 2026
c612569
Create known-issues.md
ReenigneArcher Jun 11, 2026
58b560c
Consolidate SQL migrations into initial schema
ReenigneArcher Jun 11, 2026
336d74a
Add xtask and enforce ordered SQLite migrations
ReenigneArcher Jun 11, 2026
d4f1f93
Track Cargo.lock and update .gitignore
ReenigneArcher Jun 11, 2026
d3cefa3
Fix common lint
ReenigneArcher Jun 11, 2026
510af2c
Add client-web frontend app modules
ReenigneArcher Jun 12, 2026
79cd711
Fix sonar typescript:S7764
ReenigneArcher Jun 12, 2026
81b662c
Fix sonar typescript:S3358
ReenigneArcher Jun 12, 2026
2402a21
Fix sonar typescript:S6551
ReenigneArcher Jun 12, 2026
5ea9f79
Fix sonar typescript:S6594
ReenigneArcher Jun 12, 2026
b13d977
Fix sonar typescript:S4624
ReenigneArcher Jun 12, 2026
e7d0164
Fix sonar typescript:S4144
ReenigneArcher Jun 12, 2026
43a5ef8
Fix sonar typescript:S3776
ReenigneArcher Jun 12, 2026
91df8ea
Fix sonar typescript issues
ReenigneArcher Jun 12, 2026
43c6b75
Fix sonar css:S4666
ReenigneArcher Jun 12, 2026
daab7b4
Separate and style media-card badges
ReenigneArcher Jun 13, 2026
b618e22
Use 'layers' icon for collections
ReenigneArcher Jun 13, 2026
29ad77b
Add cargo-deny license check and deny.toml
ReenigneArcher Jun 13, 2026
04283cd
CI: build web client; fix logs test timestamp
ReenigneArcher Jun 13, 2026
a8f211d
Refactor media/metadata helpers and small cleanups
ReenigneArcher Jun 13, 2026
0992d3d
Refactor CI into reusable workflow components
ReenigneArcher Jun 13, 2026
c689634
Remove strip and chmod steps from CI
ReenigneArcher Jun 13, 2026
334435e
CI: switch to musl targets and Alpine
ReenigneArcher Jun 13, 2026
0d2a497
Add optional tray and native-secret-store features
ReenigneArcher Jun 14, 2026
baaea2a
Add Flatpak packaging and CI integration
ReenigneArcher Jun 14, 2026
199c1f6
Update test_signal_handler.rs
ReenigneArcher Jun 14, 2026
5e2aeda
Add GNU targets and adjust tarpaulin for aarch64
ReenigneArcher Jun 15, 2026
254fc0d
Add Windows installer CI and WiX packaging
ReenigneArcher Jun 15, 2026
efaab06
Improve tray icon lookup and Flatpak assets
ReenigneArcher Jun 16, 2026
dd2d078
Add launch_rocket_with_shutdown and isolate web tests
ReenigneArcher Jun 16, 2026
c836e0e
Make tray event loop exit cleanly and update tests
ReenigneArcher Jun 16, 2026
8dedf6c
Use catch_unwind for panicking tests
ReenigneArcher Jun 16, 2026
ecdaee8
Refactor CI to use workspace metadata for tools
ReenigneArcher Jun 17, 2026
604e8ab
CI: matrix-driven Rust build/test workflow
ReenigneArcher Jun 17, 2026
d8a5ea3
Add macOS DMG packaging and CI integration
ReenigneArcher Jun 17, 2026
ea83ef9
Install cargo-deny via cargo-run-bin in CI
ReenigneArcher Jun 17, 2026
159606d
Rename media_type->item_type and tighten item kinds
ReenigneArcher Jun 18, 2026
9d9d805
address pr comments
ReenigneArcher Jun 22, 2026
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
13 changes: 6 additions & 7 deletions .cargo/config.toml
Original file line number Diff line number Diff line change
@@ -1,18 +1,17 @@
# TODO: static link glibc

[alias]
new-migration = "run --quiet -p xtask -- new-migration"

# [target.x86_64-unknown-linux-gnu]
# linker = "x86_64-linux-gnu-gcc"
# rustflags = ["-C", "target-feature=+crt-static"]

# [target.x86_64-unknown-linux-musl]
# rustflags = ["-L/usr/local/lib", "-L/usr/lib", "-L/lib"]

[target.aarch64-unknown-linux-gnu]
linker = "aarch64-linux-gnu-gcc"
# rustflags = ["-C", "target-feature=+crt-static"]
[target.x86_64-unknown-linux-musl]
linker = "x86_64-alpine-linux-musl-gcc"

[target.aarch64-unknown-linux-musl]
linker = "aarch64-linux-gnu-gcc"
linker = "aarch64-alpine-linux-musl-gcc"

[target.armv7-unknown-linux-gnueabihf]
linker = "arm-linux-gnueabihf-gcc"
Expand Down
37 changes: 37 additions & 0 deletions .github/workflows/ci-clippy.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
---
name: CI-Clippy
permissions: {}

on:
workflow_call:

jobs:
clippy:
name: Clippy
permissions:
contents: read
runs-on: ubuntu-latest
env:
CARGO_TERM_COLOR: always
steps:
- name: Checkout
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3

- name: Install system dependencies
run: |
sudo apt-get update
sudo apt-get install -y \
libayatana-appindicator3-dev \
libglib2.0-dev \
libgtk-3-dev \
libxdo-dev

- name: Setup Rust
uses: actions-rust-lang/setup-rust-toolchain@2b1f5e9b395427c92ee4e3331786ca3c37afe2d7 # v1.16.0
with:
components: clippy
cache: true
cache-on-failure: false

- name: Clippy
run: cargo clippy --locked -- -D warnings
46 changes: 46 additions & 0 deletions .github/workflows/ci-coverage.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
---
name: CI-Coverage
permissions: {}

on:
workflow_call:
secrets:
CODECOV_TOKEN:
required: false

jobs:
coverage:
strategy:
fail-fast: false
matrix:
target:
- x86_64-unknown-linux-musl
- aarch64-unknown-linux-musl
- x86_64-unknown-linux-gnu
- aarch64-unknown-linux-gnu
- x86_64-apple-darwin
- aarch64-apple-darwin
- x86_64-pc-windows-msvc
name: Coverage (${{ matrix.target }})
permissions:
contents: read
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3

- name: Download coverage artifact
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: coverage-${{ matrix.target }}
path: _coverage

- name: Upload coverage
uses: codecov/codecov-action@fb8b3582c8e4def4969c97caa2f19720cb33a72f # v7.0.0
with:
disable_search: true
fail_ci_if_error: true
files: ./_coverage/cobertura.xml
flags: ${{ matrix.target }}
token: ${{ secrets.CODECOV_TOKEN }}
verbose: true
186 changes: 186 additions & 0 deletions .github/workflows/ci-flatpak.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,186 @@
---
name: CI-Flatpak
permissions: {}

on:
workflow_call:
inputs:
release_commit:
required: true
type: string
release_version:
required: true
type: string

env:
APP_ID: dev.lizardbyte.app.Koko
FREEDESKTOP_SDK_VERSION: "25.08"
NODE_VERSION: "24"
PYTHON_VERSION: "3.14"

jobs:
flatpak:
name: ${{ matrix.arch }}
env:
MATRIX_ARCH: ${{ matrix.arch }}
permissions:
contents: read
runs-on: ${{ matrix.runner }}
strategy:
fail-fast: false
matrix:
include:
- arch: x86_64
runner: ubuntu-22.04
- arch: aarch64
runner: ubuntu-24.04-arm
steps:
- name: Checkout
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
with:
submodules: recursive

- name: Setup Python
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
with:
python-version: ${{ env.PYTHON_VERSION }}

- name: Setup uv
uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
with:
enable-cache: true

- name: Sync Python tools
run: |
uv sync --locked --only-group flatpak \
--python "${PYTHON_VERSION}" \
--no-python-downloads \
--no-install-project

- name: Setup Flatpak dependencies
run: |
sudo apt-get update -y
sudo apt-get install -y flatpak

sudo su "$(whoami)" -c "flatpak --user remote-add --if-not-exists flathub \
https://flathub.org/repo/flathub.flatpakrepo
"

sudo su "$(whoami)" -c "flatpak --user install -y flathub \
org.flatpak.Builder \
org.freedesktop.Platform/${MATRIX_ARCH}/${FREEDESKTOP_SDK_VERSION} \
org.freedesktop.Sdk/${MATRIX_ARCH}/${FREEDESKTOP_SDK_VERSION} \
org.freedesktop.Sdk.Extension.node${NODE_VERSION}/${MATRIX_ARCH}/${FREEDESKTOP_SDK_VERSION} \
org.freedesktop.Sdk.Extension.rust-stable/${MATRIX_ARCH}/${FREEDESKTOP_SDK_VERSION} \
"

flatpak run org.flatpak.Builder --version

- name: Generate Flatpak Node sources
run: |
uv run --locked --no-sync python -m flatpak_node_generator \
npm crates/client-web/package-lock.json \
--node-sdk-extension "org.freedesktop.Sdk.Extension.node${NODE_VERSION}//${FREEDESKTOP_SDK_VERSION}" \
--output generated-node-sources.json

- name: Generate Flatpak Cargo sources
run: |
uv run --locked --no-sync python \
./packaging/linux/flatpak/deps/flatpak-builder-tools/cargo/flatpak-cargo-generator.py \
Cargo.lock \
--output generated-cargo-sources.json

- name: Configure Flatpak manifest
env:
INPUT_RELEASE_COMMIT: ${{ inputs.release_commit }}
INPUT_RELEASE_VERSION: ${{ inputs.release_version }}
REPOSITORY_CLONE_URL: ${{ github.event.repository.clone_url }}
run: |
set -euo pipefail
build_date="$(git show -s --format=%cs "${INPUT_RELEASE_COMMIT}")"

mkdir -p build artifacts
cp generated-node-sources.json build/
cp generated-cargo-sources.json build/
cp -r packaging/linux/flatpak/deps/shared-modules build/shared-modules
cp -r packaging/linux/flatpak/modules build/modules
cp "packaging/linux/flatpak/${APP_ID}.yml" "build/${APP_ID}.yml"
cp "packaging/linux/flatpak/${APP_ID}.metainfo.xml" "build/${APP_ID}.metainfo.xml"

sed -i \
-e "s|@BUILD_DATE@|${build_date}|g" \
-e "s|@BUILD_VERSION@|${INPUT_RELEASE_VERSION}|g" \
-e "s|@GITHUB_CLONE_URL@|${REPOSITORY_CLONE_URL}|g" \
-e "s|@GITHUB_COMMIT@|${INPUT_RELEASE_COMMIT}|g" \
"build/${APP_ID}.yml"

sed -i \
-e "s|@BUILD_DATE@|${build_date}|g" \
-e "s|@BUILD_VERSION@|${INPUT_RELEASE_VERSION}|g" \
"build/${APP_ID}.metainfo.xml"

- name: Debug manifest
working-directory: build
run: cat "${APP_ID}.yml"

- name: Cache Flatpak build
uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
with:
path: ./build/.flatpak-builder
key: flatpak-${{ matrix.arch }}-${{ github.sha }}
restore-keys: |
flatpak-${{ matrix.arch }}-

- name: Build Linux Flatpak
working-directory: build
run: |
sudo su "$(whoami)" -c "flatpak run org.flatpak.Builder \
--arch=${MATRIX_ARCH} \
--force-clean \
--repo=repo \
--sandbox \
build-koko ${APP_ID}.yml"

sudo su "$(whoami)" -c "flatpak build-bundle \
--arch=${MATRIX_ARCH} \
./repo \
../artifacts/koko_${MATRIX_ARCH}.flatpak ${APP_ID}"

- name: Lint Flatpak
working-directory: build
run: |
exceptions_file="${GITHUB_WORKSPACE}/packaging/linux/flatpak/exceptions.json"

flatpak run --command=flatpak-builder-lint org.flatpak.Builder \
--exceptions \
--user-exceptions "${exceptions_file}" \
manifest \
"${APP_ID}.yml"

flatpak run --command=flatpak-builder-lint org.flatpak.Builder \
--exceptions \
--user-exceptions "${exceptions_file}" \
repo \
repo

- name: Package Flathub repo archive
if: matrix.arch == 'x86_64'
run: |
mkdir -p flathub/modules
cp "./build/generated-cargo-sources.json" "./flathub/"
cp "./build/generated-node-sources.json" "./flathub/"
cp "./build/${APP_ID}.yml" "./flathub/"
cp "./packaging/linux/flatpak/${APP_ID}.desktop" "./flathub/"
cp "./build/${APP_ID}.metainfo.xml" "./flathub/"
cp "./packaging/linux/flatpak/README.md" "./flathub/"
cp "./packaging/linux/flatpak/flathub.json" "./flathub/"
cp -r "./packaging/linux/flatpak/modules/." "./flathub/modules/"
# submodules will need to be handled in the workflow that creates the PR
tar -czf ./artifacts/flathub.tar.gz -C ./flathub .

- name: Upload Artifacts
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
if-no-files-found: error
name: koko-flatpak-${{ matrix.arch }}
path: artifacts/
Loading