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
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:
183
.gitea/workflows/release.yaml
Normal file
183
.gitea/workflows/release.yaml
Normal file
@@ -0,0 +1,183 @@
|
||||
name: release
|
||||
|
||||
# Bygger Jellyfin-pluginen (AnyCPU .NET 8 -> samma DLL for x64 och Pi5/arm64),
|
||||
# kor testerna och publicerar en release pa Gitea:
|
||||
# - varje push till master -> rullande release "latest"
|
||||
# - tagg vX.Y.Z -> versionerad release (plugin-version X.Y.Z.0)
|
||||
# - workflow_dispatch -> valfri tag (tom = latest)
|
||||
# Assets: floatplane_<ver>.zip (+.md5), manifest.json (Jellyfins plugin-
|
||||
# repository-format) och install-pi5.sh. manifest.json laddas ALLTID upp
|
||||
# till "latest" sa att URL:en nedan alltid pekar pa nyaste versionen:
|
||||
# https://gitea.brasse-pc.eu/brasse/jellyfin-plugin-floatplane/releases/download/latest/manifest.json
|
||||
#
|
||||
# Kors pa brasse-linux01-runnern (label linux-amd64, catthehacker/ubuntu:act-latest).
|
||||
# Bygget ar IL-only sa arkitekturen spelar ingen roll, men Pi5:n ska inte
|
||||
# belastas med byggen. .NET-SDK:t installeras med dotnet-install.sh eftersom
|
||||
# runner-imagen saknar dotnet (och dotnet/sdk-imagen saknar node for actions).
|
||||
on:
|
||||
push:
|
||||
branches: [master]
|
||||
tags: ["v*"]
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
tag:
|
||||
description: "Release-tag (lamna tom for 'latest')"
|
||||
required: false
|
||||
|
||||
env:
|
||||
DOTNET_CLI_TELEMETRY_OPTOUT: "1"
|
||||
DOTNET_NOLOGO: "1"
|
||||
DOTNET_SKIP_FIRST_TIME_EXPERIENCE: "1"
|
||||
REPO_URL: https://gitea.brasse-pc.eu/brasse/jellyfin-plugin-floatplane
|
||||
|
||||
jobs:
|
||||
build-release:
|
||||
runs-on: linux-amd64
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Installera verktyg (zip, jq, curl)
|
||||
run: |
|
||||
set -euo pipefail
|
||||
apt-get update -qq
|
||||
DEBIAN_FRONTEND=noninteractive apt-get install -y -qq --no-install-recommends zip jq curl ca-certificates >/dev/null
|
||||
git config --global --add safe.directory '*'
|
||||
|
||||
- name: Cache NuGet-paket
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: ~/.nuget/packages
|
||||
key: nuget-${{ hashFiles('**/*.csproj') }}
|
||||
restore-keys: nuget-
|
||||
|
||||
- name: Installera .NET 8 SDK
|
||||
run: |
|
||||
set -euo pipefail
|
||||
curl -fsSL https://dot.net/v1/dotnet-install.sh -o /tmp/dotnet-install.sh
|
||||
bash /tmp/dotnet-install.sh --channel 8.0 --install-dir "$HOME/.dotnet"
|
||||
echo "$HOME/.dotnet" >> "$GITHUB_PATH"
|
||||
echo "DOTNET_ROOT=$HOME/.dotnet" >> "$GITHUB_ENV"
|
||||
"$HOME/.dotnet/dotnet" --version
|
||||
|
||||
- name: Bestam release-tag och plugin-version
|
||||
id: t
|
||||
run: |
|
||||
set -euo pipefail
|
||||
case "$GITHUB_REF" in
|
||||
refs/tags/*) T="$GITHUB_REF_NAME" ;;
|
||||
*) T="${{ inputs.tag }}"; [ -z "$T" ] && T="latest" ;;
|
||||
esac
|
||||
# Jellyfin kraver en fyrdelad System.Version: vX.Y.Z -> X.Y.Z.0, annars 0.1.0.<run>
|
||||
case "$T" in
|
||||
v[0-9]*.[0-9]*.[0-9]*) V="${T#v}.0" ;;
|
||||
*) V="0.1.0.${{ github.run_number }}" ;;
|
||||
esac
|
||||
echo "tag=$T" >> "$GITHUB_OUTPUT"
|
||||
echo "version=$V" >> "$GITHUB_OUTPUT"
|
||||
echo "bygger release: $T (plugin-version $V)"
|
||||
|
||||
- name: Tester
|
||||
run: |
|
||||
set -euo pipefail
|
||||
if [ -d Jellyfin.Plugin.Floatplane.Tests ]; then
|
||||
dotnet test Jellyfin.Plugin.Floatplane.Tests -c Release --nologo
|
||||
else
|
||||
echo "inget testprojekt annu - hoppar over"
|
||||
fi
|
||||
|
||||
- name: Paketera (zip + meta.json + manifest.json)
|
||||
env:
|
||||
TAG: ${{ steps.t.outputs.tag }}
|
||||
VERSION: ${{ steps.t.outputs.version }}
|
||||
run: |
|
||||
set -euo pipefail
|
||||
scripts/package.sh "$VERSION" "$REPO_URL/releases/download/$TAG"
|
||||
ls -la build
|
||||
cat build/manifest.json
|
||||
|
||||
- name: Skapa/uppdatera Gitea-release + ladda upp assets
|
||||
env:
|
||||
REPO: ${{ github.repository }}
|
||||
TAG: ${{ steps.t.outputs.tag }}
|
||||
VERSION: ${{ steps.t.outputs.version }}
|
||||
TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: |
|
||||
set -euo pipefail
|
||||
# gitea-d finns bara pa Pi5:ns dockernat; harifran anvands publika adressen
|
||||
API=http://gitea-d:3000/api/v1
|
||||
curl -sf -m 5 "$API/version" >/dev/null 2>&1 || API=https://gitea.brasse-pc.eu/api/v1
|
||||
echo "API: $API"
|
||||
auth() { curl -s -H "Authorization: token $TOKEN" "$@"; }
|
||||
|
||||
ZIP="floatplane_${VERSION}.zip"
|
||||
cp build/manifest.json build/manifest.json.keep
|
||||
BODY="Jellyfin Floatplane plugin $TAG (version $VERSION, commit ${GITHUB_SHA:0:10}).
|
||||
|
||||
Byggd for Jellyfin 10.10.x (.NET 8, targetAbi 10.10.0.0). En DLL for x64 och arm64 (Pi5).
|
||||
|
||||
Installera via plugin-repository (rekommenderat):
|
||||
Jellyfin Dashboard -> Plugins -> Repositories -> + -> URL:
|
||||
$REPO_URL/releases/download/latest/manifest.json
|
||||
Sedan Plugins -> Catalog -> Floatplane -> Install, starta om Jellyfin.
|
||||
|
||||
Manuell installation pa en host med linuxserver/jellyfin-containern:
|
||||
curl -fsSL $REPO_URL/releases/download/$TAG/install-pi5.sh | sh
|
||||
(TAG=... JELLYFIN_CONFIG_DIR=... JELLYFIN_CONTAINER=... och --dry-run stods, se skriptet.)
|
||||
|
||||
Efter installation: Dashboard -> Plugins -> Floatplane -> klistra in sails.sid-cookien."
|
||||
|
||||
# --- release for TAG -------------------------------------------------
|
||||
if [ "$TAG" = "latest" ]; then
|
||||
# rullande release: ta bort den gamla sa att taggen foljer master
|
||||
rid=$(auth "$API/repos/$REPO/releases/tags/$TAG" | jq -r '.id // empty')
|
||||
[ -n "$rid" ] && auth -X DELETE "$API/repos/$REPO/releases/$rid" -o /dev/null
|
||||
auth -X DELETE "$API/repos/$REPO/tags/$TAG" -o /dev/null || true
|
||||
JSON=$(jq -n --arg t "$TAG" --arg c "$GITHUB_SHA" --arg n "latest ($VERSION)" --arg b "$BODY" \
|
||||
'{tag_name:$t, target_commitish:$c, name:$n, body:$b, prerelease:true}')
|
||||
else
|
||||
JSON=$(jq -n --arg t "$TAG" --arg n "$TAG ($VERSION)" --arg b "$BODY" '{tag_name:$t, name:$n, body:$b}')
|
||||
fi
|
||||
RESP=$(auth -X POST "$API/repos/$REPO/releases" -H 'Content-Type: application/json' -d "$JSON")
|
||||
rid=$(echo "$RESP" | jq -r '.id // empty')
|
||||
[ -z "$rid" ] && rid=$(auth "$API/repos/$REPO/releases/tags/$TAG" | jq -r '.id // empty')
|
||||
[ -n "$rid" ] && [ "$rid" != "null" ] || { echo "kunde inte skapa release: $RESP"; exit 1; }
|
||||
echo "release id: $rid"
|
||||
|
||||
upload() { # upload <release-id> <asset-name> <local-file>
|
||||
local r="$1" name="$2" file="$3" aid
|
||||
aid=$(auth "$API/repos/$REPO/releases/$r/assets" | jq -r ".[] | select(.name==\"$name\") | .id")
|
||||
if [ -n "$aid" ] && [ "$aid" != "null" ]; then
|
||||
auth -X DELETE "$API/repos/$REPO/releases/$r/assets/$aid" -o /dev/null
|
||||
fi
|
||||
echo "laddar upp $name -> release $r ..."
|
||||
auth -X POST "$API/repos/$REPO/releases/$r/assets?name=$name" -F "attachment=@$file" -o /dev/null -w " -> HTTP %{http_code}\n"
|
||||
}
|
||||
|
||||
upload "$rid" "$ZIP" "build/$ZIP"
|
||||
upload "$rid" "$ZIP.md5" "build/$ZIP.md5"
|
||||
upload "$rid" "manifest.json" "build/manifest.json"
|
||||
upload "$rid" "install-pi5.sh" "install-pi5.sh"
|
||||
echo "klart: https://gitea.brasse-pc.eu/$REPO/releases/tag/$TAG"
|
||||
|
||||
# --- manifest.json aven till "latest" vid taggad release --------------
|
||||
# Repository-URL:en i Jellyfin pekar pa latest/manifest.json; den ska
|
||||
# alltid lista den nyaste versionen. sourceUrl i manifestet pekar redan
|
||||
# pa den versionerade releasen, sa zippen behover inte dubbleras.
|
||||
if [ "$TAG" != "latest" ]; then
|
||||
lid=$(auth "$API/repos/$REPO/releases/tags/latest" | jq -r '.id // empty')
|
||||
if [ -z "$lid" ] || [ "$lid" = "null" ]; then
|
||||
LJSON=$(jq -n --arg c "$GITHUB_SHA" --arg n "latest ($VERSION)" --arg b "$BODY" \
|
||||
'{tag_name:"latest", target_commitish:$c, name:$n, body:$b, prerelease:true}')
|
||||
lid=$(auth -X POST "$API/repos/$REPO/releases" -H 'Content-Type: application/json' -d "$LJSON" | jq -r '.id // empty')
|
||||
fi
|
||||
if [ -n "$lid" ] && [ "$lid" != "null" ]; then
|
||||
upload "$lid" "manifest.json" "build/manifest.json.keep"
|
||||
upload "$lid" "install-pi5.sh" "install-pi5.sh"
|
||||
echo "manifest.json uppdaterat pa latest: $REPO_URL/releases/download/latest/manifest.json"
|
||||
else
|
||||
echo "::warning::kunde inte hitta/skapa latest-releasen for manifest.json"
|
||||
fi
|
||||
fi
|
||||
Reference in New Issue
Block a user