@@ -10,13 +10,18 @@ import (
10
10
log "github.com/sirupsen/logrus"
11
11
"github.com/spf13/cobra"
12
12
"github.com/spf13/viper"
13
+ "io/ioutil"
13
14
"os"
14
15
"os/signal"
15
16
"path/filepath"
17
+ "strconv"
16
18
"strings"
17
19
"syscall"
18
20
)
19
21
22
+ // TODO Make Configurable
23
+ const outputFileExtension = ".mkv"
24
+
20
25
var terminated bool
21
26
22
27
var LogLevel string
@@ -69,33 +74,7 @@ var rootCmd = &cobra.Command{
69
74
return
70
75
}
71
76
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 ) {
99
78
// File already processed
100
79
continue
101
80
}
@@ -105,7 +84,7 @@ var rootCmd = &cobra.Command{
105
84
106
85
tempFileName := fileName + ".transcode-temp"
107
86
108
- _ , err = os .Stat (tempFileName )
87
+ _ , err : = os .Stat (tempFileName )
109
88
110
89
if err != nil && ! os .IsNotExist (err ) {
111
90
log .Errorf ("Error reading file %s: %s" , tempFileName , err )
@@ -124,14 +103,11 @@ var rootCmd = &cobra.Command{
124
103
continue
125
104
}
126
105
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"
133
109
134
- _ = f . Close ( )
110
+ updateProcessedFile ( tempFileName , processedFileName )
135
111
136
112
if killed {
137
113
// Assume corrupted output file
@@ -230,6 +206,7 @@ func init() {
230
206
rootCmd .PersistentFlags ().Bool ("stderr" , false , "Whether to output ffmpeg stderr stream" )
231
207
rootCmd .PersistentFlags ().Bool ("keep-old" , true , "Keep old version of video if transcoded version is larger" )
232
208
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" )
233
210
234
211
rootCmd .PersistentFlags ().String ("tg-bot-key" , "" , "Telegram Bot API Key" )
235
212
rootCmd .PersistentFlags ().Int64 ("tg-chat-id" , 0 , "Telegram Bot Chat ID" )
@@ -240,7 +217,120 @@ func init() {
240
217
_ = viper .BindPFlag ("stderr" , rootCmd .PersistentFlags ().Lookup ("stderr" ))
241
218
_ = viper .BindPFlag ("keep-old" , rootCmd .PersistentFlags ().Lookup ("keep-old" ))
242
219
_ = viper .BindPFlag ("early-exit" , rootCmd .PersistentFlags ().Lookup ("early-exit" ))
220
+ _ = viper .BindPFlag ("nice" , rootCmd .PersistentFlags ().Lookup ("nice" ))
243
221
244
222
_ = viper .BindPFlag ("tg-bot-key" , rootCmd .PersistentFlags ().Lookup ("tg-bot-key" ))
245
223
_ = viper .BindPFlag ("tg-chat-id" , rootCmd .PersistentFlags ().Lookup ("tg-chat-id" ))
246
224
}
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
+ }
0 commit comments