Floatplane channel plugin for Jellyfin 10.10.x: browse, HLS proxy, cookie session, CI release
Some checks failed
release / build-release (push) Has been cancelled

- IChannel: creators -> sub-channels -> video posts (public listing API, search mapped)
- IRequiresMediaInfoCallback -> signed proxy URLs; stream controller rewrites HLS so the
  AES-128 key is fetched server-side with the session cookie, segments stay on the CDN
- delivery/info cached per token lifetime and throttled (~2/min)
- config page: paste sails.sid + validate, extra creators, quality, search test
- scripts/package.sh -> plugin folder + zip + md5 + manifest.json; Gitea release workflow
- research docs, HAR analysis (HAR itself gitignored), install-pi5.sh

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
2026-10-25 09:42:27 +01:00
commit 9e33a343ab
162 changed files with 52004 additions and 0 deletions

60
scripts/package.sh Executable file
View File

@@ -0,0 +1,60 @@
#!/usr/bin/env bash
# Builds the plugin and produces what Jellyfin needs to install it:
# build/Floatplane_<ver>/ plugin folder (DLL + meta.json) -> copy into <jellyfin>/plugins/
# build/floatplane_<ver>.zip plugin package -> release asset
# build/floatplane_<ver>.zip.md5 checksum
# build/manifest.json plugin-repository manifest (needs BASE_URL)
#
# Usage: scripts/package.sh [version] [base-url-for-zip]
# version defaults to the version in build.yaml; CI passes X.Y.Z.N
# base-url URL prefix where the zip will be downloadable (for manifest.json sourceUrl)
set -euo pipefail
cd "$(dirname "$0")/.."
VERSION="${1:-$(sed -n 's/^version: *"\(.*\)"/\1/p' build.yaml)}"
BASE_URL="${2:-}"
NAME=$(sed -n 's/^name: *"\(.*\)"/\1/p' build.yaml)
GUID=$(sed -n 's/^guid: *"\(.*\)"/\1/p' build.yaml)
ABI=$(sed -n 's/^targetAbi: *"\(.*\)"/\1/p' build.yaml)
OVERVIEW=$(sed -n 's/^overview: *"\(.*\)"/\1/p' build.yaml)
CATEGORY=$(sed -n 's/^category: *"\(.*\)"/\1/p' build.yaml)
OWNER=$(sed -n 's/^owner: *"\(.*\)"/\1/p' build.yaml)
# multi-line "description: >" and "changelog: >" blocks → single line
DESCRIPTION=$(awk '/^description: >/{f=1;next} /^[a-z]/{f=0} f{gsub(/^ +/,""); printf "%s ", $0}' build.yaml | sed 's/ *$//')
CHANGELOG=$(awk '/^changelog: >/{f=1;next} /^[a-z]/{f=0} f{gsub(/^ +/,""); printf "%s ", $0}' build.yaml | sed 's/ *$//')
SLUG=$(echo "$NAME" | tr '[:upper:]' '[:lower:]' | tr -c 'a-z0-9\n' '_')
TS=$(date -u +%Y-%m-%dT%H:%M:%SZ)
rm -rf build/publish "build/${NAME}_${VERSION}" "build/${SLUG}_${VERSION}.zip"*
mkdir -p build
dotnet publish Jellyfin.Plugin.Floatplane/Jellyfin.Plugin.Floatplane.csproj \
-c Release -o build/publish -p:Version="$VERSION" -p:AssemblyVersion="$VERSION" -p:FileVersion="$VERSION" --nologo
PLUGIN_DIR="build/${NAME}_${VERSION}"
mkdir -p "$PLUGIN_DIR"
cp build/publish/Jellyfin.Plugin.Floatplane.dll "$PLUGIN_DIR/"
jq -n --arg guid "$GUID" --arg name "$NAME" --arg desc "$DESCRIPTION" --arg ov "$OVERVIEW" \
--arg owner "$OWNER" --arg cat "$CATEGORY" --arg ver "$VERSION" --arg cl "$CHANGELOG" \
--arg abi "$ABI" --arg ts "$TS" \
'{guid:$guid, name:$name, description:$desc, overview:$ov, owner:$owner, category:$cat,
version:$ver, changelog:$cl, targetAbi:$abi, timestamp:$ts, status:"Active", autoUpdate:true,
imagePath:"", assemblies:["Jellyfin.Plugin.Floatplane.dll"]}' > "$PLUGIN_DIR/meta.json"
ZIP="build/${SLUG}_${VERSION}.zip"
(cd "$PLUGIN_DIR" && zip -q -j "../../$ZIP" Jellyfin.Plugin.Floatplane.dll meta.json)
MD5=$(md5sum "$ZIP" | cut -d' ' -f1)
echo "$MD5 $(basename "$ZIP")" > "$ZIP.md5"
if [ -n "$BASE_URL" ]; then
jq -n --arg guid "$GUID" --arg name "$NAME" --arg desc "$DESCRIPTION" --arg ov "$OVERVIEW" \
--arg owner "$OWNER" --arg cat "$CATEGORY" --arg ver "$VERSION" --arg cl "$CHANGELOG" \
--arg abi "$ABI" --arg ts "$TS" --arg md5 "$MD5" --arg url "${BASE_URL%/}/$(basename "$ZIP")" \
'[{guid:$guid, name:$name, description:$desc, overview:$ov, owner:$owner, category:$cat, imageUrl:"",
versions:[{version:$ver, changelog:$cl, targetAbi:$abi, sourceUrl:$url, checksum:$md5, timestamp:$ts}]}]' \
> build/manifest.json
fi
echo "plugin folder: $PLUGIN_DIR"
echo "package: $ZIP (md5 $MD5)"
[ -n "$BASE_URL" ] && echo "manifest: build/manifest.json -> $BASE_URL"
exit 0