aniview 1.3.0 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (38) hide show
  1. checksums.yaml +4 -4
  2. data/bin/aniview +2 -3
  3. data/lib/aniview.rb +50 -243
  4. data/lib/aniview/client/aniclient.rb +111 -53
  5. data/lib/aniview/interface/animeio/animefile.rb +73 -64
  6. data/lib/aniview/interface/animeio/animeio.rb +184 -181
  7. data/lib/aniview/interface/animeio/animeseries.rb +53 -48
  8. data/lib/aniview/interface/deluge/delugec.rb +158 -153
  9. data/lib/aniview/interface/deluge/torrentitem.rb +21 -16
  10. data/lib/aniview/interface/item.rb +21 -17
  11. data/lib/aniview/interface/mpv/mpvbridge.rb +78 -73
  12. data/lib/aniview/interface/pref/pref.rb +135 -132
  13. data/lib/aniview/interface/pref/prefitem.rb +16 -15
  14. data/lib/aniview/interface/schedule/schedule.rb +89 -83
  15. data/lib/aniview/interface/schedule/scheduleitem.rb +54 -51
  16. data/lib/aniview/interface/subscription/subscription.rb +111 -108
  17. data/lib/aniview/util/term.rb +39 -36
  18. data/lib/aniview/util/util.rb +149 -0
  19. data/lib/aniview/view/aiomenu.rb +68 -63
  20. data/lib/aniview/view/color.rb +69 -67
  21. data/lib/aniview/view/delugemenu.rb +44 -40
  22. data/lib/aniview/view/menu.rb +281 -286
  23. data/lib/aniview/view/prefmenu.rb +36 -34
  24. data/lib/aniview/view/schedulemenu.rb +32 -29
  25. data/lib/aniview/view/statusline.rb +19 -14
  26. data/lib/aniview/view/subscriptionmenu.rb +35 -32
  27. data/lib/application.rb +260 -0
  28. data/lib/daemon.rb +174 -0
  29. metadata +5 -12
  30. data/bin/aniviewd +0 -20
  31. data/lib/aniview/util/alogger.rb +0 -18
  32. data/lib/aniview/util/command.rb +0 -25
  33. data/lib/aniview/util/format.rb +0 -123
  34. data/lib/aniview/util/online.rb +0 -12
  35. data/lib/aniview/util/serializer.rb +0 -19
  36. data/lib/aniview/util/stringhelp.rb +0 -50
  37. data/lib/aniview/view/emote.rb +0 -345
  38. data/lib/aniviewd.rb +0 -179
