aric 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (58) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +9 -0
  3. data/.rspec +3 -0
  4. data/.rubocop.yml +100 -0
  5. data/.travis.yml +3 -0
  6. data/Gemfile +4 -0
  7. data/README.md +40 -0
  8. data/Rakefile +6 -0
  9. data/aric.gemspec +24 -0
  10. data/bin/aric +5 -0
  11. data/bin/console +14 -0
  12. data/bin/setup +7 -0
  13. data/lib/aric.rb +5 -0
  14. data/lib/aric/command.rb +54 -0
  15. data/lib/aric/job.rb +9 -0
  16. data/lib/aric/job/base.rb +49 -0
  17. data/lib/aric/job/finder.rb +62 -0
  18. data/lib/aric/job/player.rb +77 -0
  19. data/lib/aric/job/util.rb +28 -0
  20. data/lib/aric/job/volume.rb +23 -0
  21. data/lib/aric/job_handler.rb +46 -0
  22. data/lib/aric/resource/base.rb +58 -0
  23. data/lib/aric/resource/playlist.rb +30 -0
  24. data/lib/aric/resource/track.rb +45 -0
  25. data/lib/aric/script_runner.rb +35 -0
  26. data/lib/aric/version.rb +3 -0
  27. data/scripts/activate.js +2 -0
  28. data/scripts/back_track.js +2 -0
  29. data/scripts/current_playlist.js +12 -0
  30. data/scripts/current_playlist_tracks.js +14 -0
  31. data/scripts/current_track.js +12 -0
  32. data/scripts/down.js +5 -0
  33. data/scripts/fast_forward.js +2 -0
  34. data/scripts/finder/find_all_playlists.js +15 -0
  35. data/scripts/finder/find_all_tracks.js +15 -0
  36. data/scripts/finder/find_loved_playlists.js +16 -0
  37. data/scripts/finder/find_loved_tracks.js +16 -0
  38. data/scripts/finder/find_playlist_by_id.js +16 -0
  39. data/scripts/finder/find_playlists.js +18 -0
  40. data/scripts/finder/find_track_by_id.js +16 -0
  41. data/scripts/finder/find_tracks.js +18 -0
  42. data/scripts/finder/find_tracks_by.js +19 -0
  43. data/scripts/love.js +2 -0
  44. data/scripts/love_playlist.js +2 -0
  45. data/scripts/mute.js +2 -0
  46. data/scripts/next_track.js +2 -0
  47. data/scripts/pause.js +2 -0
  48. data/scripts/play.js +13 -0
  49. data/scripts/player_position.js +2 -0
  50. data/scripts/player_state.js +2 -0
  51. data/scripts/previous_track.js +2 -0
  52. data/scripts/resume.js +2 -0
  53. data/scripts/set_player_position.js +4 -0
  54. data/scripts/unlove.js +2 -0
  55. data/scripts/unlove_playlist.js +2 -0
  56. data/scripts/unmute.js +2 -0
  57. data/scripts/up.js +5 -0
  58. metadata +158 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 83716dff105d773cb4fda838e9c412a5948750ad
