Files
blackBarRemover/.gitea/workflows/release.yml
T
karol 2d0af2aed0
Build and Release Plugin / release (push) Successful in 33s
fix: quote strftime format string in release workflow python script
2026-09-17 21:32:32 +02:00

196 lines
7.8 KiB
YAML

name: Build and Release Plugin
on:
push:
tags:
- 'v*'
jobs:
release:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
with:
fetch-depth: 0
- name: Setup .NET
uses: actions/setup-dotnet@v3
with:
dotnet-version: |
9.0.x
10.0.x
- name: Build Plugin
run: dotnet build JellyfinPlugin/JellyfinPlugin.csproj -c Release
- name: Create ZIP Archives
run: |
cd JellyfinPlugin/bin/Release/
# Zip net9.0 (Jellyfin 10.11)
cd net9.0
zip -j ../../../../BlackBarRemover_${{ github.ref_name }}_jf10.11.zip *
cd ..
# Zip net10.0 (Jellyfin 12.0)
cd net10.0
zip -j ../../../../BlackBarRemover_${{ github.ref_name }}_jf12.0.zip *
cd ..
- name: Generate Checksums
id: checksum
run: |
MD5_SUM_9=$(md5sum BlackBarRemover_${{ github.ref_name }}_jf10.11.zip | awk '{print $1}')
MD5_SUM_10=$(md5sum BlackBarRemover_${{ github.ref_name }}_jf12.0.zip | awk '{print $1}')
echo "md5_9=$MD5_SUM_9" >> $GITHUB_OUTPUT
echo "md5_10=$MD5_SUM_10" >> $GITHUB_OUTPUT
- name: Publish Release and Update Manifest
env:
API_URL: ${{ github.api_url }}
REPO: ${{ github.repository }}
TOKEN: ${{ github.token }}
TAG: ${{ github.ref_name }}
MD5_9: ${{ steps.checksum.outputs.md5_9 }}
MD5_10: ${{ steps.checksum.outputs.md5_10 }}
run: |
python3 -c '
import os, json, urllib.request, base64, datetime
api_url = os.environ["API_URL"]
repo = os.environ["REPO"]
token = os.environ["TOKEN"]
tag = os.environ["TAG"]
md5_9 = os.environ["MD5_9"]
md5_10 = os.environ["MD5_10"]
headers = {
"Authorization": f"token {token}",
"Content-Type": "application/json"
}
# 1. Get or Create Release
rel_url = f"{api_url}/repos/{repo}/releases/tags/{tag}"
req = urllib.request.Request(rel_url, headers=headers)
rel_data = None
try:
res = urllib.request.urlopen(req)
rel_data = json.loads(res.read().decode("utf-8"))
except Exception:
pass
if not rel_data or "id" not in rel_data:
is_pre = "beta" in tag or "alpha" in tag or tag.startswith("v0.")
create_url = f"{api_url}/repos/{repo}/releases"
body = json.dumps({
"tag_name": tag,
"name": f"Release {tag}",
"body": "Automated release",
"draft": False,
"prerelease": is_pre
}).encode("utf-8")
create_req = urllib.request.Request(create_url, data=body, headers=headers)
res = urllib.request.urlopen(create_req)
rel_data = json.loads(res.read().decode("utf-8"))
rel_id = rel_data["id"]
# 2. Upload Assets
for filename in [f"BlackBarRemover_{tag}_jf10.11.zip", f"BlackBarRemover_{tag}_jf12.0.zip"]:
if not os.path.exists(filename):
print(f"File {filename} not found, skipping.")
continue
# Delete existing asset if any
for existing_asset in rel_data.get("assets", []) or []:
if existing_asset.get("name") == filename:
del_url = f"{api_url}/repos/{repo}/releases/{rel_id}/assets/{existing_asset['id']}"
del_req = urllib.request.Request(del_url, headers=headers, method="DELETE")
try:
urllib.request.urlopen(del_req)
print(f"Deleted old asset {existing_asset['id']}")
except Exception as e:
print(f"Delete asset notice: {e}")
# Upload asset
with open(filename, "rb") as f:
file_bytes = f.read()
boundary = "----WebKitFormBoundary7MA4YWxkTrZu0gW"
body_data = (
f"--{boundary}\r\n"
f"Content-Disposition: form-data; name=\"attachment\"; filename=\"{filename}\"\r\n"
f"Content-Type: application/zip\r\n\r\n"
).encode("utf-8") + file_bytes + f"\r\n--{boundary}--\r\n".encode("utf-8")
upload_headers = {
"Authorization": f"token {token}",
"Content-Type": f"multipart/form-data; boundary={boundary}"
}
upload_url = f"{api_url}/repos/{repo}/releases/{rel_id}/assets"
upload_req = urllib.request.Request(upload_url, data=body_data, headers=upload_headers)
try:
urllib.request.urlopen(upload_req)
print(f"Uploaded {filename} successfully.")
except Exception as e:
print(f"Asset upload error: {e}")
# 3. Update manifest.json on master branch
clean_ver = tag.lstrip("v").split("-")[0]
manifest_data = [
{
"guid": "12345678-1234-1234-1234-1234567890ab",
"name": "Black Bar Remover",
"description": "Automatically detects and removes black bars from video files.",
"overview": "Automatically detects and removes black bars from video files via CSS or FFmpeg.",
"owner": "karol",
"category": "Playback",
"imageUrl": "",
"versions": [
{
"version": clean_ver,
"changelog": f"Automated Release {tag} (Jellyfin 12.0)",
"targetAbi": "12.0.0.0",
"sourceUrl": f"https://gitea.labus.uk/karol/blackBarRemover/releases/download/{tag}/BlackBarRemover_{tag}_jf12.0.zip",
"checksum": md5_10,
"timestamp": datetime.datetime.now(datetime.timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ")
},
{
"version": clean_ver,
"changelog": f"Automated Release {tag} (Jellyfin 10.11)",
"targetAbi": "10.11.0.0",
"sourceUrl": f"https://gitea.labus.uk/karol/blackBarRemover/releases/download/{tag}/BlackBarRemover_{tag}_jf10.11.zip",
"checksum": md5_9,
"timestamp": datetime.datetime.now(datetime.timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ")
}
]
}
]
b64_manifest = base64.b64encode(json.dumps(manifest_data, indent=4).encode("utf-8")).decode("utf-8")
# Update on master branch
get_mf_url = f"{api_url}/repos/{repo}/contents/manifest.json?ref=master"
req_mf = urllib.request.Request(get_mf_url, headers=headers)
file_sha = None
try:
res_mf = urllib.request.urlopen(req_mf)
file_sha = json.loads(res_mf.read().decode("utf-8")).get("sha")
except Exception:
pass
put_payload = {
"content": b64_manifest,
"message": f"Update manifest.json for {tag}",
"branch": "master"
}
if file_sha:
put_payload["sha"] = file_sha
put_url = f"{api_url}/repos/{repo}/contents/manifest.json"
put_req = urllib.request.Request(put_url, data=json.dumps(put_payload).encode("utf-8"), headers=headers, method="PUT")
urllib.request.urlopen(put_req)
print("manifest.json updated successfully via API.")
'