cmus-bt 0.1.0

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 40f75a07520ceab5bd721323a216a5bf0f846e27c3068de91b53823ed13c2c13
4
+ data.tar.gz: 8efa1239b84969b51c5e82267ebdcf3ade22fcbd35d5824b243ccd7524836433
5
+ SHA512:
6
+ metadata.gz: 49d59dcc858a9501e11506a15148b064b1bec027add482a0b110c4fb56920bb39c2a3593ccb6ff95fdc87aacb0c2a9d57c1c470a23dbdaf120b5e0fdb5e1f63a
7
+ data.tar.gz: 36ca6db14d83743669db3d858cab55a6c58b560db8ee110aaa8fff2699c01ee733dee6f76ed13ac46b274e04ec83962c2020e78eb26aa156b9f0c25d86ac5602
@@ -0,0 +1,57 @@
1
+ *.gem
2
+ *.rbc
3
+ /.config
4
+ /coverage/
5
+ /InstalledFiles
6
+ /pkg/
7
+ /spec/reports/
8
+ /spec/examples.txt
9
+ /test/tmp/
10
+ /test/version_tmp/
11
+ /tmp/
12
+
13
+ # Used by dotenv library to load environment variables.
14
+ # .env
15
+
16
+ # Ignore Byebug command history file.
17
+ .byebug_history
18
+
19
+ ## Specific to RubyMotion:
20
+ .dat*
21
+ .repl_history
22
+ build/
23
+ *.bridgesupport
24
+ build-iPhoneOS/
25
+ build-iPhoneSimulator/
26
+
27
+ ## Specific to RubyMotion (use of CocoaPods):
28
+ #
29
+ # We recommend against adding the Pods directory to your .gitignore. However
30
+ # you should judge for yourself, the pros and cons are mentioned at:
31
+ # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
32
+ #
33
+ # vendor/Pods/
34
+
35
+ ## Documentation cache and generated files:
36
+ /.yardoc/
37
+ /_yardoc/
38
+ /doc/
39
+ /rdoc/
40
+
41
+ ## Environment normalization:
42
+ /.bundle/
43
+ /vendor/bundle
44
+ /lib/bundler/man/
45
+
46
+ # for a library or gem, you might want to ignore these files since the code is
47
+ # intended to run in multiple environments; otherwise, check them in:
48
+ Gemfile.lock
49
+ .ruby-version
50
+ .ruby-gemset
51
+ .rbenv-gemsets
52
+
53
+ # unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
54
+ .rvmrc
55
+
56
+ # Used by RuboCop. Remote config files pulled in from inherit_from directive.
57
+ # .rubocop-https?--*
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "https://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in wavspa.gemspec
4
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2020 Hiroshi Kuwagata
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,26 @@
1
+ # cmus-bt
2
+ Bluetooth AVRCP wrapper for [cmus](https://cmus.github.io/).
3
+
4
+ ## Usage
5
+ ```
6
+ cmus-bt [options] {NAME|DEVICE-ADDRESS}
7
+
8
+ options:
9
+ -l, --list-available-device
10
+ --log-file=FILE
11
+ --log-level=FLEVEL
12
+ ```
13
+
14
+ ### options
15
+ <dl>
16
+ <dt>-l, --list-available-device</dt>
17
+ <dd>show available device list</dd>
18
+ </dl>
19
+
20
+
21
+ ## Contributing
22
+ Bug reports and pull requests are welcome on GitHub at https://github.com/kwgt/cmus-bt.
23
+
24
+ ## License
25
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
26
+
@@ -0,0 +1,80 @@
1
+ #! /usr/bin/env ruby
2
+ # coding: utf-8
3
+
4
+ #
5
+ # Bluetooth AVRCP wrapper for cmus.
6
+ #
7
+ # Copyright (C) 2020 Hiroshi Kuwagata <kgt9221@gmail.com>
8
+ #
9
+
10
+ require 'optparse'
11
+ require 'pathname'
12
+ require 'pp'
13
+
14
+ #
15
+ # パッケージ内で参照する定数の定義
16
+ #
17
+
18
+ TRADITIONAL_NAME = "Bluetooth AVRCP wrapper for cmus"
19
+ APP_NAME = "cmus-bt"
20
+
21
+ BASE_DIR = Pathname.new(__FILE__).expand_path.dirname.parent
22
+ LIB_DIR = BASE_DIR + "lib"
23
+ APP_LIB_DIR = LIB_DIR + APP_NAME
24
+
25
+ #
26
+ # ライブラリロードパスの差し込み
27
+ #
28
+
29
+ $LOAD_PATH.unshift(LIB_DIR)
30
+
31
+ #
32
+ # アプリケーション本体の読み込み
33
+ #
34
+
35
+ require "#{APP_LIB_DIR + "version"}"
36
+ require "#{APP_LIB_DIR + "device"}"
37
+ require "#{APP_LIB_DIR + "player"}"
38
+ require "#{APP_LIB_DIR + "main"}"
39
+
40
+ #
41
+ # コマンドラインオプションのパース
42
+ #
43
+
44
+ OptionParser.new { |opt|
45
+ opt.banner << " {NAME|ADDRESS}"
46
+ opt.version = CMusBt::VERSION
47
+
48
+ log = {
49
+ :file => "/dev/null",
50
+ :level => :INFO
51
+ }
52
+
53
+ opt.on("-l", "--list-available-device") { |name|
54
+ $mode = :list_device
55
+ }
56
+
57
+ opt.on("--log-file=FILE") { |val|
58
+ log[:file] = val
59
+ }
60
+
61
+ opt.on("--log-level=FLEVEL") { |val|
62
+ log[:level] = val.upcase.to_sym
63
+ }
64
+
65
+ opt.parse!(ARGV)
66
+
67
+
68
+ logfile = File.open(log[:file], "a")
69
+ logfile.sync = true
70
+
71
+ $mode ||= :run_app
72
+ $logger = Logger.new(log[:file],
73
+ :level => log[:level],
74
+ :datetime_format => "%Y-%m-%dT%H:%M:%S")
75
+ }
76
+
77
+ #
78
+ # アプリケーションの起動
79
+ #
80
+ CMusBt::App.start(ARGV[0])
@@ -0,0 +1,44 @@
1
+
2
+ lib = File.expand_path("../lib", __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require "cmus-bt/version"
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "cmus-bt"
8
+ spec.version = CMusBt::VERSION
9
+ spec.authors = ["Hirosho Kuwagata"]
10
+ spec.email = ["kgt9221@gmail.com"]
11
+
12
+ spec.summary = %q{Bluetooth AVRCP wrapper for cmus.}
13
+ spec.description = %q{Bluetooth AVRCP wrapper for cmus.}
14
+ spec.homepage = "https://github.com/kwgt/cmus-bt"
15
+ spec.license = "MIT"
16
+
17
+ if spec.respond_to?(:metadata)
18
+ spec.metadata["homepage_uri"] = spec.homepage
19
+ else
20
+ raise "RubyGems 2.0 or newer is required to protect against " \
21
+ "public gem pushes."
22
+ end
23
+
24
+ # Specify which files should be added to the gem when it is released.
25
+ # The `git ls-files -z` loads the files in the RubyGem that have been
26
+ # added into git.
27
+ spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
28
+ `git ls-files -z`.split("\x0").reject { |f|
29
+ f.match(%r{^(test|spec|features)/})
30
+ }
31
+ end
32
+
33
+ spec.bindir = "bin"
34
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
35
+ spec.require_paths = ["none"]
36
+ spec.extensions = %w[]
37
+
38
+ spec.required_ruby_version = ">= 2.5.0"
39
+
40
+ spec.add_development_dependency "bundler", "~> 2.0"
41
+ spec.add_development_dependency "rake", "~> 10.0"
42
+ spec.add_dependency "ruby-dbus", "~> 0.16.0"
43
+ spec.add_dependency "systemu", "~> 2.6.5"
44
+ end
@@ -0,0 +1,11 @@
1
+ #! /usr/bin/env ruby
2
+ # coding: utf-8
3
+
4
+ #
5
+ # Bluetooth AVRCP wrapper for cmus.
6
+ #
7
+ # Copyright (C) 2020 Hiroshi Kuwagata <kgt9221@gmail.com>
8
+ #
9
+
10
+ require "#{APP_LIB_DIR + "device" + "bluetooth"}"
11
+ require "#{APP_LIB_DIR + "device" + "input"}"
@@ -0,0 +1,64 @@
1
+ #! /usr/bin/env ruby
2
+ # coding: utf-8
3
+
4
+ #
5
+ # Bluetooth AVRCP wrapper for cmus.
6
+ #
7
+ # Copyright (C) 2020 Hiroshi Kuwagata <kgt9221@gmail.com>
8
+ #
9
+
10
+ require 'dbus'
11
+
12
+ module CMusBt
13
+ module Device
14
+ module Bluetooth
15
+ class << self
16
+ def service
17
+ if not @service
18
+ @service = DBus.system_bus.service("org.bluez")
19
+ @service.introspect
20
+ end
21
+
22
+ return @service
23
+ end
24
+ private :service
25
+
26
+ def root
27
+ if not @root
28
+ @root = service["/"]
29
+ @root.introspect
30
+ end
31
+
32
+ return @root
33
+ end
34
+ private :root
35
+
36
+ def objman
37
+ @objman ||=
38
+ root["org.freedesktop.DBus.ObjectManager"].GetManagedObjects
39
+
40
+ return @objman
41
+ end
42
+ private :objman
43
+
44
+ def list
45
+ ret = []
46
+
47
+ objman.each { |path, hash|
48
+ next if not hash.keys.include?("org.bluez.Device1")
49
+
50
+ iface = hash["org.bluez.Device1"]
51
+
52
+ next if iface["UUIDs"].none? {|id| /^0000110e-/ =~ id}
53
+ next if not iface["Connected"]
54
+ next if not iface["ServicesResolved"]
55
+
56
+ ret << {:address => iface["Address"], :name => iface["Name"]}
57
+ }
58
+
59
+ return ret
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,106 @@
1
+ #! /usr/bin/env ruby
2
+ # coding: utf-8
3
+
4
+ #
5
+ # Bluetooth AVRCP wrapper for cmus.
6
+ #
7
+ # Copyright (C) 2020 Hiroshi Kuwagata <kgt9221@gmail.com>
8
+ #
9
+
10
+ module CMusBt
11
+ module Device
12
+ module Input
13
+ class << self
14
+ def put_ident(dst, s)
15
+ h = {}
16
+
17
+ s.scan(/([[:alpha:]]+)=(\h+)/) { |key, val|
18
+ h[key.downcase.to_sym] = val.to_i
19
+ }
20
+
21
+ dst[:ident] = h
22
+ end
23
+
24
+ def put_name(dst, s)
25
+ dst[:name] = (/^Name=\"(.*)\"$/ =~ s)? $1: nil
26
+ end
27
+
28
+ def put_phys(dst, s)
29
+ dst[:phys] = (/^Phys=(.*)$/ =~ s)? $1: nil
30
+ end
31
+
32
+ def put_sysfs(dst, s)
33
+ dst[:sysfs] = (/^Sysfs=(.*)$/ =~ s)? $1: nil
34
+ end
35
+
36
+ def put_uniq(dst, s)
37
+ dst[:uniq] = (/^Sysfs=(.*)$/ =~ s)? $1: nil
38
+ end
39
+
40
+ def put_handlers(dst, s)
41
+ a = []
42
+
43
+ s.split.each { |t|
44
+ if /^event\d+$/ =~ t
45
+ dst[:dev_file] = "/dev/input/#{t}"
46
+ else
47
+ a << t
48
+ end
49
+ }
50
+
51
+ dst[:handlers] = a
52
+ end
53
+
54
+ def put_bitmap(dst, s)
55
+ h = (dst[:bitmap] || {})
56
+
57
+ if /(.+)=(.+)/ =~ s
58
+ h[$1] = $2
59
+ end
60
+ end
61
+
62
+ def list
63
+ ret = []
64
+
65
+ File.open("/proc/bus/input/devices") { |f|
66
+ info = {}
67
+
68
+ f.each_line { |l|
69
+ case l
70
+ when /^I: (.*)$/
71
+ put_ident(info, $1)
72
+
73
+ when /^N: (.*)$/
74
+ put_name(info, $1)
75
+
76
+ when /^P: (.*)/
77
+ put_phys(info, $1)
78
+
79
+ when /^S: (.*)$/
80
+ put_sysfs(info, $1)
81
+
82
+ when /^U: (.*)$/
83
+ put_uniq(info, $1)
84
+
85
+ when /^H: Handlers=(.*)$/
86
+ put_handlers(info, $1)
87
+
88
+ when /^B: (.*)$/
89
+ put_bitmap(info, $1)
90
+
91
+ when /^\s*$/
92
+ ret << info
93
+ info = {}
94
+ next
95
+ end
96
+ }
97
+
98
+ ret << info if not info.empty?
99
+ }
100
+
101
+ return ret
102
+ end
103
+ end
104
+ end
105
+ end
106
+ end
@@ -0,0 +1,88 @@
1
+ #! /usr/bin/env ruby
2
+ # coding: utf-8
3
+
4
+ #
5
+ # Bluetooth AVRCP wrapper for cmus.
6
+ #
7
+ # Copyright (C) 2020 Hiroshi Kuwagata <kgt9221@gmail.com>
8
+ #
9
+
10
+ require 'systemu'
11
+
12
+ module CMusBt
13
+ module App
14
+ class << self
15
+ def availables
16
+ ret = []
17
+ a = Device::Bluetooth.list
18
+ b = Device::Input.list
19
+
20
+ a.each { |ai|
21
+ b.each {|bi|
22
+ if bi[:name] == ai[:address]
23
+ ret << {
24
+ :address => ai[:address],
25
+ :name => ai[:name],
26
+ :dev_file => bi[:dev_file],
27
+ }
28
+ end
29
+ }
30
+ }
31
+
32
+ return ret
33
+ end
34
+ private :availables
35
+
36
+ def list_device
37
+ list = availables()
38
+
39
+ if list.empty?
40
+ print("Available device is not exist.")
41
+
42
+ else
43
+ list.each { |info|
44
+ print(" %17s %s\n" % [info[:address], info[:name]])
45
+ }
46
+ end
47
+ end
48
+ private :list_device
49
+
50
+
51
+ def run_app(targ)
52
+ $logger.info("start #{APP_NAME} version #{CMusBt::VERSION}")
53
+ list = availables()
54
+ if list.empty?
55
+ raise("available device is not exist")
56
+ end
57
+
58
+ if targ
59
+ info = list.find {|inf| inf[:address] == targ || inf[:name] == targ}
60
+ raise("specified device is not connected") if not info
61
+ else
62
+ info = list.first
63
+ end
64
+
65
+ thread = Thread.fork {Player.daemon(info)}
66
+ status = system("cmus")
67
+
68
+ thread.raise
69
+ $logger.info("exit #{APP_NAME}")
70
+ exit(status)
71
+ end
72
+ private :run_app
73
+
74
+ def start(info)
75
+ case $mode
76
+ when :list_device
77
+ list_device
78
+
79
+ when :run_app
80
+ run_app(info)
81
+
82
+ else
83
+ raise("Not implement yet")
84
+ end
85
+ end
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,128 @@
1
+ #! /usr/bin/env ruby
2
+ # coding: utf-8
3
+
4
+ #
5
+ # Bluetooth AVRCP wrapper for cmus.
6
+ #
7
+ # Copyright (C) 2020 Hiroshi Kuwagata <kgt9221@gmail.com>
8
+ #
9
+
10
+ require 'systemu'
11
+
12
+ module CMusBt
13
+ module Player
14
+ # from struct input_event on <linux/event.h>
15
+ EVENT_STRUCTURE = "l!l!S!S!i!"
16
+
17
+ FUNC_TABLE = {
18
+ 200 => :do_play, # KEY_PLAYCD
19
+ 201 => :do_pause, # KEY_PAUSECD
20
+ 163 => :do_next, # KEY_NEXTSONG
21
+ 165 => :do_prev, # KEY_PREVIOUSSONG
22
+ }
23
+
24
+ class << self
25
+ def query
26
+ begin
27
+ status, ret = systemu("cmus-remote --query")
28
+ raise if not status.success?
29
+
30
+ rescue
31
+ sleep 0.2
32
+ retry
33
+ end
34
+
35
+ return ret
36
+ end
37
+ private :query
38
+
39
+ def status
40
+ ret = catch { |tag|
41
+ query.each_line {|l| throw tag, $1.to_sym if /^status = (.+)/ =~ l}
42
+ }
43
+
44
+ return ret
45
+ end
46
+ private :status
47
+
48
+ def read_meta
49
+ ret = {}
50
+ status = nil
51
+
52
+ query.each_line { |l|
53
+ case l
54
+ when /^status (.+)/
55
+ status = $1.to_sym
56
+
57
+ when /^file (.+)/
58
+ ret[:file] = File.basename($1)
59
+
60
+ when /^tag (.+) (.+)/
61
+ ret[$1.to_sym] = $2
62
+ end
63
+ }
64
+
65
+ ret[:name] ||= ret[:file] if status == :playing
66
+
67
+ return ret
68
+ end
69
+ private :read_meta
70
+
71
+ def do_play
72
+ if status == :playing
73
+ system("cmus-remote --pause")
74
+ $logger.info("PAUSE")
75
+ else
76
+ system("cmus-remote --play")
77
+ $logger.info("PLAY")
78
+ end
79
+ end
80
+ private :do_play
81
+
82
+ def do_pause
83
+ system("cmus-remote --pause")
84
+ $logger.info("PAUSE")
85
+ end
86
+ private :do_pause
87
+
88
+ def do_next
89
+ system("cmus-remote --next")
90
+ $logger.info("NEXT")
91
+ end
92
+ private :do_next
93
+
94
+ def do_prev
95
+ system("cmus-remote --prev")
96
+ $logger.info("PREV")
97
+ end
98
+ private :do_prev
99
+
100
+ def daemon(info)
101
+ io = File.open(info[:dev_file], "rb")
102
+ size = [0, 0, 0, 0, 0].pack(EVENT_STRUCTURE).bytesize
103
+
104
+ until io.eof?
105
+ raw = io.read(size)
106
+ tmp = raw.unpack(EVENT_STRUCTURE)
107
+
108
+ type = tmp[2]
109
+ code = tmp[3]
110
+ val = tmp[4]
111
+
112
+ $logger.debug("push #{type}, #{code}, #{val}")
113
+
114
+ next if type != 1 or val != 0
115
+
116
+ FUNC_TABLE[code] && send(FUNC_TABLE[code])
117
+ end
118
+
119
+ rescue RuntimeError
120
+ $logger.debug("stop daemon")
121
+
122
+ ensure
123
+ io&.close
124
+ end
125
+ end
126
+ end
127
+ end
128
+
@@ -0,0 +1,3 @@
1
+ module CMusBt
2
+ VERSION = "0.1.0"
3
+ end
metadata ADDED
@@ -0,0 +1,114 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: cmus-bt
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Hirosho Kuwagata
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2020-02-23 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '2.0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '2.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: ruby-dbus
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 0.16.0
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 0.16.0
55
+ - !ruby/object:Gem::Dependency
56
+ name: systemu
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 2.6.5
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 2.6.5
69
+ description: Bluetooth AVRCP wrapper for cmus.
70
+ email:
71
+ - kgt9221@gmail.com
72
+ executables:
73
+ - cmus-bt
74
+ extensions: []
75
+ extra_rdoc_files: []
76
+ files:
77
+ - ".gitignore"
78
+ - Gemfile
79
+ - LICENSE
80
+ - README.md
81
+ - bin/cmus-bt
82
+ - cmus-bt.gemspec
83
+ - lib/cmus-bt/device.rb
84
+ - lib/cmus-bt/device/bluetooth.rb
85
+ - lib/cmus-bt/device/input.rb
86
+ - lib/cmus-bt/main.rb
87
+ - lib/cmus-bt/player.rb
88
+ - lib/cmus-bt/version.rb
89
+ - pkg/.gitkeep
90
+ homepage: https://github.com/kwgt/cmus-bt
91
+ licenses:
92
+ - MIT
93
+ metadata:
94
+ homepage_uri: https://github.com/kwgt/cmus-bt
95
+ post_install_message:
96
+ rdoc_options: []
97
+ require_paths:
98
+ - none
99
+ required_ruby_version: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: 2.5.0
104
+ required_rubygems_version: !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - ">="
107
+ - !ruby/object:Gem::Version
108
+ version: '0'
109
+ requirements: []
110
+ rubygems_version: 3.1.2
111
+ signing_key:
112
+ specification_version: 4
113
+ summary: Bluetooth AVRCP wrapper for cmus.
114
+ test_files: []