keenser 0.0.5 → 0.0.6

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: 234add4fefc4b55ee4c6e8908a46229c7d7e545d
4
- data.tar.gz: 7b9bb5020bcd4602934bb0894566d33b55e65c08
3
+ metadata.gz: 8a82b0c422a1dc920fe649ef09c2fc057d4673da
4
+ data.tar.gz: ca07f7ac0c8def3bda386609c3ae2ef74c7b6605
5
5
  SHA512:
6
- metadata.gz: 2d830374f89a3d1018036d40640a3f316dc21441ec03228a7333dcd1eeeef12906ed8dcaeb6acc2df8beeaafaec5bf137a0d7442cf601645169b35879a263414
7
- data.tar.gz: 7aa2a31c19ecfe293227344b641068188f2bda7afd42fcdbe849404d366c0d6865fca600eec91cfac27b876a782c6c125a510623bcc566b54bf7edcbc7e872f4
6
+ metadata.gz: b92a2b36d02f38f21fe08edfcd4ae0d0384935a8f53ff13595d4c2a046bf94f1a390122d3324479613e67393eefa25945c567b84c8e9decf38bf2bfb848d5f2a
7
+ data.tar.gz: d0a1b396f1ffdd39575d3cbc06cd37a81218b666c02dc128d5f0255aed4a1225cc1346ee7549625b91a6228f84059aa64fab8d122dbb6cf9f1795345ee223898
data/Gemfile CHANGED
@@ -1,4 +1,3 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
- # Specify your gem's dependencies in keenser.gemspec
4
3
  gemspec
@@ -1,85 +1,40 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- %w{
4
- colorize json pry thor
5
- }.each { |m| require m }
6
-
7
- require_relative "../lib/keenser"
8
-
9
- # TODO: make asks readline friendly
10
- class Default < Thor
11
- desc "setup", "Set up the database"
12
- def setup
13
- unless ENV["SYNC"]
14
- ENV["SYNC"] = ask "Path to sync directory >"
15
- puts %!You should probably add `export SYNC="#{ENV['SYNC']}"` to your .*rc file!.yellow
16
- puts
17
- end
18
-
19
- Keenser::DB.setup!
20
-
21
- # FIXME: need to do something to reload the connection / model after the
22
- # db is setup for the first time
23
- unless Keenser::Computer.local
24
- puts arr "Configuring local machine"
25
-
26
- role = askd "Role", :client
27
- music = askd "Music directory", "#{ENV['SYNC']}/Music"
28
- playlists = askd "Playlist directory", "#{ENV['HOME']}/Playlists"
29
-
30
- Keenser::Computer.create({
31
- name: `hostname`,
32
- role: role,
33
- music: music,
34
- playlists: playlists
35
- })
36
-
37
- puts "Saved local config"
38
- puts
39
- end
40
-
41
- puts "You're all set!"
42
- end
43
-
44
- desc "console", "Attach to a database console"
45
- def console
46
- Keenser.pry
47
- end
48
-
49
- # TODO: look into subcommands
50
- desc "play", "Play music"
51
- def play *args
52
- cmd = args.shift || "pause"
53
- Keenser::Music.send cmd, *args
54
- rescue => e
55
- puts "✗ #{e.message}"
56
- end
57
-
58
- desc "status", "Show current dependency status"
59
- def status
60
- [Keenser::DB, Keenser::Music].each do |m|
61
- name = m.name.sub /^Keenser::/, ''
62
- status, msg = begin
63
- ['✓'.green, m.status]
64
- rescue => e
65
- ['✗'.red, e.to_s]
66
- end
67
- puts "#{status} #{name.underline}\t #{msg}"
3
+ cmd = ARGV.shift
4
+ session = "keenser"
5
+
6
+
7
+ if cmd == "boot"
8
+ unless system "tmux list-windows -t '#{session}' >/dev/null 2>&1"
9
+ `TMUX= tmux new-session -s '#{session}' -d`
10
+ `tmux send-keys -t '#{session}' '#{__FILE__} server' C-m`
11
+ `tmux split-window -h -t '#{session}'`
12
+ `tmux send-keys -t '#{session}' "cmus" C-m`
13
+ if ENV["TMUX"]
14
+ puts "Started new session '#{session}'"
15
+ exit
16
+ else
17
+ exec "tmux attach -t '#{session}'"
68
18
  end
69
19
  end
20
+ end
70
21
 
71
- no_commands do
72
-
73
- def arr str
74
- "#{'==>'.light_blue} #{str}"
75
- end
76
22
 
77
- def askd field, default
78
- val = ask("#{field} (#{default}) >").strip
79
- val.empty? ? default : val
80
- end
23
+ require_relative "../lib/keenser"
81
24
 
82
- end
25
+ case cmd
26
+ when "boot"
27
+ # No-op, just run the above startup logic
28
+ when nil, "console"
29
+ require "pry"
30
+ Pry.commands.delete "play"
31
+ Keenser.pry
32
+ when "server"
33
+ Keenser.start_server!
34
+ when "remote"
35
+ require "drb/drb"
36
+ DRb.start_service
37
+ puts DRbObject.new_with_uri(Keenser::Server.uri).send *ARGV
38
+ else
39
+ raise Keenser::Error.new "Not implemented: #{cmd}"
83
40
  end
84
-
85
- Default.start
@@ -21,7 +21,6 @@ Gem::Specification.new do |spec|
21
21
  spec.add_dependency "colorize", "~> 0.6"
22
22
  spec.add_dependency "pry", "~> 0.9"
23
23
  spec.add_dependency "sequel", "~> 4.6"
24
- spec.add_dependency "thor", "~> 0.18"
25
24
 
26
25
  spec.add_development_dependency "bundler", "~> 1.5"
27
26
  spec.add_development_dependency "rake", "~> 10.1"
@@ -1,7 +1,9 @@
1
- require "sequel"
1
+ # encoding: utf-8
2
+ # FIXME: lazy-load everything
3
+ %w{ colorize sequel }.each { |m| require m }
2
4
 
3
5
  %w{
4
- version error db music
6
+ version error db music server
5
7
  }.each { |m| require_relative "../lib/keenser/#{m}" }
6
8
 
7
9
  module Keenser
@@ -19,4 +21,62 @@ module Keenser
19
21
  :Tag => "tag",
20
22
  :SongTag => "song_tag"
21
23
  }.each { |name,m| autoload name, src("model/#{m}") }
24
+
25
+ def self.setup
26
+ unless ENV["SYNC"]
27
+ ENV["SYNC"] = ask "Path to sync directory >"
28
+ puts %!You should probably add `export SYNC="#{ENV['SYNC']}"` to your .*rc file!.yellow
29
+ puts
30
+ end
31
+
32
+ DB.setup!
33
+
34
+ # FIXME: need to do something to reload the connection / model after the
35
+ # db is setup for the first time
36
+ unless Computer.local
37
+ puts arr "Configuring local machine"
38
+
39
+ role = ask "Role", :client
40
+ music = ask "Music directory", "#{ENV['SYNC']}/Music"
41
+ playlists = ask "Playlist directory", "#{ENV['HOME']}/Playlists"
42
+
43
+ Computer.create({
44
+ name: `hostname`,
45
+ role: role,
46
+ music: music,
47
+ playlists: playlists
48
+ })
49
+
50
+ puts "Saved local config"
51
+ puts
52
+ end
53
+
54
+ puts "You're all set!"
55
+ end
56
+
57
+ def self.status
58
+ [Keenser::DB, Keenser::Music].each do |m|
59
+ name = m.name.sub /^Keenser::/, ''
60
+ status, msg = begin
61
+ ['✓'.green, m.status]
62
+ rescue => e
63
+ ['✗'.red, e.to_s]
64
+ end
65
+ puts "#{status} #{name.underline}\t #{msg}"
66
+ end
67
+ end
68
+
69
+ private
70
+
71
+ def self.arr str
72
+ "#{'==>'.light_blue} #{str}"
73
+ end
74
+
75
+ def self.ask field, default=nil
76
+ print field
77
+ print " (#{default})" if default
78
+ print " > "
79
+ val = STDIN.gets.strip
80
+ val.empty? ? default : val
81
+ end
22
82
  end
@@ -1,9 +1,8 @@
1
+ # encoding: utf-8
1
2
  module Keenser
2
3
  module Music
3
4
  extend self
4
5
 
5
- SESSION_NAME = "music"
6
-
7
6
  def status
8
7
  expect "tmux"
9
8
  expect "cmus-remote"
@@ -15,29 +14,30 @@ module Keenser
15
14
  end
16
15
  end
17
16
 
17
+ def show
18
+ playing.to_s
19
+ end
20
+
18
21
  %w{ prev pause next }.each do |cmd|
19
- define_method(cmd) { remote cmd; puts playing.to_s }
22
+ define_method cmd do
23
+ puts "Pressed #{cmd}"
24
+ `cmus-remote --#{cmd}`
25
+ show
26
+ end
20
27
  end
21
28
 
22
29
  def tag name
23
30
  playing.tag name
24
- puts "#{name} #{playing}"
25
- end
26
-
27
- def method_missing *args
28
- name = args.first.to_s
29
- if Tag.where(name: name).any?
30
- list name
31
- else
32
- raise Error.new "Don't know how to play '#{args}'"
33
- end
31
+ puts "Tagging #{playing} as #{name}"
32
+ "#{name} ← #{playing}"
34
33
  end
35
34
 
36
35
  def list name
37
- t = Tag.where(name: name).first
36
+ t = Tag.where(name: name.to_s).first
37
+ t.export!
38
38
  raise Error.new "Cannot find tag '#{t}'" unless t
39
39
  `echo "load -p #{t.playlist}\nset play_library=false\nplayer-next" | cmus-remote`
40
- puts "'#{name}' now playing"
40
+ "'#{name}' now playing"
41
41
  end
42
42
 
43
43
  def import name, path
@@ -51,12 +51,13 @@ module Keenser
51
51
  n += 1
52
52
  end
53
53
  t.export!
54
- puts "Imported #{n} songs"
54
+ "Imported #{n} songs"
55
55
  end
56
56
 
57
57
  def all
58
+ puts "Playing all songs"
58
59
  `echo "set play_library=true\nplayer-next" | cmus-remote`
59
- puts playing.to_s
60
+ show
60
61
  end
61
62
 
62
63
  private
@@ -77,7 +78,6 @@ module Keenser
77
78
  s
78
79
  end
79
80
 
80
-
81
81
  def test cmd
82
82
  system "#{cmd} >/dev/null 2>&1"
83
83
  end
@@ -85,14 +85,5 @@ module Keenser
85
85
  def expect bin
86
86
  raise Error.new "'#{bin}' is not present" unless test "which #{bin}"
87
87
  end
88
-
89
- def remote cmd
90
- unless test "tmux list-windows -t '#{SESSION_NAME}'"
91
- # tmux might complain about starting nested sessions without the TMUX=
92
- `TMUX= tmux new-session -s '#{SESSION_NAME}' -d 'cmus'`
93
- end
94
-
95
- `cmus-remote --#{cmd}`
96
- end
97
88
  end
98
89
  end
@@ -0,0 +1,25 @@
1
+ require "drb/drb"
2
+ require "pry"
3
+
4
+ module Keenser
5
+ def self.start_server!
6
+ # FIXME: $SAFE = 1
7
+
8
+ puts "Starting DRb server at '#{Server.uri}'"
9
+ DRb.start_service Server.uri, Server.new
10
+ DRb.thread.join
11
+ end
12
+
13
+ class Server
14
+ def self.uri
15
+ "druby://localhost:8787"
16
+ end
17
+
18
+ def play *args
19
+ cmd = args.shift || "pause"
20
+ Music.send cmd, *args
21
+ rescue => e
22
+ puts "#{'✗'.red} #{e.message}"
23
+ end
24
+ end
25
+ end
@@ -1,3 +1,3 @@
1
1
  module Keenser
2
- VERSION = "0.0.5"
2
+ VERSION = "0.0.6"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: keenser
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.0.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Dabbs
@@ -52,20 +52,6 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '4.6'
55
- - !ruby/object:Gem::Dependency
56
- name: thor
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - "~>"
60
- - !ruby/object:Gem::Version
61
- version: '0.18'
62
- type: :runtime
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - "~>"
67
- - !ruby/object:Gem::Version
68
- version: '0.18'
69
55
  - !ruby/object:Gem::Dependency
70
56
  name: bundler
71
57
  requirement: !ruby/object:Gem::Requirement
@@ -120,6 +106,7 @@ files:
120
106
  - lib/keenser/model/song_tag.rb
121
107
  - lib/keenser/model/tag.rb
122
108
  - lib/keenser/music.rb
109
+ - lib/keenser/server.rb
123
110
  - lib/keenser/version.rb
124
111
  homepage: ''
125
112
  licenses:
@@ -146,3 +133,4 @@ signing_key:
146
133
  specification_version: 4
147
134
  summary: A wee sidekick
148
135
  test_files: []
136
+ has_rdoc: