Skip to content

Commit 48a9b4c

Browse files
committed
Write metadata into processed files. Use nice.
1 parent c0d84be commit 48a9b4c

File tree

2 files changed

+136
-36
lines changed

2 files changed

+136
-36
lines changed

cmd/root.go

Lines changed: 125 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,18 @@ import (
1010
log "github.com/sirupsen/logrus"
1111
"github.com/spf13/cobra"
1212
"github.com/spf13/viper"
13+
"io/ioutil"
1314
"os"
1415
"os/signal"
1516
"path/filepath"
17+
"strconv"
1618
"strings"
1719
"syscall"
1820
)
1921

22+
// TODO Make Configurable
23+
const outputFileExtension = ".mkv"
24+
2025
var terminated bool
2126

2227
var LogLevel string
@@ -69,33 +74,7 @@ var rootCmd = &cobra.Command{
6974
return
7075
}
7176

72-
ext := filepath.Ext(fileName)
73-
74-
valid := false
75-
for _, extension := range viper.GetStringSlice("extensions") {
76-
if ext == extension {
77-
valid = true
78-
break
79-
}
80-
}
81-
82-
if !valid {
83-
continue
84-
}
85-
86-
lastDot := strings.LastIndex(fileName, ".")
87-
extCorrectedOriginal := fileName[:lastDot] + ".mkv"
88-
89-
processedFileName := filepath.Dir(extCorrectedOriginal) + "/." + filepath.Base(extCorrectedOriginal) + ".processed"
90-
91-
stat, err := os.Stat(processedFileName)
92-
93-
if err != nil && !os.IsNotExist(err) {
94-
log.Errorf("Error reading file %s: %s", processedFileName, err)
95-
continue
96-
}
97-
98-
if stat != nil {
77+
if !shouldTranscode(fileName) {
9978
// File already processed
10079
continue
10180
}
@@ -105,7 +84,7 @@ var rootCmd = &cobra.Command{
10584

10685
tempFileName := fileName + ".transcode-temp"
10786

108-
_, err = os.Stat(tempFileName)
87+
_, err := os.Stat(tempFileName)
10988

11089
if err != nil && !os.IsNotExist(err) {
11190
log.Errorf("Error reading file %s: %s", tempFileName, err)
@@ -124,14 +103,11 @@ var rootCmd = &cobra.Command{
124103
continue
125104
}
126105

127-
f, err := os.Create(processedFileName)
128-
129-
if err != nil {
130-
log.Errorf("Error writing file %s: %s", processedFileName, err)
131-
continue
132-
}
106+
lastDot := strings.LastIndex(fileName, ".")
107+
extCorrectedOriginal := fileName[:lastDot] + outputFileExtension
108+
processedFileName := filepath.Dir(extCorrectedOriginal) + "/." + filepath.Base(extCorrectedOriginal) + ".processed"
133109

134-
_ = f.Close()
110+
updateProcessedFile(tempFileName, processedFileName)
135111

136112
if killed {
137113
// Assume corrupted output file
@@ -230,6 +206,7 @@ func init() {
230206
rootCmd.PersistentFlags().Bool("stderr", false, "Whether to output ffmpeg stderr stream")
231207
rootCmd.PersistentFlags().Bool("keep-old", true, "Keep old version of video if transcoded version is larger")
232208
rootCmd.PersistentFlags().Bool("early-exit", true, "Early exit if transcoded version is larger than original (requires keep-old)")
209+
rootCmd.PersistentFlags().Bool("nice", true, "Whether to lower the priority of ffmpeg process")
233210

234211
rootCmd.PersistentFlags().String("tg-bot-key", "", "Telegram Bot API Key")
235212
rootCmd.PersistentFlags().Int64("tg-chat-id", 0, "Telegram Bot Chat ID")
@@ -240,7 +217,120 @@ func init() {
240217
_ = viper.BindPFlag("stderr", rootCmd.PersistentFlags().Lookup("stderr"))
241218
_ = viper.BindPFlag("keep-old", rootCmd.PersistentFlags().Lookup("keep-old"))
242219
_ = viper.BindPFlag("early-exit", rootCmd.PersistentFlags().Lookup("early-exit"))
220+
_ = viper.BindPFlag("nice", rootCmd.PersistentFlags().Lookup("nice"))
243221

244222
_ = viper.BindPFlag("tg-bot-key", rootCmd.PersistentFlags().Lookup("tg-bot-key"))
245223
_ = viper.BindPFlag("tg-chat-id", rootCmd.PersistentFlags().Lookup("tg-chat-id"))
246224
}
225+
226+
func shouldTranscode(fileName string) bool {
227+
if terminated {
228+
return false
229+
}
230+
231+
ext := filepath.Ext(fileName)
232+
233+
valid := false
234+
for _, extension := range viper.GetStringSlice("extensions") {
235+
if ext == extension {
236+
valid = true
237+
break
238+
}
239+
}
240+
241+
if !valid {
242+
return false
243+
}
244+
245+
lastDot := strings.LastIndex(fileName, ".")
246+
extCorrectedOriginal := fileName[:lastDot] + outputFileExtension
247+
processedFileName := filepath.Dir(extCorrectedOriginal) + "/." + filepath.Base(extCorrectedOriginal) + ".processed"
248+
249+
stat, err := os.Stat(processedFileName)
250+
251+
if err != nil && !os.IsNotExist(err) {
252+
log.Errorf("Error reading file %s: %s", processedFileName, err)
253+
return false
254+
}
255+
256+
if stat == nil {
257+
// File not transcoded ever
258+
return true
259+
}
260+
261+
if stat.Size() == 0 {
262+
// File processed using old transcoder, update meta file and skip
263+
log.Warningf("Updating processed file with file size from old transcoder: %s", fileName)
264+
updateProcessedFile(fileName, processedFileName)
265+
return false
266+
}
267+
268+
processedData, err := ioutil.ReadFile(processedFileName)
269+
270+
if err != nil {
271+
log.Errorf("Error reading file %s: %s", processedFileName, err)
272+
return false
273+
}
274+
275+
if len(processedData) == 0 {
276+
// File processed using old transcoder, update meta file and skip
277+
log.Warningf("Updating processed file with file size from old transcoder: %s", fileName)
278+
updateProcessedFile(fileName, processedFileName)
279+
return false
280+
}
281+
282+
parsed, err := strconv.ParseInt(string(processedData), 10, 64)
283+
284+
if err != nil {
285+
log.Errorf("Error parsing %s: %s", string(processedData), err)
286+
return false
287+
}
288+
289+
originalStat, err := os.Stat(fileName)
290+
291+
if err != nil {
292+
log.Errorf("Error reading file %s: %s", fileName, err)
293+
return false
294+
}
295+
296+
if parsed == originalStat.Size() {
297+
return false
298+
}
299+
300+
if !deleteProcessedFile(processedFileName) {
301+
return false
302+
}
303+
304+
return true
305+
}
306+
307+
func updateProcessedFile(fileName string, processedFileName string) {
308+
if !deleteProcessedFile(processedFileName) {
309+
return
310+
}
311+
312+
originalStat, err := os.Stat(fileName)
313+
314+
if err != nil {
315+
log.Errorf("Error reading file %s: %s", fileName, err)
316+
return
317+
}
318+
319+
err = ioutil.WriteFile(processedFileName, []byte(strconv.FormatInt(originalStat.Size(), 10)), 0644)
320+
321+
if err != nil {
322+
log.Errorf("Error writing file %s: %s", processedFileName, err)
323+
return
324+
}
325+
}
326+
327+
func deleteProcessedFile(processedFileName string) bool {
328+
err := os.Remove(processedFileName)
329+
330+
if err != nil && !os.IsNotExist(err) {
331+
log.Errorf("Error deleting file %s: %s", processedFileName, err)
332+
return false
333+
}
334+
335+
return true
336+
}

transcoder/transcoder.go

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"os/exec"
1111
"os/signal"
1212
"regexp"
13+
"runtime"
1314
"strconv"
1415
"strings"
1516
"syscall"
@@ -21,6 +22,10 @@ var lastReport *models.ProgressReport
2122
func BuildFlags(fileName string, tempFileName string, metadata *models.FileMetadata) []string {
2223
finalFlags := make([]string, 0)
2324

25+
if viper.GetBool("nice") && runtime.GOOS == "linux" {
26+
finalFlags = append(finalFlags, "ffmpeg")
27+
}
28+
2429
// The input file
2530
finalFlags = append(finalFlags, "-y", "-i", fileName)
2631

@@ -72,7 +77,12 @@ func TranscodeFile(fileName string, tempFileName string, metadata *models.FileMe
7277

7378
log.Tracef("Executing ffmpeg %s", strings.Join(flags, " "))
7479

75-
c := exec.Command("ffmpeg", flags...)
80+
var c *exec.Cmd
81+
if viper.GetBool("nice") && runtime.GOOS == "linux" {
82+
c = exec.Command("nice", flags...)
83+
} else {
84+
c = exec.Command("ffmpeg", flags...)
85+
}
7686

7787
done := make(chan bool, 2)
7888
stopTranscoder := make(chan bool, 2)

0 commit comments

Comments
 (0)