uwa_download 0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,29 @@
1
+ require 'uwa'
2
+ require 'fileutils'
3
+ require 'net/http'
4
+
5
+ module UWA
6
+ module Widget
7
+ class Download < UWA::Handler
8
+ NAME = 'uwa_download'
9
+ VERSION = '0.1'
10
+ COPYRIGHT = 'Copyright (C) 2007 Florent Solt'
11
+ DESC = 'UWA Download widget'
12
+ AUTHOR = 'Florent Solt'
13
+ EMAIL = 'florent@solt.biz'
14
+ HOMEPAGE = 'http://gnetvibes.rubyforge.org'
15
+ LICENSE = 'BSD'
16
+ end
17
+ end
18
+ end
19
+
20
+ # Network buffer increase from 1024 to 4096
21
+ module Net
22
+ class BufferedIO
23
+ private
24
+
25
+ def rbuf_fill
26
+ timeout(@read_timeout) { @rbuf << @io.sysread(0x1000) }
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,64 @@
1
+ require 'uwa_download/config'
2
+
3
+ module UWA
4
+ module Widget
5
+ class Download
6
+
7
+ def initialize
8
+ super
9
+ @author = AUTHOR
10
+ @title = 'Download'
11
+ @threads = []
12
+ @destination = "/tmp/download"
13
+ @icon = "http://www.netvibes.com/img/icons/world.gif"
14
+ @bin = '/usr/bin/aria2c'
15
+ @args = '--allow-overwrite=true --log=/dev/null --listen-port=42066 --max-upload-limit=20K'
16
+ end
17
+
18
+ def download
19
+ start(@query['uri'].strip)
20
+ monitor
21
+ end
22
+
23
+ def monitor
24
+ @threads.delete_if { |t| !t.status }
25
+ self << JSON.unparse(@threads.collect do |t|
26
+ [
27
+ t[:download][:name],
28
+ t[:download][:percent] || 0,
29
+ t[:download][:speed] || 0
30
+ ]
31
+ end)
32
+ end
33
+
34
+ private
35
+
36
+ def start(uri)
37
+ FileUtils.mkdir_p @destination
38
+ @threads << Thread.start do
39
+ begin
40
+ Thread.current[:download] = {}
41
+ Thread.current[:download][:name] = File.basename(uri)
42
+ fd = IO.popen("#{@bin} #{@args} --dir='#{@destination}' '#{uri}'")
43
+ loop do
44
+ select([fd], nil, nil)
45
+ buf = fd.sysread(0x1000).strip
46
+ percent = buf[/\d+%/]
47
+ Thread.current[:download][:percent] = percent.to_i unless percent.nil?
48
+ speed = buf[/\d+\.\d+ KB\/s/]
49
+ speed = buf[/D:\d+\.\d+ U:\d+\.\d+/] if speed.nil?
50
+ Thread.current[:download][:speed] = speed unless speed.nil?
51
+ end
52
+ rescue EOFError
53
+ fd.close
54
+ Thread.current[:download][:percent] = 100
55
+ UWA::Server.log(:download, "Finished #{uri.inspect}")
56
+ rescue Exception
57
+ UWA::Server.log(:download, "Error with #{uri.inspect} (#{$!.message})")
58
+ UWA::Server.log(:error, $!.backtrace)
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,36 @@
1
+ widget.input = widget.createElement('input');
2
+ widget.input.type = 'text';
3
+ widget.input.className = 'uwa_input';
4
+ widget.input.onkeyup = function(ev) {
5
+ if (ev.keyCode == 13) {
6
+ widget.remoteJson('download?uri=' + encodeURIComponent(widget.input.value), widget.onMonitor);
7
+ widget.input.value = '';
8
+ }
9
+ }
10
+ widget.monitor = widget.createElement('ul');
11
+ widget.monitor.className = 'uwa_monitor';
12
+
13
+ widget.onLoad = function() {
14
+ widget.body.empty();
15
+ widget.body.appendChild(widget.input);
16
+ widget.body.appendChild(widget.monitor);
17
+ widget.remoteJson('monitor', widget.onMonitor);
18
+ }
19
+
20
+ widget.onRefresh = function() {
21
+ widget.remoteJson('monitor', widget.onMonitor);
22
+ }
23
+
24
+ widget.onMonitor = function(values) {
25
+ widget.monitor.empty();
26
+ if (values.length > 0) {
27
+ widget.setAutoRefresh(1);
28
+ } else {
29
+ widget.clearPeriodical('autoRefresh');
30
+ }
31
+ for (var i=0; i<values.length; i++) {
32
+ var li = widget.createElement('li');
33
+ li.appendText(values[i][0] + ' - ' + values[i][1] + '% - ' + values[i][2]);
34
+ widget.monitor.appendChild(li);
35
+ }
36
+ }
@@ -0,0 +1,21 @@
1
+ .uwa_input {
2
+ background-image: url(http://www.netvibes.com/img/icons/attach.gif);
3
+ background-position: left center;
4
+ background-repeat: no-repeat;
5
+ width: 80%;
6
+ padding-left: 20px;
7
+ margin: auto;
8
+ display: block;
9
+ border: 1px solid #999;
10
+ padding-top: 2px;
11
+ padding-bottom: 2px;
12
+ margin-bottom: 4px;
13
+ }
14
+
15
+ .uwa_monitor LI {
16
+ background-image: url(http://www.netvibes.com/img/icons/page_white.gif);
17
+ background-position: left center;
18
+ background-repeat: no-repeat;
19
+ padding-left: 20px;
20
+ line-height: 18px;
21
+ }
metadata ADDED
@@ -0,0 +1,57 @@
1
+ --- !ruby/object:Gem::Specification
2
+ rubygems_version: 0.9.2
3
+ specification_version: 1
4
+ name: uwa_download
5
+ version: !ruby/object:Gem::Version
6
+ version: "0.1"
7
+ date: 2007-04-06 00:00:00 +02:00
8
+ summary: UWA Download widget
9
+ require_paths:
10
+ - lib
11
+ email: florent@solt.biz
12
+ homepage: http://gnetvibes.rubyforge.org
13
+ rubyforge_project:
14
+ description:
15
+ autorequire:
16
+ default_executable:
17
+ bindir: bin
18
+ has_rdoc: false
19
+ required_ruby_version: !ruby/object:Gem::Version::Requirement
20
+ requirements:
21
+ - - ">"
22
+ - !ruby/object:Gem::Version
23
+ version: 0.0.0
24
+ version:
25
+ platform: ruby
26
+ signing_key:
27
+ cert_chain:
28
+ post_install_message:
29
+ authors:
30
+ - Florent Solt
31
+ files:
32
+ - lib/uwa_download/config.rb
33
+ - lib/uwa_download/widget.rb
34
+ - resources/script.js
35
+ - resources/style.css
36
+ test_files: []
37
+
38
+ rdoc_options: []
39
+
40
+ extra_rdoc_files: []
41
+
42
+ executables: []
43
+
44
+ extensions: []
45
+
46
+ requirements: []
47
+
48
+ dependencies:
49
+ - !ruby/object:Gem::Dependency
50
+ name: uwa
51
+ version_requirement:
52
+ version_requirements: !ruby/object:Gem::Version::Requirement
53
+ requirements:
54
+ - - ">"
55
+ - !ruby/object:Gem::Version
56
+ version: 0.0.0
57
+ version: