@@ -6,25 +6,37 @@ const DEFAULT_MS = 5000; // time between fetches
6
6
const fs = require ( "fs" ) ;
7
7
const got = require ( "got" ) ;
8
8
const getopts = require ( "getopts" ) ;
9
+
9
10
var count = 0 ;
10
11
var start = 0 ;
11
12
var dup = 0 ;
12
13
var filename ;
13
14
var lastImage ;
14
15
15
- const options = getopts ( process . argv . slice ( 2 ) , {
16
- boolean : [ "h" ] ,
17
- string : [ "t" ] ,
16
+ var invalidOption = false ;
17
+ const OPTIONSDOC = {
18
+ boolean : [ "m" , "v" , "h" ] ,
19
+ string : [ "i" ] ,
18
20
alias : {
19
- interval : [ "t" ] ,
21
+ mxf : [ "m" ] ,
22
+ interval : [ "i" ] ,
23
+ verbose : [ "v" ] ,
20
24
help : [ "h" ]
25
+ } ,
26
+ unknown : option => {
27
+ invalidOption = true ;
28
+ console . error ( `Unknown option: ${ option } ` ) ;
29
+ return false ;
21
30
}
22
- } ) ;
31
+ } ;
32
+ const options = getopts ( process . argv . slice ( 2 ) , OPTIONSDOC ) ;
23
33
24
34
function usage ( ) {
25
35
console . log ( `
26
36
Usage: webstills [options] URL
27
- -t nnn, --interval nnn mS between fetches [default: 5000]
37
+ -i nnn, --interval nnn mS between fetches [default: 5000]
38
+ -m, --mxf rename files to MXF creation time
39
+ -v, --verbose show filenames as they are written
28
40
-h, --help show this help
29
41
N.B. If URL ends with =, an incrementing counter is added to
30
42
the URL to improve cache busting.
@@ -36,23 +48,53 @@ N.B. If URL ends with =, an incrementing counter is added to
36
48
}
37
49
}
38
50
51
+ function mxfdtname ( d ) {
52
+ let daterxarr = / D A T = ( \d { 4 } - \d \d - \d \d ) [ \r \n ] / . exec ( d ) ;
53
+ let timerxarr = / T I M = ( \d \d : \d \d : \d \d \. \d { 3 } ) [ \r \n ] / . exec ( d ) ;
54
+ if ( daterxarr && timerxarr ) {
55
+ return `${ daterxarr [ 1 ] . replace ( / - / g, "" ) } -${ timerxarr [ 1 ] . replace (
56
+ / : / g,
57
+ ""
58
+ ) } .jpg`;
59
+ }
60
+ return null ;
61
+ }
62
+
39
63
function writeImage ( filename , data ) {
40
- fs . writeFile ( filename + ".jpg" , data , err => {
41
- if ( err ) console . log ( `${ count } : error writing: ${ filename } .jpg` ) ;
64
+ let newname ;
65
+ filename = `${ filename } .jpg` ;
66
+ fs . writeFile ( filename , data , err => {
67
+ if ( err ) {
68
+ console . error ( `${ count } : error writing: ${ filename } .jpg` ) ;
69
+ } else {
70
+ if ( options . m ) {
71
+ newname = mxfdtname ( data . toString ( "binary" , 0 , 2047 ) ) ;
72
+ if ( newname ) {
73
+ fs . rename ( filename , newname , err => {
74
+ if ( err ) {
75
+ console . error ( `error renaming ${ filename } to ${ newname } ` ) ;
76
+ }
77
+ } ) ;
78
+ }
79
+ }
80
+ }
81
+ if ( options . v ) {
82
+ console . log ( newname ? newname : filename ) ;
83
+ }
42
84
} ) ;
43
85
}
44
86
45
87
function writeDup ( filename , data ) {
46
88
let dupstr = ( "0000" + dup ) . slice ( - 5 ) ;
47
- console . log ( `Write ${ filename } .${ dupstr } ` ) ;
89
+ console . log ( `Write duplicate ${ filename } .${ dupstr } ` ) ;
48
90
writeImage ( `${ filename } .${ dupstr } ` , data ) ;
49
91
dup ++ ;
50
92
}
51
93
52
94
async function fetcher ( ) {
53
95
let gotOptions = {
54
96
retries : 0 ,
55
- timeout : Math . min ( 1000 , options . t ) ,
97
+ timeout : Math . min ( 1200 , options . i ) ,
56
98
encoding : null ,
57
99
headers : {
58
100
"user-agent" :
@@ -91,10 +133,11 @@ async function fetcher() {
91
133
92
134
if (
93
135
options . _ . length !== 1 ||
94
- ( options . t . length && isNaN ( parseInt ( options . t , 10 ) ) )
136
+ invalidOption ||
137
+ ( options . i . length && isNaN ( parseInt ( options . i , 10 ) ) )
95
138
) {
96
139
usage ( ) ;
97
140
} else {
98
- options . t = parseInt ( options . t , 10 ) || DEFAULT_MS ;
99
- setInterval ( fetcher , options . t ) ;
141
+ options . i = parseInt ( options . i , 10 ) || DEFAULT_MS ;
142
+ setInterval ( fetcher , options . i ) ;
100
143
}
0 commit comments