Unattended stream recording with MPlayer

Gazette Linux 183 (02/2011)

par Silas Brown (Copyright © 2011) sb22 CHEZ cam POINT ac POINT uk

traduction par (tous droits réservés) exemple email CHEZ exemple POINT com

relecture exemple email CHEZ exemple POINT com


Unattended stream recording with MPlayer

par Silas Brown

Le lecteur de video pour linux MPlayer a une option pour enregistrer un flux video diffusé sur internet pour le jouer ultérieurement. L'enregistrement peut être fait par ligne de commande. Ceci est utile pour deux raisons: (1) vous pouvez enregistrer quand vous êtes trop occupé pour regarder, (2) si votre connection internet est trop lente pour les video en temps reel mais est acceptable pour des visionnage en différé (certaines connections à faible débit sont comme cela), alors vous pouvez obtenir de meilleurs resultats en utilisant le ssh pour vous connecter à un ordinateur distant ayant une bonne connection, y enregistrer la diffusion, puis télécharger le fichier résultant en différé (en supposant que le programme diffusé est court, autrement cela pourrait ne pas être pratique).

Cependant, plusieurs versions de MPlayer ont des problemes pour faire cela si elles ne sont pas supervisées. Premièrement, si la connection au flux s'arrète pour n'importe quelle raison, MPlayer ne fait aucune tentative pour la réétablir, et deuxiemement il est difficile de dire à MPlayer quand arréter l'enregistrement (il y'a des lignes de commande qui donnent des options de timing mais elles ne fonctionnent pas toujours, et le signal d'interruption peut être ignoré).

Un moyen de contournement est d'écrire un script en python (ou tout autre langage) qui lance MPlayer dans un "pseudo-terminal" et le controle via ce terminal. Le script peut alors prendre la responsabilité de redémarrer MPlayer si nécéssaire, et envoyer un signal pour le fermer à la fin.

C'est ce que fait le script ci-dessous. Vous aurez besoin de changer les variables du début (à moins que vous ne vouliez enregistrer un épisode de Shuowen Jiezi); c'est sans doute une bonne idée de programmer l'enregistrement pour qu'il commence légerement avant l'horaire prévue et qu'il se termine un petit peut apres l'heure de fin programmée, juste au cas où le studio n'aurait pas un timing parfait.

stream = "mms://65.49.26.231/suntv"
prefix = "/tmp/shuowenjiezi"
program_time = (20,05) # in your timezone
program_length_mins = 8

import pty, time, os, signal

t=time.localtime()
t = t[:3] + program_time + (0,) + t[6:]
startTime = time.mktime(t)
if time.time() > startTime:
    # missed today's program_time, wait for tomorrow
    startTime += 24*3600
endTime = startTime + program_length_mins*60

os.system("rm -f "+prefix+"*") # delete any previous recording
fileNo = 0

class TimeoutException: pass
handlingTimeout = False
def alarm(*args):
    if handlingTimeout: raise TimeoutException()
signal.signal(signal.SIGALRM, alarm)

print "Waiting to record %d minutes at %d:%02d" % ((program_length_mins,)+program_time)
time.sleep(max(0,startTime - time.time()))
while endTime > time.time():
    pid,fd = pty.fork()
    if pid==0: # child
        pty.spawn(["/bin/bash","-c","mplayer \\"%s\\" -dumpstream -dumpfile \\"%s%02d.asf\\"" % (stream,prefix,fileNo)])
        raise SystemExit # shouldn't get here
    print "mplayer started in background pty, monitoring"
    
    # Monitor the process, restarting if necessary, until time to finish:
    while os.waitpid(pid,os.WNOHANG)==(0,0) and endTime > time.time():
        # Need to read from fd to ensure its buffer is clear
        # but don't block on the reading - use signal to time out
        # (otherwise we might fail to stop the recording on time)
        signal.alarm(1)
        try:
            handlingTimeout = True
            os.read(fd,1024)
            handlingTimeout = False
        except TimeoutException: continue
        except OSError: continue
        time.sleep(1)
    fileNo += 1

print "Time to finish"
# Send it a Ctrl-C on the terminal
# (SIGINT doesn't always work, neither does -endpos)
os.write(fd,chr(3))
time.sleep(1) # just in case
os.close(fd)

Problêmes légaux et de flux

Dans les pays où les émissions télévisées sont soumises aux droits d'auteurs, une license est généralement nécessaire pour visioner où enregistrer n'importe quelle diffusion télévisée sous n'importe quelle forme, y compris sur internet, en supposant que la réception ait lieu au même moment ou l'émission est en train d'être diffusée c'est à dire est "en live". (Si le flux Internet est en retard d'une ou deux seconde dû aux délais des différents paquets, je pense que cela est tout de même considéré comme étant du "live"). La licence est généralement nécessaire pour le lieu où se déroule l'enregistrement, qui peut être différent de l'endroit où vous regarderez le résultat. Le fait que la diffusion vienne d'un autre pays ne vous dédouane généralement pas (après tout, les gens avec des télévisions normales ne l'évite pas en promettant de se brancher sur des chaines étrangères); cependant il est possible qu'une licence ne soit pas requise si la diffusion télévisée est complètement indisponible dans votre pays c'est-à-dire ne peut être reçue même par satellite (donc si elle est transmise par satellite alors il vaudrait mieux qu'il ne déserve par votre coté de la planète). Cela ne constitue pas un avis légal; vous devrez vérifier les lois de votre lieu de résidence, et il se pourrait qu'elles changent.

Vous devrez également prendre en considération toutes les régulations des réseaux auxquelles vous êtes soumis (certaines université interdisent les téléchargements de programmes télévisés non autorisés; vous devrez demander la permission). Si vous utilisez un ordinateur distant pour enrgistrer la diffusion, vous devrez prendre en compte toutes les restrictions de réseaux pour cet ordinateur aussi. Revérifiez la taille des fichiers obtenus pour vous assurer qu'ils sont de taille raisonnable.

Enfin, souvenez vous que l'enregistrement est presque certainement sous copyright et serait illégal à la redistribution. Cet enregistrement doit être pour votre usage personnel.


Silas Brown

Silas Brown est un informaticien aveugle basé a Cambridge UK. Il utilise des versions fortement personalisées de Debian Linux depuis 1999


Adaptation française de la Gazette Linux

L'adaptation française de ce document a été réalisée dans le cadre du Projet de traduction de la Gazette Linux

Cet article est publié selon les termes de la Open Publication License. La Linux Gazette n'est ni produite, ni sponsorisée, ni avalisée par notre hébergeur principal, SSC, Inc.

Vous pourrez lire d'autres articles traduits et en apprendre plus sur ce projet en visitant notre site http://www.traduc.org/Gazette_Linux

Si vous souhaitez apporter votre contribution, n'hésitez pas à nous rejoindre, nous serons heureux de vous accueillir.