lily 0.1.32 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (5) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +25 -4
  3. data/lib/lily.rb +165 -29
  4. data/lib/lily/version.rb +2 -2
  5. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9d34b90d302efac285582160f742adb3cf7210bf
4
- data.tar.gz: 6eaecd6597c17cf6dc81dde92921e9df19a4d948
3
+ metadata.gz: 75b97ec581e49684c65d5359805346373829b643
4
+ data.tar.gz: b1356a98ccbc565653a07995256cf89d4539192e
5
5
  SHA512:
6
- metadata.gz: 54e7ad4d1097682286e5bdabd3c9e7ef647e740b8c1743be158054c3edda3b56ce20ea74541e9928ce677f00eeabb6b7e7cf91d08e5058835d5246c9634cc4ff
7
- data.tar.gz: c41d533c40acf14e4ae4d1e3bbbd5c3f8cd98b6feac527b9a72d2e588bf29dc50e16ec7a6da74ed0262cfa8683069f30631740cab2d7bf2573d28a9aa8613dae
6
+ metadata.gz: f5a5f107c4cff6e69ce9e619ace0b9bdc2b2f30af266873f2bb4ef8863cd7b11abd83fe40fcf0db7509ed501e25819b9f357ba93f49aab71f8a56c68d0a80fbb
7
+ data.tar.gz: 5ef72f04e4f2169f68cf1d2112875fb2d06aaa324c278932fc131e794572d5c362db74702395d370afc6e493a348179ac2a3164514caf01424058d30aa502b27
data/README.md CHANGED
@@ -19,10 +19,10 @@ lily init # Initialize :)
19
19
 
20
20
  ## Usage
21
21
 
22
- What's a CLI without usage docs? A bad one. Below you'll find out how Lily can be used. Keep in mind, you can reference every command Lily has with `lily help`
22
+ What's a CLI without usage docs? A bad one. Below you'll find out how Lily can be used. Keep in mind, you can reference every command Lily has with `lily help`. You can find out what version of Lily you are running with `lily version` or `lily --version`.
23
23
 
24
- ### Initializing
25
- Initializing Lily is very easy. Just run `lily init`, log in with LastFM, and you're set.
24
+ ### Initializing and Resetting
25
+ Initializing Lily is very easy. Just run `lily init`, log in with LastFM, and you're set. There may be cases where a URL cannot be opened natively, in that case, run `lily init --no-open` and you can open the URL manually, which will work the same way. If you are having trouble, or want to move to a new account, just run `lily reset` to start over and re-initialize with `lily init` as usual.
26
26
 
27
27
  ### Scrobbling
28
28
  Lily's scrobbling feature is very useful, particularly for scrobbling things that can't be scrobbled automatically. For example, when you listen to a vinyl, a CD, that song you really like on the radio, or just something that bugged out and didn't scrobble. Here's how you do that:
@@ -36,7 +36,6 @@ Lily can simply and easily scrobble any individual song for you, assuming you ju
36
36
 
37
37
  ```bash
38
38
  lily scrobble song "Here Comes the Sun" "The Beatles" # scrobbles Here Comes the Sun from Abbey Road, the most popular album it is on
39
-
40
39
  lily scrobble song "Here Comes the Sun" "The Beatles" "The Beatles Ballads" # if you're a hipster, you can optionally specify the exact album you're listening to the song on
41
40
  ```
42
41
 
@@ -67,4 +66,26 @@ lily unlove album "The Beatles" "Abbey Road"
67
66
 
68
67
  lily love song "Here Comes the Sun" "The Beatles" "The Beatles Ballads"
69
68
  lily unlove song "Here Comes the Sun" "The Beatles"
