voluntary_music_metadata_enrichment 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/MIT-LICENSE +20 -0
- data/README.rdoc +3 -0
- data/Rakefile +23 -0
- data/app/assets/javascripts/voluntary_music_metadata_enrichment/application.js +5 -0
- data/app/assets/javascripts/voluntary_music_metadata_enrichment/groups/show.js.coffee +14 -0
- data/app/assets/javascripts/voluntary_music_metadata_enrichment/library/index.js.coffee +19 -0
- data/app/assets/javascripts/voluntary_music_metadata_enrichment/library/year_in_review_releases/index_view.js.coffee +32 -0
- data/app/assets/javascripts/voluntary_music_metadata_enrichment/library/year_in_review_releases/new_view.js.coffee +31 -0
- data/app/assets/javascripts/voluntary_music_metadata_enrichment/library/year_in_review_tracks/index_view.js.coffee +32 -0
- data/app/assets/javascripts/voluntary_music_metadata_enrichment/library/year_in_review_tracks/new_view.js.coffee +31 -0
- data/app/assets/javascripts/voluntary_music_metadata_enrichment/library/years_in_review/index_view.js.coffee +36 -0
- data/app/assets/javascripts/voluntary_music_metadata_enrichment/tracks/show.js.coffee +2 -0
- data/app/assets/javascripts/voluntary_music_metadata_enrichment/videos/metadata.js.coffee +6 -0
- data/app/controllers/concerns/music_metadata_enrichment/artist_confirmation.rb +207 -0
- data/app/controllers/concerns/music_metadata_enrichment/base_controller.rb +17 -0
- data/app/controllers/concerns/music_metadata_enrichment/track_confirmation.rb +57 -0
- data/app/controllers/library/music/artists_controller.rb +26 -0
- data/app/controllers/library/music/year_in_review_releases_controller.rb +110 -0
- data/app/controllers/library/music/year_in_review_tracks_controller.rb +110 -0
- data/app/controllers/library/music/years_in_review_controller.rb +41 -0
- data/app/controllers/library/music_controller.rb +14 -0
- data/app/controllers/music_metadata_enrichment/application_controller.rb +11 -0
- data/app/controllers/music_metadata_enrichment/artists_controller.rb +93 -0
- data/app/controllers/music_metadata_enrichment/group_artist_connections_controller.rb +63 -0
- data/app/controllers/music_metadata_enrichment/groups_controller.rb +40 -0
- data/app/controllers/music_metadata_enrichment/releases_controller.rb +207 -0
- data/app/controllers/music_metadata_enrichment/tracks_controller.rb +82 -0
- data/app/controllers/music_metadata_enrichment/videos_controller.rb +133 -0
- data/app/controllers/product/music_metadata_enrichment_controller.rb +6 -0
- data/app/models/concerns/year_in_review_music_entry.rb +12 -0
- data/app/models/music_artist.rb +155 -0
- data/app/models/music_library_artist.rb +10 -0
- data/app/models/music_metadata_enrichment/group.rb +136 -0
- data/app/models/music_metadata_enrichment/group_artist_connection.rb +15 -0
- data/app/models/music_release.rb +278 -0
- data/app/models/music_track.rb +255 -0
- data/app/models/music_video.rb +87 -0
- data/app/models/product/music_metadata_enrichment.rb +2 -0
- data/app/models/year_in_review_music.rb +233 -0
- data/app/models/year_in_review_music_release.rb +24 -0
- data/app/models/year_in_review_music_track.rb +28 -0
- data/app/views/library/music/artists/destroy.js.erb +1 -0
- data/app/views/library/music/index.html.erb +46 -0
- data/app/views/library/music/year_in_review_releases/_collection.html.erb +51 -0
- data/app/views/library/music/year_in_review_releases/_form.html.erb +18 -0
- data/app/views/library/music/year_in_review_releases/_multiple_form.html.erb +44 -0
- data/app/views/library/music/year_in_review_releases/create.js.erb +11 -0
- data/app/views/library/music/year_in_review_releases/destroy.js.erb +2 -0
- data/app/views/library/music/year_in_review_releases/export.html.erb +13 -0
- data/app/views/library/music/year_in_review_releases/index.html.erb +22 -0
- data/app/views/library/music/year_in_review_releases/multiple_new.html.erb +1 -0
- data/app/views/library/music/year_in_review_releases/multiple_new.js.erb +7 -0
- data/app/views/library/music/year_in_review_releases/new.html.erb +1 -0
- data/app/views/library/music/year_in_review_tracks/_collection.html.erb +52 -0
- data/app/views/library/music/year_in_review_tracks/_form.html.erb +18 -0
- data/app/views/library/music/year_in_review_tracks/_multiple_form.html.erb +46 -0
- data/app/views/library/music/year_in_review_tracks/create.js.erb +11 -0
- data/app/views/library/music/year_in_review_tracks/destroy.js.erb +2 -0
- data/app/views/library/music/year_in_review_tracks/export.html.erb +13 -0
- data/app/views/library/music/year_in_review_tracks/index.html.erb +22 -0
- data/app/views/library/music/year_in_review_tracks/multiple_new.html.erb +1 -0
- data/app/views/library/music/year_in_review_tracks/multiple_new.js.erb +7 -0
- data/app/views/library/music/year_in_review_tracks/new.html.erb +1 -0
- data/app/views/library/music/years_in_review/_collection.html.erb +52 -0
- data/app/views/library/music/years_in_review/create.js.erb +6 -0
- data/app/views/library/music/years_in_review/index.html.erb +18 -0
- data/app/views/library/music/years_in_review/show.html.erb +20 -0
- data/app/views/music_metadata_enrichment/artists/_collection.html.erb +68 -0
- data/app/views/music_metadata_enrichment/artists/by_name.html.erb +3 -0
- data/app/views/music_metadata_enrichment/artists/index.html.erb +7 -0
- data/app/views/music_metadata_enrichment/artists/name_confirmation.html.erb +1 -0
- data/app/views/music_metadata_enrichment/artists/new.html.erb +1 -0
- data/app/views/music_metadata_enrichment/artists/show.html.erb +24 -0
- data/app/views/music_metadata_enrichment/group_artist_connections/import.html.erb +6 -0
- data/app/views/music_metadata_enrichment/group_artist_connections/index.html.erb +0 -0
- data/app/views/music_metadata_enrichment/group_artist_connections/name_confirmation.html.erb +1 -0
- data/app/views/music_metadata_enrichment/group_artist_connections/new.html.erb +1 -0
- data/app/views/music_metadata_enrichment/groups/index.html.erb +0 -0
- data/app/views/music_metadata_enrichment/groups/new.html.erb +7 -0
- data/app/views/music_metadata_enrichment/groups/show.html.erb +31 -0
- data/app/views/music_metadata_enrichment/releases/_collection.html.erb +53 -0
- data/app/views/music_metadata_enrichment/releases/announce.html.erb +10 -0
- data/app/views/music_metadata_enrichment/releases/artist_confirmation.html.erb +1 -0
- data/app/views/music_metadata_enrichment/releases/by_name.html.erb +24 -0
- data/app/views/music_metadata_enrichment/releases/export.html.erb +17 -0
- data/app/views/music_metadata_enrichment/releases/index.html.erb +8 -0
- data/app/views/music_metadata_enrichment/releases/name.html.erb +9 -0
- data/app/views/music_metadata_enrichment/releases/name_confirmation.html.erb +33 -0
- data/app/views/music_metadata_enrichment/releases/new.html.erb +1 -0
- data/app/views/music_metadata_enrichment/releases/show.html.erb +50 -0
- data/app/views/music_metadata_enrichment/shared/_artist_confirmation_form.html.erb +41 -0
- data/app/views/music_metadata_enrichment/shared/_new_artist_form.html.erb +10 -0
- data/app/views/music_metadata_enrichment/shared/_new_track_form.html.erb +9 -0
- data/app/views/music_metadata_enrichment/shared/_track_confirmation_form.html.erb +29 -0
- data/app/views/music_metadata_enrichment/tracks/_spotify_track_player.html.erb +3 -0
- data/app/views/music_metadata_enrichment/tracks/artist_confirmation.html.erb +1 -0
- data/app/views/music_metadata_enrichment/tracks/by_name.html.erb +26 -0
- data/app/views/music_metadata_enrichment/tracks/index.html.erb +8 -0
- data/app/views/music_metadata_enrichment/tracks/name.html.erb +1 -0
- data/app/views/music_metadata_enrichment/tracks/name_confirmation.html.erb +1 -0
- data/app/views/music_metadata_enrichment/tracks/new.html.erb +1 -0
- data/app/views/music_metadata_enrichment/tracks/show.html.erb +21 -0
- data/app/views/music_metadata_enrichment/videos/_collection.html.erb +25 -0
- data/app/views/music_metadata_enrichment/videos/artist_confirmation.html.erb +1 -0
- data/app/views/music_metadata_enrichment/videos/by_name.html.erb +3 -0
- data/app/views/music_metadata_enrichment/videos/index.html.erb +8 -0
- data/app/views/music_metadata_enrichment/videos/metadata.html.erb +25 -0
- data/app/views/music_metadata_enrichment/videos/new.html.erb +1 -0
- data/app/views/music_metadata_enrichment/videos/show.html.erb +9 -0
- data/app/views/music_metadata_enrichment/videos/track_confirmation.html.erb +1 -0
- data/app/views/music_metadata_enrichment/videos/track_name.html.erb +1 -0
- data/app/views/product/music_metadata_enrichment/index.html.erb +6 -0
- data/config/locales/en.yml +16 -0
- data/config/locales/resources/music_artists/en.yml +43 -0
- data/config/locales/resources/music_library/en.yml +8 -0
- data/config/locales/resources/music_metadata_enrichment_group_artist_connections/en.yml +19 -0
- data/config/locales/resources/music_metadata_enrichment_groups/en.yml +25 -0
- data/config/locales/resources/music_releases/en.yml +67 -0
- data/config/locales/resources/music_tracks/en.yml +45 -0
- data/config/locales/resources/music_videos/en.yml +56 -0
- data/config/locales/resources/year_in_review_music_releases/en.yml +19 -0
- data/config/locales/resources/year_in_review_music_tracks/en.yml +19 -0
- data/config/locales/resources/years_in_review_music/en.yml +21 -0
- data/config/main_music_metadata_enrichment_navigation.rb +3 -0
- data/config/routes.rb +121 -0
- data/db/migrate/20150106183434_add_product_music_metadata_enrichment.rb +96 -0
- data/db/migrate/20150120091801_create_music_metadata_enrichment_groups.rb +28 -0
- data/db/migrate/20150120221419_create_music_library_artists.rb +12 -0
- data/db/migrate/20150123082224_year_in_review_music_entries.rb +53 -0
- data/lib/tasks/voluntary_music_metadata_enrichment_tasks.rake +4 -0
- data/lib/voluntary_music_metadata_enrichment/ability.rb +27 -0
- data/lib/voluntary_music_metadata_enrichment/concerns/model/user/has_music_library.rb +101 -0
- data/lib/voluntary_music_metadata_enrichment/engine.rb +20 -0
- data/lib/voluntary_music_metadata_enrichment/navigation.rb +49 -0
- data/lib/voluntary_music_metadata_enrichment/version.rb +3 -0
- data/lib/voluntary_music_metadata_enrichment.rb +13 -0
- metadata +525 -0
data/config/routes.rb
ADDED
@@ -0,0 +1,121 @@
|
|
1
|
+
Rails.application.routes.draw do
|
2
|
+
get '/products/music-metadata-enrichment', to: redirect('/music'), as: 'music_metadata_enrichment_product'
|
3
|
+
#get '/music_metadata_enrichment' => 'product/music_metadata_enrichment#index'
|
4
|
+
get '/music' => 'product/music_metadata_enrichment#index'
|
5
|
+
get '/music_metadata_enrichment', to: redirect('/music')
|
6
|
+
get '/music-metadata-enrichment', to: redirect('/music')
|
7
|
+
|
8
|
+
namespace :music, module: 'music_metadata_enrichment' do
|
9
|
+
resources :groups, only: [:index, :new, :create, :show] do
|
10
|
+
resources :artists, only: [:new], controller: 'group_artist_connections' do
|
11
|
+
collection do
|
12
|
+
get :import
|
13
|
+
get :name_confirmation
|
14
|
+
get :select_artist
|
15
|
+
get :creation
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
member do
|
20
|
+
get 'artists' => 'artists#index'
|
21
|
+
get 'releases' => 'releases#index'
|
22
|
+
get 'releases/export' => 'releases#export'
|
23
|
+
end
|
24
|
+
|
25
|
+
resources :releases, only: [:new]
|
26
|
+
resources :videos, only: [:index, :new]
|
27
|
+
end
|
28
|
+
|
29
|
+
resources :artists, only: [:index, :new, :create, :show] do
|
30
|
+
collection do
|
31
|
+
get :name_confirmation
|
32
|
+
get 'by_name/:name', to: 'artists#by_name'
|
33
|
+
get :by_name, as: :by_name
|
34
|
+
get :autocomplete
|
35
|
+
end
|
36
|
+
|
37
|
+
resources :releases, only: [:new] do
|
38
|
+
collection do
|
39
|
+
get :autocomplete
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
resources :tracks, only: [] do
|
44
|
+
collection do
|
45
|
+
get :autocomplete
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
resources :videos, only: [:index, :new]
|
50
|
+
end
|
51
|
+
|
52
|
+
resources :releases, only: [:index, :new, :create, :show] do
|
53
|
+
collection do
|
54
|
+
get :artist_confirmation
|
55
|
+
get :select_artist
|
56
|
+
get :name
|
57
|
+
get :name_confirmation
|
58
|
+
get :announce
|
59
|
+
post :create_announcement
|
60
|
+
get 'by_name/:artist_name/:name', to: 'releases#by_name'
|
61
|
+
get :by_name, as: :by_name
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
resources :tracks, only: [:index, :new, :create, :show] do
|
66
|
+
collection do
|
67
|
+
get :artist_confirmation
|
68
|
+
get :select_artist
|
69
|
+
get :name
|
70
|
+
get :name_confirmation
|
71
|
+
get 'by_name/:artist_name/:name', to: 'tracks#by_name'
|
72
|
+
get :by_name, as: :by_name
|
73
|
+
end
|
74
|
+
|
75
|
+
resources :videos, only: [:new]
|
76
|
+
end
|
77
|
+
|
78
|
+
resources :videos, only: [:index, :new, :create, :show] do
|
79
|
+
collection do
|
80
|
+
get :artist_confirmation
|
81
|
+
get :select_artist
|
82
|
+
get :track_name
|
83
|
+
get :track_confirmation
|
84
|
+
get :create_track
|
85
|
+
get :metadata
|
86
|
+
get 'by_name/:artist_name/:name', to: 'videos#by_name'
|
87
|
+
get :by_name, as: :by_name
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
get 'users/:user_id/library/music' => 'library/music#index', as: :user_music_library
|
93
|
+
|
94
|
+
get 'users/:user_id/library/music/years_in_review' => 'library/music/years_in_review#index', as: :user_music_years_in_review
|
95
|
+
post 'users/:user_id/library/music/years_in_review' => 'library/music/years_in_review#create', as: :create_user_music_year_in_review
|
96
|
+
get 'users/:user_id/library/music/years_in_review/:year' => 'library/music/years_in_review#show', as: :user_music_year_in_review
|
97
|
+
|
98
|
+
get 'users/:user_id/library/music/years_in_review/:year/top_releases' => 'library/music/year_in_review_releases#index', as: :user_music_year_in_review_top_releases
|
99
|
+
get 'users/:user_id/library/music/years_in_review/:year/top_releases/new' => 'library/music/year_in_review_releases#new', as: :new_user_music_year_in_review_top_release
|
100
|
+
post 'users/:user_id/library/music/years_in_review/:year/top_releases' => 'library/music/year_in_review_releases#create', as: :create_user_music_year_in_review_top_release
|
101
|
+
get 'users/current/library/music/years_in_review/:year/top_releases/multiple_new' => 'library/music/year_in_review_releases#multiple_new', as: :multiple_new_user_music_year_in_review_top_releases
|
102
|
+
post 'users/:user_id/library/music/years_in_review/:year/top_releases/create_multiple' => 'library/music/year_in_review_releases#create_multiple', as: :create_multiple_user_music_year_in_review_top_releases
|
103
|
+
delete 'users/current/library/music/year_in_review_music_releases/:id' => 'library/music/year_in_review_releases#destroy', as: :destroy_music_year_in_review_top_release
|
104
|
+
put 'users/current/library/music/year_in_review_music_releases/:id/move' => 'library/music/year_in_review_releases#move', as: :move_music_year_in_review_top_release
|
105
|
+
get 'users/current/library/music/years_in_review/:year/top_releases/export' => 'library/music/year_in_review_releases#export', as: :export_music_year_in_review_top_releases
|
106
|
+
|
107
|
+
get 'users/:user_id/library/music/years_in_review/:year/top_tracks' => 'library/music/year_in_review_tracks#index', as: :user_music_year_in_review_top_tracks
|
108
|
+
get 'users/:user_id/library/music/years_in_review/:year/top_tracks/new' => 'library/music/year_in_review_tracks#new', as: :new_user_music_year_in_review_top_track
|
109
|
+
post 'users/:user_id/library/music/years_in_review/:year/top_tracks' => 'library/music/year_in_review_tracks#create', as: :create_user_music_year_in_review_top_track
|
110
|
+
get 'users/current/library/music/years_in_review/:year/top_tracks/multiple_new' => 'library/music/year_in_review_tracks#multiple_new', as: :multiple_new_user_music_year_in_review_top_tracks
|
111
|
+
post 'users/:user_id/library/music/years_in_review/:year/top_tracks/create_multiple' => 'library/music/year_in_review_tracks#create_multiple', as: :create_multiple_user_music_year_in_review_top_tracks
|
112
|
+
delete 'users/current/library/music/year_in_review_music_tracks/:id' => 'library/music/year_in_review_tracks#destroy', as: :destroy_music_year_in_review_top_track
|
113
|
+
put 'users/current/library/music/year_in_review_music_tracks/:id/move' => 'library/music/year_in_review_tracks#move', as: :move_music_year_in_review_top_track
|
114
|
+
get 'users/current/library/music/years_in_review/:year/top_tracks/export' => 'library/music/year_in_review_tracks#export', as: :export_music_year_in_review_top_tracks
|
115
|
+
|
116
|
+
get 'users/:user_id/library/music/releases' => 'music_metadata_enrichment/releases#index', as: :user_music_library_releases
|
117
|
+
get 'users/:user_id/library/music/videos' => 'music_metadata_enrichment/videos#index', as: :user_music_library_videos
|
118
|
+
get 'users/:user_id/library/music/artists' => 'music_metadata_enrichment/artists#index', as: :user_music_library_artists
|
119
|
+
get 'users/:user_id/library/music/artists/new' => 'music_metadata_enrichment/artists#new', as: :new_user_music_library_artist
|
120
|
+
delete 'users/current/library/music/artists/:id' => 'library/music/artists#destroy', as: :destroy_music_library_artist
|
121
|
+
end
|
@@ -0,0 +1,96 @@
|
|
1
|
+
class AddProductMusicMetadataEnrichment < ActiveRecord::Migration
|
2
|
+
def up
|
3
|
+
if Product.where(name: 'Music Metadata Enrichment').first
|
4
|
+
else
|
5
|
+
Product.create(name: 'Music Metadata Enrichment', text: 'Dummy')
|
6
|
+
end
|
7
|
+
|
8
|
+
create_table :music_artists do |t|
|
9
|
+
t.string :mbid, limit: 36
|
10
|
+
t.string :name
|
11
|
+
t.string :country
|
12
|
+
t.string :disambiguation
|
13
|
+
t.integer :listeners
|
14
|
+
t.integer :plays
|
15
|
+
t.datetime :founded_at
|
16
|
+
t.datetime :dissolved_at
|
17
|
+
t.string :state
|
18
|
+
t.timestamps
|
19
|
+
end
|
20
|
+
|
21
|
+
add_index :music_artists, :mbid, unique: true
|
22
|
+
|
23
|
+
create_table :music_releases do |t|
|
24
|
+
t.string :mbid, limit: 36
|
25
|
+
t.integer :artist_id
|
26
|
+
t.string :artist_name
|
27
|
+
t.string :name
|
28
|
+
t.integer :tracks_count
|
29
|
+
t.string :future_release_date
|
30
|
+
t.datetime :released_at
|
31
|
+
t.integer :listeners
|
32
|
+
t.integer :plays
|
33
|
+
t.integer :user_id
|
34
|
+
t.string :state
|
35
|
+
t.timestamps
|
36
|
+
end
|
37
|
+
|
38
|
+
add_index :music_releases, :artist_id
|
39
|
+
add_index :music_releases, :mbid, unique: true
|
40
|
+
add_index :music_releases, :released_at
|
41
|
+
|
42
|
+
create_table :music_tracks do |t|
|
43
|
+
t.string :mbid, limit: 36
|
44
|
+
t.string :spotify_track_id, limit: 22
|
45
|
+
t.integer :artist_id
|
46
|
+
t.string :artist_name
|
47
|
+
t.integer :release_id
|
48
|
+
t.string :release_name
|
49
|
+
t.integer :master_track_id
|
50
|
+
t.integer :nr
|
51
|
+
t.string :name
|
52
|
+
t.integer :duration
|
53
|
+
t.integer :listeners
|
54
|
+
t.integer :plays
|
55
|
+
t.datetime :released_at
|
56
|
+
t.string :state
|
57
|
+
t.timestamps
|
58
|
+
end
|
59
|
+
|
60
|
+
add_index :music_tracks, :artist_id
|
61
|
+
add_index :music_tracks, :master_track_id
|
62
|
+
add_index :music_tracks, [:release_id, :name], unique: true
|
63
|
+
add_index :music_tracks, :released_at
|
64
|
+
|
65
|
+
create_table :music_videos do |t|
|
66
|
+
t.string :status
|
67
|
+
t.integer :artist_id
|
68
|
+
t.string :artist_name
|
69
|
+
t.integer :track_id
|
70
|
+
t.string :track_name
|
71
|
+
t.string :url
|
72
|
+
t.string :location
|
73
|
+
t.datetime :recorded_at
|
74
|
+
t.integer :user_id
|
75
|
+
t.integer :likes_count, default: 0
|
76
|
+
t.integer :dislikes_count, default: 0
|
77
|
+
t.string :state
|
78
|
+
t.timestamps
|
79
|
+
end
|
80
|
+
|
81
|
+
add_index :music_videos, [:type, :track_id], unique: true
|
82
|
+
add_index :music_videos, :url, unique: true
|
83
|
+
add_index :music_videos, :track_id
|
84
|
+
|
85
|
+
add_column :users, :music_library_imported, :boolean, default: false
|
86
|
+
end
|
87
|
+
|
88
|
+
def down
|
89
|
+
drop_table :music_artists
|
90
|
+
drop_table :music_releases
|
91
|
+
drop_table :music_tracks
|
92
|
+
drop_table :music_videos
|
93
|
+
|
94
|
+
remove_column :users, :music_library_imported
|
95
|
+
end
|
96
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
class CreateMusicMetadataEnrichmentGroups < ActiveRecord::Migration
|
2
|
+
def up
|
3
|
+
create_table :music_metadata_enrichment_groups do |t|
|
4
|
+
t.string :name
|
5
|
+
t.integer :user_id
|
6
|
+
t.string :current_user_name
|
7
|
+
t.integer :current_members_page
|
8
|
+
t.integer :synced
|
9
|
+
t.timestamps
|
10
|
+
end
|
11
|
+
|
12
|
+
create_table :music_metadata_enrichment_group_artist_connections do |t|
|
13
|
+
t.integer :group_id
|
14
|
+
t.integer :artist_id
|
15
|
+
t.integer :likes_count, default: 0
|
16
|
+
t.integer :dislikes_count, default: 0
|
17
|
+
t.timestamps
|
18
|
+
end
|
19
|
+
|
20
|
+
add_index :music_metadata_enrichment_group_artist_connections, :group_id
|
21
|
+
add_index :music_metadata_enrichment_group_artist_connections, :artist_id
|
22
|
+
end
|
23
|
+
|
24
|
+
def down
|
25
|
+
drop_table :music_metadata_enrichment_groups
|
26
|
+
drop_table :music_metadata_enrichment_group_artist_connections
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
class CreateMusicLibraryArtists < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
create_table :music_library_artists do |t|
|
4
|
+
t.integer :user_id
|
5
|
+
t.integer :artist_id
|
6
|
+
t.integer :plays
|
7
|
+
t.timestamps
|
8
|
+
end
|
9
|
+
|
10
|
+
add_index :music_library_artists, :user_id
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
class YearInReviewMusicEntries < ActiveRecord::Migration
|
2
|
+
def up
|
3
|
+
create_table :year_in_review_music do |t|
|
4
|
+
t.integer :user_id
|
5
|
+
t.integer :year
|
6
|
+
t.timestamps
|
7
|
+
end
|
8
|
+
|
9
|
+
add_index :year_in_review_music, :user_id
|
10
|
+
add_index :year_in_review_music, :year
|
11
|
+
|
12
|
+
create_table :year_in_review_music_releases do |t|
|
13
|
+
t.integer :year_in_review_music_id
|
14
|
+
t.integer :user_id
|
15
|
+
t.integer :year
|
16
|
+
t.integer :position
|
17
|
+
t.integer :artist_id
|
18
|
+
t.string :artist_name
|
19
|
+
t.integer :release_id
|
20
|
+
t.string :release_name
|
21
|
+
t.datetime :released_at
|
22
|
+
t.timestamps
|
23
|
+
end
|
24
|
+
|
25
|
+
add_index :year_in_review_music_releases, :year_in_review_music_id
|
26
|
+
add_index :year_in_review_music_releases, :position
|
27
|
+
|
28
|
+
create_table :year_in_review_music_tracks do |t|
|
29
|
+
t.integer :year_in_review_music_id
|
30
|
+
t.integer :user_id
|
31
|
+
t.integer :year
|
32
|
+
t.integer :position
|
33
|
+
t.integer :artist_id
|
34
|
+
t.string :artist_name
|
35
|
+
t.integer :release_id
|
36
|
+
t.string :release_name
|
37
|
+
t.integer :track_id
|
38
|
+
t.string :spotify_track_id, limit: 22
|
39
|
+
t.string :track_name
|
40
|
+
t.datetime :released_at
|
41
|
+
t.timestamps
|
42
|
+
end
|
43
|
+
|
44
|
+
add_index :year_in_review_music_tracks, :year_in_review_music_id
|
45
|
+
add_index :year_in_review_music_tracks, :position
|
46
|
+
end
|
47
|
+
|
48
|
+
def down
|
49
|
+
drop_table :year_in_review_music
|
50
|
+
drop_table :year_in_review_music_releases
|
51
|
+
drop_table :year_in_review_music_tracks
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module VoluntaryMusicMetadataEnrichment
|
2
|
+
class Ability
|
3
|
+
def self.after_initialize
|
4
|
+
Proc.new do |ability, user, options|
|
5
|
+
ability.can :read, [
|
6
|
+
MusicMetadataEnrichment::Group, MusicMetadataEnrichment::GroupArtistConnection, YearInReviewMusic, YearInReviewMusicRelease, YearInReviewMusicTrack, MusicArtist, MusicRelease, MusicTrack, MusicVideo
|
7
|
+
]
|
8
|
+
|
9
|
+
if user.present?
|
10
|
+
ability.can(:create, MusicLibraryArtist)
|
11
|
+
ability.can(:destroy, MusicLibraryArtist) {|music_library_artist| music_library_artist.user_id == user.id }
|
12
|
+
ability.can(:create, MusicMetadataEnrichment::Group)
|
13
|
+
ability.can([:create, :name_confirmation, :select_artist, :creation], MusicMetadataEnrichment::GroupArtistConnection)
|
14
|
+
ability.can(:create, YearInReviewMusic)
|
15
|
+
ability.can([:create, :move, :destroy], YearInReviewMusicRelease) {|year_in_review_music_release| year_in_review_music_release.year_in_review_music.user_id == user.id }
|
16
|
+
ability.can([:multiple_new, :export], YearInReviewMusicRelease)
|
17
|
+
ability.can([:create, :move, :destroy], YearInReviewMusicTrack) {|year_in_review_music_track| year_in_review_music_track.year_in_review_music.user_id == user.id }
|
18
|
+
ability.can([:multiple_new, :export], YearInReviewMusicTrack)
|
19
|
+
ability.can([:create, :name_confirmation], MusicArtist)
|
20
|
+
ability.can([:create, :artist_confirmation, :select_artist, :name, :name_confirmation, :announce, :create_announcement], MusicRelease)
|
21
|
+
ability.can([:create, :artist_confirmation, :select_artist, :name, :name_confirmation], MusicTrack)
|
22
|
+
ability.can([:create, :artist_confirmation, :select_artist, :track_name, :track_confirmation, :create_track, :metadata], MusicVideo)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,101 @@
|
|
1
|
+
module VoluntaryMusicMetadataEnrichment
|
2
|
+
module Concerns
|
3
|
+
module Model
|
4
|
+
module User
|
5
|
+
module HasMusicLibrary
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
|
8
|
+
included do
|
9
|
+
has_many :years_in_review_music, class_name: 'YearInReviewMusic', dependent: :destroy
|
10
|
+
has_many :music_library_artists, dependent: :destroy
|
11
|
+
has_many :music_artists, through: :music_library_artists, source: 'artist'
|
12
|
+
has_many :music_releases, through: :music_artists, source: 'releases'
|
13
|
+
has_many :music_tracks, through: :music_artists, source: 'tracks'
|
14
|
+
has_many :music_videos, through: :music_artists, source: 'videos'
|
15
|
+
|
16
|
+
scope :on_lastfm, -> { where('users.lastfm_user_name IS NOT NULL') }
|
17
|
+
|
18
|
+
after_destroy :nullify_user_association_at_videos
|
19
|
+
end
|
20
|
+
|
21
|
+
def import_music_artists(lastfm, start_page = 1)
|
22
|
+
artist_names = []
|
23
|
+
|
24
|
+
1000.times do |page|
|
25
|
+
page +=1
|
26
|
+
|
27
|
+
next unless page >= start_page
|
28
|
+
|
29
|
+
lastfm_artists = nil
|
30
|
+
|
31
|
+
3.times do
|
32
|
+
begin
|
33
|
+
begin
|
34
|
+
lastfm_artists = lastfm.library.get_artists(user: lastfm_user_name, page: page)
|
35
|
+
|
36
|
+
puts "USER #{lastfm_user_name}: LIBRARY PAGE ##{page}"
|
37
|
+
rescue REXML::ParseException
|
38
|
+
lastfm_artists = []
|
39
|
+
puts "USER #{lastfm_user_name}: LIBRARY PAGE ##{page} COULD NOT BE PARSED"
|
40
|
+
end
|
41
|
+
|
42
|
+
break
|
43
|
+
rescue Lastfm::ApiError, Timeout::Error => e
|
44
|
+
puts "USER #{lastfm_user_name}: LIBRARY PAGE ##{page} ... #{e.class.name}... TRY AGAIN"
|
45
|
+
sleep 30
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
if lastfm_artists.nil? || lastfm_artists.first.nil?
|
50
|
+
puts "USER #{lastfm_user_name}: LIBRARY PAGE ##{page} IS EMPTY"
|
51
|
+
break
|
52
|
+
end
|
53
|
+
|
54
|
+
artist_mbids = lastfm_artists.map{|a| a['mbid']}.uniq
|
55
|
+
|
56
|
+
voluntary_artists = MusicArtist.where('mbid IN(?)', artist_mbids).to_a
|
57
|
+
|
58
|
+
if lastfm_artists.select{|a| !artist_names.include?(a['name'])}.none?
|
59
|
+
# over last page
|
60
|
+
break
|
61
|
+
end
|
62
|
+
|
63
|
+
lastfm_artists.each do |lastfm_artist|
|
64
|
+
if artist_names.include?(lastfm_artist['name'])
|
65
|
+
next
|
66
|
+
else
|
67
|
+
artist_names << lastfm_artist['name']
|
68
|
+
end
|
69
|
+
|
70
|
+
next if lastfm_artist['mbid'].blank?
|
71
|
+
|
72
|
+
artist = nil
|
73
|
+
|
74
|
+
unless artist = voluntary_artists.select{|a| a.mbid == lastfm_artist['mbid'] }.first
|
75
|
+
musicbrainz_artist = MusicBrainz::Artist.find(lastfm_artist['mbid'])
|
76
|
+
|
77
|
+
if musicbrainz_artist
|
78
|
+
artist = MusicArtist.where(mbid: musicbrainz_artist.id).first
|
79
|
+
artist = MusicArtist.create(name: lastfm_artist['name'], mbid: musicbrainz_artist.id) unless artist
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
if artist
|
84
|
+
music_library_artists.create(artist_id: artist.id, plays: lastfm_artist['playcount']) unless new_record?
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
update_attribute(:music_library_imported, true) unless new_record?
|
90
|
+
end
|
91
|
+
|
92
|
+
private
|
93
|
+
|
94
|
+
def nullify_user_association_at_videos
|
95
|
+
MusicVideo.where(user_id: id).update_all("user_id = NULL")
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'voluntary'
|
2
|
+
|
3
|
+
module VoluntaryMusicMetadataEnrichment
|
4
|
+
class Engine < ::Rails::Engine
|
5
|
+
config.autoload_paths << File.expand_path("../../../app/models/concerns", __FILE__)
|
6
|
+
config.autoload_paths << File.expand_path("../../../app/controllers/concerns", __FILE__)
|
7
|
+
config.i18n.load_path += Dir[File.expand_path("../../../config/locales/**/*.{rb,yml}", __FILE__)]
|
8
|
+
|
9
|
+
SimpleNavigation::config_file_paths << File.expand_path("../../../config", __FILE__)
|
10
|
+
|
11
|
+
config.generators do |g|
|
12
|
+
g.orm :active_record
|
13
|
+
end
|
14
|
+
|
15
|
+
config.to_prepare do
|
16
|
+
User.send :include, ::VoluntaryMusicMetadataEnrichment::Concerns::Model::User::HasMusicLibrary
|
17
|
+
::Ability.add_after_initialize_callback(VoluntaryMusicMetadataEnrichment::Ability.after_initialize)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
module VoluntaryMusicMetadataEnrichment
|
2
|
+
module Navigation
|
3
|
+
def self.code
|
4
|
+
Proc.new do |navigation|
|
5
|
+
navigation.items do |primary|
|
6
|
+
primary.dom_class = 'nav'
|
7
|
+
|
8
|
+
if user_signed_in?
|
9
|
+
primary.item :music_metadata_enrichment_library, I18n.t('music_library.index.title', name: name_with_apostrophe(current_user.lastfm_user_name || current_user.full_name)), user_music_library_path(current_user) do |library|
|
10
|
+
if @user.present?
|
11
|
+
library.item :years_in_review, I18n.t('years_in_review_music.index.short_title'), user_music_years_in_review_path(current_user), id: nil do |years_in_review|
|
12
|
+
unless (@year_in_review.new_record? rescue true)
|
13
|
+
years_in_review.item :show, I18n.t('years_in_review_music.show.title', year: @year_in_review.year), user_music_year_in_review_path(current_user, @year_in_review.year) do |year_in_review|
|
14
|
+
year_in_review.item :top_releases, I18n.t('year_in_review_music_releases.index.shortest_title'), user_music_year_in_review_top_releases_path(current_user, @year_in_review.year)
|
15
|
+
year_in_review.item :top_tracks, I18n.t('year_in_review_music_tracks.index.shortest_title'), user_music_year_in_review_top_tracks_path(current_user, @year_in_review.year)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
primary.item :music_metadata_enrichment_groups, I18n.t('music_metadata_enrichment_groups.index.short_title'), music_groups_path do |groups|
|
24
|
+
groups.item :new, I18n.t('general.new'), new_music_group_path
|
25
|
+
end
|
26
|
+
|
27
|
+
primary.item :music_metadata_enrichment_artists, I18n.t('music_artists.index.short_title'), music_artists_path do |artists|
|
28
|
+
artists.item :new, I18n.t('general.new'), new_music_artist_path
|
29
|
+
end
|
30
|
+
|
31
|
+
primary.item :music_metadata_enrichment_releases, I18n.t('music_releases.index.short_title'), music_releases_path do |releases|
|
32
|
+
releases.item :new, I18n.t('general.new'), new_music_release_path
|
33
|
+
end
|
34
|
+
|
35
|
+
primary.item :music_metadata_enrichment_tracks, I18n.t('music_tracks.index.short_title'), music_tracks_path do |tracks|
|
36
|
+
tracks.item :new, I18n.t('general.new'), new_music_track_path
|
37
|
+
end
|
38
|
+
|
39
|
+
primary.item :music_metadata_enrichment_videos, I18n.t('music_videos.index.short_title'), music_videos_path do |videos|
|
40
|
+
videos.item :new, I18n.t('general.new'), new_music_video_path
|
41
|
+
end
|
42
|
+
|
43
|
+
instance_exec primary, ::Voluntary::Navigation::Base.menu_options(:authentication), &::Voluntary::Navigation.menu_code(:authentication)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'musicbrainz'
|
2
|
+
require 'lastfm'
|
3
|
+
|
4
|
+
require 'voluntary'
|
5
|
+
|
6
|
+
require 'voluntary_music_metadata_enrichment/ability'
|
7
|
+
require 'voluntary_music_metadata_enrichment/navigation'
|
8
|
+
require 'voluntary_music_metadata_enrichment/concerns/model/user/has_music_library'
|
9
|
+
|
10
|
+
require "voluntary_music_metadata_enrichment/engine"
|
11
|
+
|
12
|
+
module VoluntaryMusicMetadataEnrichment
|
13
|
+
end
|