spotify_rec 1.1 → 1.2

Sign up to get free protection for your applications and to get access to all the features.
data/lib/rec.rb CHANGED
@@ -1,11 +1,42 @@
1
- class Rec
1
+ # frozen_string_literal: true
2
2
 
3
+ class Rec
3
4
  def initialize(user)
4
5
  @user_list = user.mylist
5
6
  @user = user
6
7
  @tracks = []
7
8
  @artists = []
8
9
  @genres = []
10
+ @prompt = TTY::Prompt.new
11
+ end
12
+
13
+ def amount_of_suggestions
14
+ system('clear')
15
+ too_many_items if @user_list.length > 5
16
+ puts '》 RECOMMENDATIONS 《'
17
+ amount = @prompt.ask('How many recommendations would you like to generate?'.colorize(:light_green)) do |q|
18
+ q.in '1-10'
19
+ q.messages[:range?] = 'Number must be between 1 and 10'
20
+ end
21
+ recommend(amount.to_i)
22
+ end
23
+
24
+ def too_many_items
25
+ puts "Uh oh! You don't have any items in your list yet, so we can't generate any".colorize(:light_red)
26
+ puts 'recommendations. Please add some before doing this!'.colorize(:light_red)
27
+ @prompt.keypress('Press any key to return to the previous menu..')
28
+ menu = Menu.new(@user)
29
+ menu.display_menu
30
+ end
31
+
32
+ def recommend(num)
33
+ system('clear')
34
+ recommendations = recommendations_generate(num)
35
+ cleaned_recs = recommendations.tracks.map { |t| "#{t.name} by #{t.artists[0].name}" }
36
+ puts '》 RECOMMENDATIONS 《'.colorize(:light_green)
37
+ puts 'Select the recommendations you want to add to your playlist!'
38
+ selections = @prompt.multi_select('Hit enter with none selected to skip.', cleaned_recs)
39
+ clean_recommendations(selections)
9
40
  end
10
41
 
11
42
  def sort_my_list
@@ -13,62 +44,43 @@ class Rec
13
44
  @artists.clear
14
45
  @genres.clear
15
46
  @user_list.each do |item|
16
- @tracks << item["id"] if item["type"] == "track"
17
- @artists << item["id"] if item["type"] == "artist"
18
- @genres << item["name"].downcase if item["type"] == "genre"
47
+ @tracks << item['id'] if item['type'] == 'track'
48
+ @artists << item['id'] if item['type'] == 'artist'
49
+ @genres << item['name'].downcase if item['type'] == 'genre'
19
50
  end
20
51
  end
21
52
 
22
- def update_file
23
- updated_data = Login.load_data.each { |user| user["playlist"] = @user.playlist if user["id"] == @user.uid.to_s }
24
- File.open(userdata,"w") do |f|
25
- f.puts JSON.pretty_generate(updated_data)
26
- end
27
- puts "Sweet! Your list has been updated!".colorize(:light_green)
28
- $prompt.keypress("Press any key to return to the previous menu..")
29
- menu = Menu.new(@user)
30
- menu.menu_router
53
+ def recommendations_generate(num)
54
+ sort_my_list
55
+ RSpotify::Recommendations.generate(limit: num, seed_artists: @artists, seed_genres: @genres, seed_tracks: @tracks)
31
56
  end
32
57
 
33
58
  def clean_recommendations(selections)
34
59
  selections.each do |track|
35
- details = track.split(" by ")
60
+ details = track.split(' by ')
36
61
  song = RSpotify::Track.search("#{details[0]} #{details[1]}", limit: 1).first
37
- song_details = {
38
- "name" => song.name,
39
- "id" => song.id,
40
- "artist" => song.artists[0].name }
41
- @user.playlist << song_details
62
+ song_details(song)
42
63
  end
43
64
  update_file
44
65
  end
45
66
 
46
- def recommend(num)
47
- system("clear")
48
- sort_my_list
49
- recommendations = RSpotify::Recommendations.generate(limit: num, seed_artists: @artists, seed_genres: @genres, seed_tracks: @tracks)
50
- cleaned_recs = recommendations.tracks.map { |t| "#{t.name} by #{t.artists[0].name}" }
51
- puts "》 RECOMMENDATIONS 《".colorize(:light_green)
52
- puts "Select the recommendations you want to add to your playlist!"
53
- selections = $prompt.multi_select("Hit enter with none selected to skip.", cleaned_recs)
54
- clean_recommendations(selections)
67
+ def song_details(song)
68
+ song_details = {
69
+ 'name' => song.name,
70
+ 'id' => song.id,
71
+ 'artist' => song.artists[0].name
72
+ }
73
+ @user.playlist << song_details
55
74
  end
56
75
 
