aniview 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 28e7f572e02fc282a0fad72f7309b120930838da
4
- data.tar.gz: 3acb283170492f2abf8d3fcb012250b5f5b3a190
3
+ metadata.gz: 2f84d93b24636a62d6ce22d1f9849091921c181c
4
+ data.tar.gz: a231335941b316bc5c11e1f65f92f2df6b413956
5
5
  SHA512:
6
- metadata.gz: 7d1b14652e56f0419711f6c4ad4299f83150f6d2799871ed8a4acaa33055604de8877532941de18d52309be69786678dc173ec275d3c499ac7e7bbf0b46468c2
7
- data.tar.gz: 25b773fb7c112579f96b2806caaaa006839cd8cfc610300b192cf72cecaf78e3beb3a4e2b789391d6e3b7593b3f38bdc8157715c25dbff4cced30c96753bacd6
6
+ metadata.gz: 7781cf1761ba7187e1f890e4be9d810e23a9e4c55983ae19df2a27af93215c7862898adfbc3af1d2dcfa2bd1d44037318479b92b9a180ae0d0317b92004247cb
7
+ data.tar.gz: a313caffe6a8a5c04d9501f91af855a194936f9af9a4699b904b223a4cf43c57585520d042485105592eb2f0c176751293567b118d5f22899c379b659138b5dc
@@ -10,12 +10,14 @@ Warning.ignore([:fixnum, :bignum])
10
10
  require_relative 'aniview/view/aiomenu'
11
11
  require_relative 'aniview/view/delugemenu'
12
12
  require_relative 'aniview/view/prefmenu'
13
+
13
14
  require_relative 'aniview/interface/animeio/animeio'
14
15
  require_relative 'aniview/interface/deluge/delugec'
15
16
  require_relative 'aniview/interface/pref/pref'
17
+ require_relative 'aniview/interface/rssfeed/rssfeed'
16
18
 
17
- require_relative 'aniview/util/command'
18
19
  require_relative 'aniview/util/alogger'
20
+ require_relative 'aniview/util/command'
19
21
  require_relative 'aniview/util/term'
20
22
 
21
23
  $stdout.sync = true
@@ -27,56 +29,37 @@ class AniView
27
29
 
28
30
  @pref = Pref.new
29
31
 
30
- @format_ = {
31
- "aiomenu_all" => {
32
- "title" => "anime_library_title_format_str",
33
- "parent" => "anime_library_title_show_format_str",
34
- "child" => "anime_library_title_episode_format_str",
35
- },
36
- "aiomenu_uw" => {
37
- "title" => "anime_library_unwatched_title_format_str",
38
- "parent" => "anime_library_unwatched_title_show_format_str",
39
- "child" => "anime_library_unwatched_title_episode_format_str",
40
- },
41
- "prefmenu" => {
42
- "title" => "preferences_title_format_str",
43
- "parent" => "preferences_item_format_str",
44
- },
45
- "delugemenu" => {
46
- "title" => "deluge_title_format_str",
47
- "parent" => "deluge_item_format_str",
48
- }
49
- }
50
-
51
32
  @aio = AnimeIO.new(@pref)
52
- @delugec = DelugeC.new()
53
- @l = ALogger.new(@pref.get "log_file")
33
+ @delugec = DelugeC.new(@pref)
34
+ #@rssfeed = RssFeed.new(@pref)
35
+ @l = ALogger.new(@pref.parseTilde(@pref.get "log_file"))
54
36
  @aiomenu = AioMenu.new(
55
- :getAll,
56
- @aio,
57
- @pref.get("menu_titles")["2"],
58
- @pref,
59
- @format_["aiomenu_all"],
60
- @term
37
+ refresh_function: :getAll,
38
+ interface: @aio,
39
+ name: @pref.get("menu_titles")["library"],
40
+ pref: @pref,
41
+ format: "format_library",
42
+ term: @term
61
43
  )
62
44
  @prefmenu = PrefMenu.new(
63
- :getAll,
64
- @pref,
65
- @pref.get("menu_titles")["0"],
66
- @pref,
67
- @format_["prefmenu"],
68
- @term
45
+ refresh_function: :getAll,
46
+ interface: @pref,
47
+ name: @pref.get("menu_titles")["preferences"],
48
+ pref: @pref,
49
+ format: "format_preferences",
50
+ term: @term,
51
+ children: false
69
52
  )
