Initial commit
This commit is contained in:
parent
bbfe27a937
commit
db1606d667
34
README.md
34
README.md
|
@ -1,3 +1,35 @@
|
|||
# jellyfin-notification-webhook
|
||||
|
||||
Webhook for processing Jellyfin notifications.
|
||||
## Summary
|
||||
|
||||
Webhook for processing Jellyfin notifications.
|
||||
It used `webhook` (see below) to receive the notification payload, and then `ntfy` to send the prepared notification.
|
||||
|
||||
## Why
|
||||
|
||||
There is no Jellyfin plugin that supports `ntfy`, my chosen notification service.
|
||||
While there is a generic webhook plugin for Jellyfin, editing and troubleshooting it is tedious and error-prone.
|
||||
|
||||
## Setup
|
||||
|
||||
1. Copy the content of `hooks.json` file to your your `webhook` configuration file.
|
||||
2. In Jellyfin, install the Webhook notification plugin.
|
||||
3. Restart Jellyfin.
|
||||
4. Navigate to the plugin configuration page and click on `Add Generic Destination`.
|
||||
5. Set webhook URL to whatever your `webhook` endpoint is.
|
||||
6. Check these `Notification Type`:
|
||||
- Authentication Failure
|
||||
- Item Added
|
||||
- Pending Restart
|
||||
- Plugin Uninstalled
|
||||
- User Deleted
|
||||
- User Locked Out
|
||||
7. Lastly, check the `Send All Properties (ignores template)` checkbox.
|
||||
8. Copy the `jellyfin.sh` script to your `webhook` script folder.
|
||||
9. Add the `execute` permission to it, for example by running `chmod +x jellyfin.sh`.
|
||||
10. Edit the `jellyfin.sh` script, adjusting the values of `NTFY_SERVER_URL` and `NTFY_CHANNEL` based on your setup.
|
||||
|
||||
## Links
|
||||
|
||||
* https://github.com/adnanh/webhook
|
||||
* https://github.com/binwiederhier/ntfy
|
|
@ -0,0 +1,12 @@
|
|||
[
|
||||
{
|
||||
"id": "jellyfin-receive",
|
||||
"execute-command": "jellyfin",
|
||||
"command-working-directory": "/var/webhook",
|
||||
"pass-arguments-to-command": [
|
||||
{
|
||||
"source": "entire-payload"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
|
@ -0,0 +1,98 @@
|
|||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
NTFY_SERVER_URL=${NTFY_SERVER_URL:-ntfy.sh}
|
||||
NTFY_CHANNEL=${NTFY_CHANNEL:-jellyfin_notications}
|
||||
ICON_URL=${ICON_URL:-https://raw.githubusercontent.com/NX211/homer-icons/master}
|
||||
TMDB_URL="https://www.themoviedb.org"
|
||||
|
||||
notify() {
|
||||
# message title action tags priority
|
||||
curl -s \
|
||||
-H "Title: ${2}" \
|
||||
-H "Icon: ${ICON_URL}/png/jellyfin.png" \
|
||||
-H "Actions: ${3}" \
|
||||
-H "Tags: ${4}" \
|
||||
-H "Priority: ${5}" \
|
||||
-d "${1}" "${NTFY_SERVER_URL}/${NTFY_CHANNEL}"
|
||||
}
|
||||
|
||||
get_value() {
|
||||
jq "$1" <(echo "$JSON") | tr -d '"'
|
||||
}
|
||||
|
||||
JSON=$1
|
||||
ARTIST=$(get_value ".Artist")
|
||||
YEAR=$(get_value ".Year")
|
||||
TYPE=$(get_value ".NotificationType")
|
||||
ITEM_TYPE=$(get_value ".ItemType")
|
||||
ITEM_NAME=$(get_value ".Name")
|
||||
NOTIFICATION_USERNAME=$(get_value ".NotificationUsername")
|
||||
PLUGIN_NAME=$(get_value ".PluginName")
|
||||
PLUGIN_VERSION=$(get_value ".PluginVersion")
|
||||
SERVER=$(get_value .ServerName)
|
||||
VERSION=$(get_value .ServerVersion)
|
||||
SERIES_NAME=$(get_value .SeriesName)
|
||||
EPISODE_NUMBER=$(get_value .EpisodeNumber00)
|
||||
SEASON_NUMBER=$(get_value .SeasonNumber00)
|
||||
PROVIDER_TMDB=$(get_value .Provider_tmdb)
|
||||
PROVIDER_TVDB=$(get_value .Provider_tvdb)
|
||||
TAGS="media"
|
||||
|
||||
case "$TYPE" in
|
||||
PluginUninstalled)
|
||||
PRIORITY="2"
|
||||
MESSAGE="Plugin $PLUGIN_NAME $PLUGIN_VERSION was uninstalled."
|
||||
;;
|
||||
ItemAdded)
|
||||
PRIORITY="2"
|
||||
case "$ITEM_TYPE" in
|
||||
MusicAlbum)
|
||||
[ "$ARTIST" = "null" ] && ARTIST="Various Artists"
|
||||
MESSAGE="New music has been added: $ITEM_NAME by $ARTIST ($YEAR)."
|
||||
;;
|
||||
Episode)
|
||||
MESSAGE="$SERIES_NAME ${SEASON_NUMBER}x${EPISODE_NUMBER} - $ITEM_NAME ($YEAR) has been added."
|
||||
ACTION="view, TMDB, ${TMDB_URL}/series/${PROVIDER_TVDB}"
|
||||
;;
|
||||
Movie)
|
||||
MESSAGE="$ITEM_NAME ($YEAR) has been added."
|
||||
ACTION="view, TMDB, ${TMDB_URL}/movie/${PROVIDER_TMDB}"
|
||||
;;
|
||||
# ignore these
|
||||
Audio | Season | Series)
|
||||
;;
|
||||
*)
|
||||
MESSAGE="Item of type $ITEM_TYPE with the name $ITEM_NAME has been added to the library."
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
AuthenticationFailure)
|
||||
PRIORITY="5"
|
||||
MESSAGE="Authentication for user $NOTIFICATION_USERNAME has failed."
|
||||
;;
|
||||
PendingRestart)
|
||||
PRIORITY="4"
|
||||
MESSAGE="Server needs to be restarted."
|
||||
;;
|
||||
UserDeleted)
|
||||
PRIORITY="3"
|
||||
MESSAGE="User $NOTIFICATION_USERNAME has been deleted."
|
||||
;;
|
||||
UserLockedOut)
|
||||
PRIORITY="5"
|
||||
MESSAGE="User $NOTIFICATION_USERNAME has been locked out."
|
||||
;;
|
||||
*)
|
||||
PRIORITY="3"
|
||||
MESSAGE="Unrecognized NoticationType. See the logs."
|
||||
;;
|
||||
esac
|
||||
|
||||
# MESSAGE is empty if a NotificationType or ItemType was ignored
|
||||
if [[ -z "${MESSAGE:-}" ]]; then
|
||||
echo "MESSAGE is empty. Ignoring this notification."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
notify "${MESSAGE:-Empty message.}" "Jellyfin $VERSION ($SERVER)" "${ACTION:-}" "${TAGS:-media}" "${PRIORITY:-3}"
|
Loading…
Reference in New Issue