aspera-cli 4.0.0.pre1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/README.md +3592 -0
- data/bin/ascli +7 -0
- data/bin/asession +89 -0
- data/docs/Makefile +59 -0
- data/docs/README.erb.md +3012 -0
- data/docs/README.md +13 -0
- data/docs/diagrams.txt +49 -0
- data/docs/secrets.make +38 -0
- data/docs/test_env.conf +117 -0
- data/docs/transfer_spec.html +99 -0
- data/examples/aoc.rb +17 -0
- data/examples/proxy.pac +60 -0
- data/examples/transfer.rb +115 -0
- data/lib/aspera/api_detector.rb +60 -0
- data/lib/aspera/ascmd.rb +151 -0
- data/lib/aspera/ats_api.rb +43 -0
- data/lib/aspera/cli/basic_auth_plugin.rb +38 -0
- data/lib/aspera/cli/extended_value.rb +88 -0
- data/lib/aspera/cli/formater.rb +238 -0
- data/lib/aspera/cli/listener/line_dump.rb +17 -0
- data/lib/aspera/cli/listener/logger.rb +20 -0
- data/lib/aspera/cli/listener/progress.rb +52 -0
- data/lib/aspera/cli/listener/progress_multi.rb +91 -0
- data/lib/aspera/cli/main.rb +304 -0
- data/lib/aspera/cli/manager.rb +440 -0
- data/lib/aspera/cli/plugin.rb +90 -0
- data/lib/aspera/cli/plugins/alee.rb +24 -0
- data/lib/aspera/cli/plugins/ats.rb +231 -0
- data/lib/aspera/cli/plugins/bss.rb +71 -0
- data/lib/aspera/cli/plugins/config.rb +806 -0
- data/lib/aspera/cli/plugins/console.rb +62 -0
- data/lib/aspera/cli/plugins/cos.rb +106 -0
- data/lib/aspera/cli/plugins/faspex.rb +377 -0
- data/lib/aspera/cli/plugins/faspex5.rb +93 -0
- data/lib/aspera/cli/plugins/node.rb +438 -0
- data/lib/aspera/cli/plugins/oncloud.rb +937 -0
- data/lib/aspera/cli/plugins/orchestrator.rb +169 -0
- data/lib/aspera/cli/plugins/preview.rb +464 -0
- data/lib/aspera/cli/plugins/server.rb +216 -0
- data/lib/aspera/cli/plugins/shares.rb +63 -0
- data/lib/aspera/cli/plugins/shares2.rb +114 -0
- data/lib/aspera/cli/plugins/sync.rb +65 -0
- data/lib/aspera/cli/plugins/xnode.rb +115 -0
- data/lib/aspera/cli/transfer_agent.rb +251 -0
- data/lib/aspera/cli/version.rb +5 -0
- data/lib/aspera/colors.rb +39 -0
- data/lib/aspera/command_line_builder.rb +137 -0
- data/lib/aspera/fasp/aoc.rb +24 -0
- data/lib/aspera/fasp/connect.rb +99 -0
- data/lib/aspera/fasp/error.rb +21 -0
- data/lib/aspera/fasp/error_info.rb +60 -0
- data/lib/aspera/fasp/http_gw.rb +81 -0
- data/lib/aspera/fasp/installation.rb +240 -0
- data/lib/aspera/fasp/listener.rb +11 -0
- data/lib/aspera/fasp/local.rb +377 -0
- data/lib/aspera/fasp/manager.rb +69 -0
- data/lib/aspera/fasp/node.rb +88 -0
- data/lib/aspera/fasp/parameters.rb +235 -0
- data/lib/aspera/fasp/resume_policy.rb +76 -0
- data/lib/aspera/fasp/uri.rb +51 -0
- data/lib/aspera/faspex_gw.rb +196 -0
- data/lib/aspera/hash_ext.rb +28 -0
- data/lib/aspera/log.rb +80 -0
- data/lib/aspera/nagios.rb +71 -0
- data/lib/aspera/node.rb +14 -0
- data/lib/aspera/oauth.rb +319 -0
- data/lib/aspera/on_cloud.rb +421 -0
- data/lib/aspera/open_application.rb +72 -0
- data/lib/aspera/persistency_action_once.rb +42 -0
- data/lib/aspera/persistency_folder.rb +91 -0
- data/lib/aspera/preview/file_types.rb +300 -0
- data/lib/aspera/preview/generator.rb +258 -0
- data/lib/aspera/preview/image_error.png +0 -0
- data/lib/aspera/preview/options.rb +35 -0
- data/lib/aspera/preview/utils.rb +131 -0
- data/lib/aspera/preview/video_error.png +0 -0
- data/lib/aspera/proxy_auto_config.erb.js +287 -0
- data/lib/aspera/proxy_auto_config.rb +34 -0
- data/lib/aspera/rest.rb +296 -0
- data/lib/aspera/rest_call_error.rb +13 -0
- data/lib/aspera/rest_error_analyzer.rb +98 -0
- data/lib/aspera/rest_errors_aspera.rb +58 -0
- data/lib/aspera/ssh.rb +53 -0
- data/lib/aspera/sync.rb +82 -0
- data/lib/aspera/temp_file_manager.rb +37 -0
- data/lib/aspera/uri_reader.rb +25 -0
- metadata +288 -0
Binary file
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module Aspera
|
2
|
+
module Preview
|
3
|
+
# generator options. Used as parameter to preview generator object.
|
4
|
+
# also settable by command line.
|
5
|
+
class Options
|
6
|
+
# types of generation for video files
|
7
|
+
VIDEO_CONVERSION_METHODS=[:reencode,:blend,:clips]
|
8
|
+
VIDEO_THUMBNAIL_METHODS=[:fixed,:animated]
|
9
|
+
# options used in generator
|
10
|
+
# for scaling see: https://trac.ffmpeg.org/wiki/Scaling
|
11
|
+
# iw/ih : input width or height
|
12
|
+
# -x : keep aspect ratio, having value a multiple of x
|
13
|
+
DESCRIPTIONS = [
|
14
|
+
{ name: :max_size, default: 1<<24, description: "maximum size (in bytes) of preview file" },
|
15
|
+
{ name: :thumb_vid_scale, default: "-1:'min(ih,100)'", description: "png: video: size (ffmpeg scale argument)" },
|
16
|
+
{ name: :thumb_vid_fraction, default: 0.1, description: "png: video: position of snapshot" },
|
17
|
+
{ name: :thumb_img_size, default: 800, description: "png: non-video: height (and width)" },
|
18
|
+
{ name: :video_conversion, default: :reencode, description: "mp4: method for preview generation", :values => VIDEO_CONVERSION_METHODS },
|
19
|
+
{ name: :video_png_conv, default: :fixed, description: "mp4: method for thumbnail generation", :values => VIDEO_THUMBNAIL_METHODS },
|
20
|
+
{ name: :video_start_sec, default: 10, description: "mp4: start offset (seconds) of video preview" },
|
21
|
+
{ name: :video_scale, default: "'min(iw,360)':-2", description: "mp4: video scale (ffmpeg)" },
|
22
|
+
{ name: :blend_keyframes, default: 30, description: "mp4: blend: # key frames" },
|
23
|
+
{ name: :blend_pauseframes, default: 3, description: "mp4: blend: # pause frames" },
|
24
|
+
{ name: :blend_transframes, default: 5, description: "mp4: blend: # transition blend frames" },
|
25
|
+
{ name: :blend_fps, default: 15, description: "mp4: blend: frame per second" },
|
26
|
+
{ name: :clips_count, default: 5, description: "mp4: clips: number of clips" },
|
27
|
+
{ name: :clips_length, default: 5, description: "mp4: clips: length in seconds of each clips" },
|
28
|
+
]
|
29
|
+
# add accessors
|
30
|
+
DESCRIPTIONS.each do |opt|
|
31
|
+
attr_accessor opt[:name]
|
32
|
+
end
|
33
|
+
end # Options
|
34
|
+
end # Preview
|
35
|
+
end # Aspera
|
@@ -0,0 +1,131 @@
|
|
1
|
+
require 'tmpdir'
|
2
|
+
require 'fileutils'
|
3
|
+
require 'aspera/log'
|
4
|
+
require 'open3'
|
5
|
+
|
6
|
+
module Aspera
|
7
|
+
module Preview
|
8
|
+
class Utils
|
9
|
+
# from bash manual: meta-character need to be escaped
|
10
|
+
BASH_SPECIAL_CHARACTERS="|&;()<> \t#\n"
|
11
|
+
# shell exit code when command is not found
|
12
|
+
BASH_EXIT_NOT_FOUND=127
|
13
|
+
# external binaries used
|
14
|
+
EXPERNAL_TOOLS=[:ffmpeg,:ffprobe,:convert,:composite,:optipng,:unoconv]
|
15
|
+
private_constant :BASH_SPECIAL_CHARACTERS,:BASH_EXIT_NOT_FOUND,:EXPERNAL_TOOLS
|
16
|
+
|
17
|
+
# returns string with single quotes suitable for bash if there is any bash metacharacter
|
18
|
+
def self.shell_quote(argument)
|
19
|
+
return argument unless argument.split('').any?{|c|BASH_SPECIAL_CHARACTERS.include?(c)}
|
20
|
+
return "'"+argument.gsub(/'/){|s| "'\"'\"'"}+"'"
|
21
|
+
end
|
22
|
+
|
23
|
+
# check that external tools can be executed
|
24
|
+
def self.check_tools(skip_types=[])
|
25
|
+
EXPERNAL_TOOLS.delete(:unoconv) if skip_types.include?(:office)
|
26
|
+
# Check for binaries
|
27
|
+
EXPERNAL_TOOLS.map{|i|i.to_s}.each do |bin|
|
28
|
+
`#{bin} -h 2>&1`
|
29
|
+
raise "Error: #{bin} is not in the PATH" if $?.exitstatus.eql?(BASH_EXIT_NOT_FOUND)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
# execute external command
|
34
|
+
# one could use "system", but we would need to redirect stdout/err
|
35
|
+
# @return true if su
|
36
|
+
def self.external_command(command_symb,command_args,stdout_return=nil)
|
37
|
+
raise "unexpected command #{command_symb}" unless EXPERNAL_TOOLS.include?(command_symb)
|
38
|
+
# build command line, and quote special characters
|
39
|
+
command=command_args.clone.unshift(command_symb).map{|i| shell_quote(i.to_s)}.join(' ')
|
40
|
+
Log.log.debug("cmd=#{command}".blue)
|
41
|
+
# capture3: only in ruby2+
|
42
|
+
if Open3.respond_to?('capture3') then
|
43
|
+
stdout, stderr, exit_status = Open3.capture3(command)
|
44
|
+
else
|
45
|
+
stderr='<merged with stdout>'
|
46
|
+
stdout=%x[#{command} 2>&1]
|
47
|
+
exit_status=$?
|
48
|
+
end
|
49
|
+
if BASH_EXIT_NOT_FOUND.eql?(exit_status)
|
50
|
+
raise "Error: #{bin} is not in the PATH"
|
51
|
+
end
|
52
|
+
unless exit_status.success?
|
53
|
+
Log.log.error("commandline: #{command}")
|
54
|
+
Log.log.error("Error code: #{exit_status}")
|
55
|
+
Log.log.error("stdout: #{stdout}")
|
56
|
+
Log.log.error("stderr: #{stderr}")
|
57
|
+
raise "command returned error"
|
58
|
+
end
|
59
|
+
stdout_return.replace(stdout) unless stdout_return.nil?
|
60
|
+
return exit_status.success?
|
61
|
+
end
|
62
|
+
|
63
|
+
def self.ffmpeg(a)
|
64
|
+
raise "error: hash expected" unless a.is_a?(Hash)
|
65
|
+
#input_file,input_args,output_file,output_args
|
66
|
+
a[:gl_p]||=[
|
67
|
+
'-y', # overwrite output without asking
|
68
|
+
'-loglevel','error', # show only errors and up]
|
69
|
+
]
|
70
|
+
a[:in_p]||=[]
|
71
|
+
a[:out_p]||=[]
|
72
|
+
raise "wrong params (#{a.keys.sort})" unless [:gl_p, :in_f, :in_p, :out_f, :out_p].eql?(a.keys.sort)
|
73
|
+
external_command(:ffmpeg,[a[:gl_p],a[:in_p],'-i',a[:in_f],a[:out_p],a[:out_f]].flatten)
|
74
|
+
end
|
75
|
+
|
76
|
+
def self.video_get_duration(input_file)
|
77
|
+
result = String.new
|
78
|
+
external_command(:ffprobe,[
|
79
|
+
'-loglevel','error',
|
80
|
+
'-show_entries','format=duration',
|
81
|
+
'-print_format','default=noprint_wrappers=1:nokey=1',
|
82
|
+
input_file],result)
|
83
|
+
result.to_f
|
84
|
+
end
|
85
|
+
|
86
|
+
TMPFMT='img%04d.jpg'
|
87
|
+
|
88
|
+
def self.ffmpeg_fmt(temp_folder)
|
89
|
+
return File.join(temp_folder,TMPFMT)
|
90
|
+
end
|
91
|
+
|
92
|
+
def self.get_tmp_num_filepath(temp_folder, file_number)
|
93
|
+
return File.join(temp_folder,sprintf(TMPFMT,file_number))
|
94
|
+
end
|
95
|
+
|
96
|
+
def self.video_dupe_frame(temp_folder, index, count)
|
97
|
+
input_file=get_tmp_num_filepath(temp_folder,index)
|
98
|
+
1.upto(count) do |i|
|
99
|
+
FileUtils.ln_s(input_file,get_tmp_num_filepath(temp_folder,index+i))
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
def self.video_blend_frames(temp_folder, index1, index2)
|
104
|
+
img1=get_tmp_num_filepath(temp_folder,index1)
|
105
|
+
img2=get_tmp_num_filepath(temp_folder,index2)
|
106
|
+
count=index2-index1-1
|
107
|
+
1.upto(count) do |i|
|
108
|
+
percent = 100 * i / (count + 1)
|
109
|
+
filename = get_tmp_num_filepath(temp_folder, index1 + i)
|
110
|
+
external_command(:composite,['-blend',percent,img2,img1,filename])
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
def self.video_dump_frame(input_file, offset_seconds, scale, output_file, index=nil)
|
115
|
+
output_file=get_tmp_num_filepath(output_file,index) unless index.nil?
|
116
|
+
ffmpeg(
|
117
|
+
in_f: input_file,
|
118
|
+
in_p: ['-ss',offset_seconds],
|
119
|
+
out_f: output_file,
|
120
|
+
out_p: ['-frames:v',1,'-filter:v',"scale=#{scale}"])
|
121
|
+
return output_file
|
122
|
+
end
|
123
|
+
|
124
|
+
def message_to_png(message)
|
125
|
+
# convert -size 400x -background '#666666' -fill '#ffffff' -interword-spacing 10 -kerning 4 -pointsize 10 -gravity West -size x22 label:"Lorem dolor sit amet" -flatten xxx.png
|
126
|
+
external_command(:convert,[
|
127
|
+
])
|
128
|
+
end
|
129
|
+
end # Options
|
130
|
+
end # Preview
|
131
|
+
end # Aspera
|
Binary file
|
@@ -0,0 +1,287 @@
|
|
1
|
+
// inspired by PACSuppport.js, 2003-2004 by Apple Computer, Inc., all rights reserved
|
2
|
+
function dnsResolve(host) {
|
3
|
+
if (host == '<%=context_host%>' || host == '<%=context_ip%>')
|
4
|
+
return '<%=context_ip%>';
|
5
|
+
throw 'only DNS for initial host, not '+host;
|
6
|
+
}
|
7
|
+
function myIpAddress() {
|
8
|
+
return '<%=context_self%>';
|
9
|
+
}
|
10
|
+
function isPlainHostName(host) {
|
11
|
+
return (host.indexOf('.') == -1 ? true : false);
|
12
|
+
}
|
13
|
+
function dnsDomainIs(host, domain) {
|
14
|
+
var h = host.toLowerCase();
|
15
|
+
var d = domain.toLowerCase();
|
16
|
+
var sub = h.substring(h.length - d.length, h.length);
|
17
|
+
if (sub == d)
|
18
|
+
return true;
|
19
|
+
return false;
|
20
|
+
}
|
21
|
+
function localHostOrDomainIs(host, hostdom) {
|
22
|
+
var h1 = host.toLowerCase();
|
23
|
+
var h2 = hostdom.toLowerCase();
|
24
|
+
return ((h1 == h2) || (isPlainHostName(h1) & !isPlainHostName(h2))) ? true : false;
|
25
|
+
}
|
26
|
+
function isResolvable(host) {
|
27
|
+
var ip = dnsResolve(host);
|
28
|
+
return ((typeof ip == "string") && ip.length) ? true : false;
|
29
|
+
}
|
30
|
+
function isInNet(host, pattern, mask) {
|
31
|
+
var ip = dnsResolve(host);
|
32
|
+
if (ip) {
|
33
|
+
var p = pattern.split('.');
|
34
|
+
var m = mask.split('.');
|
35
|
+
var a = ip.split('.');
|
36
|
+
if ((p.length == m.length) && (m.length == a.length)) {
|
37
|
+
for (i = 0; i < p.length; i++) {
|
38
|
+
if ((p[i]& m[i]) != (m[i]& a[i]))
|
39
|
+
return false;
|
40
|
+
}
|
41
|
+
return true;
|
42
|
+
}
|
43
|
+
}
|
44
|
+
return false;
|
45
|
+
}
|
46
|
+
function dnsDomainLevels(host) {
|
47
|
+
var parts = host.split('.');
|
48
|
+
return parts.length - 1;
|
49
|
+
}
|
50
|
+
function shExpMatch(str, shexp) {
|
51
|
+
if (typeof str != "string" || typeof shexp != "string")
|
52
|
+
return false;
|
53
|
+
if (shexp == "*")
|
54
|
+
return true;
|
55
|
+
if (str == "" && shexp == "")
|
56
|
+
return true;
|
57
|
+
str = str.toLowerCase();
|
58
|
+
shexp = shexp.toLowerCase();
|
59
|
+
var len = str.length;
|
60
|
+
var pieces = shexp.split('*');
|
61
|
+
var start = 0;
|
62
|
+
for (i = 0; i < pieces.length; i++) {
|
63
|
+
if (pieces[i] == "")
|
64
|
+
continue;
|
65
|
+
if (start > len)
|
66
|
+
return false;
|
67
|
+
start = str.indexOf(pieces[i]);
|
68
|
+
if (start == -1)
|
69
|
+
return false;
|
70
|
+
start += pieces[i].length;
|
71
|
+
str = str.substring(start, len);
|
72
|
+
len = str.length;
|
73
|
+
}
|
74
|
+
i--;
|
75
|
+
if ((pieces[i] == "") || (str == ""))
|
76
|
+
return true;
|
77
|
+
return false;
|
78
|
+
}
|
79
|
+
function weekdayRange(wd1, wd2, gmt) {
|
80
|
+
var today = new Date();
|
81
|
+
var days = "SUNMONTUEWEDTHUFRISAT";
|
82
|
+
wd1 = wd1.toUpperCase();
|
83
|
+
if (wd2 == undefined)
|
84
|
+
wd2 = wd1;
|
85
|
+
else
|
86
|
+
wd2 = wd2.toUpperCase();
|
87
|
+
var d1 = days.indexOf(wd1);
|
88
|
+
var d2 = days.indexOf(wd2);
|
89
|
+
if ((d2 == -1) && (wd2 == "GMT")) {
|
90
|
+
gmt = wd2;
|
91
|
+
d2 = d1;
|
92
|
+
}
|
93
|
+
if ((d1 == -1) || (d2 == -1))
|
94
|
+
return false;
|
95
|
+
d1 = d1 / 3;
|
96
|
+
d2 = d2 / 3;
|
97
|
+
if (gmt == "GMT")
|
98
|
+
today = today.getUTCDay();
|
99
|
+
else
|
100
|
+
today = today.getDay();
|
101
|
+
if ((d1 <= d2) && (today >= d1) && (today <= d2))
|
102
|
+
return true;
|
103
|
+
if ((d2 < d1) && ((today <= d2) || (today >= d1)))
|
104
|
+
return true;
|
105
|
+
return false;
|
106
|
+
}
|
107
|
+
function dateRange() {
|
108
|
+
var today = new Date();
|
109
|
+
var num = arguments.length;
|
110
|
+
var gmt = arguments[num - 1];
|
111
|
+
if (typeof gmt != "string")
|
112
|
+
gmt = false;
|
113
|
+
else {
|
114
|
+
gmt = gmt.toUpperCase();
|
115
|
+
if (gmt != "GMT")
|
116
|
+
gmt = false;
|
117
|
+
else {
|
118
|
+
gmt = true;
|
119
|
+
num--;
|
120
|
+
}
|
121
|
+
}
|
122
|
+
if (!num || (num > 6))
|
123
|
+
return false;
|
124
|
+
var d1 = 0;
|
125
|
+
var d2 = 0;
|
126
|
+
var m1 = 0;
|
127
|
+
var m2 = 0;
|
128
|
+
var y1 = 0;
|
129
|
+
var y2 = 0;
|
130
|
+
for (i = 0; i < num; i++) {
|
131
|
+
var arg = arguments[i];
|
132
|
+
if (typeof arg == "number") {
|
133
|
+
if (arg > 31) {
|
134
|
+
if (!y1)
|
135
|
+
y1 = arg;
|
136
|
+
else if (!y2)
|
137
|
+
y2 = arg;
|
138
|
+
else
|
139
|
+
return false;
|
140
|
+
}
|
141
|
+
else if (!arg)
|
142
|
+
return false;
|
143
|
+
else if (!d1)
|
144
|
+
d1 = arg;
|
145
|
+
else if (!d2)
|
146
|
+
d2 = arg;
|
147
|
+
else
|
148
|
+
return false;
|
149
|
+
}
|
150
|
+
else if (typeof arg == "string") {
|
151
|
+
var months = "JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC";
|
152
|
+
arg = arg.toUpperCase();
|
153
|
+
arg = months.indexOf(arg);
|
154
|
+
if (arg == -1)
|
155
|
+
return false;
|
156
|
+
arg /= 3;
|
157
|
+
arg += 1;
|
158
|
+
if (!m1)
|
159
|
+
m1 = arg;
|
160
|
+
else if (!m2)
|
161
|
+
m2 = arg;
|
162
|
+
else
|
163
|
+
return false;
|
164
|
+
}
|
165
|
+
else
|
166
|
+
return false;
|
167
|
+
}
|
168
|
+
if (!y1) y1 = gmt ? today.getUTCFullYear() : today.getFullYear();
|
169
|
+
if (!y2) y2 = y1;
|
170
|
+
if (!m1) m1 = (gmt ? today.getUTCMonth() : today.getMonth()) + 1;
|
171
|
+
if (!m2) m2 = m1;
|
172
|
+
if (!d1) d1 = gmt ? today.getUTCDate() : today.getDate();
|
173
|
+
if (!d2) d2 = d1;
|
174
|
+
var date1;
|
175
|
+
var date2;
|
176
|
+
if (gmt) {
|
177
|
+
date1 = Date.UTC(y1, m1 - 1, d1, 0, 0, 0, 0);
|
178
|
+
date2 = Date.UTC(y2, m2 - 1, d2, 23, 59, 59, 999);
|
179
|
+
}
|
180
|
+
else {
|
181
|
+
date1 = (Date(y1, m1 - 1, d1, 0, 0, 0, 0)).valueOf();
|
182
|
+
date2 = (Date(y2, m2 - 1, d2, 23, 59, 59, 999)).valueOf();
|
183
|
+
}
|
184
|
+
today = today.valueOf();
|
185
|
+
return ((date1 <= today) && (today <= date2));
|
186
|
+
}
|
187
|
+
function timeRange() {
|
188
|
+
var date1 = new Date();
|
189
|
+
var today = new Date();
|
190
|
+
var date2 = new Date();
|
191
|
+
var num = arguments.length;
|
192
|
+
var gmt = arguments[num - 1];
|
193
|
+
if (typeof gmt != "string")
|
194
|
+
gmt = false;
|
195
|
+
else {
|
196
|
+
gmt = gmt.toUpperCase();
|
197
|
+
if (gmt != "GMT")
|
198
|
+
gmt = false;
|
199
|
+
else {
|
200
|
+
gmt = true;
|
201
|
+
num--;
|
202
|
+
}
|
203
|
+
}
|
204
|
+
if (!num || (num > 6) || ((num % 2) && (num != 1)))
|
205
|
+
return false;
|
206
|
+
date1.setMinutes(0);
|
207
|
+
date1.setSeconds(0);
|
208
|
+
date1.setMilliseconds(0);
|
209
|
+
date2.setMinutes(59);
|
210
|
+
date2.setSeconds(59);
|
211
|
+
date2.setMilliseconds(999);
|
212
|
+
for (i = 0; i < (num / 2); i++) {
|
213
|
+
var arg = arguments[i];
|
214
|
+
if (gmt) {
|
215
|
+
switch (i) {
|
216
|
+
case 0:
|
217
|
+
date1.setUTCHours(arg);
|
218
|
+
date2.setUTCHours(arg);
|
219
|
+
break;
|
220
|
+
case 1:
|
221
|
+
date1.setUTCMinutes(arg);
|
222
|
+
date2.setUTCMinutes(arg);
|
223
|
+
break;
|
224
|
+
case 2:
|
225
|
+
date1.setUTCSeconds(arg);
|
226
|
+
date2.setUTCSeconds(arg);
|
227
|
+
break;
|
228
|
+
}
|
229
|
+
}
|
230
|
+
else {
|
231
|
+
switch (i) {
|
232
|
+
case 0:
|
233
|
+
date1.setHours(arg);
|
234
|
+
date2.setHours(arg);
|
235
|
+
break;
|
236
|
+
case 1:
|
237
|
+
date1.setMinutes(arg);
|
238
|
+
date2.setMinutes(arg);
|
239
|
+
break;
|
240
|
+
case 2:
|
241
|
+
date1.setSeconds(arg);
|
242
|
+
date2.setSeconds(arg);
|
243
|
+
break;
|
244
|
+
}
|
245
|
+
}
|
246
|
+
}
|
247
|
+
if (num != 1) {
|
248
|
+
date2.setMinutes(0);
|
249
|
+
date2.setSeconds(0);
|
250
|
+
date2.setMilliseconds(0);
|
251
|
+
for (i = 0; i < (num / 2); i++) {
|
252
|
+
var arg = arguments[(num / 2) + i];
|
253
|
+
if (gmt) {
|
254
|
+
switch (i) {
|
255
|
+
case 0:
|
256
|
+
date2.setUTCHours(arg);
|
257
|
+
break;
|
258
|
+
case 1:
|
259
|
+
date2.setUTCMinutes(arg);
|
260
|
+
break;
|
261
|
+
case 2:
|
262
|
+
date2.setUTCSeconds(arg);
|
263
|
+
break;
|
264
|
+
}
|
265
|
+
}
|
266
|
+
else {
|
267
|
+
switch (i) {
|
268
|
+
case 0:
|
269
|
+
date2.setHours(arg);
|
270
|
+
break;
|
271
|
+
case 1:
|
272
|
+
date2.setMinutes(arg);
|
273
|
+
break;
|
274
|
+
case 2:
|
275
|
+
date2.setSeconds(arg);
|
276
|
+
break;
|
277
|
+
}
|
278
|
+
}
|
279
|
+
}
|
280
|
+
}
|
281
|
+
today = today.valueOf();
|
282
|
+
date1 = date1.valueOf();
|
283
|
+
date2 = date2.valueOf();
|
284
|
+
if (date2 < date1)
|
285
|
+
date2 += 86400000;
|
286
|
+
return ((date1 <= today) && (today <= date2));
|
287
|
+
}
|