57
- def amount_of_suggestions
58
- system("clear")
59
- if @user_list.length <= 0
60
- puts "Uh oh! You don't have any items in your list yet, so we can't generate any recommendations. Please add some before doing this!".colorize(:light_red)
61
- $prompt.keypress("Press any key to return to the previous menu..")
62
- menu = Menu.new(@user)
63
- menu.display_menu
64
- end
65
- puts "》 RECOMMENDATIONS 《"
66
- amount = $prompt.ask("How many recommendations would you like to generate?".colorize(:light_green)) do |q|
67
- q.in '1-10'
68
- q.messages[:range?] = "Number must be between 1 and 10"
76
+ def update_file
77
+ updated_data = Login.load_data.each { |user| user['playlist'] = @user.playlist if user['id'] == @user.uid.to_s }
78
+ File.open(userdata, 'w') do |f|
79
+ f.puts JSON.pretty_generate(updated_data)
69
80
  end
70
- recommend(amount.to_i)
81
+ puts 'Sweet! Your list has been updated!'.colorize(:light_green)
82
+ @prompt.keypress('Press any key to return to the previous menu..')
83
+ menu = Menu.new(@user)
84
+ menu.menu_router
71
85
  end
72
-
73
-
74
- end
86
+ end
@@ -1,69 +1,89 @@
1
- class User
2
-
3
- attr_reader :username, :password, :uid
4
- attr_accessor :playlist, :mylist
5
-
6
- def initialize(username, password, uid, playlist=[], mylist=[])
7
- @username = username
8
- @password = password
9
- @playlist = playlist
10
- @uid = uid
11
- @mylist = mylist
12
- end
13
-
14
- def details
15
- puts "Username: #{@username.colorize(:light_green)}"
16
- puts "Password: #{@password.colorize(:light_green)}"
17
- puts "User ID: #{@uid.to_s.colorize(:light_green)}"
18
- $prompt.keypress("Press any key to continue..")
19
- menu = Menu.new(Login::user)
20
- menu.account_details
21
- end
22
-
23
- def change_username(new_name)
24
- updated_data = Login.load_data.each { |user| user["username"] = new_name if user["id"] == Login::user.uid.to_s }
25
- File.open((Login::userdata),"w") do |f|
26
- f.puts JSON.pretty_generate(updated_data)
27
- end
28
- @username = new_name
29
- puts "Success! Your new username is #{Login::user.username}".colorize(:light_green)
30
- $prompt.keypress("Press any key to continue..")
31
- menu = Menu.new(Login::user)
32
- menu.account_details
33
- end
34
-
35
- def change_password(new_password)
36
- updated_data = Login.load_data.each { |user| user["password"] = new_password if user["id"] == Login::user.uid.to_s }
37
- File.open((Login::userdata),"w") do |f|
38
- f.puts JSON.pretty_generate(updated_data)
39
- end
40
- @password = new_password
41
- puts "Success! Your password has been changed.".colorize(:light_green)
42
- $prompt.keypress("Press any key to continue..")
43
- menu = Menu.new(Login::user)
44
- menu.account_details
45
- end
46
-
47
- def delete_from_file
48
- updated_data = []
49
- Login.load_data.each { |user| updated_data << user unless user["id"] == Login::user.uid.to_s }
50
- File.open((Login::userdata),"w") do |f|
51
- f.puts JSON.pretty_generate(updated_data)
52
- end
53
- puts "Your account has been deleted. The program will now exit.".colorize(:light_red)
54
- $prompt.keypress("Press any key to continue..")
55
- exit
56
- end
57
-
58
-
59
- def delete_account
60
- puts "Woah there! Deleting your account is serious business, and cannot be undone.".colorize(:light_red)
61
- selection = $prompt.yes?("Are you sure you want to delete your account?").colorize(:light_red)
62
- unless selection
63
- menu = Menu.new(Login::user)
64
- else
65
- delete_from_file
66
- end
67
- end
68
-
69
- end
1
+ # frozen_string_literal: true
2
+
3
+ # An instance of User should be made for everyone who logs in or signs up
4
+ class User
5
+ attr_reader :username, :password, :uid
6
+ attr_accessor :playlist, :mylist
7
+
8
+ def initialize(username, password, uid, playlist = [], mylist = [])
9
+ @username = username
10
+ @password = password
11
+ @playlist = playlist
12
+ @uid = uid
13
+ @mylist = mylist
14
+ @prompt = TTY::Prompt.new
15
+ end
16
+
17
+ def details
18
+ puts "Username: #{@username.colorize(:light_green)}"
19
+ puts "Password: #{@password.colorize(:light_green)}"
20
+ puts "User ID: #{@uid.to_s.colorize(:light_green)}"
21
+ @prompt.keypress('Press any key to continue..')
22
+ menu = Menu.new(Login.user)
23
+ menu.account_details
24
+ end
25
+
26
+ # Change Username section
27
+
28
+ def change_username(new_name)
29
+ update_username(new_name)
30
+ @username = new_name
31
+ puts "Success! Your new username is #{Login.user.username}".colorize(:light_green)
32
+ @prompt.keypress('Press any key to continue..')
33
+ menu = Menu.new(Login.user)
34
+ menu.account_details
35
+ end
36
+
37
+ def update_username(new_name)
38
+ updated_data = Login.load_data.each do |user|
39
+ user['username'] = new_name if user['id'] == Login.user.uid.to_s
40
+ end
41
+ File.open(Login.userdata, 'w') do |f|
42
+ f.puts JSON.pretty_generate(updated_data)
43
+ end
44
+ end
45
+
46
+ # Change password section
47
+
48
+ def change_password(new_password)
49
+ update_password(new_password)
50
+ @password = new_password
51
+ puts 'Success! Your password has been changed.'.colorize(:light_green)
52
+ @prompt.keypress('Press any key to continue..')
53
+ menu = Menu.new(Login.user)
54
+ menu.account_details
55
+ end
56
+
57
+ def update_password(new_password)
58
+ updated_data = Login.load_data.each do |user|
59
+ user['password'] = new_password if user['id'] == Login.user.uid.to_s
60
+ end
61
+ File.open(Login.userdata, 'w') do |f|
62
+ f.puts JSON.pretty_generate(updated_data)
63
+ end
64
+ end
65
+
66
+ # Delete account section
67
+
68
+ def delete_account
69
+ puts 'Woah there! Deleting your account is serious business, and cannot be undone.'.colorize(:light_red)
70
+ selection = @prompt.yes?('Are you sure you want to delete your account?'.colorize(:light_red))
71
+ if selection
72
+ delete_from_file
73
+ else
74
+ menu = Menu.new(Login.user)
75
+ menu.account_details
76
+ end
77
+ end
78
+
79
+ def delete_from_file
80
+ updated_data = []
81
+ Login.load_data.each { |user| updated_data << user unless user['id'] == Login.user.uid.to_s }
82
+ File.open(Login.userdata, 'w') do |f|
83
+ f.puts JSON.pretty_generate(updated_data)
84
+ end
85
+ puts 'Your account has been deleted. The program will now exit.'.colorize(:light_red)
86
+ @prompt.keypress('Press any key to continue..')
87
+ exit
88
+ end
89
+ end
@@ -1,13 +1 @@
1
- [
2
- {
3
- "id": "1",
4
- "username": "benahale",
5
- "password": "Tsurani7",
6
- "playlist": [
7
-
8
- ],
9
- "mylist": [
10
-
11
- ]
12
- }
13
- ]
1
+ []
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spotify_rec
3
3
  version: !ruby/object:Gem::Version
