musora-content-services 1.3.19 → 2.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/.editorconfig +16 -0
  2. package/CHANGELOG.md +1 -3
  3. package/docs/config.js.html +14 -5
  4. package/docs/content.js.html +425 -0
  5. package/docs/global.html +3026 -0
  6. package/docs/index.html +2 -2
  7. package/docs/module-Config.html +60 -7
  8. package/docs/module-Content-Services-V2.html +2433 -0
  9. package/docs/module-Railcontent-Services.html +522 -2
  10. package/docs/module-Sanity-Services.html +57 -43
  11. package/docs/module-Session-Management.html +575 -0
  12. package/docs/module-User-Permissions.html +406 -0
  13. package/docs/railcontent.js.html +42 -5
  14. package/docs/sanity.js.html +290 -103
  15. package/docs/user_permissions.js.html +110 -0
  16. package/docs/user_sessions.js.html +139 -0
  17. package/docs/user_types.js.html +188 -0
  18. package/jsdoc.json +2 -0
  19. package/package.json +1 -1
  20. package/publish.sh +2 -2
  21. package/src/contentMetaData.js +307 -1088
  22. package/src/contentTypeConfig.js +108 -4
  23. package/src/filterBuilder.js +6 -6
  24. package/src/index.d.ts +61 -6
  25. package/src/index.js +61 -6
  26. package/src/{services → lib}/lastUpdated.js +17 -1
  27. package/src/services/config.js +0 -0
  28. package/src/services/content.js +371 -0
  29. package/src/services/dataContext.js +0 -0
  30. package/src/services/forum.js +57 -0
  31. package/src/services/railcontent.js +124 -11
  32. package/src/services/recommendations.js +19 -0
  33. package/src/services/sanity.js +278 -104
  34. package/src/services/{userPermissions.js → user/permissions.js} +16 -2
  35. package/src/services/user/sessions.js +67 -0
  36. package/src/services/user/types.js +116 -0
  37. package/src/services/userActivity.js +32 -0
  38. package/test/content.test.js +116 -0
  39. package/test/contentLikes.test.js +0 -0
  40. package/test/contentProgress.test.js +83 -5
  41. package/test/forum.test.js +18 -0
  42. package/test/initializeTests.js +6 -1
  43. package/test/{lastUpdated.test.js → lib/lastUpdated.test.js} +2 -5
  44. package/test/sanityQueryService.test.js +66 -18
  45. package/test/{userPermissions.test.js → user/permissions.test.js} +3 -3
  46. package/tools/generate-index.cjs +16 -3
@@ -1,5 +1,55 @@
1
1
  // Metadata is taken from the 'common' element and then merged with the <brand> metadata.
2
2
  // Brand values are prioritized and will override the same property in the 'common' element.
