1 |
|
---|
2 | #!/bin/sh -e
|
---|
3 |
|
---|
4 | # Copyright (C) 2010 John Pilkington
|
---|
5 | # Largely based on scripts posted by Tino Keitel and Kees Cook in the Mythtv lists.
|
---|
6 |
|
---|
7 | # Usage: ./mythcutprojectx <recording>
|
---|
8 | # <recording> is an mpeg2 file recorded by MythTV with a valid DB entry.
|
---|
9 |
|
---|
10 | # This script is essentially a replacement for the 'lossless' mpeg2 mythtranscode.
|
---|
11 | # It will pass the recording and the MythTV cutlist to ProjectX.
|
---|
12 | # If the cutlist is empty the entire recording will be processed.
|
---|
13 | # It uses ffmpeg to report what streams are present and
|
---|
14 | # asks the user to input the PIDs of the video and one audio stream.
|
---|
15 | # It uses ProjectX to demux and mplex (from mjpegtools) to remux.
|
---|
16 | # Output format is DVD compliant without nav packets.
|
---|
17 | # It then clears the cutlist, updates the filesize in the database and rebuilds the seek table.
|
---|
18 | # The result is apparently acceptable as a recording within MythTV and as input to MythArchive.
|
---|
19 | # The ProjectX log file is kept. Other tempfiles are deleted.
|
---|
20 |
|
---|
21 | # The script needs to be edited to define some local variables.
|
---|
22 |
|
---|
23 | ####################
|
---|
24 |
|
---|
25 | # Variables RECDIR1, RECDIR2, TEMPDIR1, TEMPDIR2, PROJECTX, PASSWD need to be customised.
|
---|
26 | # RECDIR1 and TEMPDIR1 should if possible be on different drive spindles. Likewise RECDIR2 and TEMPDIR2.
|
---|
27 |
|
---|
28 | RECDIR1=/mnt/f10store/myth/reca
|
---|
29 | TEMPDIR1=/mnt/sam1/tempb
|
---|
30 |
|
---|
31 | RECDIR2=/mnt/sam1/recb
|
---|
32 | TEMPDIR2=/mnt/f10store/myth/tempa
|
---|
33 |
|
---|
34 | #PROJECTX=/path/to/ProjectX.jar (or to a link to it)
|
---|
35 | PROJECTX=~/projectx
|
---|
36 |
|
---|
37 | #PASSWD=`grep "^DBPassword" ~/.mythtv/mysql.txt | cut -d '=' -f 2-`
|
---|
38 | PASSWD=mythtv
|
---|
39 |
|
---|
40 | #################
|
---|
41 |
|
---|
42 | if test "$1" = "-h" || test "$1" = "--help" ; then
|
---|
43 | echo "Usage: ./mythcutprojectx <recording>"
|
---|
44 | echo "<recording> is an mpeg2 file recorded by MythTV with a valid DB entry."
|
---|
45 | echo "e.g. 1234_20100405123400.mpg in one of the defined RECDIRs"
|
---|
46 | echo "The output file replaces the input file which is renamed to <recording>.old"
|
---|
47 | exit 0
|
---|
48 | fi
|
---|
49 |
|
---|
50 | # Customize with paths to alternative recording and temp folders
|
---|
51 |
|
---|
52 | cd $RECDIR1
|
---|
53 | TEMP=$TEMPDIR1
|
---|
54 | if [ ! -f "$1" ] ; then
|
---|
55 | cd $RECDIR2
|
---|
56 | TEMP=$TEMPDIR2
|
---|
57 | if [ ! -f "$1" ] ; then
|
---|
58 | echo " "$1" not found. Giving up"
|
---|
59 | cd
|
---|
60 | exit 1
|
---|
61 | fi
|
---|
62 | fi
|
---|
63 |
|
---|
64 | if [ $# -lt 3 ]
|
---|
65 | then
|
---|
66 | echo "Error: needs three arguments. Running ffmpeg -i "$1" 2>&1 | grep -C 4 Video "
|
---|
67 | echo
|
---|
68 | ffmpeg -i "$1" 2>&1 | grep -C 4 Video
|
---|
69 | echo
|
---|
70 | echo "Expected Command Line is of the form ./mythcutprojectx 1234_20070927190000.mpg 0xvvv 0xaaa "
|
---|
71 | echo " filename_in_DB vPID aPID "
|
---|
72 | cd ~
|
---|
73 | exit 1
|
---|
74 | fi
|
---|
75 |
|
---|
76 | # chanid and starttime identify the recording in the DB
|
---|
77 | chanid=`echo "select chanid from recorded where basename=\"$1\";" |
|
---|
78 | mysql -N -u mythtv -p$PASSWD mythconverg `
|
---|
79 |
|
---|
80 | starttime=`echo "select starttime from recorded where basename=\"$1\";" |
|
---|
81 | mysql -N -u mythtv -p$PASSWD mythconverg `
|
---|
82 |
|
---|
83 | # list0 gives start (cut-in) points but omits initial zero if start of recording is wanted; includes eof.
|
---|
84 | list0=`echo "select mark from recordedmarkup
|
---|
85 | where chanid=$chanid and starttime='$starttime' and type=0 order by mark;" |
|
---|
86 | mysql -N -u mythtv -p$PASSWD mythconverg `
|
---|
87 |
|
---|
88 | # list1 gives start of cut (cut-out points). Has initial zero if start of recording is to be cut
|
---|
89 | list1=`echo "select mark from recordedmarkup
|
---|
90 | where chanid=$chanid and starttime='$starttime' and type=1 order by mark;" |
|
---|
91 | mysql -N -u mythtv -p$PASSWD mythconverg `
|
---|
92 |
|
---|
93 | echo "CollectionPanel.CutMode=0" > cutlist$$ ;
|
---|
94 | for i in $list1 ;
|
---|
95 | do
|
---|
96 | if [ $i = "0" ]
|
---|
97 | then
|
---|
98 | list=`echo "select mark from recordedmarkup
|
---|
99 | where chanid=$chanid and starttime='$starttime' and type in (0,1) order by mark;" |
|
---|
100 | mysql -N -u mythtv -p$PASSWD mythconverg | tail -n +2 `
|
---|
101 | # tail -n +2 drops the initial zero.
|
---|
102 | else
|
---|
103 | echo "0" >> cutlist$$
|
---|
104 | list=`echo "select mark from recordedmarkup
|
---|
105 | where chanid=$chanid and starttime='$starttime' and type in (0,1) order by mark;" |
|
---|
106 | mysql -N -u mythtv -p$PASSWD mythconverg `
|
---|
107 | fi
|
---|
108 | # use only the first element of list1, as a switch.
|
---|
109 | break
|
---|
110 | done
|
---|
111 |
|
---|
112 | # find the key frame (mark type 9) right before each cut mark,
|
---|
113 | # extract the byte offset, write it into the ProjectX cutlist
|
---|
114 | for i in $list ;
|
---|
115 | do echo "select offset from recordedseek
|
---|
116 | where chanid=$chanid and starttime='$starttime' and type=9 and mark >= $i and mark < ($i + 100)
|
---|
117 | order by offset;" |
|
---|
118 | mysql -N -u mythtv -p$PASSWD mythconverg | head -n 1
|
---|
119 | # for each cycle, head -n 1 yields the first line only.
|
---|
120 | done >> cutlist$$
|
---|
121 |
|
---|
122 | echo "list0"
|
---|
123 | echo $list0
|
---|
124 | echo
|
---|
125 | echo "list1"
|
---|
126 | echo $list1
|
---|
127 | echo
|
---|
128 | echo "list"
|
---|
129 | echo $list
|
---|
130 | echo
|
---|
131 | cat cutlist$$
|
---|
132 | echo
|
---|
133 |
|
---|
134 | #exit
|
---|
135 |
|
---|
136 | if [ -f "$1".old ] ; then
|
---|
137 | echo " "$1".old exists. Giving up"
|
---|
138 | exit 1
|
---|
139 | else
|
---|
140 | mv "$1" "$1".old
|
---|
141 | # use ProjectX to de-multiplex selected streams with the created cutlist
|
---|
142 | ionice -c3 java -jar "$PROJECTX" -name tempcut$$ -id $2,$3 -out $TEMP -cut cutlist$$ "$1".old || :
|
---|
143 | # and pipe for re-multiplexing to mplex. -f 9 is dvd format without navpacks
|
---|
144 | ionice -c3 mplex -o "$1" -V -f 9 $TEMP/tempcut${$}.m2v $TEMP/tempcut${$}.mp2
|
---|
145 |
|
---|
146 | # tell mythDB about new filesize and clear myth cutlist
|
---|
147 | FILESIZE=`du -b "$1" | cut -f 1`
|
---|
148 | if [ "${FILESIZE}" -gt 1000000 ]; then
|
---|
149 | echo "running: update recorded set filesize=${FILESIZE} where basename=\"$1\";"
|
---|
150 | echo "update recorded set filesize=${FILESIZE} where basename=\"$1\";" | mysql -u mythtv -p$PASSWD mythconverg
|
---|
151 | echo "filesize has been reset"
|
---|
152 | echo "running: ionice -c3 mythcommflag -f "$1" --clearcutlist"
|
---|
153 | ionice -c3 mythcommflag -f "$1" --clearcutlist
|
---|
154 | echo "cutlist has been cleared"
|
---|
155 | fi
|
---|
156 |
|
---|
157 | #rebuild seek table
|
---|
158 | echo "running: ionice -c3 mythtranscode --mpeg2 --buildindex --showprogress --chanid "$chanid" --starttime "$starttime""
|
---|
159 | ionice -c3 mythtranscode --mpeg2 --buildindex --showprogress --chanid "$chanid" --starttime "$starttime"
|
---|
160 | echo "seek table has been rebuilt"
|
---|
161 |
|
---|
162 | echo "Output file is $1 - PID streams $2 and $3 copied"
|
---|
163 | echo
|
---|
164 | rm -f "$1".png
|
---|
165 | #rm -f $TEMP/tempcut${$}*
|
---|
166 | mv $TEMP/tempcut${$}_log.txt $TEMP/$1_pxlog.txt
|
---|
167 | rm -f $TEMP/tempcut${$}.m2v
|
---|
168 | rm -f $TEMP/tempcut${$}.mp2
|
---|
169 | rm -f cutlist$$
|
---|
170 | fi
|
---|
171 |
|
---|
172 | cd
|
---|
173 | exit 0
|
---|
174 |
|
---|