4
- version: '1.1'
4
+ version: '1.2'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ben Ahale
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-09-28 00:00:00.000000000 Z
11
+ date: 2020-09-29 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description:
14
14
  email:
@@ -23,7 +23,6 @@ files:
23
23
  - lib/my_list.rb
24
24
  - lib/playlist.rb
25
25
  - lib/rec.rb
26
- - lib/run.rb
27
26
  - lib/user.rb
28
27
  - public/users.json
29
28
  homepage:
@@ -38,7 +37,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
38
37
  requirements:
39
38
  - - ">="
40
39
  - !ruby/object:Gem::Version
41
- version: '0'
40
+ version: '2.4'
42
41
  required_rubygems_version: !ruby/object:Gem::Requirement
43
42
  requirements:
44
43
  - - ">="
data/lib/run.rb DELETED
@@ -1,47 +0,0 @@
1
- require 'rspotify'
2
- require 'optparse'
3
- require 'json'
4
- require 'tty-prompt'
5
- require 'terminal-table'
6
- require 'colorize'
7
- require_relative 'user'
8
- require_relative 'playlist'
9
- require_relative 'login'
10
- require_relative 'rec'
11
- require_relative 'menu'
12
- require_relative 'my_list'
13
- include Login
14
-
15
- RSpotify.authenticate("712ff89a218a4e6dbe1f169e06f949b9", "e9e0517f405b4a01a1be8823126459b7")
16
- $prompt = TTY::Prompt.new
17
-
18
- VERSION = 1.0
19
-
20
- ARGV << '--run' if ARGV.empty?
21
-
22
- options = {}
23
- parser = OptionParser.new do |opts|
24
- opts.banner = "Welcome to Spotify Recommendations! Usage: spotifyrec [options]".colorize(:light_green)
25
-
26
- opts.on("-v", "--version", "Display the version") do
27
- puts "Spotify Recommendations version #{VERSION}".colorize(:light_green)
28
- end
29
-
30
- opts.on("-h", "--help", "Display the help message") do
31
- puts opts
32
- exit
33
- end
34
-
35
- opts.on("-qGENRE", "--quick=GENRE", "Generate a quick recommendation with the chosen genre") do |genre|
36
- recommendations = RSpotify::Recommendations.generate(limit: 5, seed_genres: [genre])
37
- cleaned_recs = recommendations.tracks.map { |t| "#{t.name} by #{t.artists[0].name}" }
38
- puts "》 RECOMMENDATIONS 《".colorize(:light_green)
39
- cleaned_recs.each { |track| puts track }
40
- end
41
-
42
- opts.on("-r", "--run", "Run the application") do
43
- Login::login
44
- end
45
- end
46
-
47
- parser.parse!