Graver un DVD à partir d’enregistrements de la télévision numérique

23 janvier 2010 - Mots-clés : Linux TVnum

Installation des packages

# apt install dvdauthor
# apt install mjpegtools
# apt install dvd+rw-tools

Pour rappel, la TNT peut être enregistrée à partir des logiciels suivants (non exhautif) :

  • kaffeine ;
  • gnutv ;
  • mplayer.

Personnellement, j'utilise l'enregistreur de télévision numérique en ligne de commande que j'ai réalisé.

Une fois l'enregistrement obtenu, on lui appliquera les traitements suivants :

  • démultiplexage de la vidéo et de l'audio ;
  • remultiplexage de ces mêmes flux en un fichier mpeg ;
  • convertion au format DVD ;
  • gravure du DVD.

Par simplification, j'ai fait le choix d'enregistrer une seule émission par DVD et sans menu ni chapitre : lorsqu'on insère le DVD dans une platine de lecture de salon, la lecture démarre immédiatement.

Les opérations sont les suivantes :

  • lancez projectx ;
  • mettez vos points de coupure pour supprimer les marges avant et après l'enregistrement et aussi la pub ;
  • sauvegardez les points de coupure avec le même nom que votre enregistrement mais avec l'extension « .cut » .
  • insérez un DVD vierge dans le graveur. Si vous ne le faites pas, une image iso du DVD sera générée. Vous pourrez la graver plus tard avec l'outil de votre choix (k3b par exemple) ou avec le script burndvd.sh téléchargeable ci-dessous ;
  • exécutez le script ci-dessous avec comme paramètre le nom de votre enregistrement avec son extension (.ts, .mpg, .iso).

burndvd.py

#!/usr/bin/env python2
# -*- coding: utf-8 -*-

import commands
import fnmatch
import os
import re
import shutil
import sys
import time
import tempfile
#import pdb; pdb.set_trace()

if len(sys.argv) != 2:
    print('Usage : %s <nom de fichier .ts .mpg .iso>' % (sys.argv[0],))
    sys.exit(1)

fichier = sys.argv[1]
dir = os.path.dirname(fichier)
if not dir: dir = '.'
base, extension = os.path.splitext(fichier)

if extension == '.ts':
    if os.path.exists(base + '.cut'):
        os.system('projectx %s.ts -cut %s.cut -ini ~/.projectx/X.ini' % (base, base))
    else:
        os.system('projectx %s.ts -ini ~/.projectx/X.ini' % (base,))

    audio_files = ''
    for lang in ('fra', 'eng'):
        for file in os.listdir('.'):
            if fnmatch.fnmatch(file, '%s*%s*.mp2' % (base, lang,)):
                audio_files += ' ' +  file

    os.system('mplex -V -f 8 -o %s.mpg %s %s.m2v' % (base, audio_files, base))
    extension = '.mpg'

if extension == '.mpg':
    tmpdir = tempfile.mkdtemp(dir='/tmp')
    xml_filename = os.path.join(tmpdir, base + '.xml')
    dvd_dir = os.path.join(tmpdir, 'dvd')
    os.mkdir(dvd_dir)
    file = open(xml_filename, 'w+')
    lines = [
        '<dvdauthor format="pal">\n',
        '   <vmgm />\n',
        '   <titleset>\n',
        '      <titles>\n',
        '         <pgc>\n',
        '            <vob file="%s.mpg" />\n' % (base,),
        '         </pgc>\n',
        '      </titles>\n',
        '   </titleset>\n',
        '</dvdauthor>\n',
    ]
    file.writelines(lines)
    file.close()
    os.system('dvdauthor -o %s -x %s' % (dvd_dir, xml_filename,))
    os.system('mkisofs -dvd-video -o %s.iso %s' % (base, dvd_dir))
    shutil.rmtree(tmpdir)
    extension = '.iso'

if extension == '.iso':
    status, media_info = commands.getstatusoutput('dvd+rw-mediainfo /dev/cdrom 2>/dev/null')
    items = re.findall('^ Mounted Media', media_info, re.MULTILINE)
    if len(items) == 1:
        #status, vierge = commands.getstatusoutput('dvd+rw-mediainfo /dev/cdrom 2>/dev/null | grep "^ Disc status" | cut -d: -f2 | sed \'s/^ *\(.*\) *$/\1/\'')
        items = re.findall('^ Disc status.*', media_info, re.MULTILINE)
        if len(items) == 1:
            items = items[0].split(':')
            if items[1].strip() != 'blank':
                print 'DVD non vierge'
                sys.exit(1)
            os.system('growisofs -dvd-compat -Z /dev/cdrom=%s.iso -speed=2' % (base,))
            os.remove('%s.iso' % (base,))
            time.sleep(5.)
            os.system('eject')
    else:
        print('Pas de DVD dans le graveur : image %s.iso disponible' % (base,))

#if extension != '.iso':
#    print('Extension du fichier incorrecte')
#    sys.exit(1)

for file in os.listdir(dir):
    if fnmatch.fnmatch(file, '%s*' % (base,)):
        _, extension = os.path.splitext(file)
        if not extension in ['.ts', '.mpg', '.cut', '.iso']:
            os.remove(file)


sys.exit(0)