Script: start muziek vanuit cronjob

Alles over programmeren in Linux
Gebruikersavatar
Mogenblue
Held
Held
Berichten: 351
Lid geworden op: Wo 18 Okt 2017, 08:27
Locatie: Amsterdam

Script: start muziek vanuit cronjob

Berichtdoor Mogenblue » Zo 13 Jun 2021, 21:08

Als je vanuit een cronjob een scherm applicatie wil starten is het niet genoeg om alleen de naam van het programma te geven. De cronjob weet niets van de display manager en je moet daarom aangeven waar het programma moet worden gestart. Dat doe je door het display te specificeren aan het begin van de opdracht:
DISPLAY=:0

Als je elke ochtend om half acht je computer een muzieklijst wil laten afspelen kun je in je lokale crontab de volgende regel opnemen
30 7 * * * /home/mogenblue/Muziek/cronjob-muziek.sh

In het script cronjob-muziek.sh zet je dan bijvoorbeeld de volgende code:

Code: Selecteer alles

#!/bin/bash

# automatisch muziek afspelen vanuit een cronjob

# in crontab:
# 30 7 * * * /home/mogenblue/Muziek/cronjob-muziek.sh

Afspeellijst="/home/mogenblue/Muziek/wakker-worden.m3u"

# check display ID met
# echo $DISPLAY

#------------------------------------------------------------------------

echo .
echo .
echo .
echo .

# specificeer de display als het script vanuit een cronjob wordt gestart
DISPLAY=:0 smplayer "$Afspeellijst"

echo .
echo klaar.

Voor mogenblue moet je natuurlijk je eigen username gebruiken. En in plaats van wakker-worden.m3u gebruik je je eigen afspeellijst.
Let er wel op dat je het volledige pad opneemt naar de afspeellijst anders kan de media speler het bestand niet vinden.

Meestal is de displayid 0 maar het kan ook wel eens anders zijn. Je kunt je eigen display controleren in een terminal met
echo $DISPLAY

Als het afspelen voltooid is blijft de speler gewoon open staan op het scherm.


Referenties:
How to start a GUI application from cron?
Gebruikersavatar
Mogenblue
Held
Held
Berichten: 351
Lid geworden op: Wo 18 Okt 2017, 08:27
Locatie: Amsterdam

Re: Script: start muziek vanuit cronjob

Berichtdoor Mogenblue » Ma 14 Jun 2021, 18:26

Over muziek gesproken, je kunt natuurlijk handmatig de afspeellijst veranderen, maar met een beetje creativiteit maak je een bestandje met een lijst van afspeellijsten en laat daar een willekeurige lijst uit selecteren om af te spelen. Dan wordt je elke dag gewekt door een andere afspeellijst.

Dat gaat zo:
muziek-bestand.sh

Code: Selecteer alles

#!/bin/bash

# automatisch muziek afspelen vanuit een cronjob

InvoerBestand="/home/mogenblue/Muziek/muziek-bestand.txt"

LijstIndex=4

#-------------------------------------------------------------------------------------------------

echo .
echo .
echo .
echo .

# plaats het bestand met afspeellijsten in een array
mapfile -t AfspeelTabel < $InvoerBestand

# Toon tabel items
a=0
for i in "${AfspeelTabel[@]}"
do
echo "$a, $i"
(( a++ ))
done

# selecteer willekeurige lijst
AantalLijsten=${#AfspeelTabel[@]}
LijstIndex=$(($RANDOM % $AantalLijsten))
AfspeelItem=${AfspeelTabel[$LijstIndex]}

echo .
echo .
echo "$AantalLijsten Lijsten. Geselecteerde lijst om af te spelen:"
echo "$LijstIndex, $AfspeelItem"


# specificeer de display als het script vanuit een cronjob wordt gestart
DISPLAY=:0 smplayer "$AfspeelItem"


echo .
echo .
echo klaar.

In het tekstbestand muziek-bestand.txt staat dan bijvoorbeeld de volgende lijst:

Code: Selecteer alles

/home/mogenblue/Muziek/lijst01.m3u
/home/mogenblue/Muziek/klassiek/lijst02.m3u
/home/mogenblue/Muziek/modern/lijst03.m3u
/home/mogenblue/Muziek/gitaar/lijst04.m3u
/home/mogenblue/Muziek/klavier/lijst05.m3u
Deze lijst heeft de meeste flexibiliteit omdat je lijsten uit verschillende mappen kunt opnemen. Je bent niet gebonden aan één bepaalde map.

Als je toch één bepaalde lijst wil afspelen kun je die selecteren met LijstIndex en dan moet je voor de regel
LijstIndex=$(($RANDOM % $AantalLijsten))
een # zetten. Dan verandert dat in een commentaarregel.

Als je het script handmatig start krijg je een overzicht van de afspeellijsten met het indexnummer ervoor.

Het invoerbestand is eenvoudig aan te maken door in je bestandbeheerder een reeks afspeellijsten te kopiëren en deze dan gewoon te plakken in het bestand. Dan wordt automatisch het hele pad plus bestandnaam erin gezet.

Er is wel een limiet aan het aantal lijsten voor de random generator. Deze kan namelijk maximaal een getal tussen 0 en 32767 genereren.

Referenties:
Creating an array from a text file in Bash
How to generate random number in Bash?
$RANDOM: generate random integer

Terug naar “Programmeren”

Wie is er online

Gebruikers op dit forum: Geen geregistreerde gebruikers en 9 gasten