Bash Script moc_extend.sh für Music on Console
Das alte moc_move.sh Script wurde erweitert … und in moc_extend.sh umbenannt.
Features
- (Neu) FreeMusicCharts Playliste herunterladen, anhören und einzelne Stücke herunterladen (inspiriert durch diesen Artikel).
- MOC scheint mit dem Status “302 Moved Temporarily” nichts anfangen zu können und gibt die Meldung “Format not supported” aus.
In dem Fall einfach die Datei herunterladen und so anhören :)
- MOC scheint mit dem Status “302 Moved Temporarily” nichts anfangen zu können und gibt die Meldung “Format not supported” aus.
- Man kann Musik in vorhandene Kategorien einordnen oder neue Kategorien erstellen.
- Aktuelle Datei/aktuelles Verzeichnis löschen (bzw. in den “badmusic” Ordner verschieben).
- Musikwertung vergeben/abfragen (0-50 Punkte).
- Musik in ein Zip-Archiv packen (weil öfters Leute die gerade laufende Musik haben wollen).
- Radio-Streams anzeigen und anhören (extra Script).
- Playliste der am besten bewerteten Stücke erstellen.
- Musik-Infos per ssh auf ein Webverzeichnis hochladen (ogginfo, id3tag oder nur der Dateiname).
- Zeigt die Metadaten einer Datei an.
<WRAP center round info> Alles was knotify, kdialog oder gnome notify verwendete (die aufpoppenden Nachrichten), wurde entfernt; Nachrichten werden jetzt direkt im Terminal angezeigt. </WRAP>
Screenshots
Das verwendete Terminal ist übrigens rxvt-unicode mit dieser Konfiguration.
Konfiguration
Damit das Ganze wie gezeigt im eigenen MOC läuft, muss man das natürlich in seinem MOC hinterlegen:
Z. B. aktuell bei mir:
ExecCommand1 = "/home/apps/scripts/jamendo_listen.sh -v -snlm moc"
ExecCommand2 = "/home/apps/scripts/jamendo_listen.sh -lvf .lvurl_from_start -snlm moc"
#ExecCommand3 = "/home/apps/scripts/jamendo_listen.sh -plv"
ExecCommand4 = "/home/apps/scripts/feed_ices.sh add %f"
ExecCommand5 = "/home/apps/scripts/moc_extend.sh %f selection"
ExecCommand6 = "/home/apps/scripts/moc_extend.sh %f automaticcats"
#ExecCommand7 = "/home/apps/bin/moc_extend.sh %f radio"
ExecCommand8 = "/home/apps/scripts/moc_extend.sh %f delete"
ExecCommand10 = "/home/apps/scripts/moc_extend.sh %f help"
Das Script
#!/bin/bash
AUTHOR="Natenom"
EMAIL="natenom"
VERSION="0.1.8.5"
LASTEDIT="2010-11-02"
MOCP="/bin/mocp"
#Important: If in this script mocp is called it must be started into the background "mocp &".
# Use it like this:
# $0 PATH_TO_FILE WHAT_TO_DO [SUBTARGET]
# SUBTARGET it not necessary.
#### SETTINGS ####
# Directories:
MUSIC_BASE="/home/Music" #Base directory for our music.
MUSIC_FREE="${MUSIC_BASE}/Music_Free" #Free Music Directory.
M_DST_DELETE="/home/badmusic" #Instead of deleting move bad music to this directory.
M_SENDTOARCH_ARCHIVE="/home/username/Desktop/Music.zip" #Music archive (zip) to send music...
FREE_MUSIC_CHARTS_DEST="${MUSIC_FREE}/FreeMusicCharts" #Where to download FreeMusicCharts files to.
# Else:
MESSAGE_TIME=1 #Time in seconds to show messages...
#Other Scripts:
STREAMSCRIPT="/bin/stream.sh"
RATESCRIPT="/bin/rate.sh"
#### End: SETTINGS ####
#####################################
#### DO NOT EDIT BELOW THIS LINE ####
#####################################
declare -a M__cats_free #indexed array (see man bash)
#PATH_TO_FILE
M_FILE="${1}"
#SUBTARGET
# Not necessary for every case.
SUBTARGET="${3}"
#Pushes the current song information onto a server using ssh.
function pushsonginformation() {
_file="${1}"
#_ssh_key="/path/to/key" #Only needed if not using a .ssh/config ...
_remote_ip="yourip.ip.ip.ip or name"
_remote_user="username"
_remote_port="21"
_songinfo_file_local="/tmp/song"
_songinfo_file_remote="/var/www/dest/folder/file"
_hide_path="/home/Music" #Hide/remove this part of your path (usually your private music directory).
#Get Infos about the song and write them into the file.
printtaginfo "${_file}" 0 | sed s+"${_hide_path}"++g > "${_songinfo_file_local}"
scp -P ${_remote_port} "${_songinfo_file_local}" "${_remote_user}@${_remote_ip}:${_songinfo_file_remote}"
}
function printtaginfo() {
_file=${1}
_waitforkey=${2} #Do we need to wait until a keystroke?
case $(echo "${_file}" | egrep -o '\.ogg$|\.mp3$|\.flac$|\.wav$|http:') in
http:) #Probably a stream
echo "${_file}"
_in_suffix="Unknown file type."
;;
.ogg) #Ogg file
ogginfo "${_file}"
;;
.mp3) #MP3 file
id3info "${_file}"
;;
.flac) #Flac file
#echo "No program set for flac info... ."
#at least print dir/filename
echo "${_file}"
;;
.wav) #wav file
#at least print dir/filename
echo "${_file}"
;;
*) #anything different
_in_suffix="Unknown file type."
;;
esac
if [ "${_waitforkey}" == "1" ]; then
read _wait
fi
}
function addtoarch() {
local _file="${1}"
#Add the current file to default Music.zip archive.
#Wir gehen erst ins Verzeichnis rein und nehmen den Dateinamen ohne Pfad,
# damit am Ende nicht der volle Pfad der Datei im Archiv steht; todo, dafuer gibt es mit Sicherheit eine Option.
m_sendtoarch_file=$(basename "${_file}")
m_sendtoarch_path=$(dirname "${_file}")
cd "${m_sendtoarch_path}" && zip -o "${M_SENDTOARCH_ARCHIVE}" -r "${m_sendtoarch_file}"
#title="Music On Console - SendToArch"
printf "SendToArch\nAdded \"${m_sendtoarch_file}\" to SendToArch\n"
sleep ${MESSAGE_TIME}
clear
}
#Reads current directories from ${MUSIC_FREE} and creates a selection menu.
#$0 can be free|unfree
function getcats() {
_count=0
for _cat in $(ls -D "${MUSIC_FREE}") #List only directories. #Does not work with spaces in dirnames.
do
M__cats_free[$_count]="${_cat}"
_count=$(($_count+1))
done
printf "Music_Free\nChoose a destiny folder or press [c] to create a new one or [Enter] to leave:\n"
_count=0
for _cat_free in ${M__cats_free[@]} #M__cats_free is an indexed array.
do
printf "%i - %s\n" $_count "${_cat_free}"
_count=$(($_count+1))
done
printf "\n> "
}
function move_item() {
#$3 kann auch ein Verzeichnis sein
local _dest_folder="${1}" #Zielverzeichnis
local _subtarget="${2}" #Subtarget (Classic, Electro, ...)
local _file="${3}" #kompletter Pfad zur Datei mit Dateinamen der aktuellen Datei
local _operation="mv" #Operation; bisher nur mv
local _destpath="${_dest_folder}/${_subtarget}" #kompletter Pfad für neue Datei + Dateiname
local _filename=$(basename "${_file}") #Dateiname ohne Pfad
${_operation} "${_file}" "${_destpath}" #Move/Copy the file.
if [ $? == 0 ];
then #Exitlevel 0, operation was successfull
printf "\"%s\"\nmoved successfully to:\n\"%s\"" "${_filename}" "${_dest_folder}/${_filename}"
sleep ${MESSAGE_TIME}
clear
else
printf "Failed to move\n\"%s\" to\n\"%s\"" "${_filename}" "${_dest_folder}/${_filename}"
sleep ${MESSAGE_TIME}
clear
fi
}
function main() {
case ${2} in #WHAT_TO_DO
automaticcats) #This is an interactive selection with possibility to create a new category.
clear
SUBTARGET=""
_selection="_"
getcats
read _selection
while [ "${_selection}" == "c" ]
do
printf "You decided to add a new category; Enter the directory name for your new category:\n> "
read _catname
mkdir "${MUSIC_FREE}/${_catname}"
getcats
read _selection
done
if [ ! -z "${_selection}" ]; then #We need this because with an zero _selection value bash would use 0 for ${M__cats_free[$_selection]}
#If given any number
echo "Sel: $_selection"
DST_FOLD="${MUSIC_FREE}"
SUBTARGET=${M__cats_free[$_selection]}
echo "subtarget: "
echo "subtargarray: ${M__cats_free[$_selection]}"
read #waiting for the user ... :P
move_item "${DST_FOLD}" "${SUBTARGET}" "${M_FILE}"
clear
else
printf "Not given any number. [Press Enter to exit]"
read
clear
exit 0
fi
;;
selection) #This is an interactive selection with extended possibilities.
clear
cat<<EOF
Current item is:
"${M_FILE}"
====Publish Music====
8 - Send to Archive (${M_SENDTOARCH_ARCHIVE})
====RADIO====
r - Choose a favorite radio streams ...
====Free Music Charts====
fmc - Add Free Music Charts Playlist to current Playlist
d - Download current song to "${FREE_MUSIC_CHARTS_DEST}"
====RATING====
sr - Set rating
gr - Get rating
pb - Generate playlist with best rated songs (ASC)
====Feed Ices====
fil - FeedIces this file to the equeue (Feed Ices later)
====Information====
t - Show tag information (id3info, ogginfo, whatever)
====Jamendo====
jn - Search for next Album ID and load m3u. (Jamendo Next)
jo - Open current album site in browser. (Jamendo Open)
ji - Display current Album ID. (Jamendo ID)
jd - Open download page.
==Jamendo (from start, ~/.lvurl_from_start)==
jsn - Search for next Album ID and load m3u. (Jamendo Next)
jso - Open current album site in browser. (Jamendo Open)
jsi - Display current Album ID. (Jamendo ID)
jsd - Open download page.
==Songinfo==
psi - Push Songinfo to webserver.
Choose or press ENTER to continue...
EOF
echo -en "\033[45;5m>\033[0m "
read __type
case ${__type} in
psi)
pushsonginformation "${M_FILE}"
exit 0
;;
fmc)
FMCPL="/tmp/fmcplay.list"
wget https://www.archive.org/download/freemusiccharts.songs/fmc.xml -O "${FMCPL}"
for song in $(cat "${FMCPL}" | grep -e "<url>.*</url>" | sed -e 's#</*url>##g' ); do ${MOCP} -a "$song"; done & #im Hintergrund, da mocp sonst nicht laeuft :P
;;
d) #Download song from FreeMusicCharts
cd "${FREE_MUSIC_CHARTS_DEST}" && wget "${M_FILE}"
;;
pb) #Playlist Best (external script)
m3u="$(${RATESCRIPT} --playlist1)"
#muss im Hintergrund laufen, da es sonst nie weitergeht weil ja mocp schon laeuft :P
${MOCP} --off shuffle & #wir wollen ja oben anfangen :)
${MOCP} -a "${m3u}" &
${MOCP} -p &
exit 0
;;
sr) #set rating
printf "Enter rating for this file (0-50): "
read _rating
${RATESCRIPT} --setratingbypath "${M_FILE}" "${_rating}"
exit 0
;;
gr) #get rating
printf "Your previous rating for this file was: "
${RATESCRIPT} --getratingbypath "${M_FILE}"
read _lala
exit 0
;;
r) #Show streamlist (external script)
"${STREAMSCRIPT}" --showlist
exit 0
;;
8) #Copy file to archive to send it.
addtoarch "${M_FILE}"
exit 0
;;
fil) #Add a file to equeue of feedices
/home/apps/scripts/feed_ices.sh addtoequeue "${M_FILE}"
exit 0
;;
t)
printtaginfo "${M_FILE}" 1
exit 0
;;
jn) #Jamendo Next ID
/home/apps/scripts/jamendo_listen.sh -snlm moc
exit 0
;;
jo) #Open Jamendo Album Page.
/home/apps/scripts/jamendo_listen.sh -o
exit 0
;;
ji) #Print Jamendo ID
/home/apps/scripts/jamendo_listen.sh -plv
exit 0
;;
jd) #Open download page.
/home/apps/scripts/jamendo_listen.sh -s -d
exit 0
;;
jsn) #Jamendo Next ID
/home/apps/scripts/jamendo_listen.sh -lvf /home/username/.lvurl_from_start -snlm moc
exit 0
;;
jso) #Open Jamendo Album Page.
/home/apps/scripts/jamendo_listen.sh -lvf /home/username/.lvurl_from_start -o
exit 0
;;
jsi) #Print Jamendo ID
/home/apps/scripts/jamendo_listen.sh -lvf /home/username/.lvurl_from_start -plv
exit 0
;;
jsd) #Open download page.
/home/apps/scripts/jamendo_listen.sh -lvf /home/username/.lvurl_from_start -s -d
exit 0
;;
*)
echo "No valid choice. Bye :)"
exit 0
;;
esac
;;
delete)
#delete (internally move to badmusic directory)
move_item "${M_DST_DELETE}" "${SUBTARGET}" "${M_FILE}"
;;
help)
clear
echo -e "\033[45;5mMusic on Console - Help\033[0m "
cat <<EOF
F1 - Search next Album ID on Jamendo and load m3u to playlist.
F2 - Search next Album ID on Jamendo and load m3u to playlist (Session from start).
F4 - FeedIces-Script (external script)
F5 - Extended Menu
F6 - Move to Category or create a new one (only free Music).
F8 - Delete current Folder/File (... just move it to badmusic folder :P)
F10 - This Help
----------------------------------------------------
$0
Version: ${VERSION}
${LASTEDIT} by ${AUTHOR} - ${EMAIL}"
EOF
echo "Press Enter to continue..."
read
exit 0
;;
esac
}
main "${@}"
Zuletzt geändert: 2024-07-31 06:46:36 +0000 UTC: wiki: change mumble server domain