data/lib/daemon.rb ADDED
@@ -0,0 +1,174 @@
1
+ require 'thread'
2
+ require 'socket'
3
+ require 'warning'
4
+
5
+ Warning.ignore([:fixnum, :bignum])
6
+
7
+ require_relative 'aniview/interface/deluge/delugec'
8
+ require_relative 'aniview/interface/pref/pref'
9
+ require_relative 'aniview/interface/schedule/schedule'
10
+ require_relative 'aniview/interface/subscription/subscription'
11
+ require_relative 'aniview/client/aniclient'
12
+ require_relative 'aniview/util/util'
13
+
14
+ module Aniview
15
+ class Daemon
16
+
17
+ def initialize(args)
18
+
19
+ @pref = Interface::Pref.new
20
+ @c = Client::AniClient.new @pref
21
+
22
+ args << "start" if args.length < 1
23
+ parseArgs args
24
+
25
+ @schedule = Interface::Schedule.new @pref
26
+ @delugec = Interface::DelugeC.new(@pref)
27
+ @subscription = Interface::Subscription.new(@pref, @schedule, @delugec, @c)
28
+
29
+ begin
30
+ @s = TCPServer.new @pref.get("daemon")["port"]
31
+ rescue Errno::EADDRINUSE
32
+ puts "error, something is already listening on #{@pref.get("daemon")["port"]}, maybe the \nserver is already running?"
33
+ quit
34
+ end
35
+ @looped = 0
36
+ @matches = 0
37
+ @lastchecked = "never"
38
+
39
+ $stdout.reopen(@pref.parseDir(@pref.get("daemon_log_file")), "w")
40
+ $stderr.reopen(@pref.parseDir(@pref.get("daemon_log_file")), "w")
41
+ $stdout.sync = true
42
+ $stderr.sync = true
43
+
44
+ end
45
+
46
+ def parseArgs args
47
+ args.each { |a|
48
+ case a
49
+ when "help"
50
+ help
51
+ quit
52
+ when "start"
53
+ if @c.server?
54
+ puts "already running"
55
+ quit
56
+ end
57
+ when "stop"
58
+ if @c.server?
59
+ puts "quitting"
60
+ @c.stopDaemon
61
+ quit
62
+ else
63
+ puts "server isn't running"
64
+ quit
65
+ end
66
+ when "info"
67
+ if @c.server?
68
+ puts @c.info
69
+ quit
70
+ else
71
+ puts "server isn't running"
72
+ quit
73
+ end
74
+ when "up?"
75
+ puts @c.server?
76
+ quit
77
+ when "nani"
78
+ puts @c.sendMsg("what?")
79
+ quit
80
+ when "items"
81
+ p @c.getItems
82
+ quit
83
+ else
84
+ puts "unknown command, dude!"
85
+ quit
86
+ end
87
+ }
88
+ end
89
+
90
+ def help
91
+ cmds = ["help", "start", "stop", "info", "up?", "nani"]
92
+ puts "commands:"
93
+ puts cmds.sort
94
+ end
95
+
96
+ def checkFeeds
97
+ Thread.abort_on_exception = true
98
+ Thread.new do
99
+ while true
100
+ @subscription.updateFeed
101
+
102
+ if @subscription.feed == nil
103
+ @lastchecked = "offline"
104
+ else
105
+ @lastchecked = Time.now.to_s
106
+ @schedule.load
107
+ @matches += @subscription.matchAll(verbose: true)
108
+ end
109
+
110
+ #p @schedule.getAll
111
+ @looped += 1
112
+ sleep Integer(@pref.get("rss_feed")["refresh_interval"])
113
+ end
114
+ end
115
+ end
116
+
117
+ def quit
118
+ @checkThread.exit unless @checkThread == nil
119
+ exit
120
+ end
121
+
122
+ def uptime
123
+ Util.format_duration(Time.now - @started)
124
+ end
125
+
126
+ def run
127
+ puts "--------"
128
+ puts "server started"
129
+ puts "server listening on port " + @pref.get("daemon")["port"]
130
+
131
+ trap(:QUIT) do
132
+ quit
133
+ end
134
+
135
+ @checkThread = checkFeeds
136
+ @started = Time.now
137
+ loop do
138
+ lastloop = false
139
+ client = @s.accept
140
+
141
+ message = client.gets.chomp.split(" ")
142
+ puts "got msg #{message} from client"
143
+ response = "okay."
144
+
145
+ message.each_with_index { |m, i|
146
+ case m
147
+ when "up?"
148
+ response = "true"
149
+ when "quit"
150
+ lastloop = true
151
+ response = "quitting"
152
+ when "info"
153
+ response = "uptime: #{uptime}, loops: #{@looped}, matches, #{@matches}"
154
+ when "lastchecked"
155
+ response = @lastchecked
156
+ when "items"
157
+ response = Util.encode_object(@schedule.getAll)
158
+ when "itemshash"
159
+ response = @schedule.getAllCereal
160
+ else
161
+ response = "what?"
162
+ end
163
+ }
164
+
165
+ response += "\n"
166
+
167
+ puts "responding with #{response}"
168
+ client.puts response
169
+ client.close
170
+ quit if lastloop
171
+ end
172
+ end
173
+ end
174
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: aniview
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.0
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - annacrombie
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-06-01 00:00:00.000000000 Z
11
+ date: 2017-06-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: streamio-ffmpeg
@@ -134,7 +134,6 @@ description: Browse local anime, based on cmus
134
134
  email: meotleft@gmail.com
135
135
  executables:
136
136
  - aniview
137
- - aniviewd
138
137
  extensions: []
139
138
  extra_rdoc_files: []
140
139
  files:
@@ -154,25 +153,19 @@ files:
154
153
  - "./lib/aniview/interface/schedule/schedule.rb"
155
154
  - "./lib/aniview/interface/schedule/scheduleitem.rb"
156
155
  - "./lib/aniview/interface/subscription/subscription.rb"
157
- - "./lib/aniview/util/alogger.rb"
158
- - "./lib/aniview/util/command.rb"
159
- - "./lib/aniview/util/format.rb"
160
- - "./lib/aniview/util/online.rb"
161
- - "./lib/aniview/util/serializer.rb"
162
- - "./lib/aniview/util/stringhelp.rb"
163
156
  - "./lib/aniview/util/term.rb"
157
+ - "./lib/aniview/util/util.rb"
164
158
  - "./lib/aniview/view/aiomenu.rb"
165
159
  - "./lib/aniview/view/color.rb"
166
160
  - "./lib/aniview/view/delugemenu.rb"
167
- - "./lib/aniview/view/emote.rb"
168
161
  - "./lib/aniview/view/menu.rb"
169
162
  - "./lib/aniview/view/prefmenu.rb"
170
163
  - "./lib/aniview/view/schedulemenu.rb"
171
164
  - "./lib/aniview/view/statusline.rb"
172
165
  - "./lib/aniview/view/subscriptionmenu.rb"
173
- - "./lib/aniviewd.rb"
166
+ - "./lib/application.rb"
167
+ - "./lib/daemon.rb"
174
168
  - bin/aniview
175
- - bin/aniviewd
176
169
  homepage: https://github.com/annacrombie/aniview/
177
170
  licenses:
178
171
  - MIT
