Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
mythtv [Le 07/07/2009, 19:26] 213.95.41.13 |
mythtv [Le 01/09/2022, 00:00] (Version actuelle) moths-art Passage de http à https sur les liens externes (détecté et corrigé via le bot wiki-corrector (https://forum.ubuntu-fr.org/viewtopic.php?id=2067892) |
||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
- | {{tag>Hardy vidéo audio multimédia télévision réseau media_center BROUILLON}} | + | {{tag>media_center tnt carte_tv}} |
+ | ====== MythTV ====== | ||
- | ---- | + | MythTV est un logiciel d'enregistrement numérique (télévision analogique, numérique, WebTV, etc.) extensible vers une station multimédia très complète via un système d'extensions (gestionnaire de photos, de vidéos, de musiques, lecture //DVD// & //Blu-ray disk//, navigation sur le web, etc.). |
+ | {{:mythtv:frontal_mythtv.png?320}} {{:mythtv:frontal_mythtv_programme.png?320}} | ||
- | ====== Mythtv ====== | + | {{:mythtv:frontal_mythtv_enregistrements.png?320}} {{:mythtv:frontal_mythtv_video.png?320}} |
+ | Son architecture basée sur un (ou plusieurs) //backend(s)// et un (ou plusieurs) //frontend(s)// (architecture serveur/client) vous permettra d'accéder à tous vos enregistrements et à la télévision en direct depuis n'importe quel ordinateur de votre réseau. Les enregistrements, musiques et films, sont également accessibles via une interface web ou via le protocole [[https://fr.wikipedia.org/wiki/UPNP|UPnP]]. | ||
+ | ===== Installation ===== | ||
+ | MythTV peut être installé sur n'importe quelle version d'Ubuntu en [[/tutoriel/comment_installer_un_paquet|installant le paquet]] [[apt>mythtv]] | ||
- | MYTHTV est une suite de logiciels de type centre multimédia qui permet initialement de voir et d'enregistrer la télévision. Elle permet également de voir des Dvd(r), des Divx(r), des photos, d'écouter des CD-audio, des mp3(r), de récupérer rapidement les informations (actualité internet, météo etc...) à l'aide d'un clavier, joystick ou d'une télécommande. | + | ===== Configuration ===== |
+ | FIXME | ||
+ | \\ | ||
+ | Lancer le centre de contrôle Mythbuntu (Système → Administration → Centre de contrôle Mythbuntu), il vous guidera dans le processus d'installation et de configuration de MythTV. | ||
+ | ==== Sur Ubuntu Server ==== | ||
+ | En Anglais : https://help.ubuntu.com/community/MythTV/Install/Server/Backend | ||
- | ===== Différentes solutions ===== | + | ===== Voir aussi ===== |
- | + | * [[https://www.mythtv.org/|Site officiel]] | |
- | Pour disposer de cette suite logicielle multimedia, vous pouvez : | + | * [[http://mythtv-fr.org/|Communauté francophone des utilisateurs de MythTV]] |
- | + | ||
- | - Installer uniquement le logiciel **Mythtv** | + | |
- | + | ||
- | - Installer simplement des paquets supplémentaires dans votre installation ubuntu pour la transformer, c'est **Mythbuntu**. | + | |
- | + | ||
- | - Faire une installation complète d'**Ubuntu optimisée Mythtv**. | + | |
- | + | ||
- | + | ||
- | + | ||
- | ===== Installations ===== | + | |
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | ==== Mythtv ==== | + | |
- | + | ||
- | + | ||
- | Il suffit d'installer le paquet [[apt://mythtv]] pour la partie cliente et [[apt://ubuntu-mythtv-frontend]] pour la partie serveur. Pour la configuration graphique installez aussi le paquet [[apt://mythbuntu-control-centre]] | + | |
- | + | ||
- | + | ||
- | ==== Mythtv + Ubuntu = Mythbuntu ==== | + | |
- | + | ||
- | Il existe de nombreuses versions de Ubuntu : Ubuntu, Kubuntu, Xubuntu, Edubuntu et ... Mythbuntu. Cette version est une solution gnu-linux spécialement développée pour Ubuntu permettant de transformer **facilement** son ordinateur en enregistreur de salon. | + | |
- | + | ||
- | + | ||
- | Il suffit d'installer le paquet [[apt://mythbuntu-desktop]], **attention** ce paquet transforme complètement l'apparence de gnome en un très élégant enregistreur. | + | |
- | + | ||
- | L'installation ne devrait pas poser de problème, veuillez cependant à enregistrer votre mot de passe d'accès qui sera configuré. | + | |
- | + | ||
- | Pour plus de détails voir [[http://mythtv-fr.tuxfamily.org/wiki/mythbuntu_pas_a_pas_sur_ubuntu]] | + | |
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | ==== Installation ubuntu optimisée Mythtv ==== | + | |
- | + | ||
- | >Guide d'installation d'un serveur-client avec quelques problèmes et leurs solutions. | + | |
- | + | ||
- | >Pour les puristes je mettrai le signe (!) pour ce qu'il n'est pas recommandé de faire. | + | |
- | + | ||
- | === Partitions (système) === | + | |
- | Lors de l'installation de Ubuntu, la principale question est le partitionnement des disques. | + | |
- | + | ||
- | Pour ma part, je me simplifie la vie en voyant large. | + | |
- | + | ||
- | ^taille^nom^commentaire^ | + | |
- | |10 Go| / (dit "racine")|il est possible d'en mettre largement moins| | + | |
- | |100 Go| /home| (en cas de problème, cela permet de garder ses paramètres)| | + | |
- | |2 Go| swap| (à partir de 1Go mettre la taille de la ram ou ne pas en mettre(!) )| | + | |
- | + | ||
- | **Activer les pilotes** pour NVIDIA ou ATI : cocher une case dans | + | |
- | Menu->Système->Administration->Pilote de périphériques | + | |
- | + | ||
- | Redémarrer et... attention au plantage. Plus Ubuntu évolue moins il y en a, mais au besoin noter cette ligne de commande : | + | |
- | + | ||
- | sudo dpkg-reconfigure xserver-xorg | + | |
- | ou | + | |
- | sudo dpkg-reconfigure -phigh xserver-xorg | + | |
- | + | ||
- | **Activer l'auto-login** (!) : Menu->SystèmeAdministration->Fenêtre de connexion -> onglet [Sécurité] | + | |
- | + | ||
- | + | ||
- | === Packages (initiaux) === | + | |
- | + | ||
- | ^commandes^commentaires^ | + | |
- | |sudo apt-get install| pour installer les packets (pour sélectionner appuyer en même temps sur Ctrl sur firefox) | | + | |
- | |mplayer gxine vlc libdvdread3 ogle|lecteur vidéo et codec| | + | |
- | |flashplugin-nonfree |lecteur video (flash)| | + | |
- | |tvtime|permet de tester la carte TV (existe aussi zaptv)| | + | |
- | |startupmanager| permet de modifier le démarrage de l'ordinateur (multi-boot, affichage de log etc...)| | + | |
- | |lirc| pour la télécommande ("creative Livedrive sequencer" pour utiliser la télécommande avec la carte son Audigy)| | + | |
- | |filezilla|client ftp (ça peut toujours servir)| | + | |
- | |samba |partage réseau pour Windows| | + | |
- | |openssh-server |indispensable pour utiliser putty| | + | |
- | |synergy |trop bien si vous avez plus d'un PC côte à côte (un clavier/souris pour plusieurs PC) (fonctionne aussi avec tous les Windows, Vista inclus)| | + | |
- | |nvidia-settings |pour configurer sa carte vidéo NVIDIA (exit aussi "envy" pour ATI et NVIDIA)| | + | |
- | |dmraid|si vous utilisez du raid| | + | |
- | |gparted |pour partitionner ses disques (si vous en avez plus d'un)| | + | |
- | + | ||
- | + | ||
- | + | ||
- | === Souris & Clavier bluetooth === | + | |
- | Pour l'utilisation de clavier & souris en bluetooth. | + | |
- | + | ||
- | Appuyer sur le petit bouton et taper la commande (pour chacun) : | + | |
- | + | ||
- | sudo hidd --connect AA:BB:AA:BB:AA:BB | + | |
- | + | ||
- | ( AA:BB:... étant l'adresse indiqué au dos de l'appareil) | + | |
- | + | ||
- | Après je vous recommande le GUI (l'Interface Utilisateur Graphique). | + | |
- | Menu->Système->Préférences->Bluetooth | + | |
- | + | ||
- | + | ||
- | + | ||
- | === Ecran (carte NVIDIA) === | + | |
- | Rechercher les spécifications techniques (balayage horizontal et vertical) sur le site web du constructeur de l'écran. Puis modifier le fichier en conséquence. | + | |
- | + | ||
- | sudo gedit /etc/X11/xorg.conf | + | |
- | + | ||
- | Section "Monitor" | + | |
- | Identifier "Generic Monitor" | + | |
- | HorizSync 31-81 | + | |
- | VertRefresh 56-76 | + | |
- | Option "DPMS" | + | |
- | EndSection | + | |
- | + | ||
- | (Option "DPMS" sert à éteindre l'écran lorsqu'il est inactif : je ferais bien de l'enlever ;-) ) | + | |
- | + | ||
- | Ensuite utiliser le GUI (beaucoup plus simple, mais maintenant vous pouvez cliquer sur Apply et quitter) | + | |
- | + | ||
- | sudo nvidia-settings | + | |
- | + | ||
- | Préférer cette ligne de commande à Menu->Système->Administration->NVIDIA X Server Settings, car dans ce cas il n'y aura pas de soucis pour enregistrer les modifications. | + | |
- | + | ||
- | (Pour les cartes NVIDIA le mode "TwinView" est recommandé pour le multi-écran) | + | |
- | + | ||
- | + | ||
- | === Disques durs === | + | |
- | + | ||
- | Pour plusieurs disques durs : | + | |
- | + | ||
- | Utiliser gparted pour les identifier et les modifier (!!!). Menu->Système->Administration->Editeur de partition | + | |
- | + | ||
- | Utiliser la commande mount...profiter...redémarrer... et c'est comme si rien n'avait été fait. | + | |
- | Donc à moins que ce ne soit temporaire modifier le fichier fstab: | + | |
- | sudo gedit /etc/fstab | + | |
- | + | ||
- | et ajouter les lignes nécessaires : | + | |
- | /dev/sdc5 /media/MP3 ext3 relatime 0 0 | + | |
- | /dev/mapper/sil_agaiabbifech1 /media/WXP ntfs uid=1000 0 0 | + | |
- | UUID=cdd75cda-8147-41c6-923a-32dac89083d8 /media/FILMS ext3 relatime 0 0 | + | |
- | + | ||
- | + | ||
- | Explications pour chaque ligne : | + | |
- | + | ||
- | 1- grâce à gparted j'identifie le disque comme /dev/sdc5, je le monte/place sur /media/MP3 (que j'ai préalablement créé avec un petit "sudo mkdir /media/MP3"), de plus il est de type ext3, pour le reste je ne sais pas encore mais ça fonctionne. | + | |
- | + | ||
- | 2- même chose sauf que le disque est en raid (d'où le nom plus long) et le type est NTFS (pour Windows) (petit "sudo mkdir /media/WXP"). | + | |
- | + | ||
- | 3- version moderne avec le UUID (genre "identifiant unique" pour disque dur, dans les cas précédents si on rajoute/déplace un disque/partition tout peut changer de nom /dev/sdc6), (type ext3 et petit "sudo mkdir /media/FILMS") | + | |
- | + | ||
- | Pour identifier les UUID : | + | |
- | sudo blkid | + | |
- | sudo vol_id -u /dev/sda1 | + | |
- | + | ||
- | Il est possible de renseigner les différents emplacements dans mythtv en les séparant par ":" mais cela ne fonctionne pas toujours correctement. | + | |
- | Avant j'utilisais dans le fichier fstab (ce qui n'accélère pas le démarrage de l'ordinateur) : | + | |
- | /media/FILMS/CLIPS /media/MP3/CLIPS none bind 0 0 | + | |
- | + | ||
- | J'ai évolué et j'utilise un lien maintenant. Taper directement en ligne de commande (en cas de problème de permission ajouter "sudo" devant) : | + | |
- | ln -s /media/MP3/CLIPS /media/FILMS/CLIPS | + | |
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | === MYTHTV === | + | |
- | + | ||
- | ^commandes^commentaires^ | + | |
- | |sudo apt-get install| pour installer les packets (pour sélectionner appuyer en même temps sur Ctrl sur firefox) | | + | |
- | |ubuntu-mythtv-frontend mythtv | les 2 packages principaux (installeront également mysql et bien d'autres)| | + | |
- | |mysql-query-browser| pour ceux qui s'y connaissent en sql| | + | |
- | |mythvideo <del>mythmovies</del> | voir et gérer des vidéos| | + | |
- | |mythweather| la météo| | + | |
- | |mythweb|Interface web pour contrôler presque tout mythtv| | + | |
- | |mythstream|écouter et voir du streming| | + | |
- | |mythnews|rapide pour avoir des informations sur l'actualité| | + | |
- | |mythmusic| gérer et écouter ses MP3| | + | |
- | |mythgame| jouer| | + | |
- | |mythgallery|voir ses photos| | + | |
- | |mythbrowser|navigateur internet optimisé télécommande| | + | |
- | |lame gstreamer0.10-plugins-bad gstreamer0.10-ffmpeg gstreamer0.10-plugins-good gstreamer0.10-plugins-ugly| différents codec| | + | |
- | |<del>mythplugins</del>|pour téléphoner (je ne l'utilise pas ... encore)| | + | |
- | + | ||
- | Après leurs installations, ajouter vous au groupe mythtv et redémarrer puis lan cer : Menu?Système?Administration?MythTV Backend Setup | + | |
- | + | ||
- | Renseigner les paramètres (les mêmes que ceux mis lors de l'installation des packages) | + | |
- | + | ||
- | Puis : Menu->Son et vidéo->MythTV Frontend | + | |
- | + | ||
- | + | ||
- | == En cas de problèmes, saisir les lignes de commandes suivantes == | + | |
- | + | ||
- | sudo dpkg-reconfigure mythtv-common | + | |
- | sudo dpkg-reconfigure mythtv-database | + | |
- | + | ||
- | Pour ceux qui apprécient les jolies animations en écoutant de la musique je recommande (par ordre descroissant) les plugins suivants : | + | |
- | + | ||
- | sudo apt-get install libvisual-0.4-plugins synaesthesia libvisual-projectm | + | |
- | + | ||
- | libvisual-projectm doit être très beau mais personnellement, il n'a jamais fonctionné et a même réussi à fermer mythtv. | + | |
- | + | ||
- | Mes préférés : Goom; BumpScope; LibVisual-jakdaw; LibVisual-jess; MonoScope; LibVisual-lv_gltest; LibVisual-infinite; LibVisual-corona; Synaesthesia; | + | |
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | === Télécommande (spécificité pour Audigy Platinum eX) === | + | |
- | + | ||
- | Bon nombre de télécommandes fonctionnent toutes seules et le package suivant vous y aidera. | + | |
- | + | ||
- | sudo apt-get install mythbuntu-lirc-generator | + | |
- | + | ||
- | Ce n'est pas mon cas avec la carte son Audigy Platinum eX, pour la faire fonctionner je dois modifier certains fichiers : | + | |
- | + | ||
- | <del>sudo gedit /etc/lirc/hardware.conf | + | |
- | + | ||
- | Et ajouter la ligne suivante : | + | |
- | DEVICE="/dev/snd/midiC0D1"</del> | + | |
- | + | ||
- | Dans le fichier /usr/share/lirc/remotes/creative/lircd.conf.livedrive | + | |
- | changer la ligne : | + | |
- | name rm1000 --> name Creative_RM900 | + | |
- | + | ||
- | sudo gedit /etc/modprobe.d/alsa-base | + | |
- | Ajouter : | + | |
- | options snd-emu10k1 index=0 enable_ir=1 | + | |
- | + | ||
- | Pour la RM900 (comme il l'appelle) | + | |
- | modifier le fichier suivant : | + | |
- | sudo gedit /etc/lirc/lircd.conf | + | |
- | Par celui ci: {{lircd.conf:lircd.conf.txt|}} | + | |
- | + | ||
- | Par défaut les paramètres de lirc sont dans $HOME/.lircrc mais mythtv se rajoute un fichier complémentaire, dans mon cas je n'utilise que celui de mythtv et j'ajoute un lien vers celui-ci: | + | |
- | rm $HOME/.lircrc | + | |
- | ln -s $HOME/.mythtv/lircrc $HOME/.lircrc | + | |
- | + | ||
- | + | ||
- | == En cas de problème == | + | |
- | + | ||
- | Pour tester la télécommande : irw (appuyer des touches de la télécommande) | + | |
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | Pour lancer (dans mon cas) : sudo lircd --driver=livedrive_midi --device=/dev | + | |
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | === Menus === | + | |
- | + | ||
- | Les menus se situent dans /usr/share/mythtv. Ils sont écrits en xml. | + | |
- | + | ||
- | Le principal est "mainmenu.xml" mais il en existe bien d'autres comme videomenu.xml, info_munu.xml etc... | + | |
- | + | ||
- | //En éditant le premier on remarque un menu caché le Shutdown ("Arrêt").// | + | |
- | + | ||
- | Il est donc possible possible de modifier le texte et l'image associés ainsi que l'action qu'ils effectuent. | + | |
- | Exemple : | + | |
- | ^code^commentaire^ | + | |
- | |<button>| flag de début| | + | |
- | | <type>VCD_PLAY</type>|type d'image| | + | |
- | | <text>Play VCD</text>|texte par défaut| | + | |
- | | <text lang="FR">Lecture VCD</text>|texte pour la langue française| | + | |
- | | <action>VCD_PLAY</action>|action| | + | |
- | |</button>|flag de fin| | + | |
- | + | ||
- | + | ||
- | //Je recommande un backup avant de les modifier, mais une réinstallation du package "mythtv",après leurs suppression, permet de les récupérer sans avoir besoin de tout réinstaller.// | + | |
- | + | ||
- | + | ||
- | Petite astuce pour lancer un programme extérieur : | + | |
- | ^code^commentaire^ | + | |
- | |<button>| flag de début| | + | |
- | | <type>MUSIC_SCAN</type>|type d'image| | + | |
- | | <text>My program</text>|texte par défaut| | + | |
- | | <text lang="FR">Mon programme</text>|texte pour la langue française| | + | |
- | | <action>**EXEC //monprogramme//**</action>|action| | + | |
- | |</button>|flag de fin| | + | |
- | + | ||
- | //(voir exemple dans :Intégration dans le menu)// | + | |
- | + | ||
- | === MYTHVIDEO === | + | |
- | == Lire un DVD protégé == | + | |
- | (c'est malheureux de ne pas pouvoir lire un DVD que l'on a acheté en toute légalité) | + | |
- | sudo apt-get install libdvdcss2 | + | |
- | + | ||
- | == Désactiver le lancement automatique à l'insertion d'un DVD ou CDrom == | + | |
- | + | ||
- | Lancer Nautilus : | + | |
- | + | ||
- | Edition-> Préférences -> onglets : Supports ... et adapter. | + | |
- | + | ||
- | + | ||
- | == Réduire la taille des sous-titres == | + | |
- | Dans Mythtv : Paramètres->Paramètres médias->Paramètres Vidéos->Paramètres du lecteur | + | |
- | + | ||
- | Lecteur : | + | |
- | + | ||
- | mplayer -fs -zoom -quiet -vo xv -subfont-text-scale 2 %s | + | |
- | + | ||
- | Internal : | + | |
- | + | ||
- | mplayer vcd:// -cdrom-device %d -fs -zoom -vo xv | + | |
- | + | ||
- | + | ||
- | == Reconnaissance des films (affiches, résumé et casting) == | + | |
- | Pour l'avoir en français, changer les scripts dans Paramètres->Paramètres médias->Paramètres Vidéos->Paramètres globaux | + | |
- | + | ||
- | /usr/share/mythtv/mythvideo/scripts/imdb.pl -M tv=no;video=no | + | |
- | -> | + | |
- | /usr/share/mythtv/mythvideo/scripts/allocine.pl –M | + | |
- | + | ||
- | /usr/share/mythtv/mythvideo/scripts/imdb.pl –P | + | |
- | -> | + | |
- | /usr/share/mythtv/mythvideo/scripts/allocine.pl -P | + | |
- | + | ||
- | /usr/share/mythtv/mythvideo/scripts/imdb.pl –D | + | |
- | -> | + | |
- | /usr/share/mythtv/mythvideo/scripts/allocine.pl –D | + | |
- | + | ||
- | + | ||
- | == Petit bug la fenêtre IMDB reste affichée == | + | |
- | + | ||
- | find /usr/share/mythtv/themes/ -name "video-ui.xml" -print | xargs sudo sed -i 's/enterimdb/entertmdb/g' | + | |
- | + | ||
- | == Petit bug dans allocine.pl lorsqu'il ne trouve pas le film == | + | |
- | + | ||
- | sudo gedit /usr/share/mythtv/mythvideo/scripts/allocine.pl | + | |
- | + | ||
- | + | ||
- | En fait le script n'est plus tenu à jour. | + | |
- | Remplacer le fichier par ceci: | + | |
- | #!/usr/bin/perl -w | + | |
- | + | ||
- | # | + | |
- | # This perl script is intended to perform movie data lookups in french based on | + | |
- | # the www.allocine.fr website | + | |
- | # | + | |
- | # For more information on MythVideo's external movie lookup mechanism, see | + | |
- | # the README file in this directory. | + | |
- | # | + | |
- | # Author: Xavier Hervy (maxpower44 AT tiscali DOT fr) | + | |
- | # | + | |
- | + | ||
- | # changes: | + | |
- | # 9-10-2006: Anduin Withers | + | |
- | # Changed output to utf8 | + | |
- | # Made -u option a dummy for this release, it is deprecated and will be | + | |
- | # removed | + | |
- | + | ||
- | use LWP::Simple; # libwww-perl providing simple HTML get actions | + | |
- | use HTML::Entities; | + | |
- | use URI::Escape; | + | |
- | + | ||
- | use vars qw($opt_h $opt_r $opt_d $opt_i $opt_v $opt_D $opt_M $opt_P $opt_originaltitle $opt_casting $opt_u_dummy); | + | |
- | use Getopt::Long; | + | |
- | + | ||
- | $title = "Allocine Query"; | + | |
- | $version = "v2.00"; | + | |
- | $author = "Xavier Hervy"; | + | |
- | + | ||
- | binmode(STDOUT, ":utf8"); | + | |
- | + | ||
- | # display usage | + | |
- | sub usage { | + | |
- | print "usage: $0 -hviocMPD [parameters]\n"; | + | |
- | print " -h, --help help\n"; | + | |
- | print " -v, --version display version\n"; | + | |
- | print " -i, --info display info\n"; | + | |
- | print " -o, --originaltitle concatenate title and original title\n"; | + | |
- | print " -c, --casting with -D option, grap the complete actor list (much slower)\n"; | + | |
- | print "\n"; | + | |
- | print " -M <query>, --movie query> get movie list\n"; | + | |
- | print " -D <movieid>, --data <movieid> get movie data\n"; | + | |
- | print " -P <movieid>, --poster <movieid> get movie poster\n"; | + | |
- | exit(-1); | + | |
- | } | + | |
- | + | ||
- | # display 1-line of info that describes the version of the program | + | |
- | sub version { | + | |
- | print "$title ($version) by $author\n" | + | |
- | } | + | |
- | + | ||
- | # display 1-line of info that can describe the type of query used | + | |
- | sub info { | + | |
- | print "Performs queries using the www.allocine.fr website.\n"; | + | |
- | } | + | |
- | + | ||
- | # display detailed help | + | |
- | sub help { | + | |
- | version(); | + | |
- | info(); | + | |
- | usage(); | + | |
- | } | + | |
- | + | ||
- | # returns text within 'data' between 'beg' and 'end' matching strings | + | |
- | sub parseBetween { | + | |
- | my ($data, $beg, $end)=@_; # grab parameters | + | |
- | + | ||
- | my $ldata = lc($data); | + | |
- | my $start = index($ldata, lc($beg)) + length($beg); | + | |
- | my $finish = index($ldata, lc($end), $start); | + | |
- | + | ||
- | if ($start != (length($beg) -1) && $finish != -1) { | + | |
- | my $result = substr($data, $start, $finish - $start); | + | |
- | # dont use decode entities &npsp; => spécial characters bug in html::entities ? | + | |
- | #decode_entities($result); | + | |
- | return removenbsp($result); | + | |
- | } | + | |
- | return ""; | + | |
- | } | + | |
- | + | ||
- | # use to replace by " " (instead of decode_entities) | + | |
- | sub removenbsp { | + | |
- | my ($data)=@_; # grab parameters | + | |
- | + | ||
- | my $ldata = lc($data); | + | |
- | my $start = index($ldata, " "); | + | |
- | while ($start != -1){ | + | |
- | $data = substr($data, 0, $start). " " .substr($data, $start+6, length($data)); | + | |
- | $ldata = lc($data); | + | |
- | $start = index($ldata, " "); | + | |
- | } | + | |
- | return $data; | + | |
- | } | + | |
- | + | ||
- | + | ||
- | # returns text within 'data' without tag | + | |
- | sub removeTag { | + | |
- | my ($data)=@_; # grab parameters | + | |
- | my $ldata = lc($data); | + | |
- | my $start = index($ldata, "<"); | + | |
- | my $finish = index($ldata, ">", $start)+1; | + | |
- | while ($start != -1 && $finish != -1){ | + | |
- | $data = substr($data, 0, $start).substr($data, $finish, length($data)); | + | |
- | $ldata = lc($data); | + | |
- | $start = index($ldata, "<"); | + | |
- | $finish = index($ldata, ">", $start)+1; | + | |
- | } | + | |
- | return $data; | + | |
- | } | + | |
- | + | ||
- | # get Movie Data | + | |
- | sub getMovieData { | + | |
- | my ($movieid)=@_; # grab movieid parameter | + | |
- | if (defined $opt_d) { printf("# looking for movie id: '%s'\n", $movieid);} | + | |
- | + | ||
- | # get the search results page | + | |
- | my $request = "http://www.allocine.fr/film/fichefilm_gen_cfilm=" . $movieid . ".html"; | + | |
- | if (defined $opt_d) { printf("# request: '%s'\n", $request); } | + | |
- | my $response = get $request; | + | |
- | + | ||
- | # parse title and year | + | |
- | my $title = parseBetween($response, "<title>", "</title>"); | + | |
- | # remove the "- Allocin.*" suffix | + | |
- | $title =~ s{\s*-\s*AlloCin.*}{}; | + | |
- | my $original_title = parseBetween($response, ">Titre original : <i>","</i></h"); | + | |
- | $original_title = removeTag($original_title); | + | |
- | if (defined $opt_originaltitle){ | + | |
- | if ($original_title ne ""){ | + | |
- | $title = $title . " (" . $original_title . ")"; | + | |
- | } | + | |
- | } | + | |
- | + | ||
- | #print "titre = $title\n"; | + | |
- | $title = removeTag($title); | + | |
- | my $year = parseBetween($response,">Année de production : ","</h"); | + | |
- | + | ||
- | # parse director | + | |
- | my $director = parseBetween(parseBetween($response,"Réalisé par <","/a>"),">","<"); | + | |
- | $director = removeTag($director); | + | |
- | + | ||
- | # parse writer | + | |
- | # (Note: this takes the 'first' writer, may want to include others) | + | |
- | my $writer = parseBetween($response, ">Writing credits</b>", "</table>"); | + | |
- | $writer = parseBetween($writer, "/\">", "</"); | + | |
- | + | ||
- | # parse plot | + | |
- | my $plot = parseBetween($response,"<td valign=\"top\" style=\"padding:10 0 0 0\"><div align=\"justify\"><h4>","</h4></div></td>"); | + | |
- | $plot =~ s/\n//g; | + | |
- | $plot = removeTag($plot); | + | |
- | + | ||
- | # parse user rating | + | |
- | my $userrating; | + | |
- | my $rating = parseBetween($response,"Presse</a></h5></td><td","/></td></tr>"); | + | |
- | my $nbvote = 0; | + | |
- | my $sommevote = 0; | + | |
- | $rating = parseBetween($rating,"etoile_", "\" border="); | + | |
- | if (!($rating eq "")){ | + | |
- | $sommevote += $rating - 1; | + | |
- | $nbvote ++; | + | |
- | } | + | |
- | $rating = parseBetween($response,"Spectateurs</a></h5></td><td width=","/></td></tr>"); | + | |
- | $rating = parseBetween($rating,"etoile_", "\" border="); | + | |
- | if (!($rating eq "")){ | + | |
- | $sommevote += $rating - 1; | + | |
- | $nbvote ++; | + | |
- | } | + | |
- | if ($nbvote==0){$userrating=0}; | + | |
- | if ($nbvote==1){$userrating=$sommevote*2;}; | + | |
- | if ($nbvote==2){$userrating=$sommevote;}; | + | |
- | + | ||
- | + | ||
- | # parse rating | + | |
- | my $movierating = parseBetween($response,"Interdit aux moins de ","ans"); | + | |
- | if (!($movierating eq "")) | + | |
- | { $movierating = "Interdit aux moins de " . $movierating . "ans";} | + | |
- | else | + | |
- | { | + | |
- | $movierating = parseBetween($response,"Visible ","enfants"); | + | |
- | if (!($movierating eq "")){ $movierating = "Visible par des enfants";}; | + | |
- | } | + | |
- | + | ||
- | + | ||
- | # parse movie length | + | |
- | my $runtime = parseBetween($response,"Durée : ",". </h"); | + | |
- | my $heure; | + | |
- | my $minutes; | + | |
- | ($heure,$minutes)=($runtime=~/[^\d]*(\d+)[^\d]*(\d*)/); | + | |
- | if (!$heure){ $heure = 0; } | + | |
- | if (!$minutes){ | + | |
- | $runtime = $heure * 60; | + | |
- | }else{ | + | |
- | $runtime = $heure * 60 + $minutes; | + | |
- | } | + | |
- | + | ||
- | # parse cast | + | |
- | + | ||
- | my $cast = parseBetween($response, ">Avec ","</h"); | + | |
- | $cast = removeTag($cast); | + | |
- | if (defined $opt_casting){ | + | |
- | my $responsecasting = get "http://www.allocine.fr/film/casting_gen_cfilm=" . $movieid . ".html"; | + | |
- | my $fullcast = parseBetween($responsecasting, "Acteur(s)", "<table"); | + | |
- | my $oneactor; | + | |
- | $fullcast = parseBetween($fullcast,"style=\"background-color", "</table>"); | + | |
- | my @listactor = split("style=\"background-color", $fullcast); | + | |
- | my @cleanlistactor ; | + | |
- | for $oneactor (@listactor ) { | + | |
- | $oneactor = parseBetween($oneactor,"<h4>","</h4>"); | + | |
- | $oneactor = removeTag($oneactor ); | + | |
- | push(@cleanlistactor,$oneactor); | + | |
- | } | + | |
- | my $finalcast = join (", ",@cleanlistactor); | + | |
- | if ($finalcast ne "") {$cast = $finalcast;}; | + | |
- | } | + | |
- | + | ||
- | + | ||
- | #genres | + | |
- | my $genres = parseBetween($response,">Genre : ","</h"); | + | |
- | $genres = removeTag($genres); | + | |
- | + | ||
- | #countries | + | |
- | my $countries = parseBetween($response,">Film ",". </h"); | + | |
- | $countries = removeTag($countries); | + | |
- | + | ||
- | # output fields (these field names must match what MythVideo is looking for) | + | |
- | print "Title:$title\n"; | + | |
- | if (!(defined $opt_originaltitle)){ | + | |
- | print "OriginalTitle:$original_title\n"; | + | |
- | } | + | |
- | print "Year:$year\n"; | + | |
- | print "Director:$director\n"; | + | |
- | print "Plot:$plot\n"; | + | |
- | print "UserRating:$userrating\n"; | + | |
- | print "MovieRating:$movierating\n"; | + | |
- | print "Runtime:$runtime\n"; | + | |
- | print "Writers: $writer\n"; | + | |
- | print "Cast: $cast\n"; | + | |
- | print "Genres:$genres\n"; | + | |
- | print "Countries:$countries\n"; | + | |
- | } | + | |
- | + | ||
- | # dump Movie Poster | + | |
- | sub getMoviePoster { | + | |
- | my ($movieid)=@_; # grab movieid parameter | + | |
- | if (defined $opt_d) { printf("# looking for movie id: '%s'\n", $movieid);} | + | |
- | + | ||
- | # get the search results page | + | |
- | + | ||
- | my $request = "http://www.allocine.fr/film/galerie_gen_cfilm=" . $movieid . ".html"; | + | |
- | if (defined $opt_d) { printf("# request: '%s'\n", $request); } | + | |
- | my $response = get $request; | + | |
- | my $page=parseBetween($response,"&page=",".html\" class=\"link1\"><span class=\"text2\">>>"); | + | |
- | my @pages = split ("page=",$page); | + | |
- | $request = ""; | + | |
- | + | ||
- | my $uri = ""; | + | |
- | my $furi = ""; | + | |
- | my $first= 1; | + | |
- | for $page (@pages ) { | + | |
- | $request = $page; | + | |
- | + | ||
- | # | + | |
- | # get only the page number | + | |
- | # | + | |
- | $request = substr($request, 0, index($request, '.')); | + | |
- | + | ||
- | if (!($request eq "")) { | + | |
- | $request = "http://www.allocine.fr/film/galerie_gen_cfilm=" . $movieid . "&page=" . $request . ".html"; | + | |
- | $response = get $request; | + | |
- | + | ||
- | $uri = parseBetween($response,"<table style=\"padding:0 0 0 0\" border=\"0\" >","Ko\" />"); | + | |
- | $uri = parseBetween($uri ,"<img src=\"","\" border=\"0\" class=\"galerie\" "); | + | |
- | if ($first && ! ($uri eq "")) | + | |
- | { | + | |
- | $furi = $uri; | + | |
- | $first = 0; | + | |
- | } | + | |
- | + | ||
- | } | + | |
- | # | + | |
- | # stop when we have an poster... | + | |
- | # | + | |
- | last if (($uri =~ /affiche/) or ($uri =~ /_af/)) | + | |
- | } | + | |
- | + | ||
- | # if $uri =~ affiche or _af then get the first poster if exist | + | |
- | + | ||
- | if (($uri !~ /affiche/) or ($uri !~ /_af/)) | + | |
- | { | + | |
- | if ($first == 0) | + | |
- | { | + | |
- | $uri = $furi; | + | |
- | } | + | |
- | } | + | |
- | + | ||
- | # | + | |
- | # in case nothing was found fall back to the little poster... | + | |
- | # | + | |
- | if ($uri eq "") | + | |
- | { | + | |
- | $request = "http://www.allocine.fr/film/fichefilm_gen_cfilm=" . $movieid .".html"; | + | |
- | $response = get $request; | + | |
- | $response = parseBetween($response, "sousnav_separe_droite2.gif","sortie"); | + | |
- | $uri = parseBetween($response, "<img src=\"","\""); | + | |
- | + | ||
- | # | + | |
- | # in case no little poster was found get the small DVD poster | + | |
- | # if exists ! | + | |
- | # | + | |
- | if ($uri =~ /AffichetteAllocine/) | + | |
- | { | + | |
- | $request = "http://www.allocine.fr/film/fichefilm_gen_cfilm=" . $movieid .".html"; | + | |
- | $response = get $request; | + | |
- | $response = parseBetween($response, "Disponible en","Zone"); | + | |
- | $uri = parseBetween($response, "<img src=\"","\""); | + | |
- | return if ($uri eq ""); | + | |
- | } | + | |
- | } | + | |
- | + | ||
- | print "$uri\n"; | + | |
- | } | + | |
- | + | ||
- | # dump Movie list: 1 entry per line, each line as 'movieid:Movie Title' | + | |
- | sub getMovieList { | + | |
- | my ($filename, $options)=@_; # grab parameters | + | |
- | + | ||
- | # If we wanted to inspect the file for any reason we can do that now | + | |
- | + | ||
- | # | + | |
- | # Convert filename into a query string | + | |
- | # (use same rules that Metadata::guesTitle does) | + | |
- | my $query = $filename; | + | |
- | $query = uri_unescape($query); # in case it was escaped | + | |
- | # Strip off the file extension | + | |
- | if (rindex($query, '.') != -1) { | + | |
- | $query = substr($query, 0, rindex($query, '.')); | + | |
- | } | + | |
- | # Strip off anything following '(' - people use this for general comments | + | |
- | if (rindex($query, '(') != -1) { | + | |
- | $query = substr($query, 0, rindex($query, '(')); | + | |
- | } | + | |
- | # Strip off anything following '[' - people use this for general comments | + | |
- | if (rindex($query, '[') != -1) { | + | |
- | $query = substr($query, 0, rindex($query, '[')); | + | |
- | } | + | |
- | # Strip off anything following '-' - people use this for general comments | + | |
- | if (index($query, '-') != -1) { | + | |
- | $query = substr($query, 0, index($query, '-')); | + | |
- | } | + | |
- | + | ||
- | # IMDB searches do better if any trailing ,The is left off | + | |
- | $query =~ /(.*), The$/i; | + | |
- | if ($1) { $query = $1; } | + | |
- | + | ||
- | # prepare the url | + | |
- | $query = uri_escape($query); | + | |
- | if (!$options) { $options = "" ;} | + | |
- | if (defined $opt_d) { | + | |
- | printf("# query: '%s', options: '%s'\n", $query, $options); | + | |
- | } | + | |
- | my $count = 0; | + | |
- | my $typerecherche = 3; | + | |
- | + | ||
- | while (($typerecherche <=5) && ($count ==0)){ | + | |
- | # get the search results page | + | |
- | my $request = "http://www.allocine.fr/recherche/?rub=1&motcle=$query"; | + | |
- | if (defined $opt_d) { printf("# request: '%s'\n", $request); } | + | |
- | my $response = get $request; | + | |
- | + | ||
- | # | + | |
- | # don't try to invent if it doesn't exist | + | |
- | # | + | |
- | return if $response =~ /Recherche web sur AlloCiné/; | + | |
- | + | ||
- | # extract possible matches | + | |
- | # possible matches are grouped in several catagories: | + | |
- | # exact, partial, and approximate | + | |
- | my $exact_matches = $response; | + | |
- | # parse movie list from matches | + | |
- | my $beg = "<h4><a href=\"/film/fichefilm_gen_cfilm="; | + | |
- | my $end = "</a></h4>"; | + | |
- | + | ||
- | my @movies; | + | |
- | + | ||
- | my $data = $exact_matches; | + | |
- | if ($data eq "") { | + | |
- | if (defined $opt_d) { printf("# no results\n"); } | + | |
- | $typerecherche = $typerecherche +2 ; | + | |
- | }else{ | + | |
- | my $start = index($data, $beg); | + | |
- | my $finish = index($data, $end, $start); | + | |
- | + | ||
- | my $title; | + | |
- | while ($start != -1) { | + | |
- | $start += length($beg); | + | |
- | my $sub = substr($data, $start, $finish - $start); | + | |
- | my ($movienum, $moviename) = split(".html\" class=\"link1\">", $sub); | + | |
- | $title = removeTag($moviename); | + | |
- | $moviename = removeTag($moviename); | + | |
- | my ($movieyear)= $moviename =~/\((\d+)\)/; | + | |
- | if ($movieyear){$title = $title." (".$movieyear.")"; } | + | |
- | $moviename=$title ; | + | |
- | + | ||
- | # advance data to next movie | + | |
- | $data = substr($data, - (length($data) - $finish)); | + | |
- | $start = index($data, $beg); | + | |
- | $finish = index($data, $end, $start + 1); | + | |
- | + | ||
- | # add to array | + | |
- | $movies[$count++] = $movienum . ":" . $moviename; | + | |
- | } | + | |
- | + | ||
- | # display array of values | + | |
- | for $movie (@movies) { | + | |
- | print "$movie\n"; | + | |
- | } | + | |
- | } | + | |
- | } | + | |
- | } | + | |
- | + | ||
- | # | + | |
- | # Main Program | + | |
- | # | + | |
- | + | ||
- | # parse command line arguments | + | |
- | + | ||
- | GetOptions( "utf8" => \$opt_u_dummy, | + | |
- | "version" => \$opt_v, | + | |
- | "info" => \$opt_i, | + | |
- | "originaltitle" => \$opt_originaltitle, | + | |
- | "casting" => \$opt_casting, | + | |
- | "Data" => \$opt_D, | + | |
- | "Movie" => \$opt_M, | + | |
- | "Poster" => \$opt_P | + | |
- | ); | + | |
- | + | ||
- | + | ||
- | # print out info | + | |
- | if (defined $opt_v) { version(); exit 1; } | + | |
- | if (defined $opt_i) { info(); exit 1; } | + | |
- | + | ||
- | # print out usage if needed | + | |
- | if (defined $opt_h || $#ARGV<0) { help(); } | + | |
- | + | ||
- | if (defined $opt_D) { | + | |
- | # take movieid from cmdline arg | + | |
- | $movieid = shift || die "Usage : $0 -D <movieid>\n"; | + | |
- | getMovieData($movieid); | + | |
- | } | + | |
- | + | ||
- | elsif (defined $opt_P) { | + | |
- | # take movieid from cmdline arg | + | |
- | $movieid = shift || die "Usage : $0 -P <movieid>\n"; | + | |
- | getMoviePoster($movieid); | + | |
- | } | + | |
- | + | ||
- | elsif (defined $opt_M) { | + | |
- | # take query from cmdline arg | + | |
- | #$options = shift || die "Usage : $0 -M <query>\n"; | + | |
- | my $query; | + | |
- | my $options = ''; | + | |
- | foreach $key (0 .. $#ARGV) { | + | |
- | $query .= $ARGV[$key]. ' '; | + | |
- | } | + | |
- | getMovieList($query, $options); | + | |
- | } | + | |
- | + | ||
- | === MYSQL === | + | |
- | Base de données assez primaire mais tout à fait fonctionnelle. | + | |
- | + | ||
- | Pour lancer un script (ne pas oublier les < >): | + | |
- | mysql db_name < script.sql > output.tab | + | |
- | + | ||
- | Pour se connecter à la base de mythtv (celle par defaut) : | + | |
- | mysql --user=root --password=**** mythconverg (**** est à remplacer par son mot de passe) | + | |
- | + | ||
- | == Où est la base par défaut? == | + | |
- | + | ||
- | cd /var/lib/mysql/mythconverg (!) | + | |
- | + | ||
- | == Un petit script pour améliorer la base == | + | |
- | (**** est à remplacer par son mot de passe). | + | |
- | #!/bin/bash | + | |
- | ### mysql-settings | + | |
- | HOST=localhost | + | |
- | USER=//monutilisateur// | + | |
- | PASSW=//monmotdepasse// | + | |
- | DATABASE=//mythconverg// | + | |
- | SCRIPTDIR=`dirname $0` | + | |
- | + | ||
- | echo "Optimize mysql mythtv (--------------------------------)" | + | |
- | echo "Optimize mysql mythtv (--- Start `date +'%y/%m/%d-%H:%M.%S'` ---)" | + | |
- | echo "Optimize mysql mythtv (--- Part 1 `date +'%y/%m/%d-%H:%M.%S'` ---)" | + | |
- | mysql --user=${USER} --password=${PASSW} ${DATABASE} -B -e " | + | |
- | SELECT concat('analyze table ',table_schema,'.',table_name,';') as ' ' FROM information_schema.TABLES where table_schema='mythconverg' | + | |
- | union | + | |
- | SELECT concat('check table ',table_schema,'.',table_name,';') as ' ' FROM information_schema.TABLES where table_schema='mythconverg' | + | |
- | union | + | |
- | SELECT concat('optimize table ',table_schema,'.',table_name,';') as ' ' FROM information_schema.TABLES where table_schema='mythconverg' | + | |
- | union | + | |
- | SELECT concat('repair table ',table_schema,'.',table_name,';') as ' ' FROM information_schema.TABLES where table_schema='mythconverg';" >${SCRIPTDIR}/optimysqlmyth.sql | + | |
- | echo "Optimize mysql mythtv (--- Part 2 `date +'%y/%m/%d-%H:%M.%S'` ---)" | + | |
- | mysql --user=${USER} --password=${PASSW} ${DATABASE} <${SCRIPTDIR}/optimysqlmyth.sql> ${SCRIPTDIR}/optimysqlmyth.log | + | |
- | echo "Optimize mysql mythtv (--- End `date +'%y/%m/%d-%H:%M.%S'` ---)" | + | |
- | echo "Optimize mysql mythtv (--------------------------------)" | + | |
- | echo "Optimize mysql mythtv (--------------------------------)" | + | |
- | + | ||
- | == Un petit script pour automatiser la gestion des fichiers audios == | + | |
- | #!/bin/bash | + | |
- | ### mysql-settings | + | |
- | HOST=localhost | + | |
- | USER=//monutilisateur// | + | |
- | PASSW=//monmotdepasse// | + | |
- | DATABASE=//mythconverg// | + | |
- | SCRIPTDIR=`dirname $0` | + | |
- | + | ||
- | echo "Refresh MusicMetadata Browse (------------------------------------------------)" | + | |
- | echo "Refresh MusicMetadata Browse (-- Start `date +'%y/%m/%d-%H:%M.%S'` --------------------)" | + | |
- | # Efface les playlist sauf celles par défaut | + | |
- | echo "Refresh MusicMetadata Browse (-- Part 1 `date +'%y/%m/%d-%H:%M.%S'` - efface playlist --)" | + | |
- | echo "delete from music_playlists where playlist_name <> 'default_playlist_storage' and playlist_name <> 'backup_playlist_storage';" | mysql -u $USER --password=$PASSW -D $DATABASE -h $HOST | + | |
- | # Ajoute les playlist : premier dossier | + | |
- | echo "Refresh MusicMetadata Browse (-- Part 2 `date +'%y/%m/%d-%H:%M.%S'` - crée playlist ---)" | + | |
- | echo "insert into music_playlists (playlist_name,playlist_songs) | + | |
- | select if(left(md.path,INSTR(md.path,'/')-1)='',md.path,left(md.path,INSTR(md.path,'/')-1)) as play,'' | + | |
- | FROM music_songs ms,music_directories md | + | |
- | where md.directory_id=ms.directory_id group by play;" | mysql -u $USER --password=$PASSW -D $DATABASE -h $HOST | + | |
- | + | ||
- | # Ajout des musiques aux playlist | + | |
- | echo "Refresh MusicMetadata Browse (-- Part 3 `date +'%y/%m/%d-%H:%M.%S'` - listes titres ----)" | + | |
- | # echo "update music_playlists m set m.playlist_songs=(select group_concat(ms.song_id) | + | |
- | # FROM music_songs ms,music_directories md | + | |
- | # where md.directory_id=ms.directory_id | + | |
- | # and (left(md.path,INSTR(md.path,'/')-1)=m.playlist_name or md.path=m.playlist_name) | + | |
- | # group by left(md.path,CHAR_LENGTH(m.playlist_name)))" | mysql -u $USER --password=$PASSW -D $DATABASE -h $HOST | + | |
- | + | ||
- | mysql --user=$USER --password=$PASSW $DATABASE <$SCRIPTDIR/rmb.sql> $SCRIPTDIR/rmb2.sql | + | |
- | echo "Refresh MusicMetadata Browse (-- Part 4 `date +'%y/%m/%d-%H:%M.%S'` - ajoute titres ----)" | + | |
- | mysql --user=$USER --password=$PASSW $DATABASE <$SCRIPTDIR/rmb2.sql>> $SCRIPTDIR/rmb.log | + | |
- | + | ||
- | # Ajoute les playlist : doublon | + | |
- | echo "Refresh MusicMetadata Browse (-- Part 5 `date +'%y/%m/%d-%H:%M.%S'` - Ajout doublon ---)" | + | |
- | echo "insert into music_playlists (playlist_name,playlist_songs) values('Doublon','');" | mysql -u $USER --password=$PASSW -D $DATABASE -h $HOST | + | |
- | echo "update music_playlists m set m.playlist_songs=(select group_concat(ms.song_id) FROM music_songs ms | + | |
- | inner join music_directories cc on ms.directory_id=cc.directory_id | + | |
- | left join music_directories c on c.directory_id=cc.parent_id | + | |
- | inner join (SELECT m.name,m.filename, count(*) as tt FROM music_songs m group by m.name,m.filename having tt>1) mm on mm.name=ms.name) | + | |
- | where m.playlist_name='Doublon' ; " | mysql -u $USER --password=$PASSW -D $DATABASE -h $HOST | + | |
- | # Ajoute les playlist : doublon | + | |
- | + | ||
- | echo "Refresh MusicMetadata Browse (-- End `date +'%y/%m/%d-%H:%M.%S'` -------------------)" | + | |
- | echo "Refresh MusicMetadata Browse (------------------------------------------------)" | + | |
- | + | ||
- | Avec son petit script sql | + | |
- | SELECT concat('update music_playlists m set m.playlist_songs=concat(m.playlist_songs,''',ms.song_id,''',',''',''',') where | + | |
- | m.playlist_name=''',left(m.path,INSTR(m.path,'/')-1),'''',';') as "START TRANSACTION;" | + | |
- | FROM music_songs ms,music_directories m | + | |
- | where m.directory_id=ms.directory_id and left(m.path,INSTR(m.path,'/')-1)<>'' ; | + | |
- | select 'COMMIT;' as "" from dual; | + | |
- | SELECT concat('update music_playlists m set m.playlist_songs=concat(m.playlist_songs,''',ms.song_id,''',',''',''',') where m.playlist_name=''',m.path,'''',';') as "START TRANSACTION;" | + | |
- | FROM music_songs ms,music_directories m | + | |
- | where m.directory_id=ms.directory_id and left(m.path,INSTR(m.path,'/')-1)='' ; | + | |
- | select 'COMMIT;' as "" from dual; | + | |
- | + | ||
- | == Un petit script pour automatiser la gestion des fichiers vidéos == | + | |
- | (enchainement des vidéos, classement des genres en fonction des dossiers et création des minin affiches pour les videos qui n'en n'ont pas) | + | |
- | + | ||
- | #!/bin/bash | + | |
- | ### Pour MYSQL 5.0 peut être moins | + | |
- | ### mysql-settings | + | |
- | HOST=localhost | + | |
- | USER=//monutilisateur// | + | |
- | PASSW=//monmotdepasse// | + | |
- | DATABASE=//mythconverg// | + | |
- | SCRIPTDIR=`dirname $0` | + | |
- | THUMB_TIME=00:01:00 | + | |
- | THUMB_NB=40 | + | |
- | THUMB_DIR=/media/FILMS/.affiches | + | |
- | + | ||
- | ### initialise le champ coverfile si fichier inexistante | + | |
- | VERIF_COVER() | + | |
- | { | + | |
- | if [ ! -f "$1" ]; then | + | |
- | echo 'update videometadata set coverfile="No Cover" where coverfile="'$1'"' | mysql -u $USER --password=$PASSW -D $DATABASE -h $HOST | + | |
- | fi | + | |
- | } | + | |
- | + | ||
- | ### Crée et affecte les couvertures | + | |
- | AJOUT_COVER() | + | |
- | { | + | |
- | filename="$1" | + | |
- | THUMB_PATH="$THUMB_DIR/`basename "${filename}"`.png" | + | |
- | mplayer -ss $THUMB_TIME -nosound -frames 3 -vo png:z=9 "${filename}" >> $SCRIPTDIR/rvb.log && mv -f 00000003.png "$THUMB_PATH" >> $SCRIPTDIR/rvb.log | + | |
- | if [ ! -f "${THUMB_PATH}" ]; then | + | |
- | mplayer -nosound -frames $THUMB_NB -vo png:z=9 "${filename}" >> $SCRIPTDIR/rvb.log && mv -f 000000${THUMB_NB}.png "$THUMB_PATH" >> $SCRIPTDIR/rvb.log | + | |
- | fi | + | |
- | if [ -f "${THUMB_PATH}" ]; then | + | |
- | echo "UPDATE videometadata SET coverfile=\"${THUMB_PATH}\" WHERE filename=\"${filename}\" ;" | mysql -u $USER --password=$PASSW -D $DATABASE -h $HOST | + | |
- | fi | + | |
- | rm 000000??.png >> $SCRIPTDIR/rvb.log | + | |
- | } | + | |
- | + | ||
- | ### MAIN ### | + | |
- | echo " "> $SCRIPTDIR/rvb.log | + | |
- | echo "Refresh Videometadata Browse (---------------------------------------------)" | + | |
- | echo "Refresh Videometadata Browse (-- Start `date +'%y/%m/%d-%H:%M.%S'` -----------------)" | + | |
- | ### RAZ des couvertures inexistantes | + | |
- | echo "Refresh Videometadata Browse (-- Part 1 `date +'%y/%m/%d-%H:%M.%S'` - affiche RAZ ---)" | + | |
- | echo "select coverfile as ' ' from videometadata | + | |
- | WHERE coverfile<>'No Cover' ; " | mysql -u $USER --password=$PASSW -D $DATABASE -h $HOST >"$SCRIPTDIR"/list_cover.txt | + | |
- | while read ligne | + | |
- | do | + | |
- | VERIF_COVER "$ligne" | + | |
- | done <$SCRIPTDIR/list_cover.txt | + | |
- | + | ||
- | ### Recherche des couvertures manquantes | + | |
- | echo "Refresh Videometadata Browse (-- Part 2 `date +'%y/%m/%d-%H:%M.%S'` - ?? affiches ---)" | + | |
- | echo "select v.filename as ' ' from videometadata v | + | |
- | WHERE v.coverfile='No Cover' and LOWER(right(v.filename,3)) not like 'ifo' | + | |
- | and LOWER(right(v.filename,3)) not like 'bup' and LOWER(right(v.filename,3)) not like 'srt' | + | |
- | and LOWER(right(v.filename,3)) not like 'idx' and LOWER(right(v.filename,3)) not like 'sub'; " | mysql -u $USER --password=$PASSW -D $DATABASE -h $HOST >"$SCRIPTDIR"/list_file.txt | + | |
- | ### Creation et affectation des couvertures manquantes | + | |
- | # incompatible avec mplayer | + | |
- | # do | + | |
- | # echo -e "$ligne\n" | + | |
- | # AJOUT_COVER "$ligne" | + | |
- | # done <$SCRIPTDIR/list_file.txt | + | |
- | echo "Refresh Videometadata Browse (-- Part 3 `date +'%y/%m/%d-%H:%M.%S'` - crée affiche --)" | + | |
- | oldIFS=$IFS # sauvegarde du séparateur de champ | + | |
- | IFS=$'\n' # nouveau séparateur de champ, le caractère fin de ligne | + | |
- | for ligne in $(cat $SCRIPTDIR/list_file.txt) | + | |
- | do | + | |
- | AJOUT_COVER "$ligne" | + | |
- | done | + | |
- | IFS=$old_IFS # rétablissement du séparateur de champ par défautwhile read ligne | + | |
- | + | ||
- | echo "Refresh Videometadata Browse (-- Part 4 `date +'%y/%m/%d-%H:%M.%S'` - prep script --)" | + | |
- | mysql --user=$USER --password=$PASSW $DATABASE <$SCRIPTDIR/rvb.sql> $SCRIPTDIR/rvb2.sql | + | |
- | echo "Refresh Videometadata Browse (--- Part 2 `date +'%y/%m/%d-%H:%M.%S'` - exec scripts --)" | + | |
- | mysql --user=$USER --password=$PASSW $DATABASE <$SCRIPTDIR/rvb2.sql>> $SCRIPTDIR/rvb.log | + | |
- | echo "Refresh Videometadata Browse (--- End `date +'%y/%m/%d-%H:%M.%S'` -----------------)" | + | |
- | echo "Refresh Videometadata Browse (---------------------------------------------)" | + | |
- | exit | + | |
- | + | ||
- | Avec son petit script sql (qui efface toutes les playlists!!!) : | + | |
- | # Efface les categories de video | + | |
- | truncate videocategory; | + | |
- | + | ||
- | # Ajout des categories | + | |
- | # 14 = CHAR_LENGTH('/media/FILMS/') | + | |
- | START TRANSACTION; | + | |
- | insert into videocategory (category) select distinct mid(videometadata.filename,14,INSTR(mid(videometadata.filename,14), "/")-1) from videometadata; | + | |
- | COMMIT; | + | |
- | + | ||
- | # création du second script sql | + | |
- | + | ||
- | # Affectation des categories | + | |
- | # 14 = CHAR_LENGTH('/media/FILMS/') | + | |
- | select concat('update videometadata set category=',videocategory.intid,' where intid=',videometadata.intid,';') as "START TRANSACTION; " | + | |
- | from videometadata,videocategory where mid(videometadata.filename,14,INSTR(mid(videometadata.filename,14), "/")-1)=videocategory.category; | + | |
- | select 'COMMIT;' as ""; | + | |
- | + | ||
- | # Enchainement des videos (recherche de la derniere) (avec le debut de transaction) | + | |
- | SELECT concat('update videometadata set browse=0 ,childid=',v.intid,' ') as "START TRANSACTION; " | + | |
- | FROM videometadata v where LOWER(right(v.filename,3)) not like 'ifo' and LOWER(right(v.filename,3)) not like 'bup' | + | |
- | and LOWER(right(v.filename,3)) not like 'srt' and LOWER(right(v.filename,3)) not like 'idx' and LOWER(right(v.filename,3)) not like 'sub' | + | |
- | and v.filename=(select min(vv.filename) from videometadata vv); | + | |
- | # Enchainement des videos | + | |
- | SELECT concat(' where intid=',v.intid, '; update videometadata set browse=0 ,childid=',v.intid) as " " | + | |
- | FROM videometadata v where LOWER(right(v.filename,3)) not like 'ifo' and LOWER(right(v.filename,3)) not like 'bup' | + | |
- | and LOWER(right(v.filename,3)) not like 'srt' and LOWER(right(v.filename,3)) not like 'idx' and LOWER(right(v.filename,3)) not like 'sub' | + | |
- | order by v.filename desc; | + | |
- | # Enchainement des videos (recherche de la derniere) | + | |
- | SELECT concat(' where intid=',v.intid,'; ') as " " | + | |
- | FROM videometadata v where LOWER(right(v.filename,3)) not like 'ifo' and LOWER(right(v.filename,3)) not like 'bup' | + | |
- | and LOWER(right(v.filename,3)) not like 'srt' and LOWER(right(v.filename,3)) not like 'idx' and LOWER(right(v.filename,3)) not like 'sub' | + | |
- | and v.filename=(select max(vv.filename) from videometadata vv); | + | |
- | # pour la fin de transaction | + | |
- | select 'COMMIT;' as "" ; | + | |
- | quit | + | |
- | + | ||
- | //(Pourquoi c'est long ? il y a beaucoup de fichiers et la machine n'est pas rapide)// | + | |
- | + | ||
- | //(Pourquoi ça plante ? erreur de lecture/écriture, erreur de mot de passe etc...regarder la log : rvb.log ou optimysqlmyth.log. ou simplement un mauvais codec pour créer les miniatures)// | + | |
- | + | ||
- | + | ||
- | == Intégration dans un menu == | + | |
- | sudo vi /usr/share/mythtv/util_menu.xml | + | |
- | Ajouter à l'avant-dernière ligne (le fichier commençant par <mythmenu> doit finir par </mythmenu> ): | + | |
- | + | ||
- | <button> | + | |
- | <type>MUSIC_SCAN</type> | + | |
- | <text>r.v.b.</text> | + | |
- | <text lang="FR">r.v.b.</text> | + | |
- | <action>EXEC gnome-terminal -e /home/mythtv/scripts/rvb.sh</action> | + | |
- | </button> | + | |
- | + | ||
- | <button> | + | |
- | <type>MUSIC_SCAN</type> | + | |
- | <text>optimysqlmyth</text> | + | |
- | <text lang="FR">optimysqlmyth</text> | + | |
- | <action>EXEC gnome-terminal -e /home/mythtv/scripts/optimysqlmyth.sh</action> | + | |
- | </button> | + | |
- | + | ||
- | == Autre méthode == | + | |
- | faire dans le dossier des vidéos | + | |
- | dir * > all_videos.pls | + | |
- | ou | + | |
- | find /media/CLIPS/ -type f -name "*" -type f -print > /media/CLIPS/all_videos.pls | + | |
- | (fait la liste de tout les videos qui se trouve dans /media/CLIPS/) | + | |
- | + | ||
- | Pour créer sa playlist. | + | |
- | + | ||
- | Ajouter au Paramètres→Paramètres médias→Paramètres Vidéos→Type de fichiers | + | |
- | une extension pls et la commande : | + | |
- | mplayer -fs -zoom -quiet -vo xv -playlist %s | + | |
- | + | ||
- | === DEMARRAGE AUTO === | + | |
- | Dans Système->Préférences->Sessions : | + | |
- | + | ||
- | mythbackend (est parfois inutile : ps -ef |grep mythbackend) | + | |
- | + | ||
- | mythfrontend - -service | + | |
- | + | ||
- | irexec –d (à rajouter à la fin, voire à enlever et remettre...) | + | |
- | + | ||
- | + | ||
- | == Rien à voir mais ça peut toujours servir == | + | |
- | + | ||
- | Arrêter démarrer le backend : | + | |
- | sudo /etc/init.d/mythtv-backend stop | + | |
- | sudo /etc/init.d/mythtv-backend start | + | |
- | + | ||
- | Arrêter démarrer mysql : | + | |
- | sudo /etc/init.d/mysql stop | + | |
- | sudo /etc/init.d/mysql start | + | |
- | + | ||
- | + | ||
- | === SAMBA === | + | |
- | Avoir une bibliothèque multimédia c'est bien, la partager c'est mieux... | + | |
- | + | ||
- | sudo smbpasswd -a `whoami` | + | |
- | + | ||
- | <del>sudo gedit /etc/samba/smb.conf </del> | + | |
- | + | ||
- | === MYTHTV GALERIE === | + | |
- | Pas grand chose à faire, à part le setup : indiquer l'emplacement des photos. | + | |
- | Pour son utilisation regarder "Configurer les touches". | + | |
- | + | ||
- | + | ||
- | === ARRET et REBOOT de Mythtv (!) === | + | |
- | La commande pour rebooter ou arrêter l'ordinateur peut ne pas fonctionner (car nécessite une commande sudo reboot...). | + | |
- | + | ||
- | Pour remédier à cela ajouter //son_utilisateur// au fichier /etc/sudoers: | + | |
- | + | ||
- | (problème : le fichier doit être en lecture seul. Solution : l'écraser) | + | |
- | + | ||
- | sudo cp /etc/sudoers /etc/sudoers.new | + | |
- | sudo chmod 777 /etc/sudoers.new | + | |
- | sudo gedit /etc/sudoers.new | + | |
- | ajouter en fin de fichier (//son_utilisateur// = myth): | + | |
- | mythtv ALL=NOPASSWD:/sbin/halt,/sbin/reboot,/bin/mount,/bin/umount | + | |
- | Puis écraser par le nouveau fichier | + | |
- | sudo chmod 440 /etc/sudoers.new | + | |
- | sudo cp /etc/sudoers.new /etc/sudoers | + | |
- | + | ||
- | En cas de problème redémarrer en mode (recovery mode) et supprimer cette ligne précédemment ajoutée. | + | |
- | + | ||
- | Cette methode n'a plus l'air de fonctionner sur Jaunty, pour y remédier : | + | |
- | sudo chmod u+s /sbin/halt | + | |
- | sudo chmod u+s /sbin/reboot | + | |
- | + | ||
- | //(la différence avec la précédente méthode est dans le premier cas seul un utilisateur peut executer la commande, dans la seconde c'est permis pour tout le monde)// | + | |
- | + | ||
- | ===== Liens ===== | + | |
- | + | ||
- | - Toutes les informations de la mise en place de [[http://mythtv-fr.tuxfamily.org/wiki/mythbuntu_pas_a_pas_sur_ubuntu|Mythbuntu sous Ubuntu]] (Wiki francophone des utilisateurs de Mythtv) | + | |
- | + | ||
- | http://www.mythtv.org/ | + | |
- | + | ||
- | http://mythtv-fr.tuxfamily.org/ | + | |
- | + | ||
- | http://doc.ubuntu-fr.org/media_center | + | |
- | + | ||
- | http://www.mythtv.org/modules.php?name=MythFeatures | + | |
- | + | ||
- | http://doc.ubuntu-fr.org/imprimante_brother_dcp-130c | + | |
- | + | ||
- | https://help.ubuntu.com/ubuntu/serverguide/fr/configuring-samba.html | + | |
- | + | ||
- | http://dev.mysql.com/doc/refman/5.0/fr/index.html | + | |
- | + | ||
- | Merci, thank you, vielen Dank aux autres | + | |
- | + | ||
- | ---- | + | |
- | + | ||
- | Contributeurs : [[utilisateurs:yurek]], [[utilisateurs:laurentb|L.Bellegarde]] | + |