- 
      
 - 
        
Save jordandrako/e7082a6ad3d90b85df36017bb97a02f3 to your computer and use it in GitHub Desktop.  
| #!/bin/bash | |
| helpText=" | |
| # Usage:\n | |
| #\n | |
| # ./monitor_albums.sh -k 'apiKey' -b 'http://host:port' -t [Single|EP|Album] [-m|u|A|h][-n 'artist name'][-i artistId]\n | |
| #\n | |
| # Required Options:\n | |
| # -k Your Lidarr API Key (defaults to \$apiKey env variable)\n | |
| # -b Your Lidarr instance URL (defaults to \$baseUrl env variable)\n | |
| # -t The album type you want to monitor/unmonitor (album, ep, single, etc)\n | |
| # -m|u [Un]Monitor the found albums\n | |
| #\n | |
| # Artist Options:\n | |
| # -A Unmonitors all <albumType> from all artists\n | |
| # -n 'artist name' Unmonitors all <albumType> from specified artist by name\n | |
| # -i artistId Unmonitors all <albumType> from specified artist by ID\n | |
| # -h Help text\n | |
| " | |
| ask() { | |
| if [[ ! $1 ]]; then | |
| error "You must pass a question to ask!" | |
| else | |
| question=$1 | |
| input=${2:="y/n"} | |
| echo -e "\n\e[1;34m$question\e[0m" && echo "[$input] > " | |
| [[ $3 ]] && read $3 | |
| fi | |
| } | |
| [[ ! $* ]] && echo -e $helpText && exit 1 | |
| while getopts k:b:t:i:n:Ahum flag; do | |
| case ${flag} in | |
| k) | |
| apiKeyArg=${OPTARG};; | |
| b) | |
| baseUrlArg=${OPTARG};; | |
| u) | |
| monitored=false;; | |
| m) | |
| monitored=true;; | |
| t) | |
| albumType=${OPTARG};; | |
| i) | |
| artistId=${OPTARG};; | |
| n) | |
| artistName=${OPTARG};; | |
| A) | |
| all=true;; | |
| h) | |
| echo -e $helpText; | |
| exit 0;; | |
| \?) | |
| echo "Invalid option: -$OPTARG" >&2; | |
| exit 1;; | |
| :) | |
| echo "Option -$OPTARG requires an argument." >&2; | |
| exit 1;; | |
| esac | |
| done | |
| apiKey="${apiKeyArg:=$apiKey}" | |
| baseUrl="${baseUrlArg:=$baseUrl}/api/v1" | |
| [[ ! $apiKey ]] && echo "No api key specified. Use -k or 'export apiKey=yourkeyhere'." && exit 1 | |
| [[ $baseUrl == "/api/v1" ]] && echo "Lidarr URL not specified. Use -b or 'export baseUrl=http://host:port'." && exit 1 | |
| [[ ! $monitored ]] && echo "Must specify -m monitor or -u to unmonitor!" && exit 1 | |
| [[ ! $albumType ]] && echo "Must specify -t albumType!" && exit 1 | |
| if [[ $artistName != "" ]]; then | |
| echo "Looking for artist $artistName" | |
| artists=`curl "$baseUrl/artist?apiKey=$apiKey" -s` | |
| artistId=`echo $artists | jq --arg artistName "$artistName" ' | |
| .[] | |
| | select(.artistName == $artistName) | |
| | .id'` | |
| if [[ $artistId != "" ]]; then | |
| echo "Artist found." | |
| else | |
| echo "Artist not found." | |
| exit 1 | |
| fi | |
| elif [[ $artistId != "" ]]; then | |
| echo "Looking artist by id $artistId" | |
| artist=`curl "$baseUrl/artist/$artistId?apiKey=$apiKey" -s` | |
| artistName=`echo $artist | jq .artistName` | |
| if [[ $artistName != null ]]; then | |
| echo "Artist found: $artistName" | |
| else | |
| echo "Artist not found." | |
| exit 1 | |
| fi | |
| fi | |
| [[ $all != true ]] && query="&artistId=$artistId" || query="" | |
| [[ $all == true ]] && echo "Fetching all artists..." | |
| albums=`curl "$baseUrl/album?apiKey=$apiKey$query" -s` | |
| foundAlbums=`echo $albums | jq --arg albumType "$albumType" '[.[] | select(.albumType | test($albumType, "i")) | { title: .title, id: .id}]'` | |
| albumNames=`echo $foundAlbums | jq '.[] | .title'` | |
| albumIds=`echo $foundAlbums | jq '[.[] | .id]'` | |
| [[ $monitored == true ]] && monitorString=monitor || monitorString=unmonitor | |
| ask_artist() { | |
| while true; do | |
| ask "Are you sure you want to $monitorString the following $albumType(s) from \"$artistName\"?:\n$albumNames" "N/y" conYn | |
| case $conYn in | |
| [yY]* ) | |
| cont; | |
| break;; | |
| * ) | |
| echo "Cancelled"; | |
| exit 0;; | |
| esac | |
| done | |
| } | |
| ask_all() { | |
| while true; do | |
| ask "Are you sure you want to $monitorString $albumType(s) from all artists?:\n$albumNames" "N/y" conYn | |
| case $conYn in | |
| [yY]* ) | |
| cont; | |
| break;; | |
| * ) | |
| echo "Cancelled"; | |
| exit 0;; | |
| esac | |
| done | |
| } | |
| generate_put_data() { | |
| cat <<EOF | |
| { | |
| "albumIds": $albumIds, | |
| "monitored": $monitored | |
| } | |
| EOF | |
| } | |
| cont() { | |
| curl -X PUT -H "Content-Type: application/json" -d "$(generate_put_data)" "$baseUrl/album/monitor?apiKey=$apiKey" --silent > /dev/null | |
| } | |
| # No found albums | |
| [[ ${#foundAlbums} -lt 3 ]] && echo "No $albumType(s) found for $artistName" && exit 1 | |
| # Confirm operation | |
| [[ $all == true ]] && ask_all || ask_artist | 
This seems to be just what I have been looking for!
I am trying to unmonitor all singles.
It seems to run but gets stuck at the album type:
I run the script:
$ ./monitor_albums.sh -k 'I_Have_Lidarr_API_Here' -b 'http://192.168.1.110:8686' -t single -u -A
This is what is returned:
Fetching all artists...
./monitor_albums.sh: line 104: jq: command not found
./monitor_albums.sh: line 105: jq: command not found
./monitor_albums.sh: line 106: jq: command not found
No single(s) found for
Am I running the script options correctly?
Thanks!!
The jq utility will need to be installed. If using apt-get:
sudo apt install jq
Thank you!
Yep, first I needed to install jq. I used:
sudo apt-get -y install jq
Then these commands worked for me:
$ ./monitor_albums.sh -k 'Lidarr_API_Here' -b 'http://192.168.1.110:8686' -t EP -u -A
$ ./monitor_albums.sh -k 'Lidarr_API_Here' -b 'http://192.168.1.110:8686' -t Single -u -A
Note:
album type EP would only work for me in caps. Lower case ep would not work.
Also album type for single would only work with the s in upper case. line: Single
This worked great! I had to do a new install of Lidarr and was monitoring way more than I wanted.
Super helpfull!!
@davidpeele Thanks for pointing out the case-sensitive issue. I just updated it, so it doesn't care about case.
@jordandrako It looks like there's a small bug in your case insensitive filter
select(.albumType | test($albumType, "i"))
You need to use a semi-colon between the STRING / FLAG
select(.albumType | test($albumType; "i"))
It's also useful to convert a standard - to the U+2010 dash used by musicbrainz
artistName=$(echo $artistName | sed 's/-/‐/g')
Regardless, thanks for the script, really useful!
@VeteraNovis do we add artistName=$(echo $artistName | sed 's/-/‐/g') after:
albumIds=echo $foundAlbums | jq '[.[] | .id]'
Awesome work! This works beautifully in 2025 with the latest Lidarr.
Uh oh!
There was an error while loading. Please reload this page.