commit d80691ffd63e4f7421d9025a610a8e87331b9b80
parent 69f00daf6a32c4f95e68f6a15e8fedbfe383cb34
Author: pyratebeard <root@pyratebeard.net>
Date: Wed, 5 Oct 2022 22:25:01 +0100
weeklymusictoot
Diffstat:
1 file changed, 93 insertions(+), 6 deletions(-)
diff --git a/entry/weeklymusictoot.md b/entry/weeklymusictoot.md
@@ -1,21 +1,108 @@
-For those that follow me on mastodon or twitter may have seen a #weeklymusictoot being posted on my feed over the last few weeks.
+For those that follow me on Mastodon or Twitter you may have seen a #weeklymusictoot being posted on my feed over the last few weeks.
This is an automated post which lists some of the music I listened to that week.
-My music player of choice is [cmus](https://cmus.github.io/){target="_blank" rel="noreferrer"} and one of the cool things it can do is run scripts on a song change or when the staus changes (pause, play, stop, etc.).
+My music player of choice is [cmus](https://cmus.github.io/){target="_blank" rel="noreferrer"} and one of the cool things it can do is run scripts on a song change or when the status changes (pause, play, stop, etc.).
-I have seen people use this to display album artwork or send a desktop notification each time a song changes. There are plenty of examples on the cmus [wiki](https://github.com/cmus/cmus/wiki/status-display-programs){target="_blank" rel="noreferrer"}. In the cmus repository there is a script called `cmus-status-display` which outputs the currently playing song to a text file. I made some modifications to the script to display the output in my preferred way, and to display the name of the playlist the song is in if applicable.
+I have seen people use this to display album artwork or send a desktop notification each time a song changes. There are plenty of examples on the cmus [wiki](https://github.com/cmus/cmus/wiki/status-display-programs){target="_blank" rel="noreferrer"}. In the cmus repository there is a script called `cmus-status-display` which outputs the currently playing song to a text file. I made some modifications to the script to display the output in my preferred way, or to display the name of the playlist the song is in if applicable.
```
+#!/bin/sh
+
+output()
+{
+ # write status to ~/cmus-status.txt (not very useful though)
+ echo "$*" >> ~/.cmus/wmt.txt 2>&1
+}
+
+while test $# -ge 2
+do
+ eval _$1='$2'
+ shift
+ shift
+done
+
+if test -n "$_file" && test -n "$_title" && [[ "$_status" == "playing" ]] ; then
+ if [[ $(cmus-remote -Q | grep "set play_library" | awk '{print $NF}') == "false" ]] ; then
+ _underscore=$(echo $_title | sed 's/\ /_/g')
+ _playlist=$(grep -i -e "$_title\|$_underscore" ~/.cmus/playlists/* | awk -F: '{print $1}' | awk -F/ '{print $NF}' | head -n1)
+ test -n "$_playlist" && output "custom $_playlist playlist"
+ elif [[ $(cmus-remote -Q | grep "set play_library" | awk '{print $NF}') == "true" ]] ; then
+ output "$_album by $_artist"
+ fi
+elif test -n "$_url" && [[ "$_status" == "playing" ]] ; then
+ output "$_url"
+fi
```
-Then I created a script which is run each Friday to take the contents of the music list and send out a toot on mastodon.
+Then I created a script which is run each Friday via cron to take the contents of the music list and send out a toot on mastodon.
```
+#!/bin/sh
+# ██
+# ░██
+# ███ ██ ██████████ ██████
+# ░░██ █ ░██ ░░██░░██░░██ ░░░██░
+# ░██ ███░██ ░██ ░██ ░██ ░██
+# ░████░████ ░██ ░██ ░██ ░██
+# ███░ ░░░██ ███ ░██ ░██ ░░██
+# ░░░ ░░░ ░░░ ░░ ░░ ░░
+# w e e k l y m u s i c t o o t
+
+# output of cmus-status-display script
+music_list="$HOME/.cmus/wmt.txt"
+
+# toot command path
+toot="$HOME/src/warez/toot/bin/toot"
+
+# sort list by number of plays
+weekmusic=$(sort $music_list | uniq -c | sort -nr | \
+ awk '{$1=""; print $0}' | \
+ tr '[:upper:]' '[:lower:]' | \
+ sed 's/^/\*\ /')
+
+# generate toot and count characters
+char=$(cat <<wmt | wc -m
+(automated) #weeklymusictoot
+
+this week i listened to:
+
+$weekmusic
+wmt
+)
+
+# if characters is more than 500 the toot will fail
+# we delete the last entry in the list until
+# there are less than 500 chars
+until [ ${char} -lt 500 ] ; do
+weekmusic=$(echo "$weekmusic" | sed '$d')
+cat <<wmt
+$weekmusic
+wmt
+char=$(cat <<wmt | wc -m
+(automated) #weeklymusictoot
+
+this week i listened to:
+
+$weekmusic
+wmt
+)
+sleep 1
+done
+
+# generate toot then delete list for next week
+# if it fails page me
+cat <<wmt | $toot post && rm -f ${music_list} || curl -d "wmt failed to send" https://pager.pyratebeard.net/wmt
+(automated) #weeklymusictoot
+
+this week i have been listening to:
+
+$weekmusic
+wmt
```
The second week this ran I found that the toot failed as the character count was greater than 500. I amended the script to sort the list by most entries, i.e. most played album, then count the characters and remove the least played album until the toot is viable.
-My mastodon and twitter accounts are linked using [TK](TK){target="_blank" rel="noreferrer"}, so soon after my automatic toot goes out it is tweeted as well.
+My Mastodon and Twitter accounts are linked using [Mastodon Twitter Crossposter](https://crossposter.masto.donte.com.br/){target="_blank" rel="noreferrer"}, so soon after my automatic toot goes out it is tweeted as well.
-There is no real reason for this except being a bit bored for an hour so writing a tooting script. But maybe somebody will find some new music from it ¯\_(ツ)_/¯ .
+There is no real reason for this except being a bit bored for an hour so writing a tooting script. But maybe somebody will discover some good music from it ¯\_(ツ)_/¯ .