69
+ ```
70
+
71
+ ### Information
72
+ Lily can give you information on users, albums, and songs.
73
+
74
+ **Syntax for songs:** `lily info song (<song> <artist>) [<album>]`
75
+
76
+ **Syntax for albums:** `lily info album (<album> <artist> | <eponymous album>)`
77
+
78
+ **Syntax for users:** `lily info user <username>`
79
+
80
+ **Examples:**
81
+
82
+ ```bash
83
+ lily info song "Here Comes the Sun" "The Beatles"
84
+ lily info song "Here Comes the Sun" "The Beatles" "The Beatles Ballads"
85
+
86
+ lily info album "The Beatles"
87
+ lily info album "The Beatles" "The White Album"
88
+
89
+ lily info user "soodologica"
90
+ lily info user "jshtrmml"
70
91
  ```
@@ -25,7 +25,7 @@ class Lily
25
25
 
26
26
  # returns {sk, signature}
27
27
  rescue
28
- puts "~/.lily.json appears empty"
28
+ puts "Your settings file (~/.lily.json) appears to be empty, please initialize Lily."
29
29
  end
30
30
  end
31
31
 
@@ -51,7 +51,7 @@ class Lily
51
51
  begin
52
52
  res.album
53
53
  rescue
54
- puts "Album does not exist."
54
+ puts "That album does not exist."
55
55
  end
56
56
  end
57
57
 
@@ -62,12 +62,22 @@ class Lily
62
62
  res.token
63
63
  end
64
64
 
65
- def auth
65
+ def auth(cmd)
66
66
  lastfmURL = "http://www.last.fm/api/auth/?api_key=#{@keys.public}&token=#{@token}"
67
+
68
+ if cmd == "--no-open" then puts "Open this URL and sign in to give access: #{lastfmURL}" else
69
+ Launchy.open(lastfmURL)
70
+ end
71
+
67
72
  print "Press Enter once you've given access..."
68
- Launchy.open(lastfmURL)
69
73
  STDIN.gets
70
74
  end
75
+
76
+ def reset
77
+ # reset sk and config stuff
78
+ File.delete(ENV["HOME"] + "/.lily.json")
79
+ puts "Lily has been reset, please re-initialize."
80
+ end
71
81
 
72
82
  def session_key
73
83
  sig = Digest::MD5.hexdigest("api_key#{@keys.public}methodauth.getSessiontoken#{@token}#{@keys.private}")
@@ -79,6 +89,119 @@ class Lily
79
89
  file.write(JSON.pretty_generate({"session_key" => sk}))
80
90
  end
81
91
  end
92
+
93
+ def get_dashes(string)
94
+ # create dashes for cosmetic reasons
95
+ string_array = string.split("")
96
+ dashes = ""
97
+
98
+ string_array.each do
99
+ dashes += "-"
100
+ end
101
+
102
+ return dashes
103
+ end
104
+
105
+ def tags(toptags)
106
+ tags = ""
107
+
108
+ toptags.tag.each do |i|
109
+ if i != toptags.tag[-1]
110
+ tags += i.name + ", "
111
+ elsif
112
+ tags += i.name
113
+ end
114
+ end
115
+
116
+ tags
117
+ end
118
+
119
+ def info
120
+ # http://www.last.fm/api/show/user.getInfo
121
+ command = @args.shift
122
+
123
+ if command == "user"
124
+ # user profile
125
+ username = @args[0]
126
+ info_url = "http://ws.audioscrobbler.com/2.0/?method=user.getinfo&user=" + username + "&api_key=" + @keys.public + "&format=json"
127
+ top_artists_url = "http://ws.audioscrobbler.com/2.0/?method=user.gettopartists&user=" + username + "&api_key=" + @keys.public + "&format=json"
128
+ recent_tracks_url = "http://ws.audioscrobbler.com/2.0/?method=user.getrecenttracks&user=" + username + "&api_key=" + @keys.public + "&format=json"
129
+
130
+ # get profile
131
+ info = JSON.parse(HTTP.get(info_url))
132
+ top_artists = JSON.parse(HTTP.get(top_artists_url))
133
+ recent_tracks = JSON.parse(HTTP.get(recent_tracks_url))
134
+
135
+ # create dashes for cosmetic reasons
136
+ dashes = get_dashes(username)
137
+
138
+ # figure out what to show
139
+ information = [username, "#{dashes}\n\n", "profile link: #{info.user.url}", "songs played: #{info.user.playcount}", "top artist: #{top_artists.topartists.artist[0].name}, with #{top_artists.topartists.artist[0].playcount} total plays", "most recent track: #{recent_tracks.recenttracks.track[0].name} by #{recent_tracks.recenttracks.track[0].artist['#text']}"]
140
+
141
+ if info.user.age != "0" then information.push("age: #{info.user.age}") end
142
+ if info.user.country != "" then information.push("country: #{info.user.country}") end
143
+
144
+ information.each do |i|
145
+ puts i
146
+ end
147
+ elsif command == "album"
148
+ # album info
149
+
150
+ # we got eponymous albums covered :)
151
+ if @args[1] == nil then album, artist = @args[0], @args[0] else album, artist = @args[0], @args[1] end
152
+
153
+ album_info = get_album_info(album, artist)
154
+
155
+ # dashes for cosmetic reasons
156
+ title = album + " by " + artist
157
+ dashes = get_dashes(title)
158
+
159
+ # figure out what to show
160
+ information = [title, "#{dashes}\n\n", "album link: #{album_info.url}", "played #{album_info.playcount} times by a total of #{album_info.listeners} listeners"]
161
+
162
+ begin
163
+ if album_info.tags != [] then information.push("tags: #{tags(album_info.tags)}") end
164
+ if album_info.wiki.summary != "" then information.push("\nsummary:\n#{album_info.wiki.summary}") end
165
+ rescue
166
+ # puts "error"
167
+ end
168
+
169
+ information.each do |i|
170
+ puts i
171
+ end
172
+ elsif command == "song"
173
+ # song info
174
+ track, artist = @args[0], @args[1]
175
+
176
+ url = "http://ws.audioscrobbler.com/2.0/?method=track.getInfo&api_key=" + @keys.public + "&artist=" + artist + "&track=" + track + "&format=json"
177
+ if @args[2]
178
+ album = @args[2]
179
+ url += "&album=#{album}"
180
+ end # album name is optional
181
+
182
+ song_info = JSON.parse(HTTP.get(url))["track"]
183
+
184
+ # dashes for cosmetic reasons
185
+ title = track + " by " + artist + " from the album " + song_info.album.title
186
+ dashes = get_dashes(title)
187
+
188
+ # figure out what to show
189
+ information = [title, "#{dashes}\n\n", "song link: #{song_info.url}", "played #{song_info.playcount} times by a total of #{song_info.listeners} listeners"]
190
+
191
+ begin
192
+ if song_info.toptags != [] then information.push("top tags: #{tags(song_info.toptags)}") end
193
+ if song_info.wiki.summary != "" then information.push("\nsummary:\n#{song_info.wiki.summary}") end
194
+ rescue
195
+ # nothing to see here!
196
+ end
197
+
198
+ information.each do |i|
199
+ puts i
200
+ end
201
+ else
202
+ puts "Huh, Lily didn't recognize that."
203
+ end
204
+ end
82
205
 
83
206
  def scrobble
84
207
  # last.fm/api/show/track.scrobble
@@ -115,8 +238,8 @@ class Lily
115
238
  album_length = 0
116
239
 
117
240
  # get full length of album in seconds
118
- album_info.tracks.track.each do |track|
119
- album_length += track.duration.to_i
241
+ album_info.tracks.track.each do |i|
242
+ album_length += i.duration.to_i
120
243
  end
121
244
 
122
245
  puts "Whole album length: #{album_length} seconds."
@@ -127,16 +250,16 @@ class Lily
127
250
  puts "Scrobbling your album starting at " + Time.at(time).utc.strftime("%I:%M:%S %p") + " UTC"
128
251
 
129
252
  # begin scrobbling
130
- album_info.tracks.track.each do |track|
131
- time += track.duration.to_i
253
+ album_info.tracks.track.each do |i|
254
+ time += i.duration.to_i
132
255
 
133
256
  # scrobble track
134
257
  body = self.format_params({
135
- "artist" => track.artist.name,
258
+ "artist" => i.artist.name,
136
259
  "method" => "track.scrobble",
137
260
  "sk" => @lily_json.session_key,
138
261
  "timestamp" => time,
139
- "track" => track.name,
262
+ "track" => i.name,
140
263
  "api_key" => @keys.public,
141
264
  "format" => "json",
142
265
  "album" => album_info.name
@@ -147,7 +270,7 @@ class Lily
147
270
 
148
271
  puts "#{album} by #{artist} has been scrobbled."
149
272
  else
150
- puts "huh"
273
+ puts "Huh, Lily didn't recognize that."
151
274
  end
152
275
  end
153
276
 
@@ -177,11 +300,10 @@ class Lily
177
300
  if @args[1] == nil then album, artist = @args[0], @args[0] else album, artist = @args[0], @args[1] end
178
301
 
179
302
  album_info = get_album_info(album, artist)
180
- album_length = 0
181
303
 
182
- album_info.tracks.track.each do |track|
304
+ album_info.tracks.track.each do |i|
183
305
  body = self.format_params({
184
- "track" => track.name,
306
+ "track" => i.name,
185
307
  "artist" => artist,
186
308
  "method" => "track.love",
187
309
  "sk" => @lily_json.session_key,
@@ -195,7 +317,7 @@ class Lily
195
317
 
196
318
  puts "#{album} by #{artist} has been loved ♥"
197
319
  else
198
- puts "huh"
320
+ puts "Huh, Lily didn't recognize that."
199
321
  end
200
322
  end
201
323
 
@@ -225,9 +347,8 @@ class Lily
225
347
  if @args[1] == nil then album, artist = @args[0], @args[0] else album, artist = @args[0], @args[1] end
226
348
 
227
349
  album_info = get_album_info(album, artist)
228
- album_length = 0
229
350
 
230
- album_info.tracks.track.each do |track|
351
+ album_info.tracks.track.each do |i|
231
352
  body = self.format_params({
232
353
  "track" => track.name,
233
354
  "artist" => artist,
@@ -243,7 +364,7 @@ class Lily
243
364
 
244
365
  puts "#{album} by #{artist} has been unloved :("
245
366
  else
246
- puts "huh"
367
+ puts "Huh, Lily didn't recognize that."
247
368
  end
248
369
  end
249
370
 
@@ -251,12 +372,14 @@ class Lily
251
372
  first = @args.shift
252
373
 
253
374
  case first
254
- when 'scrobble' then self.scrobble
255
- when 'init' then self.init
256
- when 'love' then self.love
257
- when 'unlove' then self.unlove
258
- when 'version', '--version' then puts self.version
259
- else self.help
375
+ when 'scrobble' then self.scrobble
376
+ when 'init' then self.init
377
+ when 'love' then self.love
378
+ when 'unlove' then self.unlove
379
+ when 'version', '--version' then puts self.version
380
+ when 'info' then self.info
381
+ when 'reset' then self.reset
382
+ else self.help
260
383
  end
261
384
  end
262
385
 
@@ -265,18 +388,31 @@ class Lily
265
388
  Lily, the Last.fm CLI.
266
389
 
267
390
  Usage:
268
- lily init
391
+ General Commands:
392
+ lily init [--no-open]
269
393
  lily help
270
- lily (scrobble | love | unlove) song (<song> <artist>) [<album>]
271
- lily (love | unlove) album (<album> <artist> | <eponymous album>)
394
+ lily reset
395
+ lily (version | --version)
396
+
397
+ Scrobbling:
398
+ lily scrobble song (<song> <artist>) [<album>]
272
399
  lily scrobble album (<album> <artist> | <eponymous album>) [--live]
400
+
401
+ Loving/Unloving:
402
+ lily (love | unlove) song (<song> <artist>) [<album>]
403
+ lily (love | unlove) album (<album> <artist> | <eponymous album>)
404
+
405
+ Information:
406
+ lily info song (<song> <artist>) [<album>]
407
+ lily info album (<album> <artist> | <eponymous album>)
408
+ lily info user <username>
273
409
  """
274
410
  end
275
411
 
276
412
  def init
277
- auth
413
+ auth(@args[-1])
278
414
  session_key
279
- puts "Initialized ~/.lily.json successfully"
415
+ puts "Initialized Lily successfully at file ~/.lily.json"
280
416
  end
281
417
 
282
418
  def version
@@ -1,4 +1,4 @@
1
1
  module Version
2
- LITERAL = '0.1.32'
3
- STRING = "lily v#{LITERAL}"
2
+ LITERAL = '0.2.0'
3
+ STRING = "Lily v#{LITERAL}"
4
4
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lily
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.32
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Josh Trommel
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2016-03-06 00:00:00.000000000 Z
12
+ date: 2016-04-16 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler