Files
jellypod/README.md
T
dtourolleandClaude Opus 5 c67005bd8f
🏗️ Build Plugin / build (push) Successful in 2m9s
🚀 Release Plugin / build-and-release (push) Successful in 1m33s
Add Jellyfin 12.0 build target alongside 10.9
The plugin now multi-targets net8.0 (Jellyfin 10.9, ABI 10.9.0.0) and net10.0
(Jellyfin 12.0, ABI 12.0.0.0) from one source tree, and each release ships both
packages.

TaskTriggerInfo.Type became a TaskTriggerInfoType enum in 12.0, which is the
only source-level break; it is handled with a NET10_0_OR_GREATER switch. CA1873
is disabled in the ruleset alongside CA1848, which it supersedes.

build.yaml stays the 10.9 config and the 12.0 one is derived from it at build
time, so the two cannot drift apart. Both manifest entries are prepended per
release with the 12.0 one first: Jellyfin keeps entries whose targetAbi is <=
the server version and takes the first of the highest version, so a 12.0 server
picks the 12.0 build while a 10.9 server never sees it.

The builder image now carries the .NET 10 SDK with the .NET 8 SDK alongside it.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-08 18:51:45 +02:00

161 lines
4.7 KiB
Markdown

# Jellypod
A Jellyfin plugin that adds podcast support to your media server.
## Quick Install
Add this repository URL in Jellyfin (Dashboard → Plugins → Repositories):
```
https://gitea.tourolle.paris/dtourolle/jellypod/raw/branch/master/manifest.json
```
## Supported Jellyfin Versions
Jellypod is released as two builds from the same source. The repository manifest
lists both, and Jellyfin picks the right one for your server automatically:
| Jellyfin server | Build | Target framework |
| --------------- | -------------- | ---------------- |
| 10.9.x | `*_jf10.9.zip` | .NET 8 |
| 12.0 and newer | `*_jf12.zip` | .NET 10 |
If you install manually, download the build matching your server — a build
installed on the wrong server will fail to load.
## Features
- Browse and subscribe to podcasts
- Automatic episode downloads
- Integration with Jellyfin's library system
- Post-download script hook for audio processing
## Post-Download Script Hook
Jellypod supports running a custom script on each downloaded episode before it's added to your library. This is useful for:
- Audio normalization (e.g., using ffmpeg-normalize)
- Format conversion
- Metadata enhancement
- Custom processing workflows
### Configuration
In the plugin settings (Dashboard → Plugins → Jellypod):
1. **Post-Download Script Path**: Full path to your script or executable
2. **Script Timeout**: Maximum execution time in seconds (default: 60)
### Script API
Your script will be called with two arguments:
```bash
script <input_file> <output_file>
```
- `input_file`: Path to the downloaded episode (read-only)
- `output_file`: Path where your script should write the processed file
### Example Scripts
**Audio normalization (bash + ffmpeg):**
```bash
#!/bin/bash
INPUT="$1"
OUTPUT="$2"
ffmpeg-normalize "$INPUT" -o "$OUTPUT" -c:a libmp3lame -b:a 128k
```
**Format conversion (bash + ffmpeg):**
```bash
#!/bin/bash
INPUT="$1"
OUTPUT="$2"
ffmpeg -i "$INPUT" -c:a aac -b:a 128k "$OUTPUT"
```
### Behavior
- If the script succeeds (exit code 0) and creates the output file, the processed file is added to your library
- If the script fails, times out, or doesn't create an output file, the original downloaded file is used instead
- All script output (stdout/stderr) is logged for debugging
- Leave the script path empty to disable post-processing
## Screenshots
### Podcast Library
![Podcast Library](images/library.png)
### Plugin Settings
![Plugin Settings](images/settings.png)
## Installation
### From Plugin Repository (Recommended)
1. In Jellyfin, go to **Dashboard****Plugins****Repositories**
2. Click the **+** button to add a new repository
3. Enter:
- **Repository Name**: `Jellypod`
- **Repository URL**: `https://gitea.tourolle.paris/dtourolle/jellypod/raw/branch/master/manifest.json`
4. Click **Save**
5. Go to **Catalog** tab and find **Jellypod**
6. Click **Install** and restart Jellyfin
### Manual Installation
1. Download the latest release from [Releases](https://gitea.tourolle.paris/dtourolle/jellypod/releases),
picking `jellypod_<version>_jf10.9.zip` for Jellyfin 10.9.x or
`jellypod_<version>_jf12.zip` for Jellyfin 12.0 and newer
2. Extract the contents to your Jellyfin plugins directory:
- **Linux**: `~/.local/share/jellyfin/plugins/Jellypod/`
- **Windows**: `%LOCALAPPDATA%\jellyfin\plugins\Jellypod\`
- **Docker**: `/config/plugins/Jellypod/`
3. Restart Jellyfin
### Building from Source
#### Requirements
- [.NET SDK 8.0](https://dotnet.microsoft.com/en-us/download/dotnet/8.0) for the Jellyfin 10.9 build
- [.NET SDK 10.0](https://dotnet.microsoft.com/en-us/download/dotnet/10.0) for the Jellyfin 12.0 build
#### Build
```bash
dotnet build # both targets
dotnet build -f net8.0 # Jellyfin 10.9 only
dotnet build -f net10.0 # Jellyfin 12.0 only
```
The plugin DLL will be in `Jellyfin.Plugin.Jellypod/bin/Debug/net8.0/` or
`Jellyfin.Plugin.Jellypod/bin/Debug/net10.0/`.
#### Packaging
`build.yaml` is the [jprm](https://github.com/oddstr13/jellyfin-plugin-repository-manager)
config for the Jellyfin 10.9 build. The Jellyfin 12.0 config is derived from it
at release time, so the two cannot drift apart:
```bash
sed -e 's/^targetAbi:.*/targetAbi: "12.0.0.0"/' \
-e 's/^framework:.*/framework: "net10.0"/' \
-e 's/^dotnet_framework:.*/dotnet_framework: "net10.0"/' \
build.yaml > build.jf12.yaml
```
## Development
This plugin is based on the [Jellyfin Plugin Template](https://github.com/jellyfin/jellyfin-plugin-template).
See the `.vscode` folder for VS Code debugging configuration.
## License
This project is licensed under the GPLv3 - see the [LICENSE](LICENSE) file for details.
## Links
- **Repository**: https://gitea.tourolle.paris/dtourolle/jellypod