Mac-nétoscope

mtcubix

Membre actif
14 Janvier 2010
338
12
Mac-nétoscope
Je vous propose dans ce fil de transformer votre mac en mac-nétoscope ...

Alors encore un nouveau recorder pour Mac ? et d'ailleurs combien il y en a ?

On peut trouver ICI une liste non exhasustive de logiciels "multiposte". Ce sont des logiciels qui permettent de regarder la télé sur PC-Mac-Linux et pour certains de programmer et d'enregistrer le flux TV sur le disque dur.

Ces logiciels, tous basés sur VLC, peuvent remplir la plupart des besoins courants.
Cependant, personnellement, j'ai eu des problèmes lors d'enregistrement de flux HD

  1. problèmes liés aux logiciels : son absent par exemple dans des flux .mp4
  2. problèmes liés à la chaine TV : enregistrements tronqués, dû au non respect
    des horaires de diffusion.
  3. problèmes liés au contenu HD : découpe des parties inutiles de l'enregistrement,
    avant le début, pub, après la fin en gardant la qualité HD initiale et la synchronisation audio-vidéo.

J'ai donc été obligé de me débrouiller en utilisant des outils qu'on peut trouver dans chaque mac.


  • VlC : qu'on ne présente plus, il peut servir à la lecture, la diffusion ou l'enregistrement de flux A-V
  • crontab : Chaque utilisateur d'un système Unix (le mac est un système unix) dispose de sa "table temporelle" dans laquelle il peut choisir de prévoir une action à une date déterminée. C'est le "démon" (Daemon) cron qu'on peut qualifier de "maître du temps Unix", qui tourne en permanence et qui déclenche les actions programmées dans les différentes crontab le moment venu.
  • bash : C'est l'intermédiaire entre l'utilisateur et le système Unix, l'utilisateur tape des commandes dans une fenêtre (Terminal par exemple) bash les traduit, le système exécute, retourne le résultat au bash qui l'affiche (ou pas).
  • ffmpeg : FFmpeg
    FFmpeg is a complete, cross-platform solution to record, convert and
    stream audio and video.
    ce qui signifie, solution complète, indépendante de la plate-forme pour la conversion et la diffusion des flux audio-vidéo
  • xcode : il est nécessaire pour installer ffmpeg, il peut servir aussi d'excellent éditeur de texte


Je vous propose donc de partager avec vous, pas à pas, ce que j'ai été "obligé" de construire (sans être programmeur de métier) pour pallier aux trois soucis présentés plus haut, ce fut d'abord un simple programmateur basé sur crontab, puis un programme chargé de collecter les horaires des chaines sur internet et d'injecter ces données dans la crontab, et pour finir, un ensemble de script utilisant ffmpeg destiné à la découpe des fichiers HD.

L'ambition de ce fill au delà du partage d'expérience est de constituer un point de départ pour tous ceux qui souhaitent se lancer dans le programmation sur mac.

Il n'est donc pas nécessaire de connaître les arcanes d'Unix pour être capable d'utiliser les scripts qui seront publiés ici, il suffira de les copier puis de les coller dans un fichier texte, de rendre ce fichier exécutable pour que cela marche.

Il va de soit que les avis des spécialistes sont les bienvenus

Ceci dit, voici le programme qui va être suivi.

  1. Avant de commencer, préparer le terrain
  2. Utilisation de VLC et la crontab pour enregistrer un flux TV
  3. Programmation d'enregistrements immédiats et différés--> script Mac-neto
  4. Récupération des horaires à partir des sites internet des chaines TV= requête php
  5. Programmation d'enregistrement utilisant les données internt --> script cronMac-neto
  6. Détermination des "images de référence = IDR" dans un enregistrement HD avec ffmepg--> script nextKeyFrame
  7. Découpe des enregistrements HD avec ffmepg --> script decouPub
  8. Reconstitution d'un fichier unique à partir de "morceaux" --> solution basée sur mencoder + ffmpeg
  9. Evolutions envisageables



--------------------------> à suivre
 
  • J’aime
Réactions: Le docteur et Cratès
[*] problèmes liés à la chaine TV : enregistrements tronqués, dû au non respect
des horaires de diffusion.

puis un programme chargé de collecter les horaires des chaines sur internet et d'injecter ces données dans la crontab
En quoi cela résoud le problème présenté plus haut. Les données seront les mêmes. :siffle: Les sites internet se contentent de diffuser les infos fournies par les chaînes, tout comme tous les autres programmes télé (papier ou Guide+)

De plus penche toi sur l'utilisation de launchd à la place de cron, c'est la solution actuellement préconisée par Apple. :zen:
 
Ca résout le problème dans la mesure où on s'adresse au site de la chaine TV concernée.
(je ne veux pas citer de noms, mais j'ai constaté pour un même programme des différences entre les horaires sur le site de la chaine et le site internet "généraliste")

Man mac s'allume et s'éteint chaque jour à heures fixes, à chaque réveil, il lance une requête pour récupérer les horaires (pour la semaine) du programme qui m'intéresse. J'avais inclus au départ toute une batterie de tests pour déterminer "un horaire probable", puis j'ai simplifié en constatant que les horaires du jour courant sont toujours fiables ( cela fait pratiquement un an que je suis une série avec cette méthode, et je n'ai manqué aucun épisode :) ) . J'applique ensuite une marge de sécurité de 5 minutes avant et après... d'où la nécessité de couper les parties superflues, car avec du contenu HD, l'occupation mémoire augmente très vite.

pour cron ou launchd on en reparlera quand je mettrai en ligne la version que j'ai adoptée, je suis intéressé de voir comment on pourra l'exprimer avec launchd car je n'ai pas du tout utilisé cette commande.
 