70
53
  @delugemenu = DelugeMenu.new(
71
- :getTorrents,
72
- @delugec,
73
- @pref.get("menu_titles")["7"],
74
- @pref,
75
- @format_["delugemenu"],
76
- @term
54
+ refresh_function: :getTorrents,
55
+ interface: @delugec,
56
+ name: @pref.get("menu_titles")["torrents"],
57
+ pref: @pref,
58
+ format: "format_torrents",
59
+ term: @term,
60
+ children: false
77
61
  )
78
62
 
79
-
80
63
  @term.save.hide_cursor.echo_off
81
64
 
82
65
  end
@@ -128,36 +111,30 @@ class AniView
128
111
  end
129
112
 
130
113
  while true
131
- #@view.draw if key != "skip"
132
114
  @shoulddraw = true
133
115
  key = @term.getKey
134
116
  @shoulddraw = false
135
117
 
136
- if key == @pref.get("keybindings")["goto unwatched"]
118
+ if key == @pref.get("keybindings")["goto_unwatched"]
137
119
  @view = @aiomenu
138
- @view.setName(@pref.get("menu_titles")["1"])
139
- @view.setFormat(@format_["aiomenu_uw"])
120
+ @view.setName(@pref.get("menu_titles")["unwatched"])
121
+ @view.setFormat("format_library_unwatched")
140
122
  @view.setRfunc(:getUnwatched)
141
123
 
142
- elsif key == @pref.get("keybindings")["goto all anime"]
124
+ elsif key == @pref.get("keybindings")["goto_library"]
143
125
  @view = @aiomenu
144
- @view.setName(@pref.get("menu_titles")["2"])
145
- @view.setFormat(@format_["aiomenu_all"])
126
+ @view.setName(@pref.get("menu_titles")["library"])
127
+ @view.setFormat("format_library")
146
128
  @view.setRfunc(:getAll)
147
-
148
- elsif key == "3"
149
- #@view = @anilistmenu
150
- #@view.setName(@pref.get("menu_titles")[key])
151
- #@view.setRfunc(:getCompleted)
152
129
 
153
- elsif key == @pref.get("keybindings")["goto torrents"]
130
+ elsif key == @pref.get("keybindings")["goto_torrents"]
154
131
  @view = @delugemenu
155
- @view.setName(@pref.get("menu_titles")["7"])
132
+ @view.setName(@pref.get("menu_titles")["torrents"])
156
133
  @view.setRfunc(:getTorrents)
157
134
 
158
- elsif key == @pref.get("keybindings")["goto preferences"]
135
+ elsif key == @pref.get("keybindings")["goto_preferences"]
159
136
  @view = @prefmenu
160
- @view.setName(@pref.get("menu_titles")["0"])
137
+ @view.setName(@pref.get("menu_titles")["preferences"])
161
138
  @view.setRfunc(:getAll)
162
139
 
163
140
  elsif key == ":"
@@ -25,7 +25,7 @@ class AnimeIO
25
25
  end
26
26
 
27
27
  def save
28
- @pref.saveLocalAnime Base64.encode64(Marshal.dump @@local_anime)
28
+ @pref.set "local_anime", Base64.encode64(Marshal.dump @@local_anime)
29
29
  end
30
30
 
31
31
  def load
@@ -40,6 +40,9 @@ class AnimeIO
40
40
  def index_anime(force: false, verbose: false)
41
41
  ret = {}
42
42
  (@pref.get("anime_locations").split(":")).each { |dir|
43
+
44
+ dir = @pref.parseTilde dir
45
+
43
46
  Dir.glob("#{dir}*/*.{mkv,avi,mp4}").each { |file|
44
47
  puts "indexing #{file}" if verbose
45
48
  seen_this = false
@@ -92,13 +95,7 @@ class AnimeIO
92
95
 
93
96
  (sarr).each { |animefile|
94
97
 
95
- #puts animefile.path
96
-
97
98
  this_parent = parent animefile.path
98
-
99
- #puts animefile.path
100
- #puts this_parent
101
-
102
99
 
103
100
  if this_parent != last_parent
104
101
  ret.merge!(
@@ -160,7 +157,7 @@ class AnimeIO
160
157
  end
161
158
 
162
159
  def logWatched(file)
163
- open(@pref.get("watch_log"), 'a') do |f|
160
+ open(@pref.parseTilde(@pref.get("watch_log")), 'a') do |f|
164
161
  f.puts %x(date).chomp + " ./" + File.basename(file) + " " + @watch_log_tag
165
162
  end
166
163
  end
@@ -3,14 +3,36 @@ require_relative 'torrentitem'
3
3
 
4
4
  class DelugeC
5
5
 
6
- def initialize
6
+ def initialize pref
7
+ @pref = pref
8
+
9
+ host = @pref.get("deluge_config")["host"]
10
+ login = @pref.get("deluge_config")["login"]
11
+ password = @pref.get("deluge_config")["password"]
12
+
13
+ if (login == "" and password == "") and (host == "127.0.0.1" or host == "localhost")
14
+ la = localAuth
15
+ login = la[0]
16
+ password = la[1]
17
+ @pref.set(["deluge_config", "login"], login)
18
+ @pref.set(["deluge_config", "password"], password)
19
+ end
20
+
7
21
  @client = Deluge::Rpc::Client.new(
8
- host: 'localhost',
9
- port: 58846,
10
- login: 'localclient',
11
- password: '1df1520eb580f2f569f4c3e846c83da2cc7a222d'
22
+ host: host,
23
+ port: Integer(@pref.get("deluge_config")["port"]),
24
+ login: @pref.get("deluge_config")["login"],
25
+ password: @pref.get("deluge_config")["password"]
12
26
  )
27
+
13
28
  @client.connect
29
+
30
+ end
31
+
32
+ def localAuth
33
+ authfile = Dir.home + "/.config/deluge/auth"
34
+ ["", ""] if not File.exist? authfile
35
+ File.open(Dir.home + "/.config/deluge/auth") { |f| f.read }.split(":")
14
36
  end
15
37
 
16
38
  def getTorrents
@@ -31,4 +53,4 @@ class DelugeC
31
53
  return ret
32
54
  end
33
55
 
34
- end
56
+ end
@@ -0,0 +1,68 @@
1
+ {
2
+ "keybindings" :
3
+ {
4
+ "goto_preferences" : "0",
5
+ "goto_unwatched" : "1",
6
+ "goto_library" : "2",
7
+ "goto_torrents" : "3",
8
+ "anime_set_watched" : "Z",
9
+ "anime_set_unwatched" : "u",
10
+ "anime_undo_set_watched" : "z",
11
+ "menu_nav_up" : "up",
12
+ "menu_nav_down" : "down",
13
+ "menu_nav_expand" : "space"
14
+ },
15
+ "anime_locations" : "~/anime/",
16
+ "clr" :
17
+ {
18
+ "main" : "blue",
19
+ "primary" : "white",
20
+ "secondary" : "cyan",
21
+ "selected" : "red"
22
+ },
23
+ "menu_titles" :
24
+ {
25
+ "unwatched" : "unwatched",
26
+ "library" : "anime library",
27
+ "torrents" : "torrents",
28
+ "preferences" : "preferences"
29
+ },
30
+ "format_library" :
31
+ {
32
+ "title" : " %t @ %D %S ",
33
+ "parent" : " %t - %c@ %D %S ",
34
+ "child" : " %t@ %D %S "
35
+ },
36
+ "format_library_unwatched" :
37
+ {
38
+ "title" : " %t @ $q@ %D %S ",
39
+ "parent" : " %t - %c@ %D %S ",
40
+ "child" : " %t@ %D %S %r "
41
+ },
42
+ "format_torrents" :
43
+ {
44
+ "title" : " %t",
45
+ "parent" : " %n@ %p "
46
+ },
47
+ "format_preferences" :
48
+ {
49
+ "title" : " %t",
50
+ "parent" : " %t@ %v "
51
+ },
52
+ "deluge_config" :
53
+ {
54
+ "host" : "localhost",
55
+ "port" : "58846",
56
+ "login" : "",
57
+ "password" : ""
58
+ },
59
+ "rss_feed" :
60
+ {
61
+ "url" : "https://www.nyaa.se/?page=rss&cats=1_37&filter=1&term=",
62
+ "refresh_interval" : "150"
63
+ },
64
+ "log_file" : "~/.aw/aw.log",
65
+ "watch_log" : "~/.aw/watchlog",
66
+ "watch_command" : "mpv -alang jpn -slang eng -msg-level=all=fatal -ass",
67
+ "local_anime" : null
68
+ }
@@ -1,5 +1,7 @@
1
1
  require 'fileutils'
2
2
  require_relative 'prefitem'
3
+ require_relative '../../view/emote.rb'
4
+ require_relative '../../util/alogger'
3
5
 
4
6
  class Pref
5
7
  def initialize
@@ -7,91 +9,90 @@ class Pref
7
9
  @home = Dir.home
8
10
  @conf = @home + "/.aw"
9
11
 
12
+ File.open(File.join(File.dirname(__FILE__), "/validate.json"), "r") {
13
+ |f| @validate = JSON.parse(f.read)
14
+ }
15
+
10
16
  dirname = File.dirname(@conf)
11
- unless File.directory?(dirname)
12
- FileUtils.mkdir_p(dirname)
13
- end
17
+ FileUtils.mkdir_p(dirname) unless File.directory?(dirname)
14
18
 
15
- @pref_file = @conf + "/r_anime"
19
+ @pref_file = @conf + "/r_anime.json"
20
+
21
+ @l = ALogger.new(Dir.home + "/desktop/validate.log")
16
22
 
17
23
  self.defaults if not File.exist?(@pref_file)
18
24
  self.load
19
25
  end
20
26
 
27
+ def parseTilde path
28
+ path.gsub("~", Dir.home)
29
+ end
30
+
21
31
  def defaults
22
- @pref = {
23
- "keybindings" => {
24
- "goto preferences" => "0",
25
- "goto unwatched" => "1",
26
- "goto all anime" => "2",
27
- "goto torrents" => "7",
28
- "anime_set watched" => "Z",
29
- "anime_set unwatched" => "u",
30
- "anime_unwatch last watched" => "z",
31
- "menu_nav_up" => "up",
32
- "menu_nav_down" => "down",
33
- "menu_nav_expand" => "space",
34
- },
35
- "anime_locations" => @home + "/airing/shows/" + ":" + @home + "/anime/",
36
- "clr" => {
37
- "main" => "blue",
38
- "primary" => "white",
39
- "secondary"=> "cyan",
40
- "selected" => "red"
41
- },
42
- "menu_titles" => {
43
- "1" => "unwatched",
44
- "2" => "anime library",
45
- "3" => "MyAnimeList",
46
-
47
- "7" => "torrents",
48
- "8" => "subscriptions",
49
- "9" => "schedule",
50
- "0" => "preferences"
51
- },
52
- "anime_library_title_format_str" => " %t - $r@ %D %S ",
53
- "anime_library_title_show_format_str" => " %t - %c@ %D %S ",
54
- "anime_library_title_episode_format_str" => " %t@ %D %S %t",
55
- "anime_library_unwatched_title_format_str" => " %t@ $q@ %D %S ",
56
- "anime_library_unwatched_title_show_format_str" => " %t - %c@ %D %S ",
57
- "anime_library_unwatched_title_episode_format_str" => " %t@ %D %S %r ",
58
- "deluge_title_format_str" => " %t",
59
- "deluge_item_format_str" => " %n@ %p ",
60
- "preferences_title_format_str" => " %t",
61
- "preferences_item_format_str" => " %t@.%v",
62
-
63
- #"watch_file" => @conf + "/watched",
64
- "log_file" => @conf + "/aw.log",
65
- "watch_log" => @conf + "/watchlog",
66
-
67
- "watch_command" => "mpv -alang jpn -slang eng -msg-level=all=fatal -ass",
68
-
69
- "local_anime" => nil
70
- }
32
+ File.open(File.join(File.dirname(__FILE__), "/defaults.json"), "r") {|f| @pref = JSON.parse(f.read)}
71
33
  self.save
72
34
  end
73
35
 
74
36
  def set(s, val)
75
- arr = [s] if s.class == String
76
- arr = s if s.class == Array
77
- @pref = setpref(arr, val, @pref)
37
+ trail = [s] if s.class == String
38
+ trail = s if s.class == Array
39
+ if valpref(trail, val, @validate)
40
+ @pref = setpref(trail, val, @pref)
41
+ end
42
+
78
43
  save
79
44
  end
80
45
 
81
- def setpref(s, val, bpref)
82
- if s.length == 1
83
- bpref[s[0]]=val
84
- return bpref
46
+ def setpref(trail, destination, map)
47
+ if trail.length == 1
48
+ map[trail[0]] = destination
49
+ return map
85
50
  else
86
- key = s.delete_at(0)
87
- bpref[key] = setpref(s, val, bpref[key])
51
+
52
+ blaze = trail[0]
53
+ map[blaze] = setpref(trail[1..-1], destination, map[blaze])
54
+
55
+ end
56
+ return map
57
+ end
58
+
59
+ def valpref(trail, destination, map)
60
+
61
+ if trail.length == 1
62
+ skeys = [
63
+ "space",
64
+ "up",
65
+ "down",
66
+ "left",
67
+ "right",
68
+ "enter"
69
+ ]
70
+
71
+ case map[trail[0]]
72
+ when "key"
73
+ return false if destination.length != 1 and not skeys.include? destination
74
+
75
+ when "path"
76
+ destination.split(":").each { |d|
77
+ return false if not Dir.exist?(parseTilde d)}
78
+
79
+ when "color"
80
+ return false if not $clr.key? destination
81
+
82
+ when "int"
83
+ return false if not destination.scan(/\D/).empty? and destination.length > 1
84
+ end
85
+
86
+ return true
87
+
88
+ else
89
+ blaze = trail[0]
90
+ return valpref(trail[1..-1], destination, map[blaze])
88
91
  end
89
- return bpref
90
92
  end
91
93
 
92
94
  def get s
93
95
  return @pref[s] if @pref.key?(s)
94
- return ""
95
96
  end
96
97
 
97
98
  def getAll
@@ -111,7 +112,6 @@ class Pref
111
112
  item[1].each { |subitem|
112
113
  subtitle = title + "_" + subitem[0]
113
114
  subval = subitem[1]
114
-
115
115
  r.merge!(PrefItem.new(subtitle, subval, []) => [PrefItem.new("", "", [item[0], subitem[0]])])
116
116
  }
117
117
  next
@@ -121,11 +121,6 @@ class Pref
121
121
  return r
122
122
  end
123
123
 
124
- def saveLocalAnime dump
125
- @pref["local_anime"] = dump
126
- self.save
127
- end
128
-
129
124
  def save
130
125
  File.open(@pref_file, "w") { |f| f.write(@pref.to_json) }
131
126
  end
@@ -0,0 +1,68 @@
1
+ {
2
+ "keybindings" :
3
+ {
4
+ "goto_preferences" : "key",
5
+ "goto_unwatched" : "key",
6
+ "goto_library" : "key",
7
+ "goto_torrents" : "key",
8
+ "anime_set_watched" : "key",
9
+ "anime_set_unwatched" : "key",
10
+ "anime_undo_set_watched" : "key",
11
+ "menu_nav_up" : "key",
12
+ "menu_nav_down" : "key",
13
+ "menu_nav_expand" : "key"
14
+ },
15
+ "anime_locations" : "path",
16
+ "clr" :
17
+ {
18
+ "main" : "color",
19
+ "primary" : "color",
20
+ "secondary" : "color",
21
+ "selected" : "color"
22
+ },
23
+ "menu_titles" :
24
+ {
25
+ "unwatched" : "any",
26
+ "library" : "any",
27
+ "torrents" : "any",
28
+ "preferences" : "any"
29
+ },
30
+ "format_library" :
31
+ {
32
+ "title" : "any",
33
+ "parent" : "any",
34
+ "child" : "any"
35
+ },
36
+ "format_library_unwatched" :
37
+ {
38
+ "title" : "any",
39
+ "parent" : "any",
40
+ "child" : "any"
41
+ },
42
+ "format_torrents" :
43
+ {
44
+ "title" : "any",
45
+ "parent" : "any"
46
+ },
47
+ "format_preferences" :
48
+ {
49
+ "title" : "any",
50
+ "parent" : "any"
51
+ },
52
+ "deluge_config" :
53
+ {
54
+ "host" : "any",
55
+ "port" : "int",
56
+ "login" : "any",
57
+ "password" : "any"
58
+ },
59
+ "rss_feed" :
60
+ {
61
+ "url" : "any",
62
+ "refresh_interval" : "int"
63
+ },
64
+ "log_file" : "path",
65
+ "watch_log" : "path",
66
+ "watch_command" : "any",
67
+ "local_anime" : "any"
68
+ }
@@ -0,0 +1,26 @@
1
+ require 'simple-rss'
2
+ require 'open-uri'
3
+
4
+ class RssFeed
5
+ def initialize #pref
6
+ #@pref = pref
7
+ @testurl = "https://www.nyaa.se/?page=rss&cats=1_37&filter=1&term="
8
+ end
9
+
10
+ def updateFeed
11
+ #@rss = SimpleRSS.parse open(@pref.get "rss_feed")
12
+ @rss = SimpleRSS.parse open (@testurl)
13
+ end
14
+
15
+ def daemon
16
+ while true
17
+
18
+ end
19
+ end
20
+
21
+ def match string
22
+ @rss.items.each{ |item|
23
+ #item.
24
+ }
25
+ end
26
+ end
@@ -37,4 +37,84 @@ class Format
37
37
  def self.format_progress p
38
38
  return "#{Integer(p)}.#{Integer(p * 10.0) % 10}"
39
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
+ if mode == "e"
54
+ add_to += String(c)
55
+ escape_mode = false
56
+
57
+ elsif c == '%'
58
+ mode = "%"
59
+
60
+ elsif c == '$'
61
+ mode = "$"
62
+
63
+ elsif c == '@'
64
+ pstr << add_to
65
+ add_to = ""
66
+ mode = "@"
67
+
68
+ elsif c == "#"
69
+ padding_collected += 1
70
+
71
+ elsif c == "\\"
72
+ mode = "e"
73
+ mode = "char"
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
+ end
94
+ }
95
+ pstr << add_to
96
+
97
+ midstr = ""
98
+ tl = 0
99
+ pstr.each{ |s| tl += s.length }
100
+ buffer_space = 0
101
+ buffer_space = (cols - tl) / (pstr.length - 1) if pstr.length > 1
102
+
103
+ addl_space = (cols - tl) % pstr.length
104
+
105
+ pstr.each_with_index{ |str, i|
106
+ #buffer_space += addl_space if i == pstr.length - 2
107
+ #if i == pstr.length - 1
108
+ #puts addl_space
109
+ #puts i == pstr.length - 1
110
+
111
+ break if i == pstr.length - 1
112
+ buffer_ = ""
113
+ buffer_ = buffer_char[i] * buffer_space if buffer_space >= 0
114
+ midstr += str + buffer_
115
+ }
116
+ midstr += pstr[pstr.length - 1]
117
+
118
+ return midstr
119
+ end
40
120
  end
@@ -0,0 +1,12 @@
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
@@ -52,13 +52,13 @@ class AioMenu < Menu
52
52
  #@malanime.update(path)
53
53
 
54
54
  refresh
55
- elsif key == @pref.get("keybindings")["anime_set watched"]
55
+ elsif key == @pref.get("keybindings")["anime_set_watched"]
56
56
  @interface.addWatched(path)
57
57
  refresh
58
- elsif key == @pref.get("keybindings")["anime_set unwatch last watched"]
58
+ elsif key == @pref.get("keybindings")["anime_undo_set_watched"]
59
59
  @interface.rmWatched()
60
60
  refresh
61
- elsif key == @pref.get("keybindings")["anime_set unwatched"]
61
+ elsif key == @pref.get("keybindings")["anime_set_unwatched"]
62
62
  @interface.rmWatched(path)
63
63
 
64
64
  end
@@ -1,13 +1,20 @@
1
1
  require_relative 'emote'
2
- require 'benchmark'
3
2
  require_relative '../util/alogger'
4
- require 'digest/bubblebabble'
3
+ require_relative '../util/format'
5
4
 
6
5
  class Menu
7
6
 
8
- def initialize(refresh_function, interface, name, pref, format_, term)
7
+ def initialize(
8
+ refresh_function:,
9
+ interface:,
10
+ name:,
11
+ pref:,
12
+ format:,
13
+ term:,
14
+ children: true
15
+ )
9
16
  @term = term
10
- @format_ = format_
17
+ @format = format
11
18
  @attributes = {
12
19
  "t" => name,
13
20
  }
@@ -17,6 +24,7 @@ class Menu
17
24
  @expanded = -1
18
25
  @selected = 0
19
26
  @scrollup = false
27
+ @children = children
20
28
  @items_formatted = {}
21
29
  @items_hash = {}
22
30
  @hashmap = {}
@@ -24,8 +32,6 @@ class Menu
24
32
 
25
33
  refresh
26
34
  @lastcount = getLen
27
-
28
- @l = ALogger.new(Dir.home + "/desktop/menu.log")
29
35
 
30
36
  end
31
37
 
@@ -53,7 +59,7 @@ class Menu
53
59
  end
54
60
 
55
61
  def setFormat(format_)
56
- @format_ = format_
62
+ @format = format_
57
63
  end
58
64
 
59
65
  def refresh
@@ -152,33 +158,37 @@ class Menu
152
158
  next
153
159
  end
154
160
 
155
- parent = printmf(
156
- @pref.get(@format_["parent"]),
161
+ parent = Format.parse_format(
162
+ @pref.get(@format)["parent"],
157
163
  item[0].attributes,
164
+ @term.cols
158
165
  )
159
166
 
160
167
  children = []
161
168
  children_hash = []
162
169
 
163
- item[1].each { |subitem|
164
-
165
- child_babble = subitem.cereal
166
-
167
- if @items_hash.key? child_babble
168
- val = @items_hash[babble]
169
- new_items_hash.merge!(child_babble => val)
170
- children<<@hashmap[babble]
171
- new_hashmap.merge!(babble => @hashmap[babble])
172
- next
173
- end
174
-
175
- children << printmf(
176
- @pref.get(@format_["child"]),
177
- subitem.attributes,
178
- )
179
- children_hash << subitem.hash
180
-
181
- }
170
+ if @children
171
+ item[1].each { |subitem|
172
+
173
+ child_babble = subitem.cereal
174
+
175
+ if @items_hash.key? child_babble
176
+ val = @items_hash[babble]
177
+ new_items_hash.merge!(child_babble => val)
178
+ children<<@hashmap[babble]
179
+ new_hashmap.merge!(babble => @hashmap[babble])
180
+ next
181
+ end
182
+
183
+ children << Format.parse_format(
184
+ @pref.get(@format)["child"],
185
+ subitem.attributes,
186
+ @term.cols
187
+ )
188
+ children_hash << subitem.hash
189
+
190
+ }
191
+ end
182
192
 
183
193
  new_items_hash.merge!(babble => children_hash)
184
194
  new_items_formatted.merge!(parent => children)
@@ -189,9 +199,10 @@ class Menu
189
199
  @items_hash = new_items_hash
190
200
  @hashmap = new_hashmap
191
201
 
192
- @title_formatted = printmf(
193
- @pref.get(@format_["title"]),
202
+ @title_formatted = Format.parse_format(
203
+ @pref.get(@format)["title"],
194
204
  @attributes,
205
+ @term.cols
195
206
  )
196
207
 
197
208
  end
@@ -245,11 +256,10 @@ class Menu
245
256
  cl = @cl["s"] if selected
246
257
  lo = "\e[#{line};1H" + cl
247
258
 
248
- if in_expanded_region
259
+ if in_expanded_region and @children
249
260
  print @cl["2"] + lo + String(@items_formatted.values[@expanded][inner_index])
250
261
  inner_index+=1
251
262
  elsif in_outer_region
252
- #@l.log "#{@attributes["t"]} #{line_on} #{starter} #{String(@items_formatted.keys[outer_index])} - #{String(@cl["1"])} #{String(lo)}"
253
263
  print @cl["1"] + lo + String(@items_formatted.keys[outer_index])
254
264
  outer_index+=1
255
265
  else
@@ -260,82 +270,6 @@ class Menu
260
270
  end
261
271
  end
262
272
 
263
- def printmf(string, d)
264
- le = "\e[K\n"
265
-
266
- pstr = []
267
- add_to = ""
268
- buffer_char = []
269
-
270
- percent_mode = false
271
- dollar_mode = false
272
- at_mode = false
273
- escape_mode = false
274
- padding_collected = 0
275
-
276
- string.split('').each { |c|
277
- if escape_mode == true
278
- add_to += String(c)
279
- escape_mode = false
280
- elsif c == '%'
281
- percent_mode = true
282
- elsif c == '$'
283
- dollar_mode = true
284
- elsif c == '@'
285
- pstr << add_to
286
- add_to = ""
287
- at_mode = true
288
- elsif c == "#"
289
- padding_collected += 1
290
- elsif c == "\\"
291
- escape_mode = true
292
- elsif at_mode
293
- buffer_char << c
294
- at_mode = false
295
- elsif percent_mode
296
- addstr = ""
297
- addstr = String(d[c]) if d.key?(c)
298
- ol = addstr.length
299
- while addstr.length < (ol + padding_collected)
300
- addstr = " " + addstr
301
- end
302
-
303
- add_to += addstr
304
-
305
- percent_mode = false
306
- elsif dollar_mode
307
- add_to += String($emote[c]) if $emote.key?(c)
308
- dollar_mode = false
309
- else
310
- add_to += c
311
- end
312
- }
313
- pstr << add_to
314
-
315
- midstr = ""
316
- tl = 0
317
- pstr.each{ |s| tl += s.length }
318
- buffer_space = 0
319
- buffer_space = (@term.cols - tl) / (pstr.length - 1) if pstr.length > 1
320
-
321
- addl_space = (@term.cols - tl) % pstr.length
322
-
323
- pstr.each_with_index{ |str, i|
324
- #buffer_space += addl_space if i == pstr.length - 2
325
- #if i == pstr.length - 1
326
- #puts addl_space
327
- #puts i == pstr.length - 1
328
-
329
- break if i == pstr.length - 1
330
- buffer_ = ""
331
- buffer_ = buffer_char[i] * buffer_space if buffer_space >= 0
332
- midstr += str + buffer_
333
- }
334
- midstr += pstr[pstr.length - 1]
335
-
336
- return midstr
337
- end
338
-
339
273
  def control(key)
340
274
  sel = resolveSelected
341
275
  if key == @pref.get("keybindings")["menu_nav_up"]
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: 0.2.0
4
+ version: 0.3.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-04-17 00:00:00.000000000 Z
11
+ date: 2017-04-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: streamio-ffmpeg
@@ -90,6 +90,46 @@ dependencies:
90
90
  - - ">="
91
91
  - !ruby/object:Gem::Version
92
92
  version: 0.10.0
93
+ - !ruby/object:Gem::Dependency
94
+ name: simple-rss
95
+ requirement: !ruby/object:Gem::Requirement
96
+ requirements:
97
+ - - "~>"
98
+ - !ruby/object:Gem::Version
99
+ version: '1.3'
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ version: 1.3.1
103
+ type: :runtime
104
+ prerelease: false
105
+ version_requirements: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - "~>"
108
+ - !ruby/object:Gem::Version
109
+ version: '1.3'
110
+ - - ">="
111
+ - !ruby/object:Gem::Version
112
+ version: 1.3.1
113
+ - !ruby/object:Gem::Dependency
114
+ name: net-ping
115
+ requirement: !ruby/object:Gem::Requirement
116
+ requirements:
117
+ - - "~>"
118
+ - !ruby/object:Gem::Version
119
+ version: '2.0'
120
+ - - ">="
121
+ - !ruby/object:Gem::Version
122
+ version: 2.0.1
123
+ type: :runtime
124
+ prerelease: false
125
+ version_requirements: !ruby/object:Gem::Requirement
126
+ requirements:
127
+ - - "~>"
128
+ - !ruby/object:Gem::Version
129
+ version: '2.0'
130
+ - - ">="
131
+ - !ruby/object:Gem::Version
132
+ version: 2.0.1
93
133
  description: Browse local anime, based on cmus
94
134
  email: meotleft@gmail.com
95
135
  executables:
@@ -97,25 +137,29 @@ executables:
97
137
  extensions: []
98
138
  extra_rdoc_files: []
99
139
  files:
140
+ - "./lib/aniview.rb"
141
+ - "./lib/aniview/interface/animeio/animefile.rb"
142
+ - "./lib/aniview/interface/animeio/animeio.rb"
143
+ - "./lib/aniview/interface/animeio/animeseries.rb"
144
+ - "./lib/aniview/interface/deluge/delugec.rb"
145
+ - "./lib/aniview/interface/deluge/torrentitem.rb"
146
+ - "./lib/aniview/interface/item.rb"
147
+ - "./lib/aniview/interface/pref/defaults.json"
148
+ - "./lib/aniview/interface/pref/pref.rb"
149
+ - "./lib/aniview/interface/pref/prefitem.rb"
150
+ - "./lib/aniview/interface/pref/validate.json"
151
+ - "./lib/aniview/interface/rssfeed/rssfeed.rb"
152
+ - "./lib/aniview/util/alogger.rb"
153
+ - "./lib/aniview/util/command.rb"
154
+ - "./lib/aniview/util/format.rb"
155
+ - "./lib/aniview/util/online.rb"
156
+ - "./lib/aniview/util/term.rb"
157
+ - "./lib/aniview/view/aiomenu.rb"
158
+ - "./lib/aniview/view/delugemenu.rb"
159
+ - "./lib/aniview/view/emote.rb"
160
+ - "./lib/aniview/view/menu.rb"
161
+ - "./lib/aniview/view/prefmenu.rb"
100
162
  - bin/aniview
101
- - lib/aniview.rb
102
- - lib/aniview/interface/animeio/animefile.rb
103
- - lib/aniview/interface/animeio/animeio.rb
104
- - lib/aniview/interface/animeio/animeseries.rb
105
- - lib/aniview/interface/deluge/delugec.rb
106
- - lib/aniview/interface/deluge/torrentitem.rb
107
- - lib/aniview/interface/item.rb
108
- - lib/aniview/interface/pref/pref.rb
109
- - lib/aniview/interface/pref/prefitem.rb
110
- - lib/aniview/util/alogger.rb
111
- - lib/aniview/util/command.rb
112
- - lib/aniview/util/format.rb
113
- - lib/aniview/util/term.rb
114
- - lib/aniview/view/aiomenu.rb
115
- - lib/aniview/view/delugemenu.rb
116
- - lib/aniview/view/emote.rb
117
- - lib/aniview/view/menu.rb
118
- - lib/aniview/view/prefmenu.rb
119
163
  homepage: https://github.com/annacrombie/aniview/
120
164
  licenses:
121
165
  - MIT