Scripting στο Linux: Ραδιόφωνο – γράψτε τις αγαπημένες σας εκπομπές

By | 12 Οκτωβρίου, 2010

Το συγκεκριμένο άρθρο είναι για τους φανατικούς του ραδιοφώνου – που τυγχάνουν να είναι και φανατικοί του Linux παράλληλα… Αν θέλουμε να γράψουμε μια από τις καθημερινές εκπομπές που αγαπάμε από το live stream του σταθμού, χωρίς να καταναλώνουμε φαιά ουσία ή/και χρόνο, πως μπορούμε να το κάνουμε;

Μην ανησυχείτε – υπάρχει λύση: το blogit teleshopping, σας παρουσιάζει τα scripts που θα χρειαστούμε!

To βασικό setup

Για αυτή τη συνταγή θα χρειαστούμε:

  • Τον mplayer: ο mplayer θα μας δώσει ένα command line interface για να μπορέσουμε να γράψουμε την εκπομπή μας στο δίσκο – βασικά θα αναλάβει το capture για εμάς.
  • Το lame: το lame αποτελεί (για εμένα) την καλύτερη λύση για τη μετατροπή αρχείων ήχου σε mp3 – έτσι ώστε τα τελικά μας αρχεία να πιάνουν ελάχιστο χώρο και να μπορούμε να τα μεταφέρουμε σε οποιαδήποτε συσκευή.
  • Τον crond: ο crond είναι ο δαίμονας που τρέχει σε οποιοδήποτε linux σύστημα και αναλαμβάνει να προγραμματίζει δουλειές που πρέπει να τρέχουν σε συγκεκριμένη στιγμή για εμας – ώστε να μην χρειάζεται να θυμόμαστε κάθε μέρα πότε πρέπει να τρέξουμε το script μας.

Μιας και ο crond είναι ήδη εγκατεστημένος στο σύστημά μας, αρκεί να τρέξουμε την παρακάτω εντολή για να εγκαταστήσουμε τα υπόλοιπα συστατικά:

 $ sudo aptitude install mplayer lame

Είμαστε τώρα έτοιμοι να γράψουμε το σκριπτάκι μας!

Το script

Το σκριπτάκι μας είναι πολύ απλό και σειριακό. Βασικά θέλουμε να τρέξει ο mplayer και να αποθηκεύσει το output του stream σε ένα αρχείο wave. Έπειτα, πρέπει να τρέξει το lame και να φτιάξει ένα καινούριο mp3 αρχείο από το wave αρχείο. Τέλος σβήνουμε το αρχείο wave το οποίο πλέον δεν χρειαζόμαστε.

Το script μας μοιάζει ως εξής:

#!/bin/bash

mplayer -prefer-ipv4 -cache 64 -ao pcm:file=/home/user/Downloads/imerodromos_902.wav mms://mediaserver2.otenet.gr/radio902gr;

lame -b 64 /home/user/Downloads/imerodromos_902.wav /home/user/Downloads/imerodromos_902_`date +"%d_%m_%Y"`.mp3;

rm /home/user/Downloads/imerodromos_902.wav;