3
+
4
+ const PROGRESS_NAMES = ['All', 'In Progress', 'Completed', 'Not Started']
5
+ const DIFFICULTY_STRINGS = ['Introductory', 'Beginner', 'Intermediate', 'Advanced', 'Expert']
6
+
7
+ class SortingOptions {
8
+ static Popularity = { value: '-popularity', name: 'Most Popular' }
9
+ static PopularityDesc = { value: 'recommended', name: 'Recommended' }
10
+ static PublishedOn = { value: '-published_on', name: 'Newest First' }
11
+ static PublishedOnDesc = { value: 'published_on', name: 'Oldest First' }
12
+ static Slug = { value: 'slug', name: 'Name: A to Z' }
13
+ static SlugDesc = { value: '-slug', name: 'Name: Z to A' }
14
+ static AllSortingOptions = [
15
+ this.PopularityDesc,
16
+ this.Popularity,
17
+ this.PublishedOn,
18
+ this.PublishedOnDesc,
19
+ this.Slug,
20
+ this.SlugDesc,
21
+ ]
22
+ }
23
+
24
+ export class Tabs {
25
+ static ForYou = { name: 'For You', short_name: 'For You' }
26
+ static Individuals = { name: 'Individuals', short_name: 'Individuals', value: 'type,individuals', cardType: 'big' }
27
+ static Collections = { name: 'Collections', short_name: 'Collections', value: 'type,collections', cardType: 'big' }
28
+ static ExploreAll = { name: 'Explore All', short_name: 'Explore All', icon: 'icon-filters', cardType: 'big'}
29
+ static All = { name: 'All', short_name: 'All', value: '' }
30
+ static Courses = { name: 'Courses', short_name: 'Courses', value: '' }
31
+ static SkillLevel = { name: 'Skill Level', short_name: 'SKILL LEVEL', is_group_by: true, value: 'difficulty_string' }
32
+ static Genres = { name: 'Genres', short_name: 'Genres', is_group_by: true, value: 'genre' }
33
+ static Completed = { name: 'Completed', short_name: 'COMPLETED', is_group_by: false, value: 'completed' }
34
+ static InProgress = { name: 'In Progress', short_name: 'IN PROGRESS', is_group_by: false, value: 'in progress' }
35
+ static OwnedChallenges = { name: 'Owned Challenges!!', short_name: 'OWNED CHALLENGES!!', value: 'owned' }
36
+ static Instructors = { name: 'Instructors', short_name: 'INSTRUCTORS', is_group_by: true, value: 'instructor' }
37
+ static Lessons = { name: 'Lessons', short_name: 'LESSONS', value: '' }
38
+ static Artists = { name: 'Artists', short_name: 'ARTISTS', is_group_by: true, value: 'artist' }
39
+ static Songs = { name: 'Songs', short_name: 'Songs', value: '' }
40
+ static Tutorials = { name: 'Tutorials', short_name: 'Tutorials', value: 'type,tutorials', cardType: 'big' }
41
+ static Transcriptions = { name: 'Transcriptions', short_name: 'Transcriptions', value: 'type,trancription', cardType: 'small' }
42
+ static PlayAlongs = { name: 'Play-Alongs', short_name: 'Play-Alongs', value:'type,play along', cardType: 'small' }
43
+ static RecentAll = { name: 'All', short_name: 'All' }
44
+ static RecentIncomplete = { name: 'Incomplete', short_name: 'Incomplete' }
45
+ static RecentCompleted = { name: 'Completed', short_name: 'Completed' }
46
+ }
47
+
48
+ export const TabResponseType = {
49
+ SECTIONS: 'sections',
50
+ CATALOG: 'catalog'
51
+ };
52
+
3
53
  const commonMetadata = {
4
54
  instructor: {
5
55
  name: 'Coaches',
@@ -14,35 +64,13 @@ const commonMetadata = {
14
64
  allowableFilters: ['difficulty', 'topic', 'genre'],
15
65
  sortBy: '-published_on',
16
66
  modalText:
17
- 'Challenges are a series of guided lessons designed to build your skills day-by-day.',
67
+ 'Challenges are a series of guided lessons designed to build your skills day-by-day.',
18
68
  tabs: [
19
- {
20
- name: 'All',
21
- short_name: 'All',
22
- value: '',
23
- },
24
- {
25
- name: 'Skill Level',
26
- short_name: 'SKILL LEVEL',
27
- is_group_by: true,
28
- value: 'difficulty_string',
29
- },
30
- {
31
- name: 'Genres',
32
- short_name: 'Genres',
33
- is_group_by: true,
34
- value: 'genre',
35
- },
36
- {
37
- name: 'Completed',
38
- short_name: 'COMPLETED',
39
- value: 'completed',
40
- },
41
- {
42
- name: 'Owned Challenges',
43
- short_name: 'OWNED CHALLENGES',
44
- value: 'owned',
45
- },
69
+ Tabs.All,
70
+ Tabs.SkillLevel,
71
+ Tabs.Genres,
72
+ Tabs.Completed,
73
+ Tabs.OwnedChallenges,
46
74
  ],
47
75
  },
48
76
  'challenge-part': {
@@ -57,23 +85,9 @@ const commonMetadata = {
57
85
  allowableFilters: ['difficulty', 'genre', 'essential', 'theory', 'creativity', 'lifestyle'],
58
86
  icon: 'icon-courses',
59
87
  tabs: [
60
- {
61
- name: 'Courses',
62
- short_name: 'COURSES',
63
- value: '',
64
- },
65
- {
66
- name: 'Instructors',
67
- short_name: 'INSTRUCTORS',
68
- is_group_by: true,
69
- value: 'instructor',
70
- },
71
- {
72
- name: 'Genres',
73
- short_name: 'Genres',
74
- is_group_by: true,
75
- value: 'genre',
76
- },
88
+ Tabs.Courses,
89
+ Tabs.Instructors,
90
+ Tabs.Genres,
77
91
  ],
78
92
  },
79
93
  pack: {
@@ -85,82 +99,40 @@ const commonMetadata = {
85
99
  allowableFilters: ['difficulty', 'genre', 'essential', 'theory', 'creativity', 'lifestyle'],
86
100
  sortBy: '-published_on',
87
101
  tabs: [
88
- {
89
- name: 'Lessons',
90
- short_name: 'LESSONS',
91
- value: '',
92
- },
93
- {
94
- name: 'Instructors',
95
- short_name: 'INSTRUCTORS',
96
- is_group_by: true,
97
- value: 'instructor',
98
- },
99
- {
100
- name: 'Genres',
101
- short_name: 'Genres',
102
- is_group_by: true,
103
- value: 'genre',
104
- },
102
+ Tabs.Lessons,
103
+ Tabs.Instructors,
104
+ Tabs.Genres,
105
105
  ],
106
106
  },
107
107
  song: {
108
108
  name: 'Songs',
109
109
  icon: 'icon-songs',
110
110
  description:
111
- 'Play the songs you love with note-for-note transcriptions and handy practice tools.',
111
+ 'Play the songs you love with note-for-note transcriptions and handy practice tools.',
112
112
  allowableFilters: ['difficulty', 'genre', 'lifestyle', 'instrumentless'],
113
113
  tabs: [
114
- {
115
- name: 'Songs',
116
- short_name: 'Songs',
117
- value: '',
118
- },
119
- {
120
- name: 'Artists',
121
- short_name: 'ARTISTS',
122
- is_group_by: true,
123
- value: 'artist',
124
- },
125
- {
126
- name: 'Genres',
127
- short_name: 'Genres',
128
- is_group_by: true,
129
- value: 'genre',
130
- },
114
+ Tabs.Songs,
115
+ Tabs.Artists,
116
+ Tabs.Genres,
131
117
  ],
132
118
  },
133
119
  'quick-tips': {
134
120
  name: 'Quick Tips',
135
121
  icon: 'icon-shows',
136
122
  description:
137
- 'Only have 10 minutes? These short lessons are designed to inspire you with quick tips and exercises, even if you don’t have lots of time to practice.',
123
+ 'Only have 10 minutes? These short lessons are designed to inspire you with quick tips and exercises, even if you don’t have lots of time to practice.',
138
124
  allowableFilters: ['difficulty', 'genre', 'essential', 'theory', 'lifestyle', 'creativity'],
139
125
  sortBy: '-published_on',
140
126
  tabs: [
141
- {
142
- name: 'Lessons',
143
- short_name: 'LESSONS',
144
- value: '',
145
- },
146
- {
147
- name: 'Instructors',
148
- short_name: 'INSTRUCTORS',
149
- is_group_by: true,
150
- value: 'instructor',
151
- },
152
- {
153
- name: 'Genres',
154
- short_name: 'Genres',
155
- is_group_by: true,
156
- value: 'genre',
157
- },
127
+ Tabs.Lessons,
128
+ Tabs.Instructors,
129
+ Tabs.Genres,
158
130
  ],
159
131
  },
160
132
  'question-and-answer': {
161
133
  name: 'Q&A',
162
134
  description:
163
- 'Each week we go live to answer your questions. Submit your questions in advance using the button below, in the Q&A thread in the forums, or live in the community chat.',
135
+ 'Each week we go live to answer your questions. Submit your questions in advance using the button below, in the Q&A thread in the forums, or live in the community chat.',
164
136
  allowableFilters: ['difficulty', 'genre', 'essential', 'theory'],
165
137
  sortBy: '-published_on',
166
138
  },
@@ -177,11 +149,7 @@ const commonMetadata = {
177
149
  shortname: 'Workouts',
178
150
  allowableFilters: ['difficulty', 'genre', 'topic'],
179
151
  tabs: [
180
- {
181
- name: 'All',
182
- short_name: 'ALL',
183
- value: '',
184
- },
152
+ Tabs.All,
185
153
  {
186
154
  name: '5 Minutes',
187
155
  short_name: '5 MINS',
@@ -203,15 +171,10 @@ const commonMetadata = {
203
171
  value: 'length_in_seconds,750+',
204
172
  value_web: ['length_in_seconds > 750'],
205
173
  },
206
- {
207
- name: 'Instructors',
208
- short_name: 'INSTRUCTORS',
209
- is_group_by: true,
210
- value: 'instructor',
211
- },
174
+ Tabs.Instructors,
212
175
  ],
213
176
  modalText:
214
- 'Workouts are fun play-along lessons that help hone your musical skills. They cover various topics, and have multiple difficulty and duration options — so there’s always a perfect Workout for you. Just pick one, press start, and play along!',
177
+ 'Workouts are fun play-along lessons that help hone your musical skills. They cover various topics, and have multiple difficulty and duration options — so there’s always a perfect Workout for you. Just pick one, press start, and play along!',
215
178
  },
216
179
  'coach-lessons': {
217
180
  allowableFilters: ['difficulty', 'genre', 'essential', 'theory', 'lifestyle', 'type'],
@@ -223,32 +186,60 @@ const commonMetadata = {
223
186
  allowableFilters: ['difficulty', 'type'],
224
187
  sortBy: '-published_on',
225
188
  tabs: [
226
- {
227
- name: 'In Progress',
228
- short_name: 'IN PROGRESS',
229
- is_group_by: false,
230
- value: 'in progress',
231
- },
232
- {
233
- name: 'Completed',
234
- short_name: 'COMPLETED',
235
- is_group_by: false,
236
- value: 'completed',
237
- },
189
+ Tabs.InProgress,
190
+ Tabs.Completed,
238
191
  ],
239
192
  },
240
193
  'new-release': {
241
194
  name: 'New Releases',
242
195
  description:
243
- "Here's a list of all lessons recently added to Drumeo. Browse on your own or use search to find whatever it is you'd like to learn!",
196
+ "Here's a list of all lessons recently added to Drumeo. Browse on your own or use search to find whatever it is you'd like to learn!",
244
197
  allowableFilters: ['type'],
245
198
  sortBy: '-published_on',
246
199
  tabs: [
247
- {
248
- name: 'Lessons',
249
- short_name: 'LESSONS',
250
- value: '',
251
- },
200
+ Tabs.Lessons,
201
+ ],
202
+ },
203
+ 'lessons': {
204
+ name: 'Lessons',
205
+ filterOptions: {
206
+ difficulty: DIFFICULTY_STRINGS,
207
+ style: ['Country/Folk', 'Funk/Disco', 'Hard Rock/Metal', 'Hip-Hop/Rap/EDM', 'Holiday/Soundtrack', 'Jazz/Blues', 'Latin/World', 'Pop/Rock', 'R&B/Soul', 'Worship/Gospel'],
208
+ type: ['Single Lessons', 'Practice Alongs', 'Performances', 'Courses', 'Shows', 'Documentaries', 'Live Archives', 'Student Archives'],
209
+ progress: PROGRESS_NAMES,
210
+ },
211
+ sortingOptions: {
212
+ title: 'Sort By',
213
+ type: 'radio',
214
+ items: SortingOptions.AllSortingOptions,
215
+ },
216
+ tabs: [
217
+ Tabs.ForYou,
218
+ Tabs.Individuals,
219
+ Tabs.Collections,
220
+ Tabs.ExploreAll
221
+ ],
222
+ },
223
+ 'songs': {
224
+ name: 'Songs',
225
+ filterOptions: {
226
+ difficulty: DIFFICULTY_STRINGS,
227
+ style: ['Blues','Christian','Classical','Country','Disco','Electronic','Folk','Funk','Hip-Hop/Rap','Holiday','Jazz','Soundtrack',
228
+ 'World','Metal','Pop','R&B/Soul','Rock'],
229
+ type: ['Tutorials', 'Transcriptions', 'Jam Tracks'],
230
+ progress: PROGRESS_NAMES,
231
+ },
232
+ sortingOptions: {
233
+ title: 'Sort By',
234
+ type: 'radio',
235
+ items: SortingOptions.AllSortingOptions,
236
+ },
237
+ tabs: [
238
+ Tabs.ForYou,
239
+ Tabs.Tutorials,
240
+ Tabs.Transcriptions,
241
+ Tabs.PlayAlongs,
242
+ Tabs.ExploreAll
252
243
  ],
253
244
  },
254
245
  }
@@ -256,86 +247,41 @@ const contentMetadata = {
256
247
  drumeo: {
257
248
  instructor: {
258
249
  description:
259
- 'Your drumming journey is unique. You need personalized coaching that helps you reach your goals. Learn from some of the best drummers in the world!',
250
+ 'Your drumming journey is unique. You need personalized coaching that helps you reach your goals. Learn from some of the best drummers in the world!',
260
251
  },
261
- course: {
252
+ live: {
253
+ thumbnailUrl: 'https://dpwjbsxqtam5n.cloudfront.net/shows/show-live.jpg',
254
+ name: 'Live',
255
+ url: '/live-streams',
256
+ shortname: 'Live Lessons',
257
+ icon: 'icon-shows',
262
258
  description:
263
- "Tackle your next drumming goal with bite-sized courses from many of the world's best drummers.",
264
- sortBy: '-published_on',
265
- },
266
- song: {
267
- sortBy: '-published_on',
268
- },
269
- 'song-tutorial': {
270
- name: 'Song Tutorials',
271
- thumbnailUrl: 'https://dpwjbsxqtam5n.cloudfront.net/shows/pianote/songs.jpg',
272
- allowableFilters: ['difficulty', 'genre'],
259
+ 'Practice sessions, Q&A, celebrations, and more are available during Drumeo live lessons. Subscribe to an event or the whole calendar, so you don’t miss out!',
260
+ allowableFilters: ['difficulty', 'genre', 'essential', 'theory'],
273
261
  sortBy: '-published_on',
274
- shortname: 'song tutorials',
275
- icon: 'play-progress',
276
- description: '',
277
- amountOfFutureLessonsToShow: 3,
278
- showFutureLessonAtTopOrBottom: 'bottom',
279
262
  tabs: [
280
- {
281
- name: 'Lessons',
282
- short_name: 'Lessons',
283
- value: '',
284
- },
285
- {
286
- name: 'Artists',
287
- short_name: 'ARTISTS',
288
- is_group_by: true,
289
- value: 'artist',
290
- },
291
- {
292
- name: 'Genres',
293
- short_name: 'Genres',
294
- is_group_by: true,
295
- value: 'genre',
296
- },
263
+ Tabs.Lessons,
264
+ Tabs.Instructors,
265
+ Tabs.Genres,
297
266
  ],
298
267
  },
299
- 'student-review': null,
300
- 'student-focus': {
301
- name: 'Student Focus',
302
- icon: 'icon-student-focus',
303
- description:
304
- 'Submit your playing for personalized and direct feedback, or look at the archive to see what challenges our instructors have already addressed.',
305
- allowableFilters: ['difficulty', 'genre', 'essential', 'theory', 'creativity', 'lifestyle'],
306
- sortBy: '-published_on',
307
- tabs: [
308
- {
309
- name: 'Lessons',
310
- short_name: 'LESSONS',
311
- value: '',
312
- },
313
- {
314
- name: 'Instructors',
315
- short_name: 'INSTRUCTORS',
316
- is_group_by: true,
317
- value: 'instructor',
318
- },
319
- {
320
- name: 'Genres',
321
- short_name: 'Genres',
322
- is_group_by: true,
323
- value: 'genre',
324
- },
325
- ],
268
+ 'odd-times': {
269
+ thumbnailUrl:
270
+ 'https://musora.com/cdn-cgi/imagedelivery/0Hon__GSkIjm-B_W77SWCA/1bf6fc7a-d1a5-4934-d322-b9f6da454000/public',
271
+ name: 'Odd Times With Aaron Edgar',
272
+ shortname: 'Episodes',
273
+ icon: 'icon-shows',
274
+ allowableFilters: [],
275
+ sortBy: 'sort',
326
276
  },
327
277
  rudiment: {
328
278
  name: 'Rudiments',
329
279
  icon: 'icon-drums',
330
280
  description:
331
- 'The 40 drum rudiments are essential for any drummer, no matter the style, genre, or scenario. You can use the videos below to help you learn, practice, and perfect every single one.',
281
+ 'The 40 drum rudiments are essential for any drummer, no matter the style, genre, or scenario. You can use the videos below to help you learn, practice, and perfect every single one.',
332
282
  allowableFilters: ['difficulty', 'genre', 'gear', 'topic'],
333
283
  tabs: [
334
- {
335
- name: 'All',
336
- short_name: 'ALL',
337
- value: '',
338
- },
284
+ Tabs.All,
339
285
  {
340
286
  name: 'Drags',
341
287
  short_name: 'DRAGS',
@@ -363,951 +309,184 @@ const contentMetadata = {
363
309
  ],
364
310
  sortBy: 'sort',
365
311
  },
366
- 'gear-guide': {
367
- thumbnailUrl: 'https://dpwjbsxqtam5n.cloudfront.net/shows/gear.jpg',
368
- name: 'Gear Guides',
369
- icon: 'icon-shows',
370
- url: '/gear-guides',
371
- description:
372
- 'Drummers love their gear - and in here you will find videos on gear demos, reviews, maintenance, tuning tips and much more.',
373
- allowableFilters: ['difficulty', 'genre'],
374
- sortBy: '-published_on',
375
- tabs: [
376
- {
377
- name: 'Lessons',
378
- short_name: 'LESSONS',
379
- value: '',
380
- },
381
- {
382
- name: 'Instructors',
383
- short_name: 'INSTRUCTORS',
384
- is_group_by: true,
385
- value: 'instructor',
386
- },
387
- {
388
- name: 'Genres',
389
- short_name: 'Genres',
390
- is_group_by: true,
391
- value: 'genre',
392
- },
393
- ],
394
- },
395
- challenges: {
396
- thumbnailUrl: 'https://dpwjbsxqtam5n.cloudfront.net/shows/challenges.jpg',
397
- name: 'Challenges',
398
- icon: 'icon-shows',
399
- description:
400
- 'Like drumming puzzles, our challenges are lessons that will take a little more brain power and practice to get down. They are a great way to motivate you to get behind the kit or pad to practice, and cover the entire gamut of drumming skill level.',
401
- allowableFilters: ['difficulty', 'genre'],
402
- sortBy: '-published_on',
403
- tabs: [
404
- {
405
- name: 'Lessons',
406
- short_name: 'LESSONS',
407
- value: '',
408
- },
409
- {
410
- name: 'Instructors',
411
- short_name: 'INSTRUCTORS',
412
- is_group_by: true,
413
- value: 'instructor',
414
- },
415
- {
416
- name: 'Genres',
417
- short_name: 'Genres',
418
- is_group_by: true,
419
- value: 'genre',
420
- },
421
- ],
422
- },
423
- 'boot-camp': {
424
- thumbnailUrl: 'https://dpwjbsxqtam5n.cloudfront.net/shows/bootcamps.jpg',
425
- name: 'Boot Camps',
426
- icon: 'icon-shows',
427
- url: '/boot-camps',
428
- description:
429
- 'Grab your sticks and practice along while watching a lesson! These boot camps are designed like workout videos so you can follow along and push your drumming at the same time.',
430
- allowableFilters: ['difficulty', 'genre', 'essential'],
431
- sortBy: '-published_on',
432
- tabs: [
433
- {
434
- name: 'Lessons',
435
- short_name: 'LESSONS',
436
- value: '',
437
- },
438
- {
439
- name: 'Instructors',
440
- short_name: 'INSTRUCTORS',
441
- is_group_by: true,
442
- value: 'instructor',
443
- },
444
- {
445
- name: 'Genres',
446
- short_name: 'Genres',
447
- is_group_by: true,
448
- value: 'genre',
449
- },
450
- ],
451
- },
452
- 'quick-tips': {
453
- thumbnailUrl:
454
- 'https://musora.com/cdn-cgi/imagedelivery/0Hon__GSkIjm-B_W77SWCA/78e68540-2b93-4445-882c-a19eef6b5d00/public',
455
- },
456
- podcast: {
457
- thumbnailUrl: 'https://dpwjbsxqtam5n.cloudfront.net/shows/show-podcast.jpg',
458
- name: 'The Drumeo Podcast',
459
- shortname: 'Episodes',
460
- icon: 'icon-shows',
461
- description:
462
- 'Enjoy our official Drumeo Podcasts in video form! Whether it be discussions about drum topics or interviews with the greats you are looking for, these are an entertaining and educational way to pass the time.',
463
- allowableFilters: [],
464
- sortBy: '-sort',
465
- url: '/podcasts',
466
- },
467
- 'on-the-road': {
468
- thumbnailUrl: 'https://dpwjbsxqtam5n.cloudfront.net/shows/on-the-road.jpg',
469
- name: 'On The Road',
470
- shortname: 'Episodes',
471
- icon: 'icon-shows',
472
- description:
473
- 'See Drumeo in action outside of the studio! This is your backstage pass to some of the biggest drum/music events in the world, as well as factory tours of your favorite drum brands.',
474
- allowableFilters: [],
475
- sortBy: '-published_on',
476
- },
477
- 'behind-the-scenes': {
478
- thumbnailUrl: 'https://dpwjbsxqtam5n.cloudfront.net/shows/behind-the-scenes.jpg',
479
- name: 'Behind the Scenes',
480
- shortname: 'Episodes',
481
- icon: 'icon-shows',
482
- description:
483
- 'Have you ever wondered what it’s like to work at the Drumeo office? This is your behind the scenes look at what we do and all the shenanigans that happen day to day.',
484
- allowableFilters: [],
485
- sortBy: '-sort',
486
- },
487
- 'study-the-greats': {
488
- thumbnailUrl: 'https://dpwjbsxqtam5n.cloudfront.net/shows/study-the-greats.jpg',
489
- name: 'Study the Greats',
490
- shortname: 'Episodes',
491
- icon: 'icon-shows',
492
- description:
493
- 'Study the greats with Austin Burcham! These lessons break down the beats, licks, and ideas of some of the most famous drummers we have had out on Drumeo.',
494
- allowableFilters: [],
495
- sortBy: 'sort',
496
- },
497
- live: {
498
- thumbnailUrl: 'https://dpwjbsxqtam5n.cloudfront.net/shows/show-live.jpg',
499
- name: 'Live',
500
- url: '/live-streams',
501
- shortname: 'Live Lessons',
502
- icon: 'icon-shows',
312
+ 'play-along': {
313
+ name: 'Play Alongs',
314
+ icon: 'icon-play-alongs',
503
315
  description:
504
- 'Practice sessions, Q&A, celebrations, and more are available during Drumeo live lessons. Subscribe to an event or the whole calendar, so you don’t miss out!',
505
- allowableFilters: ['difficulty', 'genre', 'essential', 'theory'],
506
- sortBy: '-published_on',
316
+ 'Add your drumming to high-quality drumless play-along tracks - with handy playback tools to help you create the perfect performance.',
317
+ allowableFilters: ['difficulty', 'genre', 'bpm'],
507
318
  tabs: [
508
319
  {
509
- name: 'Lessons',
510
- short_name: 'LESSONS',
320
+ name: 'All Play-Alongs',
321
+ short_name: 'ALL',
511
322
  value: '',
512
323
  },
513
- {
514
- name: 'Instructors',
515
- short_name: 'INSTRUCTORS',
516
- is_group_by: true,
517
- value: 'instructor',
518
- },
519
- {
520
- name: 'Genres',
521
- short_name: 'Genres',
522
- is_group_by: true,
523
- value: 'genre',
524
- },
525
324
  ],
526
325
  },
527
- solo: {
528
- thumbnailUrl: 'https://dpwjbsxqtam5n.cloudfront.net/shows/solos.jpg',
529
- name: 'Solos',
530
- icon: 'icon-shows',
531
- url: '/solos',
532
- description:
533
- 'Watch drum solos performed by the many different artists we have had out on Drumeo! A great way to be entertained, motivated, and to learn through amazing performances.',
534
- allowableFilters: ['difficulty', 'genre'],
535
- sortBy: '-published_on',
326
+ 'lessons': {
327
+ name: 'Lessons',
328
+ filterOptions: {
329
+ difficulty: DIFFICULTY_STRINGS,
330
+ style: ['Country/Folk', 'Funk/Disco', 'Hard Rock/Metal', 'Hip-Hop/Rap/EDM', 'Holiday/Soundtrack', 'Jazz/Blues', 'Latin/World', 'Pop/Rock', 'R&B/Soul', 'Worship/Gospel'],
331
+ type: ['Single Lessons', 'Practice Alongs', 'Performances', 'Courses', 'Shows', 'Documentaries', 'Live Archives', 'Student Archives'],
332
+ progress: PROGRESS_NAMES,
333
+ },
536
334
  tabs: [
537
- {
538
- name: 'Lessons',
539
- short_name: 'LESSONS',
540
- value: '',
541
- },
542
- {
543
- name: 'Instructors',
544
- short_name: 'INSTRUCTORS',
545
- is_group_by: true,
546
- value: 'instructor',
547
- },
548
- {
549
- name: 'Genres',
550
- short_name: 'Genres',
551
- is_group_by: true,
552
- value: 'genre',
553
- },
335
+ Tabs.ForYou,
336
+ Tabs.Individuals,
337
+ Tabs.Collections,
338
+ Tabs.ExploreAll
554
339
  ],
555
340
  },
556
- performance: {
557
- thumbnailUrl: 'https://dpwjbsxqtam5n.cloudfront.net/shows/performances.jpg',
558
- name: 'Performances',
559
- icon: 'icon-shows',
560
- url: '/performances',
561
- description:
562
- "Watch the world's best drummers perform songs, duets, and other inspirational pieces. Sit back, relax, and get ready to be inspired by these amazing performances!",
563
- allowableFilters: ['difficulty', 'genre'],
564
- sortBy: '-published_on',
341
+ 'recent': {
342
+ name: 'Recent Lessons',
565
343
  tabs: [
566
- {
567
- name: 'Lessons',
568
- short_name: 'LESSONS',
569
- value: '',
570
- },
571
- {
572
- name: 'Instructors',
573
- short_name: 'INSTRUCTORS',
574
- is_group_by: true,
575
- value: 'instructor',
576
- },
577
- {
578
- name: 'Genres',
579
- short_name: 'Genres',
580
- is_group_by: true,
581
- value: 'genre',
582
- },
344
+ Tabs.RecentAll,
345
+ Tabs.RecentIncomplete,
346
+ Tabs.RecentCompleted
583
347
  ],
584
348
  },
585
- 'exploring-beats': {
586
- thumbnailUrl: 'https://dpwjbsxqtam5n.cloudfront.net/shows/exploring-beats.jpg',
587
- name: 'Exploring Beats',
588
- icon: 'icon-shows',
589
- description:
590
- "Join Carson and his extraterrestrial roommate Gary as they travel through time and space exploring some of earth's greatest hip-hop beats and delicious snacks.",
591
- allowableFilters: [],
592
- sortBy: 'sort',
593
- },
594
- sonor: {
595
- thumbnailUrl: 'https://dpwjbsxqtam5n.cloudfront.net/shows/sonor-drums.jpg',
596
- name: 'Sonor Drums: A Drumeo Documentary',
597
- shortname: 'Videos',
598
- icon: 'icon-shows',
599
- description:
600
- 'Take a closer look at Sonor Drums with Jared as he explores the Sonor Factory in Bad Berleburg Germany and interviews the people behind the amazing brand.',
601
- allowableFilters: [],
602
- sortBy: 'published_on',
603
- url: '/sonor-drums',
604
- },
605
- 'paiste-cymbals': {
606
- thumbnailUrl: 'https://dpwjbsxqtam5n.cloudfront.net/shows/paiste-cymbals.jpg',
607
- name: 'Paiste Cymbals: A Drumeo Documentary',
608
- shortname: 'Videos',
609
- icon: 'icon-shows',
610
- description:
611
- 'Take a closer look at Paiste Cymbals with Jared as he explores the Paiste factory in Switzerland and interviews the people behind the amazing brand.',
612
- allowableFilters: [],
613
- sortBy: 'published_on',
614
- },
615
- 'rhythms-from-another-planet': {
616
- thumbnailUrl: 'https://dpwjbsxqtam5n.cloudfront.net/shows/rythms-from-another-planet.jpg',
617
- name: 'Rhythms From Another Planet',
618
- shortname: 'Videos',
619
- icon: 'icon-shows',
620
- description:
621
- 'Flying Saucers Over Canada! Aliens from the Horsehead Nebula are here glitching humans! Aaron assembles an assortment of numerically nimble nerds to save the day! Tag along for the adventure, Glitchings, Quintuplet Panteradies, and save the world to learn some phenomenally fancy fives!',
622
- allowableFilters: [],
623
- sortBy: 'sort',
624
- },
625
- tama: {
626
- thumbnailUrl: 'https://dpwjbsxqtam5n.cloudfront.net/shows/tama-drums.jpg',
627
- name: 'Tama Drums',
628
- shortname: 'Episodes',
629
- icon: 'icon-shows',
630
- description:
631
- 'Take a closer look at Tama Drums with Jared as he explores the Tama factory in Japan, learns about Japanese Culture, experiments with traditional Taiko drummers, and interviews the people behind the amazing brand.',
632
- allowableFilters: [],
633
- sortBy: 'published_on',
634
- url: '/tama-drums',
635
- },
636
- 'question-and-answer': {
637
- thumbnailUrl: 'https://dpwjbsxqtam5n.cloudfront.net/shows/question-answer.jpg',
638
- shortname: 'Lessons',
639
- icon: 'icon-shows',
640
- description:
641
- 'Get any drum related question answered by a Drumeo instructor on our weekly Q&A episodes! You can submit as many questions as you like by clicking the button below, and either join us live for the next episode, or check for your answer in the archived videos below!',
642
- },
643
- 'student-collaboration': {
644
- thumbnailUrl: 'https://dpwjbsxqtam5n.cloudfront.net/shows/student-collaborations.jpg',
645
- name: 'Drumeo Monthly Collaborations',
646
- shortname: 'Collaborations',
647
- icon: 'icon-shows',
648
- description:
649
- 'Collaborate with the community with Drumeo Monthly Collaborations! Each month a new Play-Along is chosen and members are tasked to submit their videos playing along to the song. At the end of each month, every video is joined together to create a single performance!',
650
- allowableFilters: [],
651
- sortBy: '-published_on',
652
- url: '/student-collaborations',
653
- trailer1: {
654
- vimeo_video_id: 448684113,
655
- video_playback_endpoints: [
656
- {
657
- file: 'https://player.vimeo.com/progressive_redirect/playback/448684113/rendition/240p/file.mp4?loc=external&oauth2_token_id=1284792283&signature=7f75733de09ec3266322845bdd2dd9a0e740c916b9a824710d6272b8d51793ae',
658
- width: 426,
659
- height: 240,
660
- },
661
- {
662
- file: 'https://player.vimeo.com/progressive_redirect/playback/448684113/rendition/360p/file.mp4?loc=external&oauth2_token_id=1284792283&signature=c55155a36018e86d6f008d905075bb749f2ee5fb12989845a3d2e5a9c28141e6',
663
- width: 640,
664
- height: 360,
665
- },
666
- {
667
- file: 'https://player.vimeo.com/progressive_redirect/playback/448684113/rendition/540p/file.mp4?loc=external&oauth2_token_id=1284792283&signature=d71e1f8771e78e398c17ee0167611c1619ef11f90b0287b6dff1678279cb67a3',
668
- width: 960,
669
- height: 540,
670
- },
671
- {
672
- file: 'https://player.vimeo.com/progressive_redirect/playback/448684113/rendition/720p/file.mp4?loc=external&oauth2_token_id=1284792283&signature=538b5eec06dd01591f156a96c4108e217bd7ad8903e5084e8fb3428e0f8a69a6',
673
- width: 1280,
674
- height: 720,
675
- },
676
- {
677
- file: 'https://player.vimeo.com/progressive_redirect/playback/448684113/rendition/1080p/file.mp4?loc=external&oauth2_token_id=1284792283&signature=589537c220ca4c99e746a2d24e2dad8017da016d195485a17a2c8409b3ea8c60',
678
- width: 1920,
679
- height: 1080,
680
- },
681
- {
682
- file: 'https://player.vimeo.com/progressive_redirect/playback/448684113/rendition/1440p/file.mp4?loc=external&oauth2_token_id=1284792283&signature=dda9240afee2489dbedda42499d432ebc1454e5ff2bb615bf2af8b8a298d6044',
683
- width: 2560,
684
- height: 1440,
685
- },
686
- {
687
- file: 'https://player.vimeo.com/progressive_redirect/playback/448684113/rendition/2160p/file.mp4?loc=external&oauth2_token_id=1284792283&signature=92997d941ff58b9cf8e17d6cf8ec07b332bcf61138e8ea0805fba091501e0e7c',
688
- width: 3840,
689
- height: 2160,
690
- },
349
+ 'songs': {
350
+ name: 'Songs',
351
+ filterOptions: {
352
+ difficulty: DIFFICULTY_STRINGS,
353
+ style: [
354
+ 'Blues', 'Christian', 'Classical', 'Country', 'Disco', 'Electronic', 'Folk', 'Funk', 'Hip-Hop/Rap', 'Holiday', 'Jazz', 'Soundtrack',
355
+ 'World', 'Metal', 'Pop', 'R&B/Soul', 'Rock'
691
356
  ],
692
- length_in_seconds: 53,
693
- hlsManifestUrl:
694
- 'https://player.vimeo.com/external/448684113.m3u8?s=dfb6ad351fcc3f2e5d98c7e7fac7303fa2b0a416&oauth2_token_id=1284792283',
357
+ type: ['Tutorials', 'Transcriptions', 'Play Alongs', 'Jam Tracks'],
358
+ progress: PROGRESS_NAMES,
695
359
  },
696
- trailer2: {
697
- vimeo_video_id: 448684140,
698
- video_playback_endpoints: [
699
- {
700
- file: 'https://player.vimeo.com/progressive_redirect/playback/448684140/rendition/240p/file.mp4?loc=external&oauth2_token_id=1284792283&signature=1c9adb344eaf45a1f854a209e62616e19feea57516c37f5eb1f884cac928fb06',
701
- width: 426,
702
- height: 240,
703
- },
704
- {
705
- file: 'https://player.vimeo.com/progressive_redirect/playback/448684140/rendition/360p/file.mp4?loc=external&oauth2_token_id=1284792283&signature=cde9f4fb028217960e5a2612688d8d18550db81964f1bf21f003fced6b9f63dd',
706
- width: 640,
707
- height: 360,
708
- },
709
- {
710
- file: 'https://player.vimeo.com/progressive_redirect/playback/448684140/rendition/540p/file.mp4?loc=external&oauth2_token_id=1284792283&signature=eb870305e3c2719aad514b07026030d7738b5a107693794d0745574e5392fd12',
711
- width: 960,
712
- height: 540,
713
- },
714
- {
715
- file: 'https://player.vimeo.com/progressive_redirect/playback/448684140/rendition/720p/file.mp4?loc=external&oauth2_token_id=1284792283&signature=309527ab8047731ace6a103a24536f952a5dc3bd8be2c5c2529385cc2377f8f6',
716
- width: 1280,
717
- height: 720,
718
- },
719
- {
720
- file: 'https://player.vimeo.com/progressive_redirect/playback/448684140/rendition/1080p/file.mp4?loc=external&oauth2_token_id=1284792283&signature=f93e002d6d73facf146a3cdcb2d74d8b42677897282d0f89abb02871c664d6d4',
721
- width: 1920,
722
- height: 1080,
723
- },
724
- {
725
- file: 'https://player.vimeo.com/progressive_redirect/playback/448684140/rendition/1440p/file.mp4?loc=external&oauth2_token_id=1284792283&signature=4b83c2a73161532bbe36dfae5a1203aa4b6475c60554117533dcd303e76cb67b',
726
- width: 2560,
727
- height: 1440,
728
- },
729
- {
730
- file: 'https://player.vimeo.com/progressive_redirect/playback/448684140/rendition/2160p/file.mp4?loc=external&oauth2_token_id=1284792283&signature=3108a1db7e86bd133fe01fd4384980ffaa62e854af5588d94a7f8befb92db563',
731
- width: 3840,
732
- height: 2160,
733
- },
734
- ],
735
- length_in_seconds: 106,
736
- hlsManifestUrl:
737
- 'https://player.vimeo.com/external/448684140.m3u8?s=06db72bb51f3bc10cde8367452c3cb19ed8834b2&oauth2_token_id=1284792283',
360
+ sortingOptions: {
361
+ title: 'Sort By',
362
+ type: 'radio',
363
+ items: SortingOptions.AllSortingOptions,
738
364
  },
739
- },
740
- 'diy-drum-experiment': {
741
- thumbnailUrl: 'https://dpwjbsxqtam5n.cloudfront.net/shows/diy-drum-experiments.jpg',
742
- name: 'DIY Drum Experiments',
743
- shortname: 'Episodes',
744
- icon: 'icon-shows',
745
- description:
746
- 'Step into David Raouf’s workshop where he will show you how to repurpose old and broken drum gear into usable and functional items! Whether you are a handyman or not, this show will give you unique and creative ideas and drum hacks that you have never seen before!',
747
- allowableFilters: [],
748
- sortBy: 'sort',
749
- url: '/diy-drum-experiments',
750
- },
751
- 'rhythmic-adventures-of-captain-carson': {
752
- thumbnailUrl: 'https://dpwjbsxqtam5n.cloudfront.net/shows/raocc-showcard.jpg',
753
- name: 'Rhythmic Adventures of Captain Carson',
754
- shortname: 'Episodes',
755
- icon: 'icon-shows',
756
- description:
757
- 'In The Rhythmic Adventures of Captain Carson, kids will join Captain Carson and his best friends Ricky (the robot) and Gary (the alien) as they fly through space and learn fun musical grooves. But they’ve got to be quick, because the tricky Groove Troll is trying to steal their groove!',
758
- allowableFilters: [],
759
- sortBy: 'sort',
760
- },
761
- 'in-rhythm': {
762
- thumbnailUrl: 'https://dpwjbsxqtam5n.cloudfront.net/shows/in-rhythm-show-card.jpg',
763
- name: 'In Rhythm',
764
- shortname: 'Episodes',
765
- icon: 'icon-shows',
766
- description:
767
- 'Witness a day in the life of a professional touring drummer on the road! “In Rhythm” gives you an inside look into professional drummers, what they do on the road outside of performing, and how they warm-up and prepare for the big stage!',
768
- allowableFilters: [],
769
- sortBy: 'sort',
770
- },
771
- 'backstage-secret': {
772
- thumbnailUrl:
773
- 'https://www.musora.com/musora-cdn/image/width=500,height=500,quality=95,fit=cover/https://d1923uyy6spedc.cloudfront.net/RushDoc-Neil-02.jpg',
774
- name: 'Backstage Secrets',
775
- shortname: 'Episodes',
776
- icon: 'icon-shows',
777
- description:
778
- "Join the roadies of Rush and get a firsthand look at what it's like to be part of one of our favorite bands. You’re going on an exciting, behind-the-scenes journey to their 2008 Snakes & Arrows Concert Tour - an exclusive invitation to witness the reveal of all of the band’s backstage secrets. Roadies are the unsung heroes of any band - and being a roadie with a top-rated, world-famous rock and roll band is a highly coveted job. It may appear to be all glamour and adventure, but it can be a grueling marathon of 18-hour workdays!",
779
- allowableFilters: [],
780
- sortBy: 'sort',
781
- url: '/backstage-secrets',
782
- },
783
- 'the-history-of-electronic-drums': {
784
- thumbnailUrl:
785
- 'https://imagedelivery.net/0Hon__GSkIjm-B_W77SWCA/31847ba4-02d4-4c6a-4507-32b40284a000/width=500,height=500,quality=95,fit=cover',
786
- name: 'The History Of Electronic Drums',
787
- shortname: 'Episodes',
788
- icon: 'icon-shows',
789
- description:
790
- 'The music industry is dominated by electronic music and electronic drums. For the first time ever, we’ve gathered 14 of the most innovative electronic drum kits to learn more about how they were made, how they work, and most importantly, how they sound.',
791
- allowableFilters: [],
792
- sortBy: 'sort',
793
- amountOfFutureLessonsToShow: 10,
794
- showFutureLessonAtTopOrBottom: 'bottom',
795
- },
796
- 'drum-fest-international-2022': {
797
- thumbnailUrl:
798
- 'https://musora.com/cdn-cgi/imagedelivery/0Hon__GSkIjm-B_W77SWCA/2c12c9ae-5a67-4767-f257-d1fa3693bd00/public',
799
- name: '2022 Drum Fest International',
800
- shortname: 'Episodes',
801
- icon: 'icon-shows',
802
- description:
803
- 'In 2022, Drumeo had the exclusive honor of filming Ralph Angelillo’s Drum Fest International. It was an incredible gathering of some of the best drummers in the world. Tune in to see a spectrum of unforgettable performances - from Greyson Nekrutman’s show-stopping jazz, to Simon Phillips’ fancy fusion work, these are videos you do not want to miss.',
804
- allowableFilters: [],
805
- sortBy: 'sort',
806
- },
807
- spotlight: {
808
- thumbnailUrl:
809
- 'https://imagedelivery.net/0Hon__GSkIjm-B_W77SWCA/0b67bd7f-220f-41f3-1797-8c6883a00a00/width=500,height=500,quality=95,fit=cover',
810
- name: 'Spotlight',
811
- shortname: 'Spotlight',
812
- icon: 'icon-shows',
813
- description:
814
- "We're standing on the shoulders of giants. Those who came before us paved the way for everyone who came after by developing most of what we take for granted today, in the world of drum-set playing. Learning about these giants and their contributions to our craft is essential to fully appreciate and understand what we do as musicians. This is the journey Todd Sucherman is inviting you to take on with him, as he navigates the incredible world of Spotlight.",
815
- allowableFilters: [],
816
- sortBy: 'sort',
817
365
  tabs: [
818
- {
819
- name: 'All Spotlights',
820
- short_name: 'ALL',
821
- value: '',
822
- },
366
+ Tabs.ForYou,
367
+ Tabs.Tutorials,
368
+ Tabs.Transcriptions,
369
+ Tabs.PlayAlongs,
370
+ Tabs.ExploreAll
823
371
  ],
824
372
  },
825
- 'play-along': {
826
- name: 'Play Alongs',
827
- icon: 'icon-play-alongs',
828
- description:
829
- 'Add your drumming to high-quality drumless play-along tracks - with handy playback tools to help you create the perfect performance.',
830
- allowableFilters: ['difficulty', 'genre', 'bpm'],
831
- tabs: [
832
- {
833
- name: 'All Play-Alongs',
834
- short_name: 'ALL',
835
- value: '',
836
- },
837
- ],
838
- },
839
- pack: {
840
- allowableFilters: ['difficulty', 'genre', 'essential', 'theory', 'lifestyle'],
841
- },
842
- 'odd-times': {
843
- thumbnailUrl:
844
- 'https://musora.com/cdn-cgi/imagedelivery/0Hon__GSkIjm-B_W77SWCA/1bf6fc7a-d1a5-4934-d322-b9f6da454000/public',
845
- name: 'Odd Times With Aaron Edgar',
846
- shortname: 'Episodes',
847
- icon: 'icon-shows',
848
- allowableFilters: [],
849
- sortBy: 'sort',
850
- },
851
373
  },
852
374
  pianote: {
853
- instructor: {
854
- description:
855
- 'Your piano journey is unique. You need personalized coaching that helps you reach your goals. Learn from some of the best pianists in the world!',
856
- },
857
- song: {
858
- thumbnailUrl: 'https://dpwjbsxqtam5n.cloudfront.net/shows/pianote/songs.jpg',
859
- shortname: 'songs',
860
- amountOfFutureLessonsToShow: 3,
861
- showFutureLessonAtTopOrBottom: 'bottom',
862
- sortBy: '-published_on',
863
- },
864
- course: {
865
- thumbnailUrl: 'https://dpwjbsxqtam5n.cloudfront.net/shows/pianote/courses.jpg',
866
- sortBy: '-published_on',
867
- shortname: 'Courses',
868
- icon: 'icon-courses',
869
- description:
870
- "Tackle your next piano goal with bite-sized courses from many of the world's best pianists.",
871
- amountOfFutureLessonsToShow: 3,
872
- showFutureLessonAtTopOrBottom: 'bottom',
873
- },
874
- 'quick-tips': {
875
- thumbnailUrl:
876
- 'https://imagedelivery.net/0Hon__GSkIjm-B_W77SWCA/7979495d-d06a-4f78-161f-2f670f6f9800/public',
877
- shortname: 'Quick Tips',
878
- icon: 'fa-lightbulb',
879
- amountOfFutureLessonsToShow: 3,
880
- showFutureLessonAtTopOrBottom: 'bottom',
881
- },
882
- 'student-review': {
883
- thumbnailUrl: 'https://dpwjbsxqtam5n.cloudfront.net/shows/pianote/student-review.jpg',
884
- shortname: 'Student Reviews',
885
- description:
886
- 'Want feedback on your playing? Submit a video for student review. We will watch your submission and then provide helpful encouragement and feedback. This is a great way to build accountability and benefit from the expertise of our teachers.',
887
- amountOfFutureLessonsToShow: 3,
888
- showFutureLessonAtTopOrBottom: 'bottom',
889
- },
890
- 'question-and-answer': {
891
- thumbnailUrl: 'https://dpwjbsxqtam5n.cloudfront.net/shows/pianote/question-answer.jpg',
892
- shortname: 'Q&A',
893
- icon: 'icon-student-focus',
894
- description:
895
- 'Each week we go live to answer your questions. Submit your questions in advance using the button below, in the Q&A thread in the forums, or live in the community chat.',
896
- amountOfFutureLessonsToShow: 3,
897
- showFutureLessonAtTopOrBottom: 'bottom',
898
- tabs: [
899
- {
900
- name: 'Lessons',
901
- short_name: 'LESSONS',
902
- value: '',
903
- },
904
- {
905
- name: 'Instructors',
906
- short_name: 'INSTRUCTORS',
907
- is_group_by: true,
908
- value: 'instructor',
909
- },
910
- {
911
- name: 'Genres',
912
- short_name: 'Genres',
913
- is_group_by: true,
914
- value: 'genre',
915
- },
916
- ],
917
- },
918
- 'boot-camp': {
919
- thumbnailUrl: 'https://dpwjbsxqtam5n.cloudfront.net/shows/pianote/bootcamps.jpg',
920
- name: 'Bootcamps',
921
- allowableFilters: ['difficulty', 'genre', 'essential'],
922
- sortBy: '-published_on',
923
- shortname: 'Bootcamps',
924
- url: '/boot-camps',
925
- icon: 'icon-chords-scales-icon',
926
- description:
927
- 'These bootcamps deliver results, but they also require commitment. Select a topic that you want to become an expert in, and get ready to learn!',
928
- amountOfFutureLessonsToShow: 3,
929
- showFutureLessonAtTopOrBottom: 'bottom',
930
- tabs: [
931
- {
932
- name: 'Lessons',
933
- short_name: 'LESSONS',
934
- value: '',
935
- },
936
- {
937
- name: 'Instructors',
938
- short_name: 'INSTRUCTORS',
939
- is_group_by: true,
940
- value: 'instructor',
941
- },
942
- {
943
- name: 'Genres',
944
- short_name: 'Genres',
945
- is_group_by: true,
946
- value: 'genre',
947
- },
948
- ],
949
- },
950
- podcast: {
951
- thumbnailUrl: 'https://dpwjbsxqtam5n.cloudfront.net/shows/pianote/podcast.png',
952
- name: 'The Pianote Podcast',
953
- allowableFilters: ['difficulty', 'genre'],
954
- sortBy: '-published_on',
955
- shortname: 'Podcast',
956
- icon: 'icon-podcast',
957
- url: '/podcasts',
958
- description:
959
- 'Join Lisa in her quest to unify piano players around the world, build community, and make playing the piano cool!',
960
- amountOfFutureLessonsToShow: 3,
961
- showFutureLessonAtTopOrBottom: 'bottom',
375
+ 'lessons': {
376
+ name: 'Lessons',
377
+ filterOptions: {
378
+ difficulty: DIFFICULTY_STRINGS,
379
+ style: ['Classical', 'Country/Folk', 'Funk/Disco', 'Hip-Hop/Rap/EDM', 'Holiday/Soundtrack', 'Jazz/Blues', 'Latin/World', 'Pop/Rock', 'R&B/Soul', 'Worship/Gospel'],
380
+ type: ['Single Lessons', 'Practice Alongs', 'Performances', 'Courses', 'Shows', 'Documentaries', 'Live Archives', 'Student Archives'],
381
+ progress: PROGRESS_NAMES,
382
+ },
962
383
  tabs: [
963
- {
964
- name: 'Lessons',
965
- short_name: 'LESSONS',
966
- value: '',
967
- },
968
- {
969
- name: 'Instructors',
970
- short_name: 'INSTRUCTORS',
971
- is_group_by: true,
972
- value: 'instructor',
973
- },
974
- {
975
- name: 'Genres',
976
- short_name: 'Genres',
977
- is_group_by: true,
978
- value: 'genre',
979
- },
384
+ Tabs.ForYou,
385
+ Tabs.Individuals,
386
+ Tabs.Collections,
387
+ Tabs.ExploreAll
980
388
  ],
981
389
  },
982
- 'song-tutorial': {
983
- name: 'Song Tutorials',
984
- thumbnailUrl: 'https://dpwjbsxqtam5n.cloudfront.net/shows/pianote/songs.jpg',
985
- allowableFilters: ['difficulty', 'genre'],
986
- sortBy: '-published_on',
987
- shortname: 'song tutorials',
988
- icon: 'play-progress',
989
- description: '',
990
- amountOfFutureLessonsToShow: 3,
991
- showFutureLessonAtTopOrBottom: 'bottom',
390
+ 'songs': {
391
+ name: 'Songs',
392
+ filterOptions: {
393
+ difficulty: DIFFICULTY_STRINGS,
394
+ style: [
395
+ 'Blues', 'Christian', 'Classical', 'Country', 'Disco', 'Electronic', 'Folk', 'Funk', 'Hip-Hop/Rap', 'Holiday', 'Jazz', 'Soundtrack',
396
+ 'World', 'Metal', 'Pop', 'R&B/Soul', 'Rock'
397
+ ],
398
+ type: ['Tutorials', 'Sheet Music', 'Play Alongs', 'Jam Tracks'],
399
+ progress: PROGRESS_NAMES,
400
+ },
401
+ sortingOptions: {
402
+ title: 'Sort By',
403
+ type: 'radio',
404
+ items: SortingOptions.AllSortingOptions,
405
+ },
992
406
  tabs: [
993
- {
994
- name: 'Lessons',
995
- short_name: 'Lessons',
996
- value: '',
997
- },
998
- {
999
- name: 'Artists',
1000
- short_name: 'ARTISTS',
1001
- is_group_by: true,
1002
- value: 'artist',
1003
- },
1004
- {
1005
- name: 'Genres',
1006
- short_name: 'Genres',
1007
- is_group_by: true,
1008
- value: 'genre',
1009
- },
407
+ Tabs.ForYou,
408
+ Tabs.Tutorials,
409
+ Tabs.Transcriptions,
410
+ Tabs.PlayAlongs,
411
+ Tabs.ExploreAll
1010
412
  ],
1011
413
  },
1012
414
  },
1013
415
  guitareo: {
1014
416
  instructor: {
1015
417
  description:
1016
- "Tackle your next guitar goal with bite-sized courses from many of the world's best guitarists.",
1017
- },
1018
- course: {
1019
- description:
1020
- 'These jam-packed training courses cover various lesson topics in detail. Find one that suits your guitar goals, and get started!',
1021
- },
1022
- challenge: {
1023
- tabs: [
1024
- {
1025
- name: 'All',
1026
- short_name: 'All',
1027
- value: '',
1028
- },
1029
- {
1030
- name: 'Completed',
1031
- short_name: 'COMPLETED',
1032
- value: 'completed',
1033
- },
1034
- {
1035
- name: 'Owned Challenges',
1036
- short_name: 'OWNED CHALLENGES',
1037
- value: 'owned',
1038
- },
1039
- ],
1040
- },
1041
- song: {
1042
- allowableFilters: ['difficulty', 'genre', 'lifestyle', 'instrumentless'],
1043
- },
1044
- 'song-tutorial': {
1045
- name: 'Song Tutorials',
1046
- thumbnailUrl: 'https://dpwjbsxqtam5n.cloudfront.net/shows/pianote/songs.jpg',
1047
- allowableFilters: ['difficulty', 'genre'],
1048
- sortBy: '-published_on',
1049
- shortname: 'song tutorials',
1050
- icon: 'play-progress',
1051
- description: '',
1052
- amountOfFutureLessonsToShow: 3,
1053
- showFutureLessonAtTopOrBottom: 'bottom',
1054
- tabs: [
1055
- {
1056
- name: 'Lessons',
1057
- short_name: 'Lessons',
1058
- value: '',
1059
- },
1060
- {
1061
- name: 'Artists',
1062
- short_name: 'ARTISTS',
1063
- is_group_by: true,
1064
- value: 'artist',
1065
- },
1066
- {
1067
- name: 'Genres',
1068
- short_name: 'Genres',
1069
- is_group_by: true,
1070
- value: 'genre',
1071
- },
1072
- ],
1073
- },
1074
- 'play-along': {
1075
- name: 'Play Alongs',
1076
- icon: 'icon-play-alongs',
1077
- description:
1078
- 'Our play-along feature teaches you chords, strumming patterns, riffs, and song layouts -- with handy playback tools to help you create the perfect performance.',
1079
- allowableFilters: ['difficulty', 'genre', 'essential', 'theory', 'lifestyle'],
1080
- tabs: [
1081
- {
1082
- name: 'All Play-Alongs',
1083
- short_name: 'ALL',
1084
- value: '',
1085
- },
1086
- ],
418
+ 'Tackle your next guitar goal with bite-sized courses from many of the world\'s best guitarists.',
1087
419
  },
1088
420
  recording: {
1089
421
  name: 'Archives',
1090
422
  shortname: 'Lessons',
1091
423
  icon: 'icon-library',
1092
424
  description:
1093
- 'Miss a live event or just want to watch a particular episode again? This is the place to do it. All of the Guitareo live broadcasts are archived here for you to watch at your leisure. If you have any questions or want to discuss the topics mentioned in the videos you can always post in the forum.',
425
+ 'Miss a live event or just want to watch a particular episode again? This is the place to do it. All of the Guitareo live broadcasts are archived here for you to watch at your leisure. If you have any questions or want to discuss the topics mentioned in the videos you can always post in the forum.',
1094
426
  allowableFilters: ['difficulty', 'genre'],
1095
427
  tabs: [
1096
- {
1097
- name: 'Lessons',
1098
- short_name: 'LESSONS',
1099
- value: '',
1100
- },
1101
- {
1102
- name: 'Instructors',
1103
- short_name: 'INSTRUCTORS',
1104
- is_group_by: true,
1105
- value: 'instructor',
1106
- },
1107
- {
1108
- name: 'Genres',
1109
- short_name: 'Genres',
1110
- is_group_by: true,
1111
- value: 'genre',
1112
- },
428
+ Tabs.Lessons,
429
+ Tabs.Instructors,
430
+ Tabs.Genres,
1113
431
  ],
1114
432
  },
1115
- 'quick-tips': {
1116
- thumbnailUrl:
1117
- 'https://imagedelivery.net/0Hon__GSkIjm-B_W77SWCA/297dc5b4-e878-4238-d5b5-ed0588ee0b00/public',
1118
- shortname: 'quick-tips',
1119
- icon: 'icon-shows',
1120
- allowableFilters: ['difficulty', 'genre', 'essential', 'theory', 'lifestyle'],
1121
- },
1122
- 'question-and-answer': {
1123
- thumbnailUrl: 'https://d1923uyy6spedc.cloudfront.net/question-answer-singeo.png',
1124
- icon: 'fas fa-question-circle',
1125
- description:
1126
- 'Each week we go live to answer your questions. Submit your questions in advance using the button below, in the Q&A thread in the forums, or live in the community chat.',
1127
- allowableFilters: ['difficulty', 'genre', 'essential', 'theory'],
1128
- },
1129
- 'student-review': {
1130
- thumbnailUrl: 'https://d1923uyy6spedc.cloudfront.net/student-reviews-singeo.png',
1131
- description:
1132
- 'Want feedback on your playing? Submit a video for student review. We will watch your submission and then provide helpful encouragement and feedback. This is a great way to build accountability and benefit from the expertise of our teachers.',
1133
- },
1134
- },
1135
- singeo: {
1136
- instructor: {
1137
- description:
1138
- 'Your singing journey is unique. You need personalized coaching that helps you reach your goals. Learn from some of the best singers and vocal coaches in the world!',
1139
- },
1140
- course: {
1141
- description:
1142
- "Tackle your next singing goal with bite-sized courses from many of the world's best vocalists.",
1143
- },
1144
- 'quick-tips': {
1145
- thumbnailUrl:
1146
- 'https://imagedelivery.net/0Hon__GSkIjm-B_W77SWCA/8464033e-9b4e-458e-d613-e89fb47e2a00/public',
1147
- icon: 'icon-shows',
1148
- },
1149
- challenge: {
1150
- tabs: [
1151
- {
1152
- name: 'All',
1153
- short_name: 'All',
1154
- value: '',
1155
- },
1156
- {
1157
- name: 'Completed',
1158
- short_name: 'COMPLETED',
1159
- value: 'completed',
1160
- },
1161
- {
1162
- name: 'Owned Challenges',
1163
- short_name: 'OWNED CHALLENGES',
1164
- value: 'owned',
1165
- },
1166
- ],
1167
- },
1168
- 'question-and-answer': {
1169
- thumbnailUrl: 'https://d1923uyy6spedc.cloudfront.net/question-answer.png',
1170
- icon: 'fas fa-question-circle',
433
+ 'songs': {
434
+ name: 'Songs',
435
+ filterOptions: {
436
+ difficulty: DIFFICULTY_STRINGS,
437
+ style: [
438
+ 'Blues', 'Christian', 'Classical', 'Country', 'Disco', 'Electronic', 'Folk', 'Funk', 'Hip-Hop/Rap', 'Holiday', 'Jazz', 'Soundtrack',
439
+ 'World', 'Metal', 'Pop', 'R&B/Soul', 'Rock'
440
+ ],
441
+ type: ['Tutorials', 'Tabs', 'Play Alongs', 'Jam Tracks'],
442
+ progress: PROGRESS_NAMES,
443
+ },
444
+ sortingOptions: {
445
+ title: 'Sort By',
446
+ type: 'radio',
447
+ items: SortingOptions.AllSortingOptions,
448
+ },
1171
449
  tabs: [
1172
- {
1173
- name: 'Lessons',
1174
- short_name: 'LESSONS',
1175
- value: '',
1176
- },
1177
- {
1178
- name: 'Instructors',
1179
- short_name: 'INSTRUCTORS',
1180
- is_group_by: true,
1181
- value: 'instructor',
1182
- },
1183
- {
1184
- name: 'Genres',
1185
- short_name: 'Genres',
1186
- is_group_by: true,
1187
- value: 'genre',
1188
- },
450
+ Tabs.ForYou,
451
+ Tabs.Tutorials,
452
+ Tabs.Transcriptions,
453
+ Tabs.PlayAlongs,
454
+ Tabs.ExploreAll
1189
455
  ],
1190
456
  },
457
+ },
458
+ singeo: {
1191
459
  'student-review': {
1192
460
  thumbnailUrl: 'https://d1923uyy6spedc.cloudfront.net/student-reviews.png',
1193
461
  icon: 'icon-student-focus',
1194
462
  description:
1195
- 'Want feedback on your singing? Submit a video for student review. We will watch your submission and then provide helpful encouragement and feedback. This is a great way to build accountability and benefit from the expertise of our teachers.',
463
+ 'Want feedback on your singing? Submit a video for student review. We will watch your submission and then provide helpful encouragement and feedback. This is a great way to build accountability and benefit from the expertise of our teachers.',
1196
464
  },
1197
- 'song-tutorial': {
1198
- name: 'Song Tutorials',
1199
- thumbnailUrl: 'https://dpwjbsxqtam5n.cloudfront.net/shows/pianote/songs.jpg',
1200
- allowableFilters: ['difficulty', 'genre'],
1201
- sortBy: '-published_on',
1202
- shortname: 'song tutorials',
1203
- icon: 'play-progress',
1204
- description: '',
1205
- amountOfFutureLessonsToShow: 3,
1206
- showFutureLessonAtTopOrBottom: 'bottom',
1207
- tabs: [
1208
- {
1209
- name: 'Lessons',
1210
- short_name: 'Lessons',
1211
- value: '',
1212
- },
1213
- {
1214
- name: 'Artists',
1215
- short_name: 'ARTISTS',
1216
- is_group_by: true,
1217
- value: 'artist',
1218
- },
1219
- {
1220
- name: 'Genres',
1221
- short_name: 'Genres',
1222
- is_group_by: true,
1223
- value: 'genre',
1224
- },
1225
- ],
1226
- },
1227
- routine: {
1228
- name: 'Routines',
1229
- icon: 'icon-shows',
1230
- description:
1231
- 'Warm up your voice for any occasion with our bite-sized routines - ranging from 5 to 20 minutes - perfect for busy days or when you need motivation.',
1232
- allowableFilters: ['difficulty', 'genre', 'type'],
1233
- tabs: [
1234
- {
1235
- name: 'All Routines',
1236
- short_name: 'ALL ROUTINES',
1237
- value: '',
1238
- },
1239
- ],
1240
- trailer: {
1241
- vimeo_video_id: 578243377,
1242
- video_playback_endpoints: [
1243
- {
1244
- file: 'https://player.vimeo.com/progressive_redirect/playback/578243377/rendition/360p/file.mp4?loc=external&oauth2_token_id=1284792283&signature=9eff053636a9b8abc19a0e44ae437f7fa50a0cf0a83c39373e8ae29b50dff9b6',
1245
- width: 640,
1246
- height: 360,
1247
- },
1248
- {
1249
- file: 'https://player.vimeo.com/progressive_redirect/playback/578243377/rendition/540p/file.mp4?loc=external&oauth2_token_id=1284792283&signature=f8a01157cd5707e6ade5f84a867edbd4f549f091c6c284c5352ec290b9db7bf7',
1250
- width: 960,
1251
- height: 540,
1252
- },
1253
- {
1254
- file: 'https://player.vimeo.com/progressive_redirect/playback/578243377/rendition/720p/file.mp4?loc=external&oauth2_token_id=1284792283&signature=8ccd1473aae48a510d44d38df2312a72c254e210e230f79cc0c3efae7b82f6b6',
1255
- width: 1280,
1256
- height: 720,
1257
- },
1258
- {
1259
- file: 'https://player.vimeo.com/progressive_redirect/playback/578243377/rendition/1080p/file.mp4?loc=external&oauth2_token_id=1284792283&signature=a3b326c9c79746ddf4915133220f70e4f9498e5fb089ebba0361583d2a55376d',
1260
- width: 1920,
1261
- height: 1080,
1262
- },
1263
- {
1264
- file: 'https://player.vimeo.com/progressive_redirect/playback/578243377/rendition/1440p/file.mp4?loc=external&oauth2_token_id=1284792283&signature=c0309249419ce7f80d9bbc89c63851fbb194e623fca6046b7e685611627eceac',
1265
- width: 2560,
1266
- height: 1440,
1267
- },
1268
- {
1269
- file: 'https://player.vimeo.com/progressive_redirect/playback/578243377/rendition/2160p/file.mp4?loc=external&oauth2_token_id=1284792283&signature=6ea971d1165f0f1df7af46ccdc33041a70e917028d1c1cd7af4279edd2ef9550',
1270
- width: 3840,
1271
- height: 2160,
1272
- },
465
+ 'songs': {
466
+ name: 'Songs',
467
+ filterOptions: {
468
+ difficulty: DIFFICULTY_STRINGS,
469
+ style: [
470
+ 'Blues', 'Christian', 'Classical', 'Country', 'Disco', 'Electronic', 'Folk', 'Funk', 'Hip-Hop/Rap', 'Holiday', 'Jazz', 'Soundtrack',
471
+ 'World', 'Metal', 'Pop', 'R&B/Soul', 'Rock'
1273
472
  ],
1274
- length_in_seconds: 82,
1275
- hlsManifestUrl:
1276
- 'https://player.vimeo.com/external/578243377.m3u8?s=3def726f48a4a300420f793090e4913a48c8d1f9&oauth2_token_id=1284792283',
473
+ type: ['Tutorials', 'Sheet Music', 'Play Alongs', 'Jam Tracks'],
474
+ progress: PROGRESS_NAMES,
475
+ },
476
+ sortingOptions: {
477
+ title: 'Sort By',
478
+ type: 'radio',
479
+ items: SortingOptions.AllSortingOptions,
1277
480
  },
1278
- },
1279
- workout: {
1280
- name: 'Workouts',
1281
- shortname: 'Workouts',
1282
481
  tabs: [
1283
- {
1284
- name: 'All',
1285
- short_name: 'ALL',
1286
- value: '',
1287
- },
1288
- {
1289
- name: '5 Minutes',
1290
- short_name: '5 MINS',
1291
- is_required_field: true,
1292
- value: 'length_in_seconds,-450',
1293
- value_web: ['length_in_seconds < 450'],
1294
- },
1295
- {
1296
- name: '10 Minutes',
1297
- short_name: '10 MINS',
1298
- is_required_field: true,
1299
- value: 'length_in_seconds,450-750',
1300
- value_web: ['length_in_seconds > 451', 'length_in_seconds < 751'],
1301
- },
1302
- {
1303
- name: 'Instructors',
1304
- short_name: 'INSTRUCTORS',
1305
- is_group_by: true,
1306
- value: 'instructor',
1307
- },
482
+ Tabs.ForYou,
483
+ Tabs.Tutorials,
484
+ Tabs.Transcriptions,
485
+ Tabs.PlayAlongs,
486
+ Tabs.ExploreAll
1308
487
  ],
1309
488
  },
1310
- },
489
+ }
1311
490
  }
1312
491
 
1313
492
  export const typeWithSortOrder = [
@@ -1315,6 +494,7 @@ export const typeWithSortOrder = [
1315
494
  'diy-drum-experiments',
1316
495
  'rhythmic-adventures-of-captain-carson',
1317
496
  ]
497
+
1318
498
  export function processMetadata(brand, type, withFilters = false) {
1319
499
  let brandMetaData = contentMetadata[brand]?.[type]
1320
500
  // If the type is explicitly defined as null or the brand doesn't exist return null
@@ -1333,9 +513,15 @@ export function processMetadata(brand, type, withFilters = false) {
1333
513
  name: brandMetaData.name || null,
1334
514
  description: brandMetaData.description || null,
1335
515
  url: brandMetaData.url ? brand + brandMetaData.url : brand + '/' + type,
516
+ sort: brandMetaData.sortingOptions || null,
517
+ tabs: brandMetaData.tabs || [],
1336
518
  }
1337
519
 
1338
- if (withFilters) {
520
+ if (withFilters && brandMetaData.filterOptions) {
521
+ processedData.filters = transformFilters(brandMetaData.filterOptions)
522
+ }
523
+
524
+ if (withFilters && !brandMetaData.filterOptions) {
1339
525
  Object.keys(brandMetaData).forEach((key) => {
1340
526
  if (!['thumbnailUrl', 'name', 'description'].includes(key)) {
1341
527
  processedData[key] = brandMetaData[key]
@@ -1345,3 +531,36 @@ export function processMetadata(brand, type, withFilters = false) {
1345
531
 
1346
532
  return processedData
1347
533
  }
534
+
535
+ /**
536
+ * Defines the filter types for each key
537
+ */
538
+ const filterTypes = {
539
+ difficulty: 'checkbox',
540
+ genre: 'checkbox',
541
+ topic: 'checkbox',
542
+ type: 'checkbox',
543
+ progress: 'radio',
544
+ }
545
+
546
+ /**
547
+ * Transforms filterOptions into the required format
548
+ */
549
+ function transformFilters(filterOptions) {
550
+ return Object.entries(filterOptions).map(([key, values]) => ({
551
+ title: capitalizeFirstLetter(key),
552
+ type: filterTypes[key] || 'checkbox',
553
+ key,
554
+ items: values.map(value => ({
555
+ name: value,
556
+ value: `${key},${key === 'progress' ? value.toLowerCase() : value}`,
557
+ })),
558
+ }))
559
+ }
560
+
561
+ /**
562
+ * Capitalizes the first letter of a string
563
+ */
564
+ export function capitalizeFirstLetter(string) {
565
+ return string.charAt(0).toUpperCase() + string.slice(1)
566
+ }