Allow .flv or .avi file extensions in conversion code.
[recordtv.git] / src / rtv_convert.py
blob5529f02c0c0b013d1861f54934f379240e79e8d1
1 #!/usr/bin/python
3 import os
4 import os.path
5 import re
6 import shutil
7 import sys
8 import rtv_utils, rtv_programmeinfo
10 allowed_chars_re = re.compile( "[a-zA-z0-9_-]" )
12 def _sanitise_filename( fn, max_len ):
13 fn = str( fn )
14 san_fn = ""
15 for ch in fn:
16 if allowed_chars_re.match( ch ):
17 san_fn += ch
18 else:
19 san_fn += "_"
20 return san_fn[:max_len]
22 def _get_flv_file_path( rtvinfo, fallback_filename ):
23 if not os.path.isfile( rtvinfo ):
24 print "Error: rtvinfo file '%s' not found." % rtvinfo
25 sys.stdout.flush()
26 return ( "", fallback_filename )
28 proginfo = rtv_programmeinfo.ProgrammeInfo()
29 proginfo.load( rtvinfo )
31 startTime = str( proginfo.startTime )
33 if proginfo.sub_title:
34 unsan_file = startTime[:10] + "_" + str( proginfo.sub_title )
35 elif proginfo.channel_pretty:
36 unsan_file = startTime + "_" + str( proginfo.channel_pretty )
37 else:
38 unsan_file = startTime + "_" + str( proginfo.channel )
40 progname_dir = _sanitise_filename( proginfo.title, 40 )
42 if proginfo.destination and proginfo.destination != "":
43 ret_dir = os.path.join(
44 _sanitise_filename( proginfo.destination, 40 ),
45 progname_dir )
46 else:
47 ret_dir = progname_dir
49 ans = ( ret_dir,
50 os.path.join( ret_dir, _sanitise_filename( unsan_file, 40 ) ) )
52 return ans
54 def _delete_empty_dirs( config ):
55 for ( dirpath, dirnames, filenames ) in os.walk(
56 config.converted_progs_dir ):
57 if len( filenames ) == 0 and len( dirnames ) == 0:
59 # Don't delete the "deleted" dir
60 if ( dirpath.endswith( "deleted" ) ):
61 continue
63 empty_dir_name = os.path.join(
64 config.converted_progs_dir, dirpath )
65 print "Removing empty directory '%s'" % empty_dir_name
66 os.rmdir( empty_dir_name )
69 def convert( config ):
71 for fn in os.listdir( config.recorded_progs_dir ):
72 if fn[-3:] != ".ts":
73 continue
75 fn_stem = fn[ : fn.rfind( "." ) ]
77 fn = os.path.join( config.recorded_progs_dir, fn )
79 rtvinfo = os.path.join( config.recorded_progs_dir,
80 fn_stem + ".rtvinfo" )
82 (flv_dir, flv_stem) = _get_flv_file_path( rtvinfo, fn_stem )
84 rtv_utils.ensure_dir_exists(
85 os.path.join( config.converted_progs_dir, flv_dir ) )
87 flv_before = os.path.join( config.converted_progs_dir,
88 flv_stem + "_converting.avi" )
90 flv_after = os.path.join( config.converted_progs_dir,
91 flv_stem + ".avi" )
93 rtvinfo_new = flv_stem + ".rtvinfo"
95 old_dir = os.path.join( config.recorded_progs_dir, "old" )
97 sys.stdout.flush()
98 retval = os.system( config.convert_command % (
99 fn, flv_before, flv_after, old_dir ) )
101 if retval != 0:
102 print "Conversion of '%s' returned an error." % fn
103 continue
105 if os.path.isfile( rtvinfo ):
106 shutil.move( rtvinfo,
107 os.path.join( config.converted_progs_dir, rtvinfo_new ) )
109 _delete_empty_dirs( config )
112 def rename( config ):
113 for ( dirpath, dirnames, filenames ) in os.walk(
114 config.converted_progs_dir ):
116 for fn in filenames:
117 fn_extension = fn[-4:]
119 if fn_extension not in ( ".flv", ".avi" ):
120 continue
122 fn_stem = os.path.join( dirpath, fn[ : fn.rfind( "." ) ] )
124 rtvinfo_orig = os.path.join( config.converted_progs_dir,
125 fn_stem + ".rtvinfo" )
127 flv_orig = os.path.join( config.converted_progs_dir,
128 fn_stem + fn_extension )
130 (flv_dir, flv_stem) = _get_flv_file_path( rtvinfo_orig, fn_stem )
132 rtv_utils.ensure_dir_exists(
133 os.path.join( config.converted_progs_dir, flv_dir ) )
135 flv_after = os.path.join( config.converted_progs_dir,
136 flv_stem + fn_extension )
138 rtvinfo_after = os.path.join( config.converted_progs_dir,
139 flv_stem + ".rtvinfo" )
141 if flv_orig != flv_after:
142 print "Renaming %s -> %s" % ( flv_orig, flv_after )
143 shutil.move( flv_orig, flv_after )
145 if rtvinfo_orig != rtvinfo_after:
146 print "Renaming %s -> %s" % ( rtvinfo_orig, rtvinfo_after )
147 shutil.move( rtvinfo_orig, rtvinfo_after )
149 _delete_empty_dirs( config )