voluntary_music_metadata_enrichment 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (137) hide show
  1. data/MIT-LICENSE +20 -0
  2. data/README.rdoc +3 -0
  3. data/Rakefile +23 -0
  4. data/app/assets/javascripts/voluntary_music_metadata_enrichment/application.js +5 -0
  5. data/app/assets/javascripts/voluntary_music_metadata_enrichment/groups/show.js.coffee +14 -0
  6. data/app/assets/javascripts/voluntary_music_metadata_enrichment/library/index.js.coffee +19 -0
  7. data/app/assets/javascripts/voluntary_music_metadata_enrichment/library/year_in_review_releases/index_view.js.coffee +32 -0
  8. data/app/assets/javascripts/voluntary_music_metadata_enrichment/library/year_in_review_releases/new_view.js.coffee +31 -0
  9. data/app/assets/javascripts/voluntary_music_metadata_enrichment/library/year_in_review_tracks/index_view.js.coffee +32 -0
  10. data/app/assets/javascripts/voluntary_music_metadata_enrichment/library/year_in_review_tracks/new_view.js.coffee +31 -0
  11. data/app/assets/javascripts/voluntary_music_metadata_enrichment/library/years_in_review/index_view.js.coffee +36 -0
  12. data/app/assets/javascripts/voluntary_music_metadata_enrichment/tracks/show.js.coffee +2 -0
  13. data/app/assets/javascripts/voluntary_music_metadata_enrichment/videos/metadata.js.coffee +6 -0
  14. data/app/controllers/concerns/music_metadata_enrichment/artist_confirmation.rb +207 -0
  15. data/app/controllers/concerns/music_metadata_enrichment/base_controller.rb +17 -0
  16. data/app/controllers/concerns/music_metadata_enrichment/track_confirmation.rb +57 -0
  17. data/app/controllers/library/music/artists_controller.rb +26 -0
  18. data/app/controllers/library/music/year_in_review_releases_controller.rb +110 -0
  19. data/app/controllers/library/music/year_in_review_tracks_controller.rb +110 -0
  20. data/app/controllers/library/music/years_in_review_controller.rb +41 -0
  21. data/app/controllers/library/music_controller.rb +14 -0
  22. data/app/controllers/music_metadata_enrichment/application_controller.rb +11 -0
  23. data/app/controllers/music_metadata_enrichment/artists_controller.rb +93 -0
  24. data/app/controllers/music_metadata_enrichment/group_artist_connections_controller.rb +63 -0
  25. data/app/controllers/music_metadata_enrichment/groups_controller.rb +40 -0
  26. data/app/controllers/music_metadata_enrichment/releases_controller.rb +207 -0
  27. data/app/controllers/music_metadata_enrichment/tracks_controller.rb +82 -0
  28. data/app/controllers/music_metadata_enrichment/videos_controller.rb +133 -0
  29. data/app/controllers/product/music_metadata_enrichment_controller.rb +6 -0
  30. data/app/models/concerns/year_in_review_music_entry.rb +12 -0
  31. data/app/models/music_artist.rb +155 -0
  32. data/app/models/music_library_artist.rb +10 -0
  33. data/app/models/music_metadata_enrichment/group.rb +136 -0
  34. data/app/models/music_metadata_enrichment/group_artist_connection.rb +15 -0
  35. data/app/models/music_release.rb +278 -0
  36. data/app/models/music_track.rb +255 -0
  37. data/app/models/music_video.rb +87 -0
  38. data/app/models/product/music_metadata_enrichment.rb +2 -0
  39. data/app/models/year_in_review_music.rb +233 -0
  40. data/app/models/year_in_review_music_release.rb +24 -0
  41. data/app/models/year_in_review_music_track.rb +28 -0
  42. data/app/views/library/music/artists/destroy.js.erb +1 -0
  43. data/app/views/library/music/index.html.erb +46 -0
  44. data/app/views/library/music/year_in_review_releases/_collection.html.erb +51 -0
  45. data/app/views/library/music/year_in_review_releases/_form.html.erb +18 -0
  46. data/app/views/library/music/year_in_review_releases/_multiple_form.html.erb +44 -0
  47. data/app/views/library/music/year_in_review_releases/create.js.erb +11 -0
  48. data/app/views/library/music/year_in_review_releases/destroy.js.erb +2 -0
  49. data/app/views/library/music/year_in_review_releases/export.html.erb +13 -0
  50. data/app/views/library/music/year_in_review_releases/index.html.erb +22 -0
  51. data/app/views/library/music/year_in_review_releases/multiple_new.html.erb +1 -0
  52. data/app/views/library/music/year_in_review_releases/multiple_new.js.erb +7 -0
  53. data/app/views/library/music/year_in_review_releases/new.html.erb +1 -0
  54. data/app/views/library/music/year_in_review_tracks/_collection.html.erb +52 -0
  55. data/app/views/library/music/year_in_review_tracks/_form.html.erb +18 -0
  56. data/app/views/library/music/year_in_review_tracks/_multiple_form.html.erb +46 -0
  57. data/app/views/library/music/year_in_review_tracks/create.js.erb +11 -0
  58. data/app/views/library/music/year_in_review_tracks/destroy.js.erb +2 -0
  59. data/app/views/library/music/year_in_review_tracks/export.html.erb +13 -0
  60. data/app/views/library/music/year_in_review_tracks/index.html.erb +22 -0
  61. data/app/views/library/music/year_in_review_tracks/multiple_new.html.erb +1 -0
  62. data/app/views/library/music/year_in_review_tracks/multiple_new.js.erb +7 -0
  63. data/app/views/library/music/year_in_review_tracks/new.html.erb +1 -0
  64. data/app/views/library/music/years_in_review/_collection.html.erb +52 -0
  65. data/app/views/library/music/years_in_review/create.js.erb +6 -0
  66. data/app/views/library/music/years_in_review/index.html.erb +18 -0
  67. data/app/views/library/music/years_in_review/show.html.erb +20 -0
  68. data/app/views/music_metadata_enrichment/artists/_collection.html.erb +68 -0
  69. data/app/views/music_metadata_enrichment/artists/by_name.html.erb +3 -0
  70. data/app/views/music_metadata_enrichment/artists/index.html.erb +7 -0
  71. data/app/views/music_metadata_enrichment/artists/name_confirmation.html.erb +1 -0
  72. data/app/views/music_metadata_enrichment/artists/new.html.erb +1 -0
  73. data/app/views/music_metadata_enrichment/artists/show.html.erb +24 -0
  74. data/app/views/music_metadata_enrichment/group_artist_connections/import.html.erb +6 -0
  75. data/app/views/music_metadata_enrichment/group_artist_connections/index.html.erb +0 -0
  76. data/app/views/music_metadata_enrichment/group_artist_connections/name_confirmation.html.erb +1 -0
  77. data/app/views/music_metadata_enrichment/group_artist_connections/new.html.erb +1 -0
  78. data/app/views/music_metadata_enrichment/groups/index.html.erb +0 -0
  79. data/app/views/music_metadata_enrichment/groups/new.html.erb +7 -0
  80. data/app/views/music_metadata_enrichment/groups/show.html.erb +31 -0
  81. data/app/views/music_metadata_enrichment/releases/_collection.html.erb +53 -0
  82. data/app/views/music_metadata_enrichment/releases/announce.html.erb +10 -0
  83. data/app/views/music_metadata_enrichment/releases/artist_confirmation.html.erb +1 -0
  84. data/app/views/music_metadata_enrichment/releases/by_name.html.erb +24 -0
  85. data/app/views/music_metadata_enrichment/releases/export.html.erb +17 -0
  86. data/app/views/music_metadata_enrichment/releases/index.html.erb +8 -0
  87. data/app/views/music_metadata_enrichment/releases/name.html.erb +9 -0
  88. data/app/views/music_metadata_enrichment/releases/name_confirmation.html.erb +33 -0
  89. data/app/views/music_metadata_enrichment/releases/new.html.erb +1 -0
  90. data/app/views/music_metadata_enrichment/releases/show.html.erb +50 -0
  91. data/app/views/music_metadata_enrichment/shared/_artist_confirmation_form.html.erb +41 -0
  92. data/app/views/music_metadata_enrichment/shared/_new_artist_form.html.erb +10 -0
  93. data/app/views/music_metadata_enrichment/shared/_new_track_form.html.erb +9 -0
  94. data/app/views/music_metadata_enrichment/shared/_track_confirmation_form.html.erb +29 -0
  95. data/app/views/music_metadata_enrichment/tracks/_spotify_track_player.html.erb +3 -0
  96. data/app/views/music_metadata_enrichment/tracks/artist_confirmation.html.erb +1 -0
  97. data/app/views/music_metadata_enrichment/tracks/by_name.html.erb +26 -0
  98. data/app/views/music_metadata_enrichment/tracks/index.html.erb +8 -0
  99. data/app/views/music_metadata_enrichment/tracks/name.html.erb +1 -0
  100. data/app/views/music_metadata_enrichment/tracks/name_confirmation.html.erb +1 -0
  101. data/app/views/music_metadata_enrichment/tracks/new.html.erb +1 -0
  102. data/app/views/music_metadata_enrichment/tracks/show.html.erb +21 -0
  103. data/app/views/music_metadata_enrichment/videos/_collection.html.erb +25 -0
  104. data/app/views/music_metadata_enrichment/videos/artist_confirmation.html.erb +1 -0
  105. data/app/views/music_metadata_enrichment/videos/by_name.html.erb +3 -0
  106. data/app/views/music_metadata_enrichment/videos/index.html.erb +8 -0
  107. data/app/views/music_metadata_enrichment/videos/metadata.html.erb +25 -0
  108. data/app/views/music_metadata_enrichment/videos/new.html.erb +1 -0
  109. data/app/views/music_metadata_enrichment/videos/show.html.erb +9 -0
  110. data/app/views/music_metadata_enrichment/videos/track_confirmation.html.erb +1 -0
  111. data/app/views/music_metadata_enrichment/videos/track_name.html.erb +1 -0
  112. data/app/views/product/music_metadata_enrichment/index.html.erb +6 -0
  113. data/config/locales/en.yml +16 -0
  114. data/config/locales/resources/music_artists/en.yml +43 -0
  115. data/config/locales/resources/music_library/en.yml +8 -0
  116. data/config/locales/resources/music_metadata_enrichment_group_artist_connections/en.yml +19 -0
  117. data/config/locales/resources/music_metadata_enrichment_groups/en.yml +25 -0
  118. data/config/locales/resources/music_releases/en.yml +67 -0
  119. data/config/locales/resources/music_tracks/en.yml +45 -0
  120. data/config/locales/resources/music_videos/en.yml +56 -0
  121. data/config/locales/resources/year_in_review_music_releases/en.yml +19 -0
  122. data/config/locales/resources/year_in_review_music_tracks/en.yml +19 -0
  123. data/config/locales/resources/years_in_review_music/en.yml +21 -0
  124. data/config/main_music_metadata_enrichment_navigation.rb +3 -0
  125. data/config/routes.rb +121 -0
  126. data/db/migrate/20150106183434_add_product_music_metadata_enrichment.rb +96 -0
  127. data/db/migrate/20150120091801_create_music_metadata_enrichment_groups.rb +28 -0
  128. data/db/migrate/20150120221419_create_music_library_artists.rb +12 -0
  129. data/db/migrate/20150123082224_year_in_review_music_entries.rb +53 -0
  130. data/lib/tasks/voluntary_music_metadata_enrichment_tasks.rake +4 -0
  131. data/lib/voluntary_music_metadata_enrichment/ability.rb +27 -0
  132. data/lib/voluntary_music_metadata_enrichment/concerns/model/user/has_music_library.rb +101 -0
  133. data/lib/voluntary_music_metadata_enrichment/engine.rb +20 -0
  134. data/lib/voluntary_music_metadata_enrichment/navigation.rb +49 -0
  135. data/lib/voluntary_music_metadata_enrichment/version.rb +3 -0
  136. data/lib/voluntary_music_metadata_enrichment.rb +13 -0
  137. 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,4 @@
1
+ # desc "Explaining what the task does"
2
+ # task :voluntary_music_metadata_enrichment do
3
+ # # Task goes here
4
+ # 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,3 @@
1
+ module VoluntaryMusicMetadataEnrichment
2
+ VERSION = "0.0.1"
3
+ end
@@ -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