Ca résout le problème dans la mesure où on s'adresse au site de la chaine TV concernée.
(je ne veux pas citer de noms, mais j'ai constaté pour un même programme des différences entre les horaires sur le site de la chaine et le site internet "généraliste")
Tu comptes récupérer les pages HTML du site de la chaîne et le parser pour extraire les infos ? Que se passe-t-il quand le format change ?
J'applique ensuite une marge de sécurité de 5 minutes avant et après... d'où la nécessité de couper les parties superflues, car avec du contenu HD, l'occupation mémoire augmente très vite.
Je vais te faire part de ma très grande expérience d'enregistreur d'émission de télé. 5mn avant je suis d'accord, par contre je mets plutôt 10mn après. Quant aux programmes diffusés la nuit sur certaines chaînes, les décalages d'horaire peuvent être bien plus importants que ces marges.
je suis intéressé de voir comment on pourra l'exprimer avec launchd car je n'ai pas du tout utilisé cette commande.
Il faut construire un fichier plist au format xml et le mettre dans le bon répertoire LaunchDaemons dans Bibliothèque.
 
ntx a dit:
Tu comptes récupérer les pages HTML du site de la chaîne et le parser pour extraire les infos ? Que se passe-t-il quand le format change ?

oui, quand le format change, il faut changer les mots clés de recherche (avec awk), ce qui justifiera une mise à jour :D
pour le moment, le format est le même depuis au moins 7 mois que ça marche...

ntx a dit:
Je vais te faire part de ma très grande expérience d'enregistreur d'émission de télé. 5mn avant je suis d'accord, par contre je mets plutôt 10mn après. Quant aux programmes diffusés la nuit sur certaines chaînes, les décalages d'horaire peuvent être bien plus importants que ces marges.
Je suis d'accord qu'il faut être très prudent à ce niveau, car au tout début, je faisais confiance aux horaires trouvés sur les sites "généralistes", et même en prenant des précautions (5 min avant et 5 min après), je ne compte pas le nombre de fois ou je fus amèrement désappointé avec des enregistrements tronqués, c'est d'ailleurs le sentiment de frustration induit qui m'a poussé à me lancer dans cette entreprise.

Dans mon cas, c'est une série de 45 minutes, avec une coupre pub, je compte 5' avant , 5' après et 5' de pub soit un total d'1heure ce qui fait un fichier de 2.33 GO en HD après découpe il pèse 1.5 GO

Il faudra donc adapter en fonctions des cas..

ntx a dit:
Il faut construire un fichier plist au format xml et le mettre dans le bon répertoire LaunchDaemons dans Bibliothèque.
on y reviendra lorsque j'aborderai le point numéro 2

merci pour l'intérêt que tu portes à cette question ;)
 
1- Avant de commencer

Il faut préparer le terrain pour ne pas disperser les documents un peu partout dans sa machine et installer les outils nécessaires s'ils ne sont déjà présents


  • Installer Xcode

    Ceux qui n'ont pas xcode peuvent l'installer à partir du disque d'installation "Developer". Xcode est nécessaire pour l'installation des programmes Unix, c'est un environnement complet de programmation, personnellemnt je l'utilise aussi comme ... Editeur de texte :). Il est très pratique car les lignes sont numérotées, et on dispose d'une fonction "recherche/remplacement" très puissante, à mon avis il vaut largement BBedit [/b] qui lui est payant..
  • Créer un dossier bin

    Dossier à créer dans la session (petite maison). Ce dossier contiendra tous les scripts de votre création
    - Dans le finder: menu Fichier > Nouveau Dossier :: sélectionner puis changer le nom : bin (4 clics maxi, 2 clics minis + saisie de nom au clavier)

    - Avec le terminal :

    mkdir ~/bin

    (rien d'autre à ajouter c'est fait, et pas d'erreur possible, il est bien dans le dossier "petite maison" )
    (caractère tilde = ~ = alt et n)
  • Mettre à jour le profil .profile

    C'est un fichier invisible appelé .profile que le système Unix utilise pour identifier les préférences des utilisateurs. Il contient en outre des chemins d'accès vers les exécutables unix.

    Pour savoir si vous avez un fichier .profile, il suffit de taper

    more ~/.profile

    que le fichier existe ou pas, il faut le mettre à jour. Pour ceux qui n'ont jamais utilisé Unix sur leur mac, taper ou recopier les lignes ci-dessous dans une fenêtre Terminal , l'application se trouve dans Applications/Utilitaires.

    export EDITOR=pico

    cette commande demande au système d'utiliser l'éditeur pico comme éditeur de texte, il est plus intuitif que l'éditeur standard vi

    pico ~/.profile

    Le fichier .profile s'ouvre dans la fenêtre Terminal

    Il suffira de copier-coller (ou retaper) les instructions ci-dessous

    export PATH=/bin:/usr/bin:/usr/local/bin:/Users/nom_abrégé_de_session/bin:$PATH
    export EDITOR=pico


    (nom_abrégé_de_session est votre nom abrégé de session qui se trouve en face de la petite maison)

    puis taper pour enregistrer le fichier, la combinaison de touches : ctrl et o
    valider avec touche entrée, puis fermer le document avec la combinaison de touches : ctrl et x
  • Choisir un éditeur de texte

    Il faut un éditeur de texte pour écrire des scripts, c'est indispensable, les logiciels de traitements de texte ne sont pas adaptés, car ils rajoutent (dans le corps du fichier) des commandes invisibles de formattage entre autres.

    TextEdit : éviter le format .rtfd absolument, mode .txt uniquement
    texshop : excellent éditeur pour Latex ..
    xcode : il ne faut pas avoir peur de ce mastodonte, il est complet et efficace.
    Terminal : la liste des editeurs texte Unix est longue : nano, pico, vi, emacs .....

    bref vous faites votre choix
  • dernier point : le sha-bang #!
    Les scripts sont des fichiers qui contiennent une suite de commandes, pour que le système sache que c'est un script exécutable, il faut que les deux premiers caractères du fichiers soient consitués par ce couple #! appelé sha-bang, juste après doit se trouver le chemin complet du "programme" qui doit exécuter les commandes
    #!/bin/bash script bash
    #!/bin/sh script sh
    #!/bin/php script php
    ....

    remarque importante : quand le script est créé et sauvegardé la première fois, il n'est autre qu'un "bête" fichier texte, si on doube-clique dessus, le mieux qui puisse se produire est qu'il s'ouvre dans TextEdit . Pour que les commandes qu'il contient puissent s'exécuter, il faut le rendre "exécutable" , ce qu'il faudra faire au moyen de la commande suivante (après sauvegarde du fichier), exemple script hello :

    chmod ugo+x ~/Documents/Exemples/hello

    Aspects du script hello avant (gauche) et après modification des permissions avec chmod
-------------------------------------->> A suivre
 
10 mn après, c'est même souvent très insuffisant dans le cas de programme de fin de soirée (les plus intéressants). Le cas de figure des séries avec trois épisodes à la chaîne est typique : je table facile sur un 15-20mn dans ce cas-là (surtout si c'est une chaîne à pub). Bon, en règle générale le troisième épisode est une resucée d'une saison précédente balancée dans le désordre.
Bon, intermède non technique, désolé.

Mais je suis fasciné de voir ce qu'on faire faire avec de bonnes vieilles commandes Unix...

Je vous laisse reprendre... ;)
 
2- Utilisation de VLC et la crontab pour...




  • utilisateur=user

    Tous les utilisateurs d'un système Unix ont un répertoire principal appelé "home" dans lequel ils peuvent stocker leurs dossiers et documents. La "petite maison" symbolique dans le finder est un héritage de cette architecture.

    Comme plusieurs utilisateurs peuvent ouvrir simultanément une session de travail sur le système Unix. La commande whoami (qui suis-je) permet d'identifier l'utilisation d'une session donnée. On va donc récupérer le résultat de cette commande dans une variable user .

    user=$( whoami )

    De cette façon, l'utilisateur paul par exemple, qui veut inspecter le contenu du dossier Movies dans son mac peut écrire dans un script les instructions suivantes :

    Bloc de code:
    #! /bin/bash
    [B] ls -la  /Users/paul/Movies  [/B]
    ce script ne peut s'exécuter que dans le mac de paul.

    Bloc de code:
    #! /bin/bash
    user=$( whoami )
    [B] ls -la  /Users/$user/Movies  [/B]
    ce script s'exécute dans tous les systèmes Unix quelque soit l'utilisateur pourvu que le dossier Movies existe

    remarque a dit:
    user est une variable
    $user est la valeur de la variable user.

    donc ne pas confondre une variable et sa valeur
    de plus, une variable dans un script bash ne peut être utilisée que si elle préalablement initialisée
  • Enregistrer avec Vlc

    On peut enregistrer un flux TV avec Vlc en utilisant le menu de l'application bien sûr, mais aussi en utilisant une version exécutable cvlc qu'on peut installer avec MacPorts , ou alors en faisant appel à une astuce plus simple (découverte sur le net ) et qui utilise une version normale de Vlc .

    Je conseille de choisir une version différente de celle dont on dispose dans le dossier /Applications, car si c'est la même qui sert à enregistrer et à visionner des films, on risque de perdre un enregistrement en cours si on ouvre en même temps un fichier video.

    Pour ma part, j'utilise la vesion 1.0.3, que j'ai "caché" dans un dossier invisible nommé .enregistrements

    On commence par créer un alias de l'exécutable unix qui se trouve dans le "paquet" de l'application

    alias vlc='/Users/$user/Movies/.enregistrements/VLC-103.app/Contents/MacOS/VLC'

    et on utilise la commande adéquate qui permet d'enregistrer un flux A-V en temps réel (rtsp)

    vlc $canal_tv --sout="#standard{access=file,mux=$format_video,dst=$fichier_destination}"

    $canal_tv est la chaîne tv que l'on veut enregistrer, elle doit être accessible dans l'offre TV de votre FAI . En ce qui me concerne, je ne connais que le format et les numéros de chaines de Free . Cependant, quelque soit le fournisseur d'accès, si vous n'arrivez pas à vous procurer la liste des chaînes, vous pouvez la reconstruire en affichant tous les canaux disponibles sur vlc et en notant à chaque fois le texte qui s'affiche dans la barre de progression du contrôleur (voir l'illustration en dessous)


    $format_video est le format d'encapsulation du flux A-V, .ps, .ts, .mp4, j'ai une préférence pour le format .ts (transport stream)

    $fichier_destination nom de fichier destiné à stocker l'enregistrement

    Maintenant qu'on sait comment enregistrer, il faut trouver comment arrêter l'enregistrement. Personnellement je n'ai pas trouvé de solution intégrée à Vlc . La solution suggérée un peu partout passe par le terminal.
    1. On ajoute le symbole & à la fin de la commande précédente afin de "reprendre la main" sur le système
    2. On demande ensuite au système de "dormir" pendant le temps nécessaire à l'enregistrement
    3. Puis, on "tue" le process vlc.
  • script Vlc_recorder

    Bloc de code:
    #! /bin/sh
    #
    #
    
    fichier=$1
    user=$(whomai)
    
    #--------------------------------------------------
    #--------------------------------------------------
    # fichier contient les informations suivantes
    # ligne 1 = format_video
    # ligne 2 = le nom du programme à enregistrer
    # ligne 3 = canal_tv = nom du canal tv à enregistrer
    # ligne 4 = seconds = temps d'enregistrement en secondes
    #--------------------------------------------------
    #--------------------------------------------------
    
    infos=( $(<"$fichier") ) # on récupère les données de $fichier dans le tableau Infos
                             # le premier élément d'un tableau dans bash porte le numéro 0
    format_video=${infos[0]}
    fichier_destination="/Users/$user/Movies/"${infos[1]}".$format_video"
    canal_tv=${infos[2]}
    seconds=${infos[3]}
    
    alias vlc='/Users/$user/Movies/.enregistrements/VLC-103.app/Contents/MacOS/VLC'
    vlc $canal_tv --sout="#standard{access=file,mux=$format_video,dst=$fichier_destination}"&
    
    echo " On reprend la main sur le systeme "
    sleep $seconds
    kill %1
    Le script ci-dessus est au c&#339;ur de notre procédure d'enregistrement, il prend pour argument un fichier de données, s'exécute immédiatement. Afin de l'exécuter à une date déterminée, il faut l'associer à la crontab.
  • programmer des événements avec crontab

    crontab = table chronologique dans laquelle des événements sont prévus à l'avance et exécutés le moment venu. Le daemon cron compare en permanence les dates inscrites dans la crontab avec la date système, et quand le moment arrive, c'est lui qui déclenche l'action programmée.

    Pour en savoir plus ==> votre moteur préféré : crontab

    la structure de la crontab est la suivante :

    mn hh jj mm commande arguments_de_la_commande
    minutes heure jour mois (chemin d'accès)

    Si on remplace un des champs (mn, hh, jj, hh) par une étoile, l'action : commande arguments devient périodique

    exemples

    03 12 04 12 /Users/paul/bin/vlc_recorder /Users/paul/Movies/.enregistrements/dallas signifie : à la date et heure indiquées, lancer le script vlc_recorder, les données pour l'enregistrement se trouvent dans le fichier dallas.


    03 12 04 * /Users/paul/bin/vlc_recorder /Users/paul/Movies/.enregistrements/dallas signifie : à chaque mois, au 4ieme jour à midi et 3 minutes, lancer le script vlc_recorder, les données pour l'enregistrement se trouvent dans le fichier dallas.
    [*] prochaine étape

    associer vlc et la crontab pour programmer les enregistrements


-------------------------------------->> A suivre
 
  • programmer des événements avec crontab

    la structure de la crontab est la suivante :

    mn hh jj mm commande arguments_de_la_commande
    minutes heure jour mois (chemin d'accès)

    Si on remplace un des champs (mn, hh, jj, hh) par une étoile, l'action : commande

    03 12 04 12 /Users/paul/bin/vlc_recorder /Users/paul/Movies/.enregistrements


    03 12 04 * /Users/paul/bin/vlc_recorder /Users/paul/Movies/.enregistrements/dallas

-------------------------------------->> A suivre

Correctif : j'ai oublié d'indiquer le jour de la semaine dans la crontab
mn hh jj mm jds commande arguments_de_la_commande
minutes heure jour mois jour(s)-de-semaine
 
3- Programmation d'enregistrements ....

Je vous propose ici deux scripts, un qui gère la partie programmation, et l'autre qui exécute les actions programmées.


  • Script mac_neto

    c'est un script qui propose deux options : Enregistrement immédiat, et enregistrement programmé.

    La première option est suivie par une demande d'entrer au clavier , sur une seule ligne : le titre de l'enregistrement, le canal TV concerné à choisir dans une liste qui s'affiche, et la durée d'enregistrement.

    La deuxième option est suivie par la demande d'entrer au clavier les mêmes informations ci-dessus, avec en plus l'heure de la date d'enregistrement.

    Les données sont vérifiées, si elles sont correctes, elles sont affichées pour validation.

    Bloc de code:
    #! /bin/sh
    
    # Mac_neto
    # ************************************************************************
    # Constantes globales
            # regex pour tester des nombres
            durex='^([0-9]+)\:([0-9]+)\:([0-9]+)\:([0-9]+)\:([0-9]+)'
            
            # Duree maximale d'enregistrement
            DUREE_MAX=300  
            
            # Utilisateur   
            USER=$(whoami)
            
            # Dossier movies de l_utilisateur
            FILMS_DOS="/Users/$USER/Movies"
            
            # pour stocker les consignes des films à enregistrer
            # Si le dossier n_'existe pas, on le cree
            FICHIERS_DOS="$FILMS_DOS/.enregistrements/fichiers"
            if [ -d $FICHIERS_DOS ]; then
                continue
                else
                mkdir $FICHIERS_DOS
            fi
            
            # fichier contenant le liste des chaines de la tv_box
            # A installer soi-meme suivant son FAI
            RTSP_FBX="$FILMS_DOS/.enregistrements/rtsp_fbx" 
            
            # minute, heure, jour à rajouter aux titres afin de ne pas les confondre
            STRING_DATE=$(date '+%M-%H-%d')
            
            # Nombre de secondes depuis l_origine d_Unix (1970)
            SECS=$(date '+%s')
            
    # ******************************************************************************
    # ******************************************************************************
    echo " ************************************************************************ "
    echo " ************************************************************************ "
    echo " ---------           PROGRAMMATION D UN ENREGISTREMENT   ---------------- "
    echo " ************************************************************************ "
    echo " ************************************************************************ "
    
    echo "Entrer le type d_enregistrement souhaite i: pour immediat d:pour differe"
    read TYPE
    echo " --------- Voici les chaines disponibles"
    awk ' {printf("Numero= %03d \t\t TV=%s\n",$1,$2)}' $RTSP_FBX
    
    case $TYPE in
        "i")
        echo "Enregistrement immediat"
        echo "-------------------------------------------------------------------------"
    
        echo "Entrer les informations suivantes, tel que le montre l'exemple en dessous"
    
        echo "-------------------------------------------------------------------------"
        echo "Titre \t\t\t| numero | duree(mn) | "
        echo "-------------------------------------------------------------------------"
        echo "-------------------------------------------------------------------------"
        awk 'BEGIN {num=2 ; duree=5 ;titre="tintin-se-la-coule-a-kaboul"
            printf("%13s \t  %03d \t  %3d  \n",titre,num, duree)}'
        echo "-------------------------------------------------------------------------"
        
        read LE_TITRE LE_CANAL LA_DUREE 
        L_HEURE=$(date  '+%H:%M') ; LA_DATE=$(date  '+%d:%m:%y'); REC="Immediat"
        ;;
        
        "d") 
        echo "Enregistrement differe"
        echo "-------------------------------------------------------------------------"
    
        echo "Entrer les informations suivantes, tel que le montre l'exemple en dessous"
    
        echo "-------------------------------------------------------------------------"
        echo "Titre \t\t\t| numero | duree(mn) | heure(hh:mm) | date(jj:MM:AA) "
        echo "-------------------------------------------------------------------------"
        echo "-------------------------------------------------------------------------"
        awk 'BEGIN {num=2 ; tv="France2" ; duree=5; hour="13:10" ; dat="19:11:10";
            titre="On-se-dechaine-au-phare-ouest"
            printf("%13s \t  %03d \t  %5s \t %3s\t\t  %5s  \n",titre,num,duree,hour,dat)}'
        echo "-------------------------------------------------------------------------"
        
        read LE_TITRE LE_CANAL LA_DUREE L_HEURE LA_DATE
        ddat="$L_HEURE:$LA_DATE"; REC="Differe"
        
        
        #------ depassement  ---------------
        #-----------------------------
        echo "--- Verification si la date est depasse "
        #-----------------------------
        #-----------------------------
        SECNDS=$(date -j -f "%M:%H:%d:%m:%y" "$ddat" "+%s" )
        
        if (( $SECS > $SECNDS )); then
        echo " La date d_enregistrement est depassee"
        exit 1
        fi
        
        #------ la date  -------------
        #-----------------------------
        echo "--- analyse de la date "
        #-----------------------------
        #-----------------------------
        erreur=$(echo $ddat | awk '{ split($0,tt,":"); err=0;
                # analyse de l_annee, bisextile  normale
                y=(tt[5]%4)
                            
                # les mois de l_annee
                split(31 28 31 30 31 30 31 31 30 31 30 30,mois," ")
                if (y = 0 ); mois[2]=29
                            
                # analyse des minutes
                if (tt[2] > 59)
                {err="minutes invalides"; exit 1}
                            
                # analyse de l heure
                if (tt[1] > 23)
                {err="heure invalide"; exit 1}
                            
                # analyse du jour
                if (tt[3] < mois[tt[4]])
                {err="mois invalide"; exit 1}}
    
                END {print(err) }')
                            
        if (( $erreur == 0 )); then
        echo " date ok "
        else
        exit 1
        fi
    
        ;;
    esac
    
    #------ chaine  --------------
    #-----------------------------
    echo "--- Verification du canal TV"
    #-----------------------------
    #-----------------------------
    chaine=($(awk '{ if ($1 == '"$LE_CANAL"' ) print( $2,$3)} ' $RTSP_FBX))
    
    if [[ -z  $chaine ]]; then
        echo "Le numero de canal = $numero ne correpond a aucune chaine TV "
        echo "une erreur peut-etre ?? recommenecer depuis le debut" 
        exit 1
    fi
    echo "Canal ok"
    TV=${chaine[0]}; RTSP=${chaine[1]}
    
    #------ duree  ---------------
    #-----------------------------
    echo "--- Verification de la duree"
    #-----------------------------
    #-----------------------------
    if (( $LA_DUREE > $DUREE_MAX )) ; then 
        echo "La duree entree excede la duree maximale $DUREE_MAX Heures "
        echo "Recommencer avec une durée plus courte "
        exit 1
    fi
    echo "duree ok "
    
    
    #------- titre ---------------
    #-----------------------------
    echo "---construction du titre"
    #-----------------------------
    #-----------------------------
    
    FILM=$LE_TITRE"_"$STRING_DATE
    FICHIER=$FICHIERS_DOS"/"$FILM
    SECONDES=$((LA_DUREE*60))
    VLC="/Users/$USER/bin/vlc_recorder"
    
    RECORD=$REC":"$LE_TITRE":"$TV":"$LA_DUREE":"$L_HEURE":"$LA_DATE
    echo $RECORD | awk '{split($0,f,":")
         print("----Voici la programmation demandee, si tout est OK taper y ------------- ")
         print("------------------------------------------------------------------------- ")
         printf("%15s = %s\n%15s = %s\n%15s = %s\n%15s = %03d %s\n%15s = %02d%s%02d\n%15s = %02d%s%02d\n","Enregistrement",f[1],"Titre",f[2],"Canal",f[3],"Duree",f[4],"minutes","Heure",f[5],":",f[6],"Date",f[7],":",f[8]);
         print("------------------------------------------------------------------------- ")
         }
        '
        
    read REPONSE
    
    if [[ $REPONSE == "y" ]]; then
        
        # Ecriture des consignes d_enregistrement dans le fichier $FICHIER
        echo "-Ecriture des consignes dans le fichier d_enregistrement: $FILM"
            echo $FILM > $FICHIER
            echo $RTSP >> $FICHIER
            echo "ts" >> $FICHIER
            echo $SECONDES >> $FICHIER
            echo $TV >> $FICHIER
            echo $L_HEURE >> $FICHIER
    
            case $TYPE in
                "i")
                # Enregistrement immédiat
                $VLC  $FICHIER
                echo "c_est dans la boite"
            ;;
            
                "d") 
                cronik="/Users/$USER/Movies/.enregistrements/cronik"
                etoile="*"
                t_tab=(${ddat//:/ })
                minute=${t_tab[1]};heure=${t_tab[0]};jour=${t_tab[2]};mois=${t_tab[3]}
                echo "$minute $heure $jour $mois $etoile $VLC $FILM" > $cronik
                crontab -l | cat - $cronik| crontab
                echo "cest dans la crontab"
            ;;
            esac
    fi
  • Script vlc_recorder

    Le script mac_netoo fait appel au script vlc_recorder. C'est le même que celui qu'on trouve au paragraphe 2.
    Mais ayant apporté certaines modifications sur que je ne peux effectuer (Edition impossible), je le reprends ci-dessous.

    Bloc de code:
    #! /bin/sh
    
    # vlc_recorder
    # *******************
    # Constantes globales
            # Utilisateur   
            USER=$(whoami)
            
            # ou sont stockes les consignes des films à enregistrer
            FICHIERS_DOS="/Users/$USER/Movies/.enregistrements/fichiers"
    
    file=$1
            
    cd $FICHIERS_DOS
    CONSIGNES=( $(<"$file") )
    FILM=${CONSIGNES[0]}
    rtsp=${CONSIGNES[1]}
    MUXER=${CONSIGNES[2]}
    SECONDES=${CONSIGNES[3]}
    
    dst="/Users/$USER/Movies/"$FILM".$MUXER"
    
    alias vlc='/Users/$USER/Movies/.enregistrements/VLC-103.app/Contents/MacOS/VLC'
    vlc $rtsp --sout="#standard{access=file,mux=$MUXER,dst=$dst}"&
    echo "on reprend la main ..... "
    
    sleep $SECONDES
    kill %1
    exit 1
  • Format du fichier rstp_fbx

    ce fichier contient les canaux TV que chacun peut collecter suivant son FAI, il faudra le créer et le placer dans le dossier .enregistrement.

    /Users/$USER/Movies/.enregistrements/

    voici l'exemple des chaines publiques pour Free
    Bloc de code:
    fichier contenant les canaux TV de la freebox, une ligne= 3 champs séparés par des espaces.
    champs numero un= numero de canal , champs numero deux = nom de la chaine , champs numero trois = code free de la chaine 
    [COLOR=red][B](remarque : les espaces dans les noms des chaines sont remplacés par des tirets [/B][/COLOR]) 
    2 France-2-HD        rtsp://mafreebox.freebox.fr/fbxtv_pub/stream?namespace=1&service=201&flavour=hd
    3 France-3            rtsp://mafreebox.freebox.fr/fbxtv_pub/stream?namespace=1&service=202&flavour=sd
    4 France-5            rtsp://mafreebox.freebox.fr/fbxtv_pub/stream?namespace=1&service=203&flavour=hd
    5 Arte-HD            rtsp://mafreebox.freebox.fr/fbxtv_pub/stream?namespace=1&service=204&flavour=hd  
    14 France-4            rtsp://mafreebox.freebox.fr/fbxtv_pub/stream?namespace=1&service=376&flavour=sd


-------------------------------------->> A suivre
 
4- Récupération .. ou comment parser du xml avec awk

Le script mac_neto ainsi que les logiciels équivalents sont fort utiles pour des utilisations épisodiques. Cependant, ils trouvent vite leur limite quand on en fait un usage intensif ( enregistrements de séries quotidiennes avec un ou plusieurs épisodes) ou, quand on s'absente pour une longue période et qu'on souhaite continuer à enregistrer sa série préférée.

La solution passe alors par l'écriture d'un script qui récupère les horaires chaque jour sur internet et les injecte dans la crontab. Ce qu'on peut faire très facilement avec l'outil curl intégré dans le système Unix de chaque mac.

curl $page_web > $fichier_destination

$page_web = adresse internet de la page web contenant les programmes de la chaine TV qu'on souhaite télécharger
$fichier_destination = chemin complet du fichier pour stocker ces informations dans le disque dur

Les documents xml (html) sont organisés comme un système de fichier.Les données sont contenues entre des balises ouvrantes et fermantes du type <html /html> qui indiquent le début et la fin des données, tous comme les dossiers et sous dossiers, les balises peuvent contenir d'autres balises.
Il existe plusieurs API php spécilaisées dans la récupération des données dans un document xml. taper parser documents xml pour plus de renseignements.

Pour de multiples raisons, il est possible de se passer de php et de faire la même chose avec peut-être plus d'économie de moyen en se servant des outils Unix standards. Le plus ergonomique à mon sens est l'outil awk .

awk considère que tout fichier texte est une suite d'enregistrements, un enregistrement se termine par le caractère fin de ligne. Chaque enregistrement est une suite de champs ou mots séparés par un espace (séparateur par défaut). Les mots dans un enregistrements sont numérotés dans l'ordre $1,$2... jusqu'au dernier accessible par la variable $NF. L'enregistrement (toute la ligne) est désigné par la valeur $0.
awk est structuré comme le langage C, ce qui est normal si l'on sait que k dans awk désigne l'initiale d'un des deux inventeurs du C (Kernighan). L'intérêt de ce programme, outre le fait qu'il spécialisé dans le traitement de texte, est qu'il est muni d'une bibliothèque mathématique relativement complète, ce qui comble une des lacunes du shell bash par exemple.

Dans ce qui suit, un script qui permet de "parser" les programmes d'une télévision publique, France 3 en l'occurrence.

L'analyse du fichier téléchargé à l'aide de curl montre que les programmes sont séparés en tranches horaires délimitées entre deux balises <ul et /ul>. Les données forment ainsi des paragraphes plus ou moins longs, le retour à la ligne ne s'effectue qu'après la balise fermante /ul>.Plusieurs programmes délimités entre deux balises <li /li> peuvent être inclus dans la même tranche horaire.

Un programme donné est caractérisé par trois données : heure de début, titre, durée. Données qu'on retrouve respectivement entre des balises <span /span>, <a /a> et <em /em>.

Afin de faciliter le traitement du fichier avec awk, on commence par effectuer des opérations de "nettoyage" qui consistent à :
- Elimination des accents pour faciliter les recherches
- Elimination de caractères spéciaux tel que " et '
- Insertion de sauts de lignes pour éviter qu'il y'ait plusieurs programmes dans un même paragraphe.

Bloc de code:
#!/bin/bash

# les programmes de France 3 du jour 
# *************************************************************************


user=$(whoami)

# Creation d_un dossier pour stocker les page wab telechargees
# *************************************************************************
web_dos="/Users/$user/Movies/.enregistrements/pages_web"

if [ -d $web_dos ]; then
echo "le dossier existe"
else
echo "le dossier n_existe pas, on le cree"
mkdir $web_dos
fi

page_web="http://www.programme-tv.net/programme/chaine/programme-france-3-7.html"
page_1=$web_dos"/page_1.txt"
page_2=$web_dos"/page_2.txt"
page_3=$web_dos"/page_3.txt"
page_4=$web_dos"/page_4.txt"

# Telechargement des programmes
# *************************************************************************

curl $page_web > $page_1


# nettoyage avec sed , tr et awk
# *************************************************************************

cat $page_1 | tr 'A-Zàçéèêîô\"' 'a-zaceeeio-'> $page_2
# certains accents sont recalcitrants, il faudra rajouter les autres au fur et a mesure
sed 's/&eacute;/e/g ; s/&#039;/_/g ;s/&ocirc;/o/g ; s/&ecirc;/e/g' $page_2 > $page_3
# saut de ligne avant chaque heure de debut de programme
awk  'gsub("class=-heure->","\n\nheure=") {print($0)}' $page_3 > $page_4


# Traitement avec awk, le resultat est affiche sur le terminal
# *************************************************************************

awk '
BEGIN {reg_heure="[0-9]+:[0-9]+";
       reg_title="title=-[0-9a-z\ .,;:!\\/_]+-";
       reg_duree="[0-9]+\ mn|[0-9]+h[0-9]+";
       titre=x ; duree = x; heure = x }
       
       # recherche de l_heure
       $0~/heure=/ {coco=match($1 ,reg_heure)  
                    if (coco != 0 ) 
                    {dd=RSTART ; len=RLENGTH;
                     heure = substr($1,dd,len);}
                     }
       

       # recherche du titre
       $0~/title=-/ {coco=match($0 ,reg_title)  
                    if (coco != 0 ) 
                    {dd=RSTART+7 ; len=RLENGTH-8;
                     titre = substr($0,dd,len);}
                     else
                     {titre=inconnu} 
                     }

       # recherche de la duree
       $0~/<\/em><\/p><\/li>/ {coco=match($0 ,reg_duree)  
                    if (coco != 0 ) 
                    {duree = substr($0,RSTART,RLENGTH);
                    printf("Heure=%6s  Duree=%6s  Titre= %s\n",heure,duree,titre)}
                    }' $page_4
Il suffit copier le script ci-dessus dans fichier texte sans extension, de le rendre exécutable, un double clic et les programmes du jour s'affichent dans le terminal

Bloc de code:
/Users/mt/bin/awk_parse_program ; exit;
iMac:~ mt$ /Users/mt/bin/awk_parse_program ; exit;
le dossier existe
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 37597    0 37597    0     0   154k      0 --:--:-- --:--:-- --:--:--  194k
Heure= 00:05  Duree=  5 mn  Titre= tout le sport
Heure= 01:10  Duree=  1h25  Titre= concert daniele gatti
Heure= 02:35  Duree= 45 mn  Titre= nypd blue
Heure= 03:20  Duree= 40 mn  Titre= nypd blue
Heure= 04:00  Duree= 30 mn  Titre= soir 3
Heure= 04:30  Duree= 25 mn  Titre= plus belle la vie
Heure= 04:55  Duree=  5 mn  Titre= un livre, un jour
Heure= 05:00  Duree= 25 mn  Titre= les matinales
Heure= 05:25  Duree= 35 mn  Titre= questions pour un champion
Heure= 06:00  Duree= 35 mn  Titre= euronews
Heure= 06:35  Duree=  1h55  Titre= ludo
Heure= 08:30  Duree=  2h30  Titre= samedi ludo
Heure= 11:00  Duree=  5 mn  Titre= meteo
Heure= 11:05  Duree= 55 mn  Titre= magazines regionaux
Heure= 12:00  Duree= 25 mn  Titre= 12/13 : midi pile : journal regional
Heure= 12:25  Duree= 25 mn  Titre= 12/13 : journal national
Heure= 12:50  Duree= 35 mn  Titre= nous nous sommes tant aimes
Heure= 13:25  Duree=  1h10  Titre= les grands du rire
Heure= 14:35  Duree= 25 mn  Titre= cote jardin
Heure= 15:00  Duree= 20 mn  Titre= en course sur france 3
Heure= 16:45  Duree=  5 mn  Titre= un livre toujours
Heure= 17:00  Duree= 30 mn  Titre= slam
Heure= 17:30  Duree= 30 mn  Titre= des chiffres et des lettres
Heure= 18:00  Duree= 35 mn  Titre= questions pour un champion
Heure= 18:35  Duree= 10 mn  Titre= avenue de l_europe
Heure= 18:50  Duree=  3 mn  Titre= 19/20 : edition nationale
Heure= 18:53  Duree=  7 mn  Titre= 19/20 : edition regionale et locale
Heure= 19:00  Duree= 30 mn  Titre= 19/20 : journal regional
Heure= 19:30  Duree= 28 mn  Titre= 19/20 : journal national
Heure= 19:58  Duree=  2 mn  Titre= meteo
Heure= 20:00  Duree=  5 mn  Titre= tout le sport
Heure= 20:10  Duree= 25 mn  Titre= repas de familles
Heure= 20:35  Duree= 55 mn  Titre= sos 18
Heure= 21:30  Duree= 50 mn  Titre= sos 18
Heure= 22:20  Duree= 55 mn  Titre= sos 18
Heure= 23:16  Duree=  4 mn  Titre= meteo
Heure= 23:20  Duree= 20 mn  Titre= soir 3
Heure= 23:40  Duree=  1h55  Titre= que la fete commence
logout

[Opération terminée]
-------------------------------------->> A suivre
 
5- Programmation ...programme macnetsocope

Voici l'étape finale, le programme macnetsocope. Il est composé de 6 scripts

  • Composition du programme
    1. macneto_scope
      A lancer en premier, il permet de configurer le programme :
      - Lancer le programme de configuration si celle-ci n'est pas faite
      - Ajouter et supprimer des programmes à la liste des programmes à enregistrer
    2. macneto_config
      Script de configuration, il sert à :
      - Créer les dossiers et fichiers nécessaires au fonctionnement du programme
      - Copier VLC dans un dossier à l'extérieur du dossier Applications
    3. macneto_daemon
      Script qui doit être lancé périodiquement, il doit être au choix :
      - Lancé à l'ouverture de session. A sélectionner dans la fenêtre
      Préférences Système > Comptes > Ouverture

      - Placer un alias de ce dans Bibliothèque/StarupItems

      - Utiliser la crontab
    4. macneto_collect
      Script de collecte des données
    5. macneto_process
      script de traitement des données collectées
    6. macneto_update
      mise à jour de la crontab avec prise en compte des données nouvelles
  • Procédure
    1. Créer un dossier ~/bin
    2. Copier les scripts ci-dessous (avec les mêms noms) et les placer dans le dossier ~/bin
    3. Les rendre exécutable : chmod u+x script
  • Les scripts du macnetoscope
    L'ensemble étant trop long (> 20000 caractères autorisés), ils seront postés les uns après les autres


---------- Nouveau message ajouté à 23h38 ---------- Le message précédent a été envoyé à 23h14 ----------

macneto_scope
Bloc de code:
#!/bin/bash 
# macneto_scope
# *************************************************************************
# *************************************************************************
# -------------------------------------------------------------------------
# ----    Programmation avec recherche des horaires sur internet ----------
# -------------------------------------------------------------------------
# *************************************************************************
# *************************************************************************

user=$(whoami)

rtsp_adsl="/Users/$user/bin/zzzmacneto_dos/rtsp_adsl"
tv_programs="/Users/$user/bin/zzzmacneto_dos/tv_programs"

# test fichier rtsp

if [ ! -f $rtsp_adsl ]; then
echo "__________________________________________________________________________"
echo "Lancement du programme de configuration "
echo "__________________________________________________________________________"
macneto_config
code_retour=$(echo $? )
    if (( $code_retour == 0 )); then
    clear
    else
    echo "__________________________________________________________________________"
    echo "__________________________________________________________________________"
    echo " Echec de la configuration "
    echo " Assurezvous que les dossiers et fichiers suivants existent aux endroits indiqués"
    echo " /Users/$user/bin                         ===> dossier de rangement des executables perso"
    echo " /Users/$user/bin/zzzmacneto_dos             ===> dossier de rangement mac_netoscope"
    echo " /Users/$user/bin/zzzmacneto_dos/rtsp_adsl   ===> fichiers canaux TV du FAI"
    echo " /Users/$user/bin/zzzmacneto_dos/vlc_macneto ===> copie de vlc qui doit se trouver dans Applications"
    echo "__________________________________________________________________________"
    echo "__________________________________________________________________________"
    exit 1
    fi
fi
clear    
echo "__________________________________________________________________________"
echo " Script pour installer une programmation d_enregistrement permanente d_emission TV"
echo -e " Il est possible de surveiller plusieurs emissions, sur un ou plusiers canaux TV\n\n\n"
echo " --------- Voici la liste des emmissions programmees"
awk '$0 ~ /TV/ && $0 ~ /program/  {printf("Numero= %-5d TV=%-15s Program=%s\n",NR,$2,$4)}' $tv_programs
code_retour=$(echo $? )

echo "_____________________________________________"
echo -e "Entrer \n------> a: pour ajouter une emission a la liste \n------> s: pour en supprimer de la liste ci-dessus"
echo "_____________________________________________"
read choix

case $choix in
"s")
    if (( $code_retour != 0 )); then
        echo "fichier pour le moment vide, rien a supprimer"
        exit 0
    else
        echo " Supprimer une emission de la liste d_enregistrement : entrer son numero "
        read number
        program=$(sed -n "$number p" $tv_programs)
        echo "La ligne suivante sera supprimee de la liste des enregistrements"
        echo "===> ${program[@]}"
        new_programs="/Users/$user/bin/zzzmacneto_dos/new_programs"
        awk 'NR != '"$number"' {print ($0)}' $tv_programs > $new_programs
        cat $new_programs > $tv_programs
    fi
    ;;
    
"a")
    echo " Ajouter une emissions a la liste d'enregistrement "
    echo " --------- Voici la liste des canaux TV disponibles"
    awk ' {printf("Numero= %-4d....TV= %s\n",$1,$2)}' $rtsp_adsl
    echo " Entrer le numero du canal tv et le titre de l_emission a enregistrer "
    read tablo
    data=( $tablo )
    number=${data[0]}; tv=$(awk '$1 ~ /^'"$number"'$/ {print($2)}' $rtsp_adsl)
    len=${#data[@]}
    blob=${data[1]}
        if (( $len > 2 )); then
            for (( k=2; k< $len ; k++ )); do
            blob=$blob"-${data[$k]}"
            done
        fi
    echo "$tv $blob" | awk ' {printf("TV= %-15s program= %s\n",$1,$2)}'  >> $tv_programs
    echo -e "Le programme :==> $blob  sur :==> $tv \na ete ajoute a la liste des emissions a enregistrer"
                
    ;;
esac


---------- Nouveau message ajouté à 23h42 ---------- Le message précédent a été envoyé à 23h38 ----------

macneto_daemon
Bloc de code:
#!/bin/bash
# macneto_daemon
# *************************************************************************
# *************************************************************************
# -------------------------------------------------------------------------
# ----    Programmation avec recherche des horaires sur internet ----------
# -------------------------------------------------------------------------
# *************************************************************************
# *************************************************************************
#
# CE SCRIPT DOIT ETRE AU CHOIX /
#
# _______1• LANCE A L_OUVERTURE DE SESSION (Pref.Syst. > Comptes > ouverture)
#
# _______2• PLACE DANS LE DOSSIER :./Library/StartupItems/
# 
# _______3• LANCE VIA LA CRONTAB 
#
#_______________________________________________________________________________
# le programme attend que les services réseau de l_ordinateur soient etablis
#_______________________________________________________________________________

# sleep 100

#_______________________________________________________________________________
# test de configuration
#_______________________________________________________________________________

user=$(whoami)

# Chercher les programmes a surveiller dans le fichier tv_programs
tv_programs="/Users/$user/bin/zzzmacneto_dos/tv_programs"

if [ -f $tv_programs ]; then
    echo "le fichier existe, la config est supposee correcte"
    else
    echo "le dossier existe pas, rien a surveiller, ou configuration mal faite"
    echo "lancer les script macneto_config et macneto_scope ensuite"
    exit 1
fi

#_______________________________________________________________________________
# collecte des informations sur le web
#_______________________________________________________________________________

macneto_collect

#_______________________________________________________________________________
# les informations sont collectees et traitees, elles sont dans : cronfile
# ======================> mise a jour de la crontab avec le script suivant
#_______________________________________________________________________________

macneto_update


---------- Nouveau message ajouté à 23h43 ---------- Le message précédent a été envoyé à 23h42 ----------

macneto_config
Bloc de code:
#!/bin/bash

# macneto_config
# Programme de configuration du  macnetoscope
# *************************************************************************

user=$(whoami)

enregistrements="/Users/$user/Movies/.enregistrements/"
web_pages=$enregistrements"web_pages/"
rec_files=$enregistrements"rec_files/"
crontable=$enregistrements"crontable/"
bin="/Users/$user/bin/"
zzzmacneto_dos=$bin"zzzmacneto_dos/"
rtsp_adsl=$zzzmacneto_dos"rtsp_adsl"

echo "____________________________________________________________"
echo "------------------------------------------------------------"
echo " La configuration consiste à : "
echo "......... A= Creer des dossiers"
echo "•• General pour tout ranger    = $enregistrements"
echo "•• Pour ranger les pages web   = $web_pages"
echo "•• Pour les fichiers consignes = $rec_files"
echo "•• Pour les fichiers crontab   = $crontable"
echo "•• Pour ranger ses scripts     = $bin , seulement si absent"
echo "•• Pour ranger vlc et ....     = $zzzmacneto_dos"
echo ""
echo ""
echo "......... B= Creer un fichier"
echo "•• Fichier des canaux TV adsl  = $rtsp_adsl"
echo "•• Fichier suivi   programmes  = $tv_programs"
echo ""
echo ""
echo "......... C= Copier vlc dans le dossier zzzmacneto_dos"
echo "____________________________________________________________"
echo "------------------------------------------------------------"
echo ""
echo ""
echo " Creation des dossiers s_ils n_existent pas"
echo "___________________________________________"
echo "-------------------------------------------"
dossiers=($enregistrements $web_pages $rec_files $crontable $bin $zzzmacneto_dos )
for item in ${dossiers[@]} ; do
    if [ -d $item ]; then
        echo " Le dossier $item existe "
    else
        echo " Creation du dossier : $item"
        # mkdir $item
    fi
done    
echo ""
echo ""
echo " Verification du fichier  canaux rtsp"
echo "_____________________________________"
echo "-------------------------------------"
if [ -f $rtsp_adsl ]; then
echo " Le fichier existe "
else
echo " Ce fichier est fonctionnel pour Free uniquement, pour tout autre FAI"
echo " Editer le fichier $rtsp_adsl et modifier les canaux rtsp en respectant le modele"    

echo "2 france-2-hd        rtsp://mafreebox.freebox.fr/fbxtv_pub/stream?namespace=1&service=201&flavour=hd
3 france-3            rtsp://mafreebox.freebox.fr/fbxtv_pub/stream?namespace=1&service=202&flavour=hd
4 france-5            rtsp://mafreebox.freebox.fr/fbxtv_pub/stream?namespace=1&service=203&flavour=hd
5 arte-hd            rtsp://mafreebox.freebox.fr/fbxtv_pub/stream?namespace=1&service=204&flavour=hd    
8 direct-8-hd        rtsp://mafreebox.freebox.fr/fbxtv_pub/stream?namespace=1&service=372&flavour=hd
10 tmc                rtsp://mafreebox.freebox.fr/fbxtv_pub/stream?namespace=1&service=497&flavour=ld
11 nt1                rtsp://mafreebox.freebox.fr/fbxtv_pub/stream?namespace=1&service=374&flavour=sd
12 nrj-12-hd        rtsp://mafreebox.freebox.fr/fbxtv_pub/stream?namespace=1&service=375&flavour=hd
14 france-4            rtsp://mafreebox.freebox.fr/fbxtv_pub/stream?namespace=1&service=376&flavour=sd
17 directstar        rtsp://mafreebox.freebox.fr/fbxtv_pub/stream?namespace=1&service=678&flavour=sd
21 rtl9                rtsp://mafreebox.freebox.fr/fbxtv_pub/stream?namespace=1&service=210&flavour=ld
22 ab1                rtsp://mafreebox.freebox.fr/fbxtv_pub/stream?namespace=1&service=211&flavour=ld
118 game-one        rtsp://mafreebox.freebox.fr/fbxtv_pub/stream?namespace=1&service=220&flavour=sd
119 game-one-hd        rtsp://mafreebox.freebox.fr/fbxtv_pub/stream?namespace=1&service=799&flavour=hd" >> $rtsp_adsl
fi

echo ""
echo ""
echo " Verification du fichier  tv_programs"
echo "_____________________________________"
echo "-------------------------------------"
if [ -f $tv_programs ]; then
echo " Le fichier $tv_programs existe "
else
echo -e "fichier de surveillance des programmes televisison" >> $tv_programs
echo "" >> $tv_programs
fi

echo ""
echo ""        
echo " Verification vlc "
echo "_____________________________________"
echo "-------------------------------------"
code_retour=0

vlc="/Users/$user/bin/zzzmacneto_dos/vlc_macneto.app"
if [ -d $vlc ]; then
echo " vlc est present"
else
echo "copie de vlc en cours"
cp -R /Applications/VLC.app /Users/$user/bin/zzzmacneto_dos/vlc_macneto.app
code_retour=$(echo $? )
    if (( $code_retour != 0 )); then
    echo " echec de la copie de vlc, procéder manuellement à la copie de"
    echo " vlc dans le dossier zzzmacneto_dos, et renommer le : vlc_macneto"
    fi
fi

# Verification de la presence des script macneto
macneto=($bin"macneto_scope" $bin"macneto_config" $bin"macneto_daemon" $bin"macneto_collect" $bin"macneto_process" $bin"macneto_update")

for item in ${macneto[@]} ; do
    if [ -f $item ]; then
        continue
    else
        code_retour=1
        echo "$item n_est pas dans $bin, le macnetoscope ne peut fonctionner"
        break
    fi
done    

# test final
if (( $code_retour == 0 )); then
echo " Configuration réussie, le macnetoscope est maintenant operationnel"
else
echo " Echec de la configuration, recommencer !! "
fi


---------- Nouveau message ajouté à 23h43 ---------- Le message précédent a été envoyé à 23h43 ----------

macneto_collect
Bloc de code:
#!/bin/bash
# macneto_collect
# -------------------------------------------------------------------------
# ----    Programmation avec recherche des horaires sur internet ----------
# ---------------   sous programme de collecte de donnees      ------------
# -------------------------------------------------------------------------

# Constantes globales
# °°°°°°°°°°°°°°°°°°°

user=$(whoami)
# dossier pour stocker les pages web
pages_web="/Users/$user/Movies/.enregistrements/pages_web/"

# fichier pour stocker teporairement les resultats des recherches
cronfile="/Users/$user/Movies/.enregistrements/crontable/cronfile"
if [ -f $cronfile ]; then
rm $cronfile
fi

# fichiers contenant les informations des canaux tv de la box-adsl
tv_programs="/Users/$user/bin/zzzmacneto_dos/tv_programs"

# List des emissions a enregistrer
tv_liste=($(awk ' $0~/^TV=/ {print ($2)}' $tv_programs))
pr_liste=($(awk ' $0~/^TV=/ {print ($4)}' $tv_programs))
echo ${tv_liste[@]}
echo ${pr_liste[@]}

# questions de date
seconds=$(date '+%s' )
for (( k=1; k<7 ; k++)); do
    secs=$((seconds+k*86400))
    kdate=$(date -r $secs "+%Y-%m-%d")
    chaine[$k]="chaine/$kdate/programme-"
done
chaine[0]="chaine/programme-"

# boucle sur les programmes tv a surveiller
# °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
for (( k=0; k<${#tv_liste[@]}; k++)) ; do
tv=${tv_liste[$k]}
program=${pr_liste[$k]}

    # calcul de l_adresse web de la chaine tv dans le site web
    # °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
    racine_site_web="http://www.programme-tv.net/programme/"
    lesite_web=$racine_site_web"programme-tnt.html"
    page0_tnt=$pages_web"tnt0.txt"
    page1_tnt=$pages_web"tnt1.txt"
    curl $lesite_web > $page0_tnt

    # petit nettoyage
    cat $page0_tnt | tr 'A-Zàçéèêîô\"' 'a-zaceeeio-'> $page1_tnt
    
    # saut de ligne avant chaque heure de debut de programme
    awk  'gsub("-\/programme\/chaine\/programme-","\n\ncanal= ") {print($0)}' $page1_tnt > $page0_tnt


    # recherche du code du canal tv
    code_tv=$(awk ' BEGIN {reg_chaine="[a-z0-9-]+.html"}
                    $2 ~ /'"$tv"'/ {coco=match($2,reg_chaine)  
                    if (coco != 0 ) 
                    {print (substr($2,RSTART,RLENGTH)); exit}
                    } ' $page0_tnt)
                    
    # test prophylactique, le code du canal trouve  doit etre non vide
    if [ -z $code_tv ]; then
        echo " code_tv est vide, la chaine n_est pas trouvee, ou n_existe pas "
        echo " entreprendre toute action utile pour resoudre le probleme"
        exit 1
    fi
echo ""
echo ""
echo "_______________________________________________________________"
echo "telechargement des programmes du canal tv = $code_tv "
echo "_______________________________________________________________"

    # le canal tv est trouve, telechargement des programmes de la semaine
    # °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
    for (( jour=0; jour<7 ; jour++ )); do
    tvpage_web=$racine_site_web${chaine[$jour]}$code_tv
    page0_tv=$pages_web"tv0.txt"
    page1_tv=$pages_web"tv1.txt"
    page2_tv=$pages_web"tv2.txt"
    page_tv=$pages_web"$code_tv-$jour.txt"
    
    echo "$seconds $jour $tv $program" | awk ' { 
    printf("date_du_jour(sec)= %d   jour= %-3d TV= %-15s program= %s\n",$1,$2,$3,$4) }' > $page_tv
    
    curl $tvpage_web > $page0_tv

    # nettoyage avec sed , tr et awk
    # °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
    cat $page0_tv | tr 'A-Zàçéèêîô\"' 'a-zaceeeio-'> $page1_tv
    # certains accents sont recalcitrants, il faudra rajouter les autres au fur et a mesure
    sed 's/&eacute;/e/g ; s/&#039;/_/g ;s/&ocirc;/o/g ; s/&ecirc;/e/g' $page1_tv > $page2_tv
    # saut de ligne avant chaque heure de debut de programme
    awk  'gsub("class=-heure->","\n\nheure=") {print($0)}' $page2_tv >> $page_tv

    # Envoi pour traitement avec macneto_process
    # °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
    macneto_process $page_tv
    done
done
 
macneto_process
Bloc de code:
#!/bin/bash
# macneto_process

# -------------------------------------------------------------------------
# ----    Programmation avec recherche des horaires sur internet ----------
# -----------   sous programme de traitement des pages web    -------------
# -------------------------------------------------------------------------

# Constantes globales
# °°°°°°°°°°°°°°°°°°°
line=($( sed -n "1 p" $1))
jour=${line[3]} ;tv=${line[5]} ; programtv=${line[7]} 
user=$(whoami)

# fichier pour stocker temporairement les resultats des recherches
cronfile="/Users/$user/Movies/.enregistrements/crontable/cronfile"

# mois courant , jour du mois , annee actuelle
mm=$(date '+%m' ); jj=$(date '+%d') ; yy=$(date '+%y')

# traitement avec awk
# °°°°°°°°°°°°°°°°°°°

# on remplace les - par des espaces
program="${programtv//-/ }"

liste_horaire=($(awk '
BEGIN {reg_heure="[0-9]+:[0-9]+"; reg_duree="[0-9]+\ mn|[0-9]+h[0-9]+";}
       
       # recherche de l_heure et du programme 
       $0~/heure=/ &&  $0~/'"$program"'/ {coco=match($1 ,reg_heure)  
       if (coco != 0 ) 
       {dd=RSTART ; len=RLENGTH; heure = substr($1,dd,len);
       idx=index(heure,":")
       hh=substr(heure,1,idx-1) ; mn=substr(heure,idx+1,length(heure))}}
       
       # recherche de la duree et du programme 
       $0~/<\/em><\/p><\/li>/ $0~/'"$program"'/ {coco=match($0 ,reg_duree)  
       if (coco != 0 ) 
       {duree = substr($0,RSTART,RLENGTH);
        idx=index(duree, "h")
        if (idx == 0 )
            {idx=index(duree,"mn") ; dd=substr(duree,1,idx-1)*1 }
        else
            {dd=60*substr(duree,1,idx-1)+1*substr(duree,idx+1,length(duree))}
        
        printf("%02d-%02d-%d\n",mn,hh,dd)}
                    }' $1))

# test prophylactique, le program est diffuse ce jour ou pas
if [ -z "${liste_horaire[0]}" ]; then
    echo " le programme= $programtv  n'est pas diffusé aujourdh_hui= $jj/$mm "
    exit 0
fi

# prise en compte d_un intervalle securité de 5 minutes au jour j
# °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
k=0
for item in ${liste_horaire[@]}; do
    it=(${item//-/ }) ; mn=${it[0]} ; hh=${it[1]}; duree=${it[2]}
    
    # conversion de l_horaire en secondes
    dd="$mn:$hh:$jj:$mm:$yy"
    seconds=$(date -j -f '%M:%H:%d:%m:%y' $dd "+%s")
    
    # soustraction d_un intervalle de securite de 5 minutes
    secs=$((seconds-300+86400*jour))
    
    # conversion en minutes
    mins=$((secs/60))
    
    # duree augmentee de 15 minutes= 3 coupures pub
    duree=$((duree+15))
    
    # enregistrement dans la cronfile
    echo "$programtv"_"$mins $duree $tv" >> $cronfile
    echo "$programtv"_"$mins $duree $tv"
done


---------- Nouveau message ajouté à 23h46 ---------- Le message précédent a été envoyé à 23h44 ----------

macneto_update
Bloc de code:
#!/bin/bash
# macneto_update
# -------------------------------------------------------------------------
# ----    Programmation avec recherche des horaires sur internet ----------
# -------------------------------------------------------------------------

# Constantes globales
# *******************
user=$(whoami)
regex='([a-z0-9 .,;-_]+)\_([0-9]+)'
regpr='([a-z0-9 .,;-_]+)'

# mois courant , jour du mois , annee actuelle
date_actuelle=$(date '+%s') ; date_actuelle=$((date_actuelle/60))

# crontab et cronfile vers fichiers tv_programs
# *********************************************
rtsp_adsl="/Users/$user/bin/zzzmacneto_dos/rtsp_adsl"
crontable="/Users/$user/Movies/.enregistrements/crontable/"
cronfile=$crontable"cronfile"
recs="/Users/$user/Movies/.enregistrements/rec_files/"
crontab_old=$crontable"crontab_old" 
crontab_new=$crontable"crontab_new"
crontab_temp=$crontable"crontab_temp"
crontab_diff=$crontable"crontab_diff"
cronfile_temp=$crontable"cronfile_temp"
crontab -l > $crontable"crontab_old"

# recuperation des programmes issus de la crontab
awk 'BEGIN { reg_program="[a-z0-9 .,;-_]+"}
     $7 ~ reg_program {print $7}' $crontab_old > $crontab_temp
     
awk 'BEGIN { reg_program="[a-z0-9 .,;-_]+"}
     $0 !~ reg_program {print $0}' $crontab_old > $crontab_new     

# recuperation des programmes issus de la cronfile
awk '{print $1}' $cronfile > $cronfile_temp
     
# comparaison des deux fichiers avec diff
diff -n -bB $crontab_temp $cronfile_temp > $crontab_diff

# creation des fichiers de consigne pour les nouveaux programmes
nb_lin=($(wc -l $crontab_diff))

for (( k=1; k <= $nb_lin ; k++ )); do
program_name=$(sed -n "$k p" $crontab_diff)

    # on ne traite que les lignes correspondant a un nom de programme
    if [[ $program_name =~ $regex ]] ; then
    duree=$(awk '$0 ~ /'"$program_name"'/ {print($2)} ' $cronfile)
    #echo "duree=$duree"
    chaintv=$(awk '$0 ~ /'"$program_name"'/ {print($3)} ' $cronfile)
    #echo "chaintv=$chaintv"
    rtsp=$(awk '$0 ~ /'"$chaintv"'/ {print($3)} ' $rtsp_adsl)
    #echo "rtsp=$rtsp"
    
    fichier=$recs$program_name
    echo "$program_name" > $fichier
    echo "$rtsp" >> $fichier
    echo "ts" >> $fichier
    echo "$duree" >> $fichier
    echo "$chaintv" >> $fichier 
    fi
done

echo ""
echo ""
echo "_______________________________________________________________"
echo " Traiment final - mise a jour de la crontab        ------------"
echo "_______________________________________________________________"

# mise a jour de la crontab
# *************************

cat $crontab_diff >> $crontab_temp
nb_lin=($(wc -l $crontab_temp))

for (( k=1; k <= $nb_lin ; k++ )); do
program_name=$(sed -n "$k p" $crontab_temp)

    # on ne traite que les lignes correspondant a un nom de programme
    if [[ $program_name =~ $regex ]] ; then
    minutes=${BASH_REMATCH[2]}
        
        # On elimine les enregistrement des passes
        if (( $minutes > $date_actuelle )); then
        seconds=$((minutes*60))
        ladate=$(date -r $seconds '+%M:%H:%d:%m')
        echo "$ladate $program_name" | awk '
        {split($1,date,":")
        commande="/Users/mt/bin/vlc_macneto"
        printf("%02d %02d %02d %02d * %s %s\n",date[1],date[2],date[3],date[4],commande,$2)}' >> $crontab_new
        fi
    fi
done
     
# contenu de la nouvelle crontab
awk '{printf("%-4d %s\n",NR,$0)}' $crontab_new

crontab $crontab_new
La suite concernant plutôt la vidéo, elle sera placée dans le forum du même nom : VIDEO