data/bin/aniviewd DELETED
@@ -1,20 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- begin
4
- require 'aniviewd'
5
- rescue LoadError
6
- require_relative '../lib/aniviewd' if File.exist?(File.join(File.dirname(__FILE__), '../lib/aniviewd.rb'))
7
- end
8
-
9
- unless defined? AniViewd
10
- puts "cant find aniviewd library"
11
- exit
12
- end
13
-
14
- av = AniViewd.new(ARGV)
15
-
16
- process = fork do
17
- av.run
18
- end
19
-
20
- Process.detach(process)
@@ -1,18 +0,0 @@
1
- class ALogger
2
-
3
- def initialize(file, overwrite = true)
4
-
5
- @logfile = file
6
- mode = "a"
7
- mode = "w" if overwrite
8
- open(@logfile, mode) { |f| f.puts "initialized..." }
9
-
10
- end
11
-
12
- def log(string)
13
-
14
- open(@logfile, 'a') { |f| f.puts "#{Time.now.to_s} #{string}" }
15
-
16
- end
17
-
18
- end
@@ -1,25 +0,0 @@
1
- require 'readline'
2
- require_relative '../view/color'
3
-
4
- class Command
5
- def self.read(term, prompt = "", default = "")
6
-
7
- term.bold.echo_on
8
-
9
- print "\033[" + String(term.rows) + ";1H" + Color.white
10
- term.show_cursor
11
-
12
- Readline.completion_append_character = ""
13
- Readline.pre_input_hook = -> do
14
- Readline.insert_text default
15
- Readline.redisplay
16
- Readline.pre_input_hook = nil
17
- end
18
-
19
- input = Readline.readline(prompt, false)
20
-
21
- term.hide_cursor.nobold.echo_off.clear
22
-
23
- return input
24
- end
25
- end
@@ -1,123 +0,0 @@
1
- class Format
2
- def self.format_duration v
3
- hours = Integer((v-(v%3600))/3600)
4
- minutes = Integer( ((v-(v%60))/60) - (hours * 60))
5
- seconds = Integer(v%60)
6
- seconds = "0" + String(seconds) if seconds < 10
7
- if hours < 1 and minutes < 1
8
- "0:#{seconds}"
9
- else
10
- if hours < 1
11
- return "#{String(minutes)}:#{String(seconds)}"
12
- else
13
- minutes = "0" + String(minutes) if minutes < 10
14
- return "#{String(hours)}:#{String(minutes)}:#{String(seconds)}"
15
- end
16
- end
17
- end
18
-
19
- def self.format_size s
20
- fs = Float(s)
21
-
22
- bytecount = {
23
- "TB" => 1000000000000.0,
24
- "GB" => 1000000000.0,
25
- "MB" => 1000000.0,
26
- "KB" => 1000.0,
27
- "B" => 1.0,
28
- }
29
- r = "TB"
30
- r = "GB" if s < bytecount["TB"]
31
- r = "MB" if s < bytecount["GB"]
32
- r = "KB" if s < bytecount["KB"]
33
-
34
- return String( Float(fs/bytecount[r] * 10.0 ).round / 10.0 ) + r
35
- end
36
-
37
- def self.format_progress p
38
- return "#{Integer(p)}.#{Integer(p * 10.0) % 10}"
39
- end
40
-
41
- def self.parse_format string, d, cols
42
- le = "\e[K\n"
43
-
44
- pstr = []
45
- add_to = ""
46
- buffer_char = []
47
-
48
- mode = "char"
49
-
50
- padding_collected = 0
51
-
52
- string.split('').each { |c|
53
-
54
- if mode == "e"
55
- add_to += String(c)
56
- mode = "char"
57
-
58
- elsif c == '%'
59
- mode = "%"
60
-
61
- elsif c == '$'
62
- mode = "$"
63
-
64
- elsif c == '@'
65
- pstr << add_to
66
- add_to = ""
67
- mode = "@"
68
-
69
- elsif c == "#"
70
- padding_collected += 1
71
-
72
- elsif c == "\\"
73
- mode = "e"
74
-
75
- elsif mode == "@"
76
- buffer_char << c
77
- mode = "char"
78
-
79
- elsif mode == "%"
80
- addstr = ""
81
- addstr = String(d[c]) if d.key?(c)
82
- ol = addstr.length
83
- addstr = " " + addstr while addstr.length < (ol + padding_collected)
84
- add_to += addstr
85
- mode = "char"
86
-
87
- elsif mode == "$"
88
- #add_to += String($emote[c]) if $emote.key?(c)
89
- mode = "char"
90
-
91
- else
92
- add_to += c
93
-
94
- end
95
- }
96
- pstr << add_to
97
-
98
- buffer_char << " " if buffer_char.length == 0
99
-
100
- midstr = ""
101
- tl = 0
102
- pstr.each{ |s| tl += s.length }
103
- buffer_space = 0
104
- buffer_space = (cols - tl) / (pstr.length - 1) if pstr.length > 1
105
-
106
- addl_space = (cols - tl) % pstr.length
107
-
108
- pstr.each_with_index{ |str, i|
109
- #buffer_space += addl_space if i == pstr.length - 2
110
- # p pstr.length
111
- # p pstr
112
-
113
- break if i == pstr.length - 1
114
- buffer_ = ""
115
- buffer_ = buffer_char[i] * buffer_space if buffer_space >= 0
116
-
117
- midstr += str + buffer_
118
- }
119
- midstr += pstr[pstr.length - 1]
120
-
121
- return midstr[0..cols-1]
122
- end
123
- end
@@ -1,12 +0,0 @@
1
- require 'net/ping'
2
-
3
- class Online
4
- def initialize
5
-
6
- end
7
-
8
- def up? host
9
- result = %x("ping -c 1 #{host} | grep received")
10
- end
11
-
12
- end
@@ -1,19 +0,0 @@
1
- require 'base64'
2
-
3
- class Serializer
4
-
5
- def self.e d
6
- Base64.strict_encode64(Marshal.dump d)
7
- end
8
-
9
- def self.d e
10
- begin
11
- Marshal.load(Base64.decode64(e))
12
- rescue ArgumentError
13
- {}
14
- rescue TypeError
15
- {}
16
- end
17
- end
18
-
19
- end