4
+ data.tar.gz: a9bcf7b61e4d53ab16a374aae185c1f22c31775a
5
+ SHA512:
6
+ metadata.gz: 8926293e242e2efa94ac452e9fc6ca1cd74f703eacc74cfac566cec539840ebbda0ed6e19dc4f867676e11e9ec52639b68864a222d6e6a14cbd723ee1506f05a
7
+ data.tar.gz: de6c5e80d54124c0103fc57f35ca10e8838d30a4a0a80a1781887f9d8cc8105c8c1c3973d3b870a452d1a4c551e9c6265f59ea96000108e7d591769ab0801e06
data/.gitignore ADDED
@@ -0,0 +1,9 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --format documentation
2
+ --require spec_helper
3
+ --color
data/.rubocop.yml ADDED
@@ -0,0 +1,100 @@
1
+ AllCops:
2
+ Exclude:
3
+ - "vendor/**/*"
4
+ - "db/schema.rb"
5
+ DisplayCopNames: true
6
+
7
+ Style/AndOr:
8
+ EnforcedStyle: conditionals
9
+
10
+ Style/AsciiComments:
11
+ Enabled: false
12
+
13
+ Style/BracesAroundHashParameters:
14
+ Enabled: false
15
+
16
+ Style/CollectionMethods:
17
+ PreferredMethods:
18
+ detect: "detect"
19
+ find: "detect"
20
+
21
+ Style/DeprecatedHashMethods:
22
+ Enabled: false
23
+
24
+ Style/Documentation:
25
+ Enabled: false
26
+
27
+ Style/DoubleNegation:
28
+ Enabled: false
29
+
30
+ Style/DotPosition:
31
+ EnforcedStyle: trailing
32
+
33
+ Style/EmptyElse:
34
+ EnforcedStyle: empty
35
+
36
+ Style/FormatString:
37
+ EnforcedStyle: percent
38
+
39
+ Style/GuardClause:
40
+ MinBodyLength: 5
41
+
42
+ Style/IfUnlessModifier:
43
+ Enabled: false
44
+
45
+ Style/IndentHash:
46
+ EnforcedStyle: consistent
47
+
48
+ Style/Lambda:
49
+ Enabled: false
50
+
51
+ Style/NumericLiterals:
52
+ MinDigits: 7
53
+
54
+ Style/PredicateName:
55
+ NamePrefixBlacklist:
56
+ - "is_"
57
+ - "have_"
58
+ NamePrefix:
59
+ - "is_"
60
+ - "have_"
61
+
62
+ Style/RedundantReturn:
63
+ AllowMultipleReturnValues: true
64
+
65
+ Style/SignalException:
66
+ EnforcedStyle: only_raise
67
+
68
+ Style/SpaceAroundOperators:
69
+ MultiSpaceAllowedForOperators:
70
+ - "="
71
+ - "=>"
72
+ - "||"
73
+
74
+ Style/SingleLineBlockParams:
75
+ Enabled: false
76
+
77
+ Style/TrailingComma:
78
+ EnforcedStyleForMultiline: comma
79
+
80
+ Lint/UnderscorePrefixedVariableName:
81
+ Enabled: false
82
+
83
+ Lint/UnusedMethodArgument:
84
+ Enabled: false
85
+
86
+ Metrics/AbcSize:
87
+ Max: 30
88
+
89
+ Metrics/CyclomaticComplexity:
90
+ Max: 10
91
+
92
+ Metrics/LineLength:
93
+ Max: 120
94
+
95
+ Metrics/PerceivedComplexity:
96
+ Max: 8
97
+
98
+ Metrics/MethodLength:
99
+ CountComments: false
100
+ Max: 15
data/.travis.yml ADDED
@@ -0,0 +1,3 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.2.2
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in aric.gemspec
4
+ gemspec
data/README.md ADDED
@@ -0,0 +1,40 @@
1
+ # Aric
2
+
3
+ <a href="https://codeclimate.com/github/ganmacs/aric"><img src="https://codeclimate.com/github/ganmacs/aric/badges/gpa.svg" /></a>
4
+ [![Build Status](https://travis-ci.org/ganmacs/aric.svg)](https://travis-ci.org/ganmacs/aric)
5
+
6
+ Awesome Ruby Itunes Client
7
+
8
+ ## Installation
9
+
10
+ Add this line to your application's Gemfile:
11
+
12
+ ```ruby
13
+ gem 'aric'
14
+ ```
15
+
16
+ And then execute:
17
+
18
+ $ bundle
19
+
20
+ Or install it yourself as:
21
+
22
+ $ gem install aric
23
+
24
+ ## Usage
25
+
26
+ TODO: Write usage instructions here
27
+
28
+ ## Development
29
+
30
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `bin/console` for an interactive prompt that will allow you to experiment.
31
+
32
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release` to create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
33
+
34
+ ## Contributing
35
+
36
+ 1. Fork it ( https://github.com/[my-github-username]/aric/fork )
37
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
38
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
39
+ 4. Push to the branch (`git push origin my-new-feature`)
40
+ 5. Create a new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require 'bundler/gem_tasks'
2
+ require 'rspec/core/rake_task'
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task default: :spec
data/aric.gemspec ADDED
@@ -0,0 +1,24 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'aric/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'aric'
8
+ spec.version = Aric::VERSION
9
+ spec.authors = ['ganmacs']
10
+ spec.email = ['ganmacs@gmail.com']
11
+
12
+ spec.summary = 'Awesome Ruby Ituens Client'
13
+ spec.homepage = 'https://github.com/ganmacs/arci'
14
+
15
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
16
+ spec.bindir = 'bin'
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.require_paths = ['lib']
19
+ spec.add_dependency 'hashie', '~> 3.4.0'
20
+
21
+ spec.add_development_dependency 'bundler', '~> 1.9'
22
+ spec.add_development_dependency 'rake', '~> 10.0'
23
+ spec.add_development_dependency 'rspec'
24
+ end
data/bin/aric ADDED
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+ $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
3
+ require 'aric'
4
+
5
+ Aric::Command.new(ARGV).call
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'bundler/setup'
4
+ require 'aric'
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require 'irb'
14
+ IRB.start
data/bin/setup ADDED
@@ -0,0 +1,7 @@
1
+ #!/bin/bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+
5
+ bundle install
6
+
7
+ # Do any other automated setup that you need to do here
data/lib/aric.rb ADDED
@@ -0,0 +1,5 @@
1
+ require 'aric/version'
2
+ require 'aric/command'
3
+
4
+ module Aric
5
+ end
@@ -0,0 +1,54 @@
1
+ require 'optparse'
2
+ require 'aric/job_handler'
3
+
4
+ module Aric
5
+ class Command
6
+ class JobNameRequired < StandardError; end
7
+
8
+ def initialize(args = ARGV)
9
+ @args = args
10
+ end
11
+
12
+ def call
13
+ case
14
+ when list?
15
+ puts JobHandler.jobs
16
+ else
17
+ puts handler.run(*values)
18
+ end
19
+ end
20
+
21
+ private
22
+
23
+ def values
24
+ @values ||= @args.drop(1)
25
+ end
26
+
27
+ def job
28
+ @job ||= (@args.first or raise JobNameRequired)
29
+ end
30
+
31
+ def handler
32
+ @handler ||= JobHandler.new(job)
33
+ end
34
+
35
+ def list?
36
+ options['list']
37
+ end
38
+
39
+ def options
40
+ @options ||= option_parser.getopts(@argv)
41
+ end
42
+
43
+ def option_parser
44
+ @optin_parser ||= OptionParser.new do |opt|
45
+ opt.version = Aric::VERSION
46
+ opt.banner = 'Usage: aric [options]'
47
+
48
+ opt.separator 'Options:'
49
+ opt.on('-l', '--list', 'show available methods')
50
+ opt.on('-d', 'demonize')
51
+ end
52
+ end
53
+ end
54
+ end
data/lib/aric/job.rb ADDED
@@ -0,0 +1,9 @@
1
+ require 'aric/job/player'
2
+ require 'aric/job/volume'
3
+ require 'aric/job/util'
4
+ require 'aric/job/finder'
5
+
6
+ module Aric
7
+ module Job
8
+ end
9
+ end
@@ -0,0 +1,49 @@
1
+ require 'json'
2
+ require 'singleton'
3
+ require 'aric/script_runner'
4
+ require 'aric/resource/track'
5
+ require 'aric/resource/playlist'
6
+
7
+ module Aric
8
+ module Job
9
+ class Base
10
+ include Singleton
11
+
12
+ class << self
13
+ def run(job_name, *args)
14
+ instance.send(job_name, *args)
15
+ end
16
+ end
17
+
18
+ private
19
+
20
+ def run(job_name, *opt)
21
+ ScriptRunner.run(job_name.to_s, *opt)
22
+ end
23
+
24
+ def build_track(json)
25
+ ::Aric::Resource::Track.new(json)
26
+ end
27
+
28
+ def build_tracks(json)
29
+ json.map do |e|
30
+ build_track(e)
31
+ end
32
+ end
33
+
34
+ def build_playlist(json)
35
+ ::Aric::Resource::Playlist.new(json)
36
+ end
37
+
38
+ def build_playlists(json)
39
+ json.map do |e|
40
+ build_playlist(e)
41
+ end
42
+ end
43
+
44
+ def jsonify(body)
45
+ JSON.parse(body)
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,62 @@
1
+ require 'aric/job/base'
2
+
3
+ module Aric
4
+ module Job
5
+ class Finder < Base
6
+ def find_tracks(v)
7
+ ts = run(:find_tracks, v)
8
+ build_tracks(jsonify(ts))
9
+ end
10
+
11
+ def find_track_by_id(id)
12
+ t = run(:find_track_by_id, id)
13
+ build_track(jsonify(t))
14
+ end
15
+
16
+ def find_loved_tracks
17
+ ts = run(:find_loved_tracks)
18
+ build_tracks(jsonify(ts))
19
+ end
20
+
21
+ # Too Slow Command
22
+ def find_all_tracks
23
+ ts = run(:find_all_tracks)
24
+ build_tracks(jsonify(ts))
25
+ end
26
+
27
+ %w(albums all artists composers displayed songs).each do |n|
28
+ name = "find_tracks_by_#{n}"
29
+ define_method(name) do |v|
30
+ t = run('find_tracks_by', n, v)
31
+ build_tracks(jsonify(t))
32
+ end
33
+ end
34
+
35
+ def find_playlists(name)
36
+ pls = run(:find_playlists, name)
37
+ build_playlists(jsonify(pls))
38
+ end
39
+
40
+ def find_playlist_by_id(id)
41
+ pl = run(:find_playlist_by_id, id)
42
+ build_playlist(jsonify(pl))
43
+ end
44
+
45
+ def find_loved_playlists
46
+ pls = run(:find_loved_playlists)
47
+ build_playlists(jsonify(pls))
48
+ end
49
+
50
+ def find_all_playlists
51
+ pls = run(:find_all_playlists)
52
+ build_playlists(jsonify(pls))
53
+ end
54
+
55
+ private
56
+
57
+ def run(job_name, *opt)
58
+ ScriptRunner.run("finder/#{job_name}", opt)
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,77 @@
1
+ require 'aric/job/base'
2
+
3
+ module Aric
4
+ module Job
5
+ class Player < Base
6
+ def play(id = nil)
7
+ run(:play, id)
8
+ end
9
+ alias_method :start, :play
10
+
11
+ def pause
12
+ run(:pause)
13
+ end
14
+ alias_method :stop, :pause
15
+
16
+ def resume
17
+ run(:resume)
18
+ end
19
+
20
+ def back_track
21
+ run(:back_track)
22
+ end
23
+ alias_method :back, :back_track
24
+
25
+ def previous_track
26
+ run(:previous_track)
27
+ end
28
+
29
+ def next_track
30
+ run(:next_track)
31
+ end
32
+ alias_method :next, :next_track
33
+
34
+ def fast_forward
35
+ run(:fast_forward)
36
+ end
37
+
38
+ def current_track
39
+ t = run(:current_track)
40
+ build_track(jsonify(t))
41
+ end
42
+ alias_method :track, :current_track
43
+
44
+ def current_playlist
45
+ pl = run(:current_playlist)
46
+ build_playlist(jsonify(pl))
47
+ end
48
+ alias_method :playlist, :current_playlist
49
+
50
+ def current_playlist_tracks
51
+ ts = run(:current_playlist_tracks)
52
+ build_tracks(jsonify(ts))
53
+ end
54
+
55
+ def player_state(v = [])
56
+ run(:player_state)
57
+ end
58
+ alias_method :state, :player_state
59
+
60
+ %w(playing paused stopped).each do |name|
61
+ define_method("#{name}?") do
62
+ player_state == name
63
+ end
64
+ end
65
+
66
+ def player_position
67
+ run(:player_position)
68
+ end
69
+ alias_method :position, :player_position
70
+
71
+ def set_player_position(pos)
72
+ run(:set_player_position, pos)
73
+ end
74
+ alias_method :set_position, :set_player_position
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,28 @@
1
+ require 'aric/job/base'
2
+
3
+ module Aric
4
+ module Job
5
+ class Util < Base
6
+ def activate
7
+ run(:activate)
8
+ end
9
+ alias_method :open, :activate
10
+
11
+ def love
12
+ run(:love)
13
+ end
14
+
15
+ def unlove
16
+ run(:unlove)
17
+ end
18
+
19
+ def love_playlist
20
+ run(:love_playlist)
21
+ end
22
+
23
+ def playlist_unlove
24
+ run(:unlove_playlist)
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,23 @@
1
+ require 'aric/job/base'
2
+
3
+ module Aric
4
+ module Job
5
+ class Volume < Base
6
+ def up(v = 5)
7
+ run(:up, v)
8
+ end
9
+
10
+ def down(v = 5)
11
+ run(:down, v)
12
+ end
13
+
14
+ def mute
15
+ run(:mute)
16
+ end
17
+
18
+ def unmute
19
+ run(:unmute)
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,46 @@
1
+ require 'aric/job'
2
+
3
+ module Aric
4
+ class JobHandler
5
+ class JobNotFound < StandardError; end
6
+
7
+ class << self
8
+ def jobs
9
+ @jobs ||= job_class_hash.values.flat_map(&:itself)
10
+ end
11
+
12
+ def job_class_hash
13
+ @job_class_hash ||= job_classes.each_with_object({}) do |c, a|
14
+ a[c] = c.public_instance_methods(false)
15
+ end
16
+ end
17
+
18
+ private
19
+
20
+ def job_classes
21
+ @job_class ||= Job.constants.map { |e| Job.const_get(e) }
22
+ end
23
+ end
24
+
25
+ def initialize(job_name)
26
+ @job_name = job_name.to_sym
27
+ end
28
+
29
+ def run(*args)
30
+ # check argument number
31
+ job_class.run(@job_name, *args)
32
+ end
33
+
34
+ private
35
+
36
+ # Return Job class that has job_name method
37
+ def job_class
38
+ raise JobNotFound if job_not_found?
39
+ JobHandler.job_class_hash.find { |_, v| v.include?(@job_name) }.first
40
+ end
41
+
42
+ def job_not_found?
43
+ !JobHandler.jobs.include?(@job_name)
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,58 @@
1
+ require 'hashie'
2
+ require 'aric/job'
3
+
4
+ module Aric
5
+ module Resource
6
+ class Base
7
+ class << self
8
+ def find_by(cond)
9
+ raise ArgumentError if cond.nil?
10
+ if cond.is_a?(Hash)
11
+ find_with_condition(cond)
12
+ elsif cond == :all
13
+ find_all
14
+ else
15
+ raise ArgumentError
16
+ end
17
+ end
18
+
19
+ def all
20
+ find_by(:all)
21
+ end
22
+
23
+ private
24
+
25
+ def find_all
26
+ raise NotImplementedError
27
+ end
28
+
29
+ def find_with_condition(cond)
30
+ raise NotImplementedError
31
+ end
32
+
33
+ def finder
34
+ @finder ||= Aric::Job::Finder.instance
35
+ end
36
+ end
37
+
38
+ def initialize(resource)
39
+ properties = resource.delete('properties') || {}
40
+ @resource = Hashie::Mash.new(resource.merge(properties))
41
+
42
+ @resource.select { |_, v| [TrueClass, FalseClass].include?(v.class) }.each do |k, v|
43
+ self.class.class_eval do
44
+ define_method("#{k}?") { v }
45
+ end
46
+ end
47
+ end
48
+
49
+ def method_missing(method_name, *args, &block)
50
+ if @resource.respond_to?(method_name)
51
+ @resource.send(method_name, *args, &block)
52
+ else
53
+ super
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,30 @@
1
+ require 'aric/resource/base'
2
+
3
+ module Aric
4
+ module Resource
5
+ class Playlist < Base
6
+ class << self
7
+ private
8
+
9
+ def find_with_condition(cond)
10
+ case
11
+ when cond[:id]
12
+ finder.find_playlist_by_id(cond[:id]).first
13
+ when cond[:name]
14
+ finder.find_playlists(cond[:name]).first
15
+ when cond[:loved]
16
+ finder.find_loved_playlists(cond[:loved])
17
+ end
18
+ end
19
+
20
+ def find_all
21
+ finder.find_all_playlists
22
+ end
23
+ end
24
+
25
+ def to_s
26
+ name
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,45 @@
1
+ require 'aric/resource/base'
2
+
3
+ module Aric
4
+ module Resource
5
+ class Track < Base
6
+ class << self
7
+ private
8
+
9
+ def find_with_condition(cond)
10
+ case
11
+ when cond[:id]
12
+ finder.find_track_by_id(cond[:id])
13
+ when cond[:loved]
14
+ finder.find_loved_tracks(cond[:loved])
15
+ when cond[:name]
16
+ finder.find_tracks_by_songs(cond[:name]).first
17
+ when cond[:album]
18
+ finder.find_tracks_by_albums(cond[:album]).first
19
+ when cond[:artists]
20
+ finder.find_tracks_by_artists(cond[:artists]).first
21
+ end
22
+ end
23
+
24
+ # Maybe Too Slow
25
+ def find_all
26
+ finder.finder_all_tracks
27
+ end
28
+ end
29
+
30
+ def play
31
+ player.play(persistentID)
32
+ end
33
+
34
+ def to_s
35
+ '%s / %s / %s' % [name, artist, album]
36
+ end
37
+
38
+ private
39
+
40
+ def player
41
+ @player ||= Aric::Job::Player.instance
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,35 @@
1
+ require 'open3'
2
+
3
+ module Aric
4
+ class ScriptRunner
5
+ class << self
6
+ def run(file_name, args = [])
7
+ new(file_name).run(args)
8
+ end
9
+ end
10
+
11
+ def initialize(file_name)
12
+ @file_name = file_name.to_s
13
+ end
14
+
15
+ def run(args = [])
16
+ args = Array(args).join(' ')
17
+ stdout, stderr, status = Open3.capture3("osascript -l JavaScript #{script_file_path} #{args}")
18
+ puts nil, '<============================================================ DEBUG OUTPUT START HERE'
19
+ p stdout, stderr, status
20
+ puts '<============================================================ DEBUG OUTPUT CLOSE HERE', nil
21
+ raise stderr unless status.success?
22
+ stdout.strip
23
+ end
24
+
25
+ private
26
+
27
+ def script_file_path
28
+ "#{script_base_dir}/#{@file_name}.js"
29
+ end
30
+
31
+ def script_base_dir
32
+ @script_base_dir ||= File.expand_path('../../../scripts', __FILE__)
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,3 @@
1
+ module Aric
2
+ VERSION = '0.1.0'
3
+ end
@@ -0,0 +1,2 @@
1
+ var app = Application("iTunes");
2
+ app.activate();
@@ -0,0 +1,2 @@
1
+ var app = Application("iTunes");
2
+ app.backTrack();
@@ -0,0 +1,12 @@
1
+ var app = Application("iTunes");
2
+ var playlist = app.currentPlaylist();
3
+
4
+ JSON.stringify({
5
+ class: playlist.class(),
6
+ container: playlist.container(),
7
+ id: playlist.id(),
8
+ index: playlist.index(),
9
+ name: playlist.name(),
10
+ persistentID: playlist.persistentID(),
11
+ properties: playlist.properties()
12
+ });
@@ -0,0 +1,14 @@
1
+ var app = Application("iTunes");
2
+ var tracks_in_playlist = app.currentPlaylist().tracks().map(function(track){
3
+ var tmp = {
4
+ class: track.class(),
5
+ container: track.container(),
6
+ id: track.id(),
7
+ index: track.index(),
8
+ name: track.name(),
9
+ persistentID: track.persistentID(),
10
+ properties: track.properties()
11
+ };
12
+ return tmp;
13
+ });
14
+ JSON.stringify(tracks_in_playlist);
@@ -0,0 +1,12 @@
1
+ var app = Application("iTunes");
2
+ var track = app.currentTrack();
3
+
4
+ JSON.stringify({
5
+ class: track.class(),
6
+ container: track.container(),
7
+ id: track.id(),
8
+ index: track.index(),
9
+ name: track.name(),
10
+ persistentID: track.persistentID(),
11
+ properties: track.properties()
12
+ });
data/scripts/down.js ADDED
@@ -0,0 +1,5 @@
1
+ function run(argv){
2
+ var app = Application("iTunes");
3
+ app.soundVolume = app.soundVolume() - (argv[0] * 1);
4
+ return app.soundVolume();
5
+ }
@@ -0,0 +1,2 @@
1
+ var app = Application("iTunes");
2
+ app.fastForward();
@@ -0,0 +1,15 @@
1
+ function run(argv) {
2
+ var app = Application("iTunes");
3
+ var pls = app.playlists().map(function(playlist){
4
+ return {
5
+ class: playlist.class(),
6
+ container: playlist.container(),
7
+ id: playlist.id(),
8
+ index: playlist.index(),
9
+ name: playlist.name(),
10
+ persistentID: playlist.persistentID(),
11
+ properties: playlist.properties()
12
+ };
13
+ });
14
+ return JSON.stringify(pls);
15
+ }
@@ -0,0 +1,15 @@
1
+ function run(argv) {
2
+ var app = Application("iTunes");
3
+ var tracks = app.tracks().map(function(track){
4
+ return {
5
+ class: track.class(),
6
+ container: track.container(),
7
+ id: track.id(),
8
+ index: track.index(),
9
+ name: track.name(),
10
+ persistentID: track.persistentID(),
11
+ properties: track.properties()
12
+ };
13
+ });
14
+ return JSON.stringify(tracks);
15
+ }
@@ -0,0 +1,16 @@
1
+ function run(argv) {
2
+ var app = Application("iTunes");
3
+ var playlists = app.playlists().filter(function(x){ return x.loved(); }).map(function(playlist){
4
+ return {
5
+ class: playlist.class(),
6
+ container: playlist.container(),
7
+ id: playlist.id(),
8
+ index: playlist.index(),
9
+ name: playlist.name(),
10
+ persistentID: playlist.persistentID(),
11
+ properties: playlist.properties()
12
+ };
13
+ });;
14
+
15
+ return JSON.stringify(playlists);
16
+ }
@@ -0,0 +1,16 @@
1
+ function run(argv) {
2
+ var app = Application("iTunes");
3
+ var tracks = app.tracks().filter(function(x){ return x.loved(); }).map(function(track){
4
+ return {
5
+ class: track.class(),
6
+ container: track.container(),
7
+ id: track.id(),
8
+ index: track.index(),
9
+ name: track.name(),
10
+ persistentID: track.persistentID(),
11
+ properties: track.properties()
12
+ };
13
+ });;
14
+
15
+ return JSON.stringify(tracks);
16
+ }
@@ -0,0 +1,16 @@
1
+ function run(argv) {
2
+ var app = Application("iTunes");
3
+ var playlist = app.playlists().find(function(x){
4
+ return x.persistentID() == argv[0];
5
+ });
6
+
7
+ return JSON.stringify({
8
+ class: playlist.class(),
9
+ container: playlist.container(),
10
+ id: playlist.id(),
11
+ index: playlist.index(),
12
+ name: playlist.name(),
13
+ persistentID: playlist.persistentID(),
14
+ properties: playlist.properties()
15
+ });
16
+ }
@@ -0,0 +1,18 @@
1
+ function run(argv) {
2
+ var app = Application("iTunes");
3
+ var playlists = app.playlists().filter(function(x){
4
+ return x.name() == argv[0];
5
+ }).map(function(playlist){
6
+ return {
7
+ class: playlist.class(),
8
+ container: playlist.container(),
9
+ id: playlist.id(),
10
+ index: playlist.index(),
11
+ name: playlist.name(),
12
+ persistentID: playlist.persistentID(),
13
+ properties: playlist.properties()
14
+ };
15
+ });
16
+
17
+ return JSON.stringify(playlists);
18
+ }
@@ -0,0 +1,16 @@
1
+ function run(argv) {
2
+ var app = Application("iTunes");
3
+ var track = app.tracks().find(function(x){
4
+ return x.persistentID() == argv[0];
5
+ });
6
+
7
+ return JSON.stringify({
8
+ class: track.class(),
9
+ container: track.container(),
10
+ id: track.id(),
11
+ index: track.index(),
12
+ name: track.name(),
13
+ persistentID: track.persistentID(),
14
+ properties: track.properties()
15
+ });
16
+ }
@@ -0,0 +1,18 @@
1
+ function run(argv) {
2
+ var app = Application("iTunes");
3
+ var pl = app.playlists().find(function(x){
4
+ return x.name() == "ミュージック" || x.name() == "Music";
5
+ });
6
+ var tracks = app.search(pl, {for: argv[0]}).map(function(track){
7
+ return {
8
+ class: track.class(),
9
+ container: track.container(),
10
+ id: track.id(),
11
+ index: track.index(),
12
+ name: track.name(),
13
+ persistentID: track.persistentID(),
14
+ properties: track.properties()
15
+ };
16
+ });
17
+ return JSON.stringify(tracks);
18
+ }
@@ -0,0 +1,19 @@
1
+ function run(argv) {
2
+ var app = Application("iTunes");
3
+ var pl = app.playlists().find(function(x){
4
+ return x.name() == "ミュージック" || x.name() == "Music";
5
+ });
6
+ var tracks = app.search(pl, {for: argv[1], only: argv[0]}).map(function(track){
7
+ return {
8
+ class: track.class(),
9
+ container: track.container(),
10
+ id: track.id(),
11
+ index: track.index(),
12
+ name: track.name(),
13
+ persistentID: track.persistentID(),
14
+ properties: track.properties()
15
+ };
16
+ });
17
+
18
+ return JSON.stringify(tracks);
19
+ }
data/scripts/love.js ADDED
@@ -0,0 +1,2 @@
1
+ var app = Application("iTunes");
2
+ app.currentTrack().loved = true;
@@ -0,0 +1,2 @@
1
+ var app = Application("iTunes");
2
+ app.currentPlaylist.loved = true;
data/scripts/mute.js ADDED
@@ -0,0 +1,2 @@
1
+ var app = Application("iTunes");
2
+ app.mute = true;
@@ -0,0 +1,2 @@
1
+ var app = Application("iTunes");
2
+ app.nextTrack();
data/scripts/pause.js ADDED
@@ -0,0 +1,2 @@
1
+ var app = Application("iTunes");
2
+ app.pause();
data/scripts/play.js ADDED
@@ -0,0 +1,13 @@
1
+ function run(argv){
2
+ var app = Application("iTunes");
3
+
4
+ if (argv.length > 0) {
5
+ var persistentID = argv[0];
6
+ var t = app.tracks().find(function (x) {
7
+ return x.persistentID() == persistentID;
8
+ });
9
+ app.play(t);
10
+ } else {
11
+ app.play();
12
+ }
13
+ }
@@ -0,0 +1,2 @@
1
+ var app = Application("iTunes");
2
+ app.playerPosition();
@@ -0,0 +1,2 @@
1
+ var app = Application("iTunes");
2
+ app.playerState();
@@ -0,0 +1,2 @@
1
+ var app = Application("iTunes");
2
+ app.previousTrack();
data/scripts/resume.js ADDED
@@ -0,0 +1,2 @@
1
+ var app = Application("iTunes");
2
+ app.resume();
@@ -0,0 +1,4 @@
1
+ function run(argv){
2
+ var app = Application("iTunes");
3
+ app.playerPosition = argv[0] * 1;
4
+ }
data/scripts/unlove.js ADDED
@@ -0,0 +1,2 @@
1
+ var app = Application("iTunes");
2
+ app.currentTrack().loved = false;
@@ -0,0 +1,2 @@
1
+ var app = Application("iTunes");
2
+ app.currentPlaylist.loved = false;
data/scripts/unmute.js ADDED
@@ -0,0 +1,2 @@
1
+ var app = Application("iTunes");
2
+ app.mute = false;
data/scripts/up.js ADDED
@@ -0,0 +1,5 @@
1
+ function run(argv){
2
+ var app = Application("iTunes");
3
+ app.soundVolume = app.soundVolume() + (argv[0] * 1);
4
+ return app.soundVolume();
5
+ }
metadata ADDED
@@ -0,0 +1,158 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: aric
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - ganmacs
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-12-15 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: hashie
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 3.4.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 3.4.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.9'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.9'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '10.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '10.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ description:
70
+ email:
71
+ - ganmacs@gmail.com
72
+ executables:
73
+ - aric
74
+ - console
75
+ - setup
76
+ extensions: []
77
+ extra_rdoc_files: []
78
+ files:
79
+ - ".gitignore"
80
+ - ".rspec"
81
+ - ".rubocop.yml"
82
+ - ".travis.yml"
83
+ - Gemfile
84
+ - README.md
85
+ - Rakefile
86
+ - aric.gemspec
87
+ - bin/aric
88
+ - bin/console
89
+ - bin/setup
90
+ - lib/aric.rb
91
+ - lib/aric/command.rb
92
+ - lib/aric/job.rb
93
+ - lib/aric/job/base.rb
94
+ - lib/aric/job/finder.rb
95
+ - lib/aric/job/player.rb
96
+ - lib/aric/job/util.rb
97
+ - lib/aric/job/volume.rb
98
+ - lib/aric/job_handler.rb
99
+ - lib/aric/resource/base.rb
100
+ - lib/aric/resource/playlist.rb
101
+ - lib/aric/resource/track.rb
102
+ - lib/aric/script_runner.rb
103
+ - lib/aric/version.rb
104
+ - scripts/activate.js
105
+ - scripts/back_track.js
106
+ - scripts/current_playlist.js
107
+ - scripts/current_playlist_tracks.js
108
+ - scripts/current_track.js
109
+ - scripts/down.js
110
+ - scripts/fast_forward.js
111
+ - scripts/finder/find_all_playlists.js
112
+ - scripts/finder/find_all_tracks.js
113
+ - scripts/finder/find_loved_playlists.js
114
+ - scripts/finder/find_loved_tracks.js
115
+ - scripts/finder/find_playlist_by_id.js
116
+ - scripts/finder/find_playlists.js
117
+ - scripts/finder/find_track_by_id.js
118
+ - scripts/finder/find_tracks.js
119
+ - scripts/finder/find_tracks_by.js
120
+ - scripts/love.js
121
+ - scripts/love_playlist.js
122
+ - scripts/mute.js
123
+ - scripts/next_track.js
124
+ - scripts/pause.js
125
+ - scripts/play.js
126
+ - scripts/player_position.js
127
+ - scripts/player_state.js
128
+ - scripts/previous_track.js
129
+ - scripts/resume.js
130
+ - scripts/set_player_position.js
131
+ - scripts/unlove.js
132
+ - scripts/unlove_playlist.js
133
+ - scripts/unmute.js
134
+ - scripts/up.js
135
+ homepage: https://github.com/ganmacs/arci
136
+ licenses: []
137
+ metadata: {}
138
+ post_install_message:
139
+ rdoc_options: []
140
+ require_paths:
141
+ - lib
142
+ required_ruby_version: !ruby/object:Gem::Requirement
143
+ requirements:
144
+ - - ">="
145
+ - !ruby/object:Gem::Version
146
+ version: '0'
147
+ required_rubygems_version: !ruby/object:Gem::Requirement
148
+ requirements:
149
+ - - ">="
150
+ - !ruby/object:Gem::Version
151
+ version: '0'
152
+ requirements: []
153
+ rubyforge_project:
154
+ rubygems_version: 2.4.5.1
155
+ signing_key:
156
+ specification_version: 4
157
+ summary: Awesome Ruby Ituens Client
158
+ test_files: []