# Mac-nétoscope



## mtcubix (11 Novembre 2010)

*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


 problèmes liés aux logiciels : son absent par exemple dans des flux .mp4
 problèmes liés à la chaine TV : enregistrements tronqués, dû au non respect 
des horaires de diffusion.
 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.


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



--------------------------> à suivre


----------



## ntx (11 Novembre 2010)

mtcubix a dit:


> [*] 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.  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.


----------



## mtcubix (11 Novembre 2010)

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.


----------



## ntx (11 Novembre 2010)

mtcubix a dit:


> 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.


----------



## mtcubix (11 Novembre 2010)

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 
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


----------



## mtcubix (12 Novembre 2010)

* 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


----------



## Le docteur (13 Novembre 2010)

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...


----------



## mtcubix (14 Novembre 2010)

* 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 :


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


```
#! /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.
 On ajoute le symbole * & * à la fin de la commande précédente  afin de "reprendre la main" sur le système
 On demande ensuite au système de "dormir" pendant le temps nécessaire à l'enregistrement
 Puis, on "tue" le process  vlc.
 
*   script Vlc_recorder *


```
#! /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*


----------



## mtcubix (15 Novembre 2010)

mtcubix a dit:


> *programmer des événements avec crontab *
> 
> la structure de la crontab est la suivante :
> 
> ...



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


----------



## mtcubix (19 Novembre 2010)

* 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.


```
#! /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.


```
#! /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

```
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


----------



## mtcubix (27 Novembre 2010)

* 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.


```
#!/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


```
/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


----------



## mtcubix (5 Décembre 2010)

* 5- Programmation ...programme macnetsocope *

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


 * Composition du programme *
 * 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
 * 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
 * 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
 * macneto_collect *
Script de collecte des données
 * macneto_process *
script de traitement des données collectées
 * macneto_update *
mise à jour de la crontab avec prise en compte des données nouvelles

 * Procédure *
 Créer un dossier ~/bin
 Copier les scripts ci-dessous (avec les mêms noms) et les placer dans le dossier ~/bin
 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*

```
#!/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*

```
#!/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*

```
#!/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*

```
#!/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
```


----------



## mtcubix (5 Décembre 2010)

* macneto_process*

```
#!/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*

```
#!/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 *


----------