Για να δούμε τώρα μια μια τις γραμμές και το τι κάνουν:

  1. Στην κορυφή του αρχείου, έχουμε την standard επικεφαλίδα, που λέει στο σύστημα ότι το συγκεκριμένο script πρέπει να τρέξει σαν bash script. Αυτό δεν χρειάζεται να αλλάξει ποτέ.
  2. Η δεύτερη εντολή ξεκινά τον mplayer. Αν δούμε προσεκτικά, η παράμετρος “file=” ακολουθείται από ένα path στο δίσκο μας – αυτό είναι το αρχείο όπου ο mplayer θα βγάλει το output, και μπορούμε να το παραμετροποιήσουμε. Δεν χρειάζεται να υπάρχει το αρχείο, αλλά πρέπει να υπάρχουν όλοι οι φάκελοι που θα ορίσουμε εδώ, οπότε πρέπει να προσέχουμε με τις αλλαγές. Στο τέλος της εντολής, βλέπουμε ένα mms URL. Αυτό είναι το URL για το live stream του σταθμού από τον οποίο θέλουμε να γράψουμε. Για να βρούμε το stream του σταθμού μας, μπορούμε να κοιτάξουμε στο radiofono.gr και να το αντιγράψουμε στο script μας.
  3. Η τρίτη εντολή τρέχει τον lame με δύο αρχεία σαν παραμέτρους: το πρώτο αρχείο είναι το ίδιο με το output του mplayer και το δεύτερο είναι το όνομα του τελικού αρχείου mp3. Αν προσέξουμε καλά, θα δούμε μια μικρή πονηριά στο δεύτερο αρχείο: την ενσωματωμένη εντολή date. Η εντολή date τυπώνει στην κονσόλα του linux την τρέχουσα ώρα και ημερομηνία. O τρόπος με τον οποίο θα την τυπώσει είναι πλήρως παραμετροποιήσιμος – και αυτό γίνεται με την παράμετρο “+” ακολουθούμενη με το format που θέλει ο χρήστης. Στην περίπτωσή μας αυτό είναι το “%d_%m_%Y”, το οποίο και έχει σαν αποτέλεσμα να τυπωθεί η μέρα (%d), ο μήνας (%m) και ο χρόνος (%Y) σαν αριθμοί χωρισμένοι με underscore (_). Έτσι, κάθε μέρα θα γράφεται και ένα ξεχωριστό mp3 αρχείο στον ίδιο φάκελο, χωρίς να σβήνονται τα παλαιότερα!
  4. Τέλος, αφαιρούμε το αρχείο wav που πλέον δεν μας χρειάζεται.

Όπως βλέπουμε, το script είναι ιδιαίτερα απλό και καλύπτει πλήρως της ανάγκες μας. Αφού το αντιγράψουμε και το σώσουμε σε ένα αρχείο (π.χ. 902_record.sh), το κάνουμε εκτελέσιμο με την εντολή:

$ chmod a+x 902_record.sh

Τώρα μπορούμε να το δοκιμάσουμε τρέχοντας το κατευθείαν στην κονσόλα με:

$ ./902_record.sh

Στην περίπτωση που όλα πήγαν καλά θα δούμε το output του mplayer, ως εξής:

$./902_record.sh                                                                                                                      
MPlayer SVN-r1.0~rc3+svn20090426-4.4.3 (C) 2000-2009 MPlayer Team                                                                                                    
mplayer: could not connect to socket
mplayer: No such file or directory
Failed to open LIRC support. You will not be able to use your remote control.

Playing mms://mediaserver2.otenet.gr/radio902gr.
STREAM_ASF, URL: mms://mediaserver2.otenet.gr/radio902gr
Resolving mediaserver2.otenet.gr for AF_INET...
Connecting to server mediaserver2.otenet.gr[62.103.128.34]: 1755...
Connected
unknown object
unknown object
unknown object
file object, packet length = 831 (831)
unknown object
stream object, stream ID: 1
data object
mmst packet_length = 831
Cache size set to 64 KBytes
Cache fill: 12.50% (8192 bytes)   
ASF file format detected.
[asfheader] Audio stream found, -aid 1
==========================================================================
Opening audio decoder: [ffmpeg] FFmpeg/libavcodec audio decoders
AUDIO: 16000 Hz, 2 ch, s16le, 20.0 kbit/3.91% (ratio: 2500->64000)
Selected audio codec: [ffwmav2] afm: ffmpeg (DivX audio v2 (FFmpeg))
==========================================================================
[AO PCM] File: /home/vagos/Downloads/imerodromos_902.wav (WAVE)
PCM: Samplerate: 16000Hz Channels: Stereo Format s16le
[AO PCM] Info: Faster dumping is achieved with -vc null -vo null -ao pcm:fast
[AO PCM] Info: To write WAVE files use -ao pcm:waveheader (default).
AO: [pcm] 16000Hz 2ch s16le (2 bytes per sample)
Video: no video
Starting playback...
A:179672.9 (49:54:32.9) of 2133437440.0 (592621:30:40.0) 88.8% 0%

Βλέπουμε ότι το script μας έχει κολλήσει μιας και ο mplayer συνεχίζει να γράφει ότι έρχεται από το stream στο δίσκο. Όταν έχουμε κάνει capture αρκετά πράγματα, μπορούμε να το σταματήσουμε πληκτρολογώντας Ctrl-C στην κονσόλα. Μετά από αυτό, το lame αναλαμβάνει να φτιάξει το mp3 αρχείο μας. Θα δούμε extra output όπως:

Exiting... (Quit)
LAME 3.98.2 64bits (http://www.mp3dev.org/)
Using polyphase lowpass filter, transition band:  7806 Hz -  8000 Hz
Encoding /home/vagos/Downloads/imerodromos_902.wav
 to /home/vagos/Downloads/imerodromos_902_10_10_2010.mp3
Encoding as 16 kHz j-stereo MPEG-2 Layer III (8x)  64 kbps qval=3
 Frame          |  CPU time/estim | REAL time/estim | play/CPU |    ETA
 5933/5933  (100%)|    0:03/    0:03|    0:03/    0:03|   58.040x|    0:00
--------------------------------------------------------------------------------------------------------------------------------------------------------------------
 kbps        MS  %     long switch short %
 64.0      100.0        93.1   4.0   2.9
Writing LAME Tag...done
ReplayGain: -3.5dB

Από τη στιγμή που έχουν όλα τελειώσει, μπορούμε να ανοίξουμε το αρχείο μας, για να ακούσουμε ότι πήγαν όλα σωστά.

Η τελευταία πινελιά – να γίνουν όλα αυτόματα

Τώρα, πρέπει να πειράξουμε τον crond ώστε να ξεκινά να γράφει και να σταματά το script τις ώρες και μέρες που θέλουμε. Τρέχουμε τις ακόλουθες εντολές στην κονσόλα για να πειράξουμε το αρχείο crontab του χρήστη μας, που δίνει εντολές στον crond για το τι θα κάνει και πότε:

$ export EDITOR="gedit"
$ crontab -e

Θα δούμε μια γραμμή σαν την ακόλουθη στο αρχείο:

# m h  dom mon dow   command

Αυτή η γραμμή είναι ο οδηγός μας για το πως θα γράψουμε ένα σωστό αρχείο ώστε η εντολή μας να τρέχει στη σωστή ώρα και μέρα. Ξεκινάμε με m (λεπτά), h (ώρα), dom (day of month – η μέρα σαν αριθμός), mon (ο μήνας σαν αριθμός), dow (day of week – μέρα της βδομάδας σαν αριθμός ή όνομα, π.χ. “mon” – “sun”) και τέλος η εντολή που θέλουμε να τρέξει. Η εκπομπή που εγώ θέλω να γράψω παίζει μόνο εργάσιμες μέρες (Δευτέρα – Παρασκευή), οποιοδήποτε μήνα ή μέρα του μήνα, και ξεκινάει στις 11.00. Επίσης τελειώνει στις μία (13.00) τις ίδιες μέρες. Οπότε το crontab μου είναι κάπως έτσι:

# m h  dom mon dow   command
00 11 * * 1-5 /home/user/902_record.sh
00 13 * * 1-5 killall mplayer
02 13 * * 1-5 killall mplayer

Βλέπουμε λοιπόν ότι τρέχουμε το script μας στις 11.00 κάθε μέρα και μετά στις 13.00 σκοτώνουμε τον mplayer (όχι το script) με την εντολή killall για να μπορέσουμε να προχωρήσουμε στο lame. Τα δύο killall είναι απλά για να εξασφαλίσουμε ότι όντως ο mplayer έχει πεθάνει. Σώζουμε το αρχείο και έχουμε πλέον τελειώσει!

Καλό radio-capture!

2 thoughts on “Scripting στο Linux: Ραδιόφωνο – γράψτε τις αγαπημένες σας εκπομπές

  1. vagos Post author


    nestoxy:

    Άντε μπας και προχωρήσουμε καθόλου στοLinux γιατί πολύ GUI έχει πέσει…
    Ωραίος!

    Μην αγχώνεσαι, έχει πολλά ακόμα τέτοιου είδους που θα επακολουθήσουν. Θα γίνεις ειδικός! 🙂

    Reply

Αφήστε μια απάντηση

Η ηλ. διεύθυνση σας δεν δημοσιεύεται.

Αυτός ο ιστότοπος χρησιμοποιεί το Akismet για να μειώσει τα ανεπιθύμητα σχόλια. Μάθετε πώς υφίστανται επεξεργασία τα δεδομένα των σχολίων σας.