musora-content-services 2.167.1 → 2.167.3

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 (136) hide show
  1. package/.agent/decisions/2026-07-17-onboarding-statuses.md +21 -0
  2. package/.agent/decisions/2026-07-20-mu2-1724-songs-lessons-counts.md +33 -0
  3. package/.agent/decisions/2026-07-20-query-builder-tostring.md +37 -0
  4. package/CHANGELOG.md +15 -0
  5. package/package.json +2 -1
  6. package/src/contentTypeConfig.js +2 -0
  7. package/src/index.d.ts +2 -0
  8. package/src/index.js +2 -0
  9. package/src/lib/sanity/query.ts +5 -0
  10. package/src/services/config.js +15 -0
  11. package/src/services/content/artist.ts +1 -3
  12. package/src/services/content/counts.ts +47 -0
  13. package/src/services/content/genre.ts +1 -3
  14. package/src/services/content/instructor.ts +1 -3
  15. package/src/services/contentProgress.js +1 -1
  16. package/src/services/eventsAPI.js +49 -7
  17. package/src/services/user/onboarding.ts +22 -0
  18. package/src/services/userActivity.js +2 -0
  19. package/src/version-info.js +1 -0
  20. package/.claude/settings.local.json +0 -52
  21. package/test/initializeTests.js +0 -60
  22. package/test/integration/awards/award-exclusion-handling.test.ts +0 -275
  23. package/test/integration/awards/internal/image-utils.test.ts +0 -86
  24. package/test/integration/content-progress/__mocks__/mocks.ts +0 -104
  25. package/test/integration/content-progress/contentProgress.test.ts +0 -335
  26. package/test/integration/content-progress/e2eOfflineProgress.test.ts +0 -352
  27. package/test/integration/content-progress/e2eProgress.test.ts +0 -612
  28. package/test/integration/content-progress/getters.test.ts +0 -334
  29. package/test/integration/content-progress/helpers.test.ts +0 -263
  30. package/test/integration/content-progress/offlineContentProgress.test.ts +0 -226
  31. package/test/integration/forums.test.ts +0 -209
  32. package/test/integration/infrastructure/FetchRequestExecutor.test.ts +0 -88
  33. package/test/integration/initializeTestDB.ts +0 -80
  34. package/test/integration/learning-paths.test.ts +0 -854
  35. package/test/integration/notifications.test.ts +0 -178
  36. package/test/integration/progress-row/content-card.test.ts +0 -283
  37. package/test/integration/sync/adapters/idb-errors.test.ts +0 -144
  38. package/test/integration/sync/adapters/sqlite-errors.test.ts +0 -173
  39. package/test/integration/sync/fetch.test.ts +0 -224
  40. package/test/integration/sync/repositories/content-likes.test.ts +0 -99
  41. package/test/integration/sync/repositories/practices.test.ts +0 -179
  42. package/test/integration/sync/repositories/progress.test.ts +0 -245
  43. package/test/integration/sync/repositories/user-award-progress.static.test.ts +0 -68
  44. package/test/integration/sync/repositories/user-award-progress.test.ts +0 -387
  45. package/test/integration/sync/store/cross-user-protection.test.ts +0 -217
  46. package/test/integration/sync/store/store-idb.test.ts +0 -180
  47. package/test/integration/sync/store/store.test.ts +0 -361
  48. package/test/integration/user/permissions.test.js +0 -20
  49. package/test/integration/userActivity.test.ts +0 -102
  50. package/test/live/README.md +0 -29
  51. package/test/live/content.test.js +0 -116
  52. package/test/localStorageMock.js +0 -21
  53. package/test/log.js +0 -5
  54. package/test/mockData/award-definitions.js +0 -171
  55. package/test/mockData/mockData_fetchByRailContentIds_one_content.json +0 -35
  56. package/test/mockData/mockData_progress_content.json +0 -182
  57. package/test/mockData/mockData_sanity_progress_content.json +0 -1451
  58. package/test/mockData/mockData_user_practices.json +0 -9
  59. package/test/setupConsole.js +0 -6
  60. package/test/setupNetworkGuard.js +0 -3
  61. package/test/setupTimers.js +0 -13
  62. package/test/unit/HttpClient.test.ts +0 -267
  63. package/test/unit/awards/award-alacarte-observer.test.ts +0 -199
  64. package/test/unit/awards/award-auto-refresh.test.ts +0 -84
  65. package/test/unit/awards/award-calculations.test.ts +0 -34
  66. package/test/unit/awards/award-callbacks.test.ts +0 -144
  67. package/test/unit/awards/award-certificate-display.test.ts +0 -330
  68. package/test/unit/awards/award-collection-edge-cases.test.ts +0 -212
  69. package/test/unit/awards/award-collection-filtering.test.ts +0 -287
  70. package/test/unit/awards/award-completion-flow.test.ts +0 -306
  71. package/test/unit/awards/award-multi-lesson.test.ts +0 -243
  72. package/test/unit/awards/award-observer-integration.test.ts +0 -327
  73. package/test/unit/awards/award-query-messages.test.ts +0 -448
  74. package/test/unit/awards/award-user-collection.test.ts +0 -416
  75. package/test/unit/awards/duplicate-prevention.test.ts +0 -120
  76. package/test/unit/awards/helpers/completion-mock.ts +0 -56
  77. package/test/unit/awards/helpers/index.ts +0 -3
  78. package/test/unit/awards/helpers/mock-setup.ts +0 -79
  79. package/test/unit/awards/helpers/progress-emitter.ts +0 -45
  80. package/test/unit/awards/message-generator.test.ts +0 -162
  81. package/test/unit/content-progress/bubbleTrickle.test.ts +0 -322
  82. package/test/unit/content-progress/helpers.test.ts +0 -329
  83. package/test/unit/content-progress/navigateTo.test.ts +0 -381
  84. package/test/unit/contentLikes.test.ts +0 -62
  85. package/test/unit/contentMetaData.test.ts +0 -58
  86. package/test/unit/dataContext.test.ts +0 -38
  87. package/test/unit/dateUtils.test.ts +0 -188
  88. package/test/unit/endScreen.test.js +0 -712
  89. package/test/unit/imageSRCBuilder.test.ts +0 -37
  90. package/test/unit/imageSRCVerify.test.ts +0 -155
  91. package/test/unit/infrastructure/DefaultHeaderProvider.test.ts +0 -39
  92. package/test/unit/infrastructure/sanity/ContentClient.test.ts +0 -168
  93. package/test/unit/infrastructure/sanity/DefaultConfigProvider.test.ts +0 -93
  94. package/test/unit/infrastructure/sanity/FetchQueryExecutor.test.ts +0 -174
  95. package/test/unit/infrastructure/sanity/SanityClient.test.ts +0 -140
  96. package/test/unit/lib/__snapshots__/filter.test.ts.snap +0 -5
  97. package/test/unit/lib/filter.test.ts +0 -1154
  98. package/test/unit/lib/lastUpdated.test.ts +0 -21
  99. package/test/unit/lib/query.test.ts +0 -1469
  100. package/test/unit/lib/sanity/decorators/base.test.ts +0 -368
  101. package/test/unit/lib/sanity/decorators/navigate-to.test.ts +0 -361
  102. package/test/unit/lib/sanity/decorators/need-access.test.ts +0 -89
  103. package/test/unit/lib/sanity/decorators/need-lifetime-upgrade.test.ts +0 -85
  104. package/test/unit/lib/sanity/decorators/page-type.test.ts +0 -81
  105. package/test/unit/playerSettings.test.ts +0 -73
  106. package/test/unit/progress-row/content-card.test.ts +0 -314
  107. package/test/unit/progress-row/playlist-card.test.ts +0 -104
  108. package/test/unit/progressRows.test.ts +0 -243
  109. package/test/unit/recommendations.test.js +0 -47
  110. package/test/unit/sanityQueryService.test.ts +0 -200
  111. package/test/unit/search.test.ts +0 -44
  112. package/test/unit/sentry.test.ts +0 -62
  113. package/test/unit/services/progress-internal/bubble.test.ts +0 -279
  114. package/test/unit/services/progress.test.ts +0 -396
  115. package/test/unit/streakMessage.test.ts +0 -251
  116. package/test/unit/sync/context.test.ts +0 -51
  117. package/test/unit/sync/effects/logout-warning.test.ts +0 -158
  118. package/test/unit/sync/effects/push-failure-notification.test.ts +0 -196
  119. package/test/unit/sync/errors/sync-errors.test.ts +0 -106
  120. package/test/unit/sync/errors/validators.test.ts +0 -61
  121. package/test/unit/sync/helpers/TestModel.ts +0 -44
  122. package/test/unit/sync/helpers/index.ts +0 -172
  123. package/test/unit/sync/manager.test.ts +0 -303
  124. package/test/unit/sync/models/user-award-progress.test.ts +0 -82
  125. package/test/unit/sync/resolver.test.ts +0 -229
  126. package/test/unit/sync/retry.test.ts +0 -314
  127. package/test/unit/sync/run-scope.test.ts +0 -23
  128. package/test/unit/sync/stale-record-cleanup.test.ts +0 -107
  129. package/test/unit/sync/store/push-coalescer.test.ts +0 -156
  130. package/test/unit/sync/store-configs.test.ts +0 -37
  131. package/test/unit/sync/telemetry/sync-telemetry.test.ts +0 -118
  132. package/test/unit/sync/utils/event-emitter.test.ts +0 -64
  133. package/test/unit/sync/utils/throttle.test.ts +0 -245
  134. package/test/unit/url-builder.test.ts +0 -72
  135. package/test/unit/user/account.test.ts +0 -66
  136. package/test/unit/user/permissions.test.js +0 -191
@@ -1,1451 +0,0 @@
1
- [
2
- {
3
- "artist": null,
4
- "artist_name": "Domino Santantonio",
5
- "brand": "drumeo",
6
- "child_count": null,
7
- "difficulty": 3,
8
- "difficulty_string": "Beginner",
9
- "genre": null,
10
- "id": 410480,
11
- "image": "https://cdn.sanity.io/images/4032r8py/staging/a1331acc11c72891d3078dbb000e566b56b95794-8000x4500.jpg",
12
- "length_in_seconds": 302,
13
- "lesson_count": null,
14
- "lessons": null,
15
- "parent_content_data": [
16
- 410478
17
- ],
18
- "permission_id": [
19
- 1,
20
- 78,
21
- 91,
22
- 92
23
- ],
24
- "progress_percent": null,
25
- "published_on": "2024-07-19T07:01:00.000000Z",
26
- "railcontent_id": 410480,
27
- "sanity_id": "challenge-part_410480",
28
- "slug": "day-2-around-the-kit",
29
- "status": "published",
30
- "thumbnail": "https://cdn.sanity.io/images/4032r8py/staging/a1331acc11c72891d3078dbb000e566b56b95794-8000x4500.jpg",
31
- "title": "Day 2 — Around The Kit",
32
- "type": "challenge-part",
33
- "url": "/drumeo/challenge/sheet-music-101/410478/day-2-around-the-kit/410480",
34
- "web_url_path": "/drumeo/challenge/sheet-music-101/410478/day-2-around-the-kit/410480",
35
- "xp": 100,
36
- "need_access": false
37
- },
38
- {
39
- "artist": null,
40
- "artist_name": "Domino Santantonio",
41
- "brand": "drumeo",
42
- "child_count": null,
43
- "difficulty": 3,
44
- "difficulty_string": "Beginner",
45
- "genre": null,
46
- "id": 410481,
47
- "image": "https://cdn.sanity.io/images/4032r8py/staging/a7f46367bf84cd4425e9ebb26c3d411901a32adc-8000x4500.jpg",
48
- "length_in_seconds": 288,
49
- "lesson_count": null,
50
- "lessons": null,
51
- "parent_content_data": [
52
- 410478
53
- ],
54
- "permission_id": [
55
- 1,
56
- 78,
57
- 91,
58
- 92
59
- ],
60
- "progress_percent": null,
61
- "published_on": "2024-07-20T07:01:00.000000Z",
62
- "railcontent_id": 410481,
63
- "sanity_id": "challenge-part_410481",
64
- "slug": "day-3-more-bass-drum",
65
- "status": "published",
66
- "thumbnail": "https://cdn.sanity.io/images/4032r8py/staging/a7f46367bf84cd4425e9ebb26c3d411901a32adc-8000x4500.jpg",
67
- "title": "Day 3 — More Bass Drum",
68
- "type": "challenge-part",
69
- "url": "/drumeo/challenge/sheet-music-101/410478/more-bass-drum/410481",
70
- "web_url_path": "/drumeo/challenge/sheet-music-101/410478/more-bass-drum/410481",
71
- "xp": 100,
72
- "need_access": false
73
- },
74
- {
75
- "artist": null,
76
- "artist_name": "Domino Santantonio",
77
- "brand": "drumeo",
78
- "child_count": 24,
79
- "difficulty": 1,
80
- "difficulty_string": "Novice",
81
- "genre": null,
82
- "id": 402199,
83
- "image": "https://cdn.sanity.io/images/4032r8py/staging/94ffc60e09728dcb15f6443fd275fc5a67cb0dd6-8334x10417.png",
84
- "length_in_seconds": 17451,
85
- "lesson_count": 24,
86
- "lessons": [
87
- {
88
- "brand": "drumeo",
89
- "id": 402542,
90
- "lessons": null,
91
- "slug": "course-kick-off",
92
- "type": "challenge-part"
93
- },
94
- {
95
- "brand": "drumeo",
96
- "id": 402314,
97
- "lessons": null,
98
- "slug": "acoustic-kit-setup",
99
- "type": "challenge-part"
100
- },
101
- {
102
- "brand": "drumeo",
103
- "id": 402316,
104
- "lessons": null,
105
- "slug": "electronic-kit-setup",
106
- "type": "challenge-part"
107
- },
108
- {
109
- "brand": "drumeo",
110
- "id": 402318,
111
- "lessons": null,
112
- "slug": "practice-pad-setup",
113
- "type": "challenge-part"
114
- },
115
- {
116
- "brand": "drumeo",
117
- "id": 402320,
118
- "lessons": null,
119
- "slug": "day-1-your-first-drum-beat-lesson-workout-1",
120
- "type": "challenge-part"
121
- },
122
- {
123
- "brand": "drumeo",
124
- "id": 402322,
125
- "lessons": null,
126
- "slug": "your-first-drum-beat-workout-2",
127
- "type": "challenge-part"
128
- },
129
- {
130
- "brand": "drumeo",
131
- "id": 402324,
132
- "lessons": null,
133
- "slug": "your-first-drum-beat-workout-3",
134
- "type": "challenge-part"
135
- },
136
- {
137
- "brand": "drumeo",
138
- "id": 402326,
139
- "lessons": null,
140
- "slug": "your-first-drum-beat-workout-4",
141
- "type": "challenge-part"
142
- },
143
- {
144
- "brand": "drumeo",
145
- "id": 402328,
146
- "lessons": null,
147
- "slug": "your-first-drum-beat-workout-5",
148
- "type": "challenge-part"
149
- },
150
- {
151
- "brand": "drumeo",
152
- "id": 402330,
153
- "lessons": null,
154
- "slug": "doubling-it-up-lesson-workout-1",
155
- "type": "challenge-part"
156
- },
157
- {
158
- "brand": "drumeo",
159
- "id": 402332,
160
- "lessons": null,
161
- "slug": "doubling-it-up-workout-2",
162
- "type": "challenge-part"
163
- },
164
- {
165
- "brand": "drumeo",
166
- "id": 402334,
167
- "lessons": null,
168
- "slug": "doubling-it-up-workout-3",
169
- "type": "challenge-part"
170
- },
171
- {
172
- "brand": "drumeo",
173
- "id": 402336,
174
- "lessons": null,
175
- "slug": "doubling-it-up-workout-4",
176
- "type": "challenge-part"
177
- },
178
- {
179
- "brand": "drumeo",
180
- "id": 402338,
181
- "lessons": null,
182
- "slug": "doubling-it-up-workout-5",
183
- "type": "challenge-part"
184
- },
185
- {
186
- "brand": "drumeo",
187
- "id": 402340,
188
- "lessons": null,
189
- "slug": "adding-fills-crashes-lesson-workout-1",
190
- "type": "challenge-part"
191
- },
192
- {
193
- "brand": "drumeo",
194
- "id": 402342,
195
- "lessons": null,
196
- "slug": "adding-fills-crashes-workout-2",
197
- "type": "challenge-part"
198
- },
199
- {
200
- "brand": "drumeo",
201
- "id": 402344,
202
- "lessons": null,
203
- "slug": "adding-fills-crashes-workout-3",
204
- "type": "challenge-part"
205
- },
206
- {
207
- "brand": "drumeo",
208
- "id": 402346,
209
- "lessons": null,
210
- "slug": "adding-fills-crashes-workout-4",
211
- "type": "challenge-part"
212
- },
213
- {
214
- "brand": "drumeo",
215
- "id": 402348,
216
- "lessons": null,
217
- "slug": "adding-fills-crashes-workout-5",
218
- "type": "challenge-part"
219
- },
220
- {
221
- "brand": "drumeo",
222
- "id": 402350,
223
- "lessons": null,
224
- "slug": "your-first-song-lesson-workout-1",
225
- "type": "challenge-part"
226
- },
227
- {
228
- "brand": "drumeo",
229
- "id": 402352,
230
- "lessons": null,
231
- "slug": "your-first-song-workout-2",
232
- "type": "challenge-part"
233
- },
234
- {
235
- "brand": "drumeo",
236
- "id": 402354,
237
- "lessons": null,
238
- "slug": "your-first-song-workout-3",
239
- "type": "challenge-part"
240
- },
241
- {
242
- "brand": "drumeo",
243
- "id": 402356,
244
- "lessons": null,
245
- "slug": "your-first-song-workout-4",
246
- "type": "challenge-part"
247
- },
248
- {
249
- "brand": "drumeo",
250
- "id": 402358,
251
- "lessons": null,
252
- "slug": "your-first-song-workout-5",
253
- "type": "challenge-part"
254
- }
255
- ],
256
- "parent_content_data": null,
257
- "permission_id": [
258
- 91,
259
- 92,
260
- 1,
261
- 78,
262
- 101,
263
- 102
264
- ],
265
- "progress_percent": null,
266
- "published_on": "2023-12-28T08:02:00.000000Z",
267
- "railcontent_id": 402199,
268
- "sanity_id": "challenge_402199",
269
- "slug": "30-day-drummer",
270
- "status": "published",
271
- "thumbnail": "https://cdn.sanity.io/images/4032r8py/staging/94ffc60e09728dcb15f6443fd275fc5a67cb0dd6-8334x10417.png",
272
- "title": "30-Day Drummer",
273
- "type": "challenge",
274
- "url": "/drumeo/challenge/30-day-drummer/402199",
275
- "web_url_path": "/drumeo/challenge/30-day-drummer/402199",
276
- "xp": 100,
277
- "need_access": false
278
- },
279
- {
280
- "artist": null,
281
- "artist_name": "Domino Santantonio",
282
- "brand": "drumeo",
283
- "child_count": 9,
284
- "difficulty": 3,
285
- "difficulty_string": "Beginner",
286
- "genre": null,
287
- "id": 410478,
288
- "image": "https://cdn.sanity.io/images/4032r8py/staging/6f01890a7c09b7cc1600ca85b7c6feb56759e277-8334x10417.png",
289
- "length_in_seconds": 2246,
290
- "lesson_count": 9,
291
- "lessons": [
292
- {
293
- "brand": "drumeo",
294
- "id": 410479,
295
- "lessons": null,
296
- "slug": "day-1-the-money-beat",
297
- "type": "challenge-part"
298
- },
299
- {
300
- "brand": "drumeo",
301
- "id": 410480,
302
- "lessons": null,
303
- "slug": "day-2-around-the-kit",
304
- "type": "challenge-part"
305
- },
306
- {
307
- "brand": "drumeo",
308
- "id": 410481,
309
- "lessons": null,
310
- "slug": "day-3-more-bass-drum",
311
- "type": "challenge-part"
312
- },
313
- {
314
- "brand": "drumeo",
315
- "id": 410482,
316
- "lessons": null,
317
- "slug": "day-4-more-snare-drum",
318
- "type": "challenge-part"
319
- },
320
- {
321
- "brand": "drumeo",
322
- "id": 410484,
323
- "lessons": null,
324
- "slug": "day-5-adding-a-crash",
325
- "type": "challenge-part"
326
- },
327
- {
328
- "brand": "drumeo",
329
- "id": 410483,
330
- "lessons": null,
331
- "slug": "day-6-rests",
332
- "type": "challenge-part"
333
- },
334
- {
335
- "brand": "drumeo",
336
- "id": 410485,
337
- "lessons": null,
338
- "slug": "day-7-drum-fills",
339
- "type": "challenge-part"
340
- },
341
- {
342
- "brand": "drumeo",
343
- "id": 410486,
344
- "lessons": null,
345
- "slug": "day-8-flams-and-drags",
346
- "type": "challenge-part"
347
- },
348
- {
349
- "brand": "drumeo",
350
- "id": 410487,
351
- "lessons": null,
352
- "slug": "day-9-what-s-next",
353
- "type": "challenge-part"
354
- }
355
- ],
356
- "parent_content_data": null,
357
- "permission_id": [
358
- 1,
359
- 78,
360
- 91,
361
- 92
362
- ],
363
- "progress_percent": null,
364
- "published_on": "2024-07-18T07:01:00.000000Z",
365
- "railcontent_id": 410478,
366
- "sanity_id": "challenge_410478",
367
- "slug": "sheet-music-101",
368
- "status": "published",
369
- "thumbnail": "https://cdn.sanity.io/images/4032r8py/staging/6f01890a7c09b7cc1600ca85b7c6feb56759e277-8334x10417.png",
370
- "title": "Sheet Music 101",
371
- "type": "challenge",
372
- "url": "/drumeo/challenge/sheet-music-101/410478",
373
- "web_url_path": "/drumeo/challenge/sheet-music-101/410478",
374
- "xp": 100,
375
- "need_access": false,
376
- "first_incomplete_child": {
377
- "brand": "drumeo",
378
- "id": 410479,
379
- "lessons": null,
380
- "slug": "day-1-the-money-beat",
381
- "type": "challenge-part"
382
- },
383
- "second_incomplete_child": null
384
- },
385
- {
386
- "artist": null,
387
- "artist_name": "Kyle Radomsky",
388
- "brand": "drumeo",
389
- "child_count": null,
390
- "difficulty": 0,
391
- "difficulty_string": "All",
392
- "genre": null,
393
- "id": 274889,
394
- "image": "https://cdn.sanity.io/images/4032r8py/staging/2263f9dc44a5c2c6e775513d4eebbaae92cabf20-1921x1080.png",
395
- "length_in_seconds": 62,
396
- "lesson_count": null,
397
- "lessons": null,
398
- "parent_content_data": [
399
- 274368
400
- ],
401
- "permission_id": [
402
- 1,
403
- 91,
404
- 92
405
- ],
406
- "progress_percent": null,
407
- "published_on": "2020-11-14T16:00:00.000000Z",
408
- "railcontent_id": 274889,
409
- "sanity_id": "course-part_274889",
410
- "slug": "introduction",
411
- "status": "published",
412
- "thumbnail": "https://cdn.sanity.io/images/4032r8py/staging/2263f9dc44a5c2c6e775513d4eebbaae92cabf20-1921x1080.png",
413
- "title": "Introduction",
414
- "type": "course-part",
415
- "url": "/drumeo/courses/electronic-multi-pad-gear-guide/274368/introduction/274889",
416
- "web_url_path": "/drumeo/courses/electronic-multi-pad-gear-guide/274368/introduction/274889",
417
- "xp": 150,
418
- "need_access": false
419
- },
420
- {
421
- "artist": null,
422
- "artist_name": "Kyle Radomsky",
423
- "brand": "drumeo",
424
- "child_count": null,
425
- "difficulty": 0,
426
- "difficulty_string": "All",
427
- "genre": null,
428
- "id": 287853,
429
- "image": "https://cdn.sanity.io/images/4032r8py/staging/3fb1f385e41f351105ee8714ee2ef7cc1eafcfc1-3841x2160.png",
430
- "length_in_seconds": 1043,
431
- "lesson_count": null,
432
- "lessons": null,
433
- "parent_content_data": [
434
- 280498
435
- ],
436
- "permission_id": [
437
- 1,
438
- 91,
439
- 92
440
- ],
441
- "progress_percent": null,
442
- "published_on": "2021-02-06T16:00:00.000000Z",
443
- "railcontent_id": 287853,
444
- "sanity_id": "course-part_287853",
445
- "slug": "introduction-unboxing",
446
- "status": "published",
447
- "thumbnail": "https://cdn.sanity.io/images/4032r8py/staging/3fb1f385e41f351105ee8714ee2ef7cc1eafcfc1-3841x2160.png",
448
- "title": "Introduction/Unboxing",
449
- "type": "course-part",
450
- "url": "/drumeo/courses/roland-td-07-gear-guide/280498/introduction-unboxing/287853",
451
- "web_url_path": "/drumeo/courses/roland-td-07-gear-guide/280498/introduction-unboxing/287853",
452
- "xp": 150,
453
- "need_access": false
454
- },
455
- {
456
- "artist": null,
457
- "artist_name": "Kyle Radomsky",
458
- "brand": "drumeo",
459
- "child_count": null,
460
- "difficulty": 0,
461
- "difficulty_string": "All",
462
- "genre": null,
463
- "id": 287855,
464
- "image": "https://cdn.sanity.io/images/4032r8py/staging/21431571d1d2b6db97ce104d1e44d57e280f8a4a-3840x2160.png",
465
- "length_in_seconds": 834,
466
- "lesson_count": null,
467
- "lessons": null,
468
- "parent_content_data": [
469
- 280498
470
- ],
471
- "permission_id": [
472
- 1,
473
- 91,
474
- 92
475
- ],
476
- "progress_percent": null,
477
- "published_on": "2021-02-06T16:00:00.000000Z",
478
- "railcontent_id": 287855,
479
- "sanity_id": "course-part_287855",
480
- "slug": "creating-your-own-kits-and-advanced-features",
481
- "status": "published",
482
- "thumbnail": "https://cdn.sanity.io/images/4032r8py/staging/21431571d1d2b6db97ce104d1e44d57e280f8a4a-3840x2160.png",
483
- "title": "Creating Your Own Kits And Advanced Features",
484
- "type": "course-part",
485
- "url": "/drumeo/courses/roland-td-07-gear-guide/280498/creating-your-own-kits-and-advanced-features/287855",
486
- "web_url_path": "/drumeo/courses/roland-td-07-gear-guide/280498/creating-your-own-kits-and-advanced-features/287855",
487
- "xp": 150,
488
- "need_access": false
489
- },
490
- {
491
- "artist": null,
492
- "artist_name": "Kyle Radomsky",
493
- "brand": "drumeo",
494
- "child_count": null,
495
- "difficulty": 0,
496
- "difficulty_string": "All",
497
- "genre": null,
498
- "id": 287858,
499
- "image": "https://cdn.sanity.io/images/4032r8py/staging/e72d6b3e5517d329f035c7e17e680e5012c544f6-3840x2160.png",
500
- "length_in_seconds": 652,
501
- "lesson_count": null,
502
- "lessons": null,
503
- "parent_content_data": [
504
- 280498
505
- ],
506
- "permission_id": [
507
- 1,
508
- 91,
509
- 92
510
- ],
511
- "progress_percent": null,
512
- "published_on": "2021-02-06T16:00:00.000000Z",
513
- "railcontent_id": 287858,
514
- "sanity_id": "course-part_287858",
515
- "slug": "coach-function-and-bluetooth",
516
- "status": "published",
517
- "thumbnail": "https://cdn.sanity.io/images/4032r8py/staging/e72d6b3e5517d329f035c7e17e680e5012c544f6-3840x2160.png",
518
- "title": "Coach Function And Bluetooth",
519
- "type": "course-part",
520
- "url": "/drumeo/courses/roland-td-07-gear-guide/280498/coach-function-and-bluetooth/287858",
521
- "web_url_path": "/drumeo/courses/roland-td-07-gear-guide/280498/coach-function-and-bluetooth/287858",
522
- "xp": 150,
523
- "need_access": false
524
- },
525
- {
526
- "artist": null,
527
- "artist_name": "Kyle Radomsky",
528
- "brand": "drumeo",
529
- "child_count": 5,
530
- "difficulty": 1,
531
- "difficulty_string": "Novice",
532
- "genre": null,
533
- "id": 274368,
534
- "image": "https://cdn.sanity.io/images/4032r8py/staging/9dfbf11ccceadd68ceb6f41bf6d0dd42a562afa7-1921x1080.png",
535
- "length_in_seconds": 2343,
536
- "lesson_count": 5,
537
- "lessons": [
538
- {
539
- "brand": "drumeo",
540
- "id": 274889,
541
- "lessons": null,
542
- "slug": "introduction",
543
- "type": "course-part"
544
- },
545
- {
546
- "brand": "drumeo",
547
- "id": 274890,
548
- "lessons": null,
549
- "slug": "yamaha-dtx-multi-12",
550
- "type": "course-part"
551
- },
552
- {
553
- "brand": "drumeo",
554
- "id": 274891,
555
- "lessons": null,
556
- "slug": "roland-spd-sx-se",
557
- "type": "course-part"
558
- },
559
- {
560
- "brand": "drumeo",
561
- "id": 274892,
562
- "lessons": null,
563
- "slug": "alesis-strike-pad",
564
- "type": "course-part"
565
- },
566
- {
567
- "brand": "drumeo",
568
- "id": 274893,
569
- "lessons": null,
570
- "slug": "conclusion",
571
- "type": "course-part"
572
- }
573
- ],
574
- "parent_content_data": null,
575
- "permission_id": [
576
- 1,
577
- 91,
578
- 92
579
- ],
580
- "progress_percent": null,
581
- "published_on": "2020-11-14T16:00:00.000000Z",
582
- "railcontent_id": 274368,
583
- "sanity_id": "course_274368",
584
- "slug": "electronic-multi-pad-gear-guide",
585
- "status": "published",
586
- "thumbnail": "https://cdn.sanity.io/images/4032r8py/staging/9dfbf11ccceadd68ceb6f41bf6d0dd42a562afa7-1921x1080.png",
587
- "title": "Electronic Multi-Pad Gear Guide",
588
- "type": "course",
589
- "url": "/drumeo/courses/electronic-multi-pad-gear-guide/274368",
590
- "web_url_path": "/drumeo/courses/electronic-multi-pad-gear-guide/274368",
591
- "xp": 150,
592
- "need_access": false
593
- },
594
- {
595
- "artist": null,
596
- "artist_name": "Kyle Radomsky",
597
- "brand": "drumeo",
598
- "child_count": 5,
599
- "difficulty": 0,
600
- "difficulty_string": "All",
601
- "genre": null,
602
- "id": 280498,
603
- "image": "https://cdn.sanity.io/images/4032r8py/staging/ae9eebd6b11e17dc4dcbaea5b06668b4bc800aa2-3840x2160.png",
604
- "length_in_seconds": 3159,
605
- "lesson_count": 5,
606
- "lessons": [
607
- {
608
- "brand": "drumeo",
609
- "id": 287853,
610
- "lessons": null,
611
- "slug": "introduction-unboxing",
612
- "type": "course-part"
613
- },
614
- {
615
- "brand": "drumeo",
616
- "id": 287854,
617
- "lessons": null,
618
- "slug": "basic-features-and-playing-examples",
619
- "type": "course-part"
620
- },
621
- {
622
- "brand": "drumeo",
623
- "id": 287855,
624
- "lessons": null,
625
- "slug": "creating-your-own-kits-and-advanced-features",
626
- "type": "course-part"
627
- },
628
- {
629
- "brand": "drumeo",
630
- "id": 287858,
631
- "lessons": null,
632
- "slug": "coach-function-and-bluetooth",
633
- "type": "course-part"
634
- },
635
- {
636
- "brand": "drumeo",
637
- "id": 287859,
638
- "lessons": null,
639
- "slug": "conclusion",
640
- "type": "course-part"
641
- }
642
- ],
643
- "parent_content_data": null,
644
- "permission_id": [
645
- 1,
646
- 91,
647
- 92
648
- ],
649
- "progress_percent": null,
650
- "published_on": "2021-02-06T16:00:00.000000Z",
651
- "railcontent_id": 280498,
652
- "sanity_id": "course_280498",
653
- "slug": "roland-td-07-gear-guide",
654
- "status": "published",
655
- "thumbnail": "https://cdn.sanity.io/images/4032r8py/staging/ae9eebd6b11e17dc4dcbaea5b06668b4bc800aa2-3840x2160.png",
656
- "title": "Roland TD-07 Gear Guide",
657
- "type": "course",
658
- "url": "/drumeo/courses/roland-td-07-gear-guide/280498",
659
- "web_url_path": "/drumeo/courses/roland-td-07-gear-guide/280498",
660
- "xp": 500,
661
- "need_access": false,
662
- "first_incomplete_child": {
663
- "brand": "drumeo",
664
- "id": 287854,
665
- "lessons": null,
666
- "slug": "basic-features-and-playing-examples",
667
- "type": "course-part"
668
- },
669
- "second_incomplete_child": null
670
- },
671
- {
672
- "artist": null,
673
- "artist_name": "Domino Santantonio",
674
- "brand": "drumeo",
675
- "child_count": null,
676
- "difficulty": 0,
677
- "difficulty_string": "All",
678
- "genre": null,
679
- "id": 415585,
680
- "image": "https://cdn.sanity.io/images/4032r8py/staging/86f0094cd02a27b3efcab4fc23dc08d1bea3471e-1920x1080.jpg",
681
- "length_in_seconds": 3770,
682
- "lesson_count": null,
683
- "lessons": null,
684
- "parent_content_data": null,
685
- "permission_id": [
686
- 78,
687
- 89,
688
- 88,
689
- 90,
690
- 91,
691
- 92
692
- ],
693
- "progress_percent": null,
694
- "published_on": "2025-02-01T19:17:42.354Z",
695
- "railcontent_id": 415585,
696
- "sanity_id": "f727e89d-d254-473c-9511-40ab237d30b4",
697
- "slug": "30-day-drummer-level-ii-week-4-live-q-and-a",
698
- "status": "published",
699
- "thumbnail": "https://cdn.sanity.io/images/4032r8py/staging/86f0094cd02a27b3efcab4fc23dc08d1bea3471e-1920x1080.jpg",
700
- "title": "30-Day Drummer Level II: Week 4 — Live Q&A",
701
- "type": "question-and-answer",
702
- "url": "/drumeo/question-and-answer/30-day-drummer-level-ii-week-4-live-q-and-a/415585",
703
- "web_url_path": "/drumeo/question-and-answer/30-day-drummer-level-ii-week-4-live-q-and-a/415585",
704
- "xp": 150,
705
- "need_access": false
706
- },
707
- {
708
- "artist": null,
709
- "artist_name": "Aaron Graham",
710
- "brand": "drumeo",
711
- "child_count": null,
712
- "difficulty": 0,
713
- "difficulty_string": "All",
714
- "genre": [
715
- "Pop/Rock"
716
- ],
717
- "id": 410255,
718
- "image": "https://cdn.sanity.io/images/4032r8py/staging/0c3eab2d329c7794d1a5295cf15667bb09942ca6-1920x1080.jpg",
719
- "length_in_seconds": 5894,
720
- "lesson_count": null,
721
- "lessons": null,
722
- "parent_content_data": null,
723
- "permission_id": [
724
- 78,
725
- 91,
726
- 92,
727
- 89,
728
- 88,
729
- 90
730
- ],
731
- "progress_percent": null,
732
- "published_on": "2024-08-29T00:00:00.000000Z",
733
- "railcontent_id": 410255,
734
- "sanity_id": "live_410255",
735
- "slug": "the-police-groove-fills",
736
- "status": "published",
737
- "thumbnail": "https://cdn.sanity.io/images/4032r8py/staging/0c3eab2d329c7794d1a5295cf15667bb09942ca6-1920x1080.jpg",
738
- "title": "Live Premiere - The Police Grooves & Fills",
739
- "type": "live",
740
- "url": "/drumeo/live-streams/the-police-groove-fills/410255",
741
- "web_url_path": "/drumeo/live-streams/the-police-groove-fills/410255",
742
- "xp": 150,
743
- "need_access": false
744
- },
745
- {
746
- "artist": null,
747
- "artist_name": "Jared Falk",
748
- "brand": "drumeo",
749
- "child_count": null,
750
- "difficulty": 0,
751
- "difficulty_string": "All",
752
- "genre": null,
753
- "id": 257245,
754
- "image": "https://cdn.sanity.io/images/4032r8py/staging/d1f585c45eabed92b1ecc17d98e5c5a4c68663aa-3840x2160.png",
755
- "length_in_seconds": 273,
756
- "lesson_count": null,
757
- "lessons": null,
758
- "parent_content_data": [
759
- 257243
760
- ],
761
- "permission_id": [
762
- 1,
763
- 65,
764
- 91,
765
- 92
766
- ],
767
- "progress_percent": null,
768
- "published_on": "2020-06-09T15:00:00.000000Z",
769
- "railcontent_id": 257245,
770
- "sanity_id": "pack-bundle-lesson_257245",
771
- "slug": "week-1---drum-fill-foundations",
772
- "status": "published",
773
- "thumbnail": "https://cdn.sanity.io/images/4032r8py/staging/d1f585c45eabed92b1ecc17d98e5c5a4c68663aa-3840x2160.png",
774
- "title": "What Is A Drum Fill?",
775
- "type": "pack-bundle-lesson",
776
- "url": "/drumeo/packs/4-weeks-to-better-drum-fills/257242/4-weeks-to-better-drum-fills/257243/week-1---drum-fill-foundations/257245",
777
- "web_url_path": "/drumeo/packs/4-weeks-to-better-drum-fills/257242/4-weeks-to-better-drum-fills/257243/week-1---drum-fill-foundations/257245",
778
- "xp": 150,
779
- "need_access": false
780
- },
781
- {
782
- "artist": null,
783
- "artist_name": "Jared Falk",
784
- "brand": "drumeo",
785
- "child_count": null,
786
- "difficulty": 0,
787
- "difficulty_string": "All",
788
- "genre": null,
789
- "id": 257249,
790
- "image": "https://cdn.sanity.io/images/4032r8py/staging/1400dad32e30c670c29e557ba4af467304188d88-3840x2160.png",
791
- "length_in_seconds": 279,
792
- "lesson_count": null,
793
- "lessons": null,
794
- "parent_content_data": [
795
- 257243,
796
- 257242
797
- ],
798
- "permission_id": [
799
- 1,
800
- 65,
801
- 91,
802
- 92
803
- ],
804
- "progress_percent": null,
805
- "published_on": "2020-06-09T15:00:00.000000Z",
806
- "railcontent_id": 257249,
807
- "sanity_id": "pack-bundle-lesson_257249",
808
- "slug": "lengths-of-drum-fills",
809
- "status": "published",
810
- "thumbnail": "https://cdn.sanity.io/images/4032r8py/staging/1400dad32e30c670c29e557ba4af467304188d88-3840x2160.png",
811
- "title": "Lengths Of Drum Fills",
812
- "type": "pack-bundle-lesson",
813
- "url": "/drumeo/packs/4-weeks-to-better-drum-fills/257242/4-weeks-to-better-drum-fills/257243/lengths-of-drum-fills/257249",
814
- "web_url_path": "/drumeo/packs/4-weeks-to-better-drum-fills/257242/4-weeks-to-better-drum-fills/257243/lengths-of-drum-fills/257249",
815
- "xp": 150,
816
- "need_access": false
817
- },
818
- {
819
- "artist": null,
820
- "artist_name": "Jared Falk",
821
- "brand": "drumeo",
822
- "child_count": null,
823
- "difficulty": 0,
824
- "difficulty_string": "All",
825
- "genre": null,
826
- "id": 257250,
827
- "image": "https://cdn.sanity.io/images/4032r8py/staging/54d9510678088385d1d1ab002a00ed71ccc18a70-3840x2160.png",
828
- "length_in_seconds": 417,
829
- "lesson_count": null,
830
- "lessons": null,
831
- "parent_content_data": [
832
- 257243,
833
- 257242
834
- ],
835
- "permission_id": [
836
- 1,
837
- 65,
838
- 91,
839
- 92
840
- ],
841
- "progress_percent": null,
842
- "published_on": "2020-06-09T15:00:00.000000Z",
843
- "railcontent_id": 257250,
844
- "sanity_id": "pack-bundle-lesson_257250",
845
- "slug": "practice-tips--practice-space",
846
- "status": "published",
847
- "thumbnail": "https://cdn.sanity.io/images/4032r8py/staging/54d9510678088385d1d1ab002a00ed71ccc18a70-3840x2160.png",
848
- "title": "Practice Tips & Practice Space",
849
- "type": "pack-bundle-lesson",
850
- "url": "/drumeo/packs/4-weeks-to-better-drum-fills/257242/4-weeks-to-better-drum-fills/257243/practice-tips--practice-space/257250",
851
- "web_url_path": "/drumeo/packs/4-weeks-to-better-drum-fills/257242/4-weeks-to-better-drum-fills/257243/practice-tips--practice-space/257250",
852
- "xp": 150,
853
- "need_access": false
854
- },
855
- {
856
- "artist": null,
857
- "artist_name": null,
858
- "brand": "drumeo",
859
- "child_count": 5,
860
- "difficulty": 0,
861
- "difficulty_string": "All",
862
- "genre": null,
863
- "id": 257243,
864
- "image": "https://cdn.sanity.io/images/4032r8py/staging/7fc6edf19f68d80193a9718c25ece693c3475198-368x207.png",
865
- "length_in_seconds": 2329,
866
- "lesson_count": 5,
867
- "lessons": [
868
- {
869
- "brand": "drumeo",
870
- "id": 257245,
871
- "lessons": null,
872
- "slug": "week-1---drum-fill-foundations",
873
- "type": "pack-bundle-lesson"
874
- },
875
- {
876
- "brand": "drumeo",
877
- "id": 257249,
878
- "lessons": null,
879
- "slug": "lengths-of-drum-fills",
880
- "type": "pack-bundle-lesson"
881
- },
882
- {
883
- "brand": "drumeo",
884
- "id": 257250,
885
- "lessons": null,
886
- "slug": "practice-tips--practice-space",
887
- "type": "pack-bundle-lesson"
888
- },
889
- {
890
- "brand": "drumeo",
891
- "id": 257251,
892
- "lessons": null,
893
- "slug": "the-note-value-tree",
894
- "type": "pack-bundle-lesson"
895
- },
896
- {
897
- "brand": "drumeo",
898
- "id": 259235,
899
- "lessons": null,
900
- "slug": "the-motions",
901
- "type": "pack-bundle-lesson"
902
- }
903
- ],
904
- "parent_content_data": [
905
- 257242
906
- ],
907
- "permission_id": [
908
- 1,
909
- 65,
910
- 91,
911
- 92
912
- ],
913
- "progress_percent": null,
914
- "published_on": "2020-06-09T15:00:00.000000Z",
915
- "railcontent_id": 257243,
916
- "sanity_id": "pack-bundle_257243",
917
- "slug": "4-weeks-to-better-drum-fills",
918
- "status": "published",
919
- "thumbnail": "https://cdn.sanity.io/images/4032r8py/staging/7fc6edf19f68d80193a9718c25ece693c3475198-368x207.png",
920
- "title": "Week #1 - Drum Fill Foundations",
921
- "type": "pack-bundle",
922
- "url": "/drumeo/packs/4-weeks-to-better-drum-fills/257242/4-weeks-to-better-drum-fills/257243",
923
- "web_url_path": "/drumeo/packs/4-weeks-to-better-drum-fills/257242/4-weeks-to-better-drum-fills/257243",
924
- "xp": 0,
925
- "need_access": false
926
- },
927
- {
928
- "artist": null,
929
- "artist_name": "Jared Falk",
930
- "brand": "drumeo",
931
- "child_count": 4,
932
- "difficulty": 0,
933
- "difficulty_string": "All",
934
- "genre": null,
935
- "id": 257242,
936
- "image": "https://cdn.sanity.io/images/4032r8py/staging/da4675ae1f67e84bf7bb8a494d83629367121a6c-1530x861.jpg",
937
- "length_in_seconds": null,
938
- "lesson_count": 15,
939
- "lessons": [
940
- {
941
- "brand": "drumeo",
942
- "id": 257243,
943
- "lessons": [
944
- {
945
- "brand": "drumeo",
946
- "id": 257245,
947
- "slug": "week-1---drum-fill-foundations",
948
- "type": "pack-bundle-lesson"
949
- },
950
- {
951
- "brand": "drumeo",
952
- "id": 257249,
953
- "slug": "lengths-of-drum-fills",
954
- "type": "pack-bundle-lesson"
955
- },
956
- {
957
- "brand": "drumeo",
958
- "id": 257250,
959
- "slug": "practice-tips--practice-space",
960
- "type": "pack-bundle-lesson"
961
- },
962
- {
963
- "brand": "drumeo",
964
- "id": 257251,
965
- "slug": "the-note-value-tree",
966
- "type": "pack-bundle-lesson"
967
- },
968
- {
969
- "brand": "drumeo",
970
- "id": 259235,
971
- "slug": "the-motions",
972
- "type": "pack-bundle-lesson"
973
- }
974
- ],
975
- "slug": "4-weeks-to-better-drum-fills",
976
- "type": "pack-bundle"
977
- },
978
- {
979
- "brand": "drumeo",
980
- "id": 257246,
981
- "lessons": [
982
- {
983
- "brand": "drumeo",
984
- "id": 257252,
985
- "slug": "beginner",
986
- "type": "pack-bundle-lesson"
987
- },
988
- {
989
- "brand": "drumeo",
990
- "id": 257253,
991
- "slug": "intermediate",
992
- "type": "pack-bundle-lesson"
993
- },
994
- {
995
- "brand": "drumeo",
996
- "id": 257254,
997
- "slug": "advanced",
998
- "type": "pack-bundle-lesson"
999
- }
1000
- ],
1001
- "slug": "week-2---three-levels-of-drum-fills",
1002
- "type": "pack-bundle"
1003
- },
1004
- {
1005
- "brand": "drumeo",
1006
- "id": 257247,
1007
- "lessons": [
1008
- {
1009
- "brand": "drumeo",
1010
- "id": 257255,
1011
- "slug": "beginner",
1012
- "type": "pack-bundle-lesson"
1013
- },
1014
- {
1015
- "brand": "drumeo",
1016
- "id": 257256,
1017
- "slug": "intermediate",
1018
- "type": "pack-bundle-lesson"
1019
- },
1020
- {
1021
- "brand": "drumeo",
1022
- "id": 257257,
1023
- "slug": "advanced",
1024
- "type": "pack-bundle-lesson"
1025
- }
1026
- ],
1027
- "slug": "week-3---build-musical-tension-with-odd-groupings",
1028
- "type": "pack-bundle"
1029
- },
1030
- {
1031
- "brand": "drumeo",
1032
- "id": 257248,
1033
- "lessons": [
1034
- {
1035
- "brand": "drumeo",
1036
- "id": 257258,
1037
- "slug": "beginner",
1038
- "type": "pack-bundle-lesson"
1039
- },
1040
- {
1041
- "brand": "drumeo",
1042
- "id": 257259,
1043
- "slug": "intermediate",
1044
- "type": "pack-bundle-lesson"
1045
- },
1046
- {
1047
- "brand": "drumeo",
1048
- "id": 257260,
1049
- "slug": "advanced",
1050
- "type": "pack-bundle-lesson"
1051
- },
1052
- {
1053
- "brand": "drumeo",
1054
- "id": 259236,
1055
- "slug": "conclusion",
1056
- "type": "pack-bundle-lesson"
1057
- }
1058
- ],
1059
- "slug": "week-4---linear-drum-fill-explorations",
1060
- "type": "pack-bundle"
1061
- }
1062
- ],
1063
- "parent_content_data": null,
1064
- "permission_id": [
1065
- 65,
1066
- 1,
1067
- 91,
1068
- 92,
1069
- 78
1070
- ],
1071
- "progress_percent": null,
1072
- "published_on": "2020-06-09T15:00:00.000000Z",
1073
- "railcontent_id": 257242,
1074
- "sanity_id": "pack_257242",
1075
- "slug": "4-weeks-to-better-drum-fills",
1076
- "status": "published",
1077
- "thumbnail": "https://cdn.sanity.io/images/4032r8py/staging/da4675ae1f67e84bf7bb8a494d83629367121a6c-1530x861.jpg",
1078
- "title": "Four Weeks To Better Drum Fills",
1079
- "type": "pack",
1080
- "url": "/drumeo/packs/4-weeks-to-better-drum-fills/257242",
1081
- "web_url_path": "/drumeo/packs/4-weeks-to-better-drum-fills/257242",
1082
- "xp": 500,
1083
- "need_access": false,
1084
- "first_incomplete_child": {
1085
- "id": 257243,
1086
- "slug": "4-weeks-to-better-drum-fills",
1087
- "type": "pack-bundle"
1088
- },
1089
- "second_incomplete_child": {
1090
- "brand": "drumeo",
1091
- "id": 257251,
1092
- "slug": "the-note-value-tree",
1093
- "type": "pack-bundle-lesson",
1094
- "parent": {
1095
- "id": 257243,
1096
- "slug": "4-weeks-to-better-drum-fills",
1097
- "type": "pack-bundle"
1098
- }
1099
- }
1100
- },
1101
- {
1102
- "artist": null,
1103
- "artist_name": "Mike Michalkow",
1104
- "brand": "drumeo",
1105
- "child_count": null,
1106
- "difficulty": 2,
1107
- "difficulty_string": "Beginner",
1108
- "genre": [
1109
- "Metal"
1110
- ],
1111
- "id": 316732,
1112
- "image": "https://cdn.sanity.io/images/4032r8py/staging/8fd09777a4a69e34ad2f24d95f7beeb93c60caf7-1920x1080.png",
1113
- "length_in_seconds": 169,
1114
- "lesson_count": null,
1115
- "lessons": null,
1116
- "parent_content_data": null,
1117
- "permission_id": [
1118
- 1,
1119
- 91,
1120
- 92
1121
- ],
1122
- "progress_percent": null,
1123
- "published_on": "2021-08-30T17:00:00.000000Z",
1124
- "railcontent_id": 316732,
1125
- "sanity_id": "play-along_316732",
1126
- "slug": "basic-metal",
1127
- "status": "published",
1128
- "thumbnail": "https://cdn.sanity.io/images/4032r8py/staging/8fd09777a4a69e34ad2f24d95f7beeb93c60caf7-1920x1080.png",
1129
- "title": "Basic Metal",
1130
- "type": "play-along",
1131
- "url": "/drumeo/play-alongs/basic-metal/316732",
1132
- "web_url_path": "/drumeo/play-alongs/basic-metal/316732",
1133
- "xp": 100,
1134
- "need_access": false
1135
- },
1136
- {
1137
- "artist": null,
1138
- "artist_name": "Mike Michalkow",
1139
- "brand": "drumeo",
1140
- "child_count": null,
1141
- "difficulty": 4,
1142
- "difficulty_string": "Intermediate",
1143
- "genre": [
1144
- "Blues"
1145
- ],
1146
- "id": 316752,
1147
- "image": "https://cdn.sanity.io/images/4032r8py/staging/ca83b48c47ec89e672c9335f8e570f4f6a9d0202-1920x1080.png",
1148
- "length_in_seconds": 184,
1149
- "lesson_count": null,
1150
- "lessons": null,
1151
- "parent_content_data": null,
1152
- "permission_id": [
1153
- 1,
1154
- 91,
1155
- 92
1156
- ],
1157
- "progress_percent": null,
1158
- "published_on": "2021-08-30T17:00:00.000000Z",
1159
- "railcontent_id": 316752,
1160
- "sanity_id": "play-along_316752",
1161
- "slug": "intermediate-blues-shuffle",
1162
- "status": "published",
1163
- "thumbnail": "https://cdn.sanity.io/images/4032r8py/staging/ca83b48c47ec89e672c9335f8e570f4f6a9d0202-1920x1080.png",
1164
- "title": "Intermediate Blues Shuffle",
1165
- "type": "play-along",
1166
- "url": "/drumeo/play-alongs/intermediate-blues-shuffle/316752",
1167
- "web_url_path": "/drumeo/play-alongs/intermediate-blues-shuffle/316752",
1168
- "xp": 150,
1169
- "need_access": false
1170
- },
1171
- {
1172
- "artist": null,
1173
- "artist_name": "Mark Kelso",
1174
- "brand": "drumeo",
1175
- "child_count": null,
1176
- "difficulty": 5,
1177
- "difficulty_string": "Intermediate",
1178
- "genre": [
1179
- "World"
1180
- ],
1181
- "id": 316772,
1182
- "image": "https://cdn.sanity.io/images/4032r8py/staging/71d486fb654edd0b719444b982ccd5f86adea1a4-1920x1080.png",
1183
- "length_in_seconds": 215,
1184
- "lesson_count": null,
1185
- "lessons": null,
1186
- "parent_content_data": null,
1187
- "permission_id": [
1188
- 1,
1189
- 91,
1190
- 92
1191
- ],
1192
- "progress_percent": null,
1193
- "published_on": "2021-08-30T17:00:00.000000Z",
1194
- "railcontent_id": 316772,
1195
- "sanity_id": "play-along_316772",
1196
- "slug": "bossa-nova",
1197
- "status": "published",
1198
- "thumbnail": "https://cdn.sanity.io/images/4032r8py/staging/71d486fb654edd0b719444b982ccd5f86adea1a4-1920x1080.png",
1199
- "title": "Bossa Nova",
1200
- "type": "play-along",
1201
- "url": "/drumeo/play-alongs/bossa-nova/316772",
1202
- "web_url_path": "/drumeo/play-alongs/bossa-nova/316772",
1203
- "xp": 150,
1204
- "need_access": false
1205
- },
1206
- {
1207
- "artist": null,
1208
- "artist_name": "Brandon Toews",
1209
- "brand": "drumeo",
1210
- "child_count": null,
1211
- "difficulty": 8,
1212
- "difficulty_string": "Expert",
1213
- "genre": [
1214
- "Jazz",
1215
- "World"
1216
- ],
1217
- "id": 335025,
1218
- "image": "https://cdn.sanity.io/images/4032r8py/staging/52b3841879d31248d69ca5b811925f41c0767799-1920x1080.jpg",
1219
- "length_in_seconds": 322,
1220
- "lesson_count": null,
1221
- "lessons": null,
1222
- "parent_content_data": null,
1223
- "permission_id": [
1224
- 89,
1225
- 94,
1226
- 88,
1227
- 90,
1228
- 78,
1229
- 92
1230
- ],
1231
- "progress_percent": null,
1232
- "published_on": "2022-08-04T15:00:00.000000Z",
1233
- "railcontent_id": 335025,
1234
- "sanity_id": "play-along_335025",
1235
- "slug": "a-night-in-tunisia",
1236
- "status": "published",
1237
- "thumbnail": "https://cdn.sanity.io/images/4032r8py/staging/52b3841879d31248d69ca5b811925f41c0767799-1920x1080.jpg",
1238
- "title": "A Night In Tunisia",
1239
- "type": "play-along",
1240
- "url": "/drumeo/play-alongs/a-night-in-tunisia/335025",
1241
- "web_url_path": "/drumeo/play-alongs/a-night-in-tunisia/335025",
1242
- "xp": 200,
1243
- "need_access": false
1244
- },
1245
- {
1246
- "artist": null,
1247
- "artist_name": "Sharon Ransom",
1248
- "brand": "drumeo",
1249
- "child_count": null,
1250
- "difficulty": 2,
1251
- "difficulty_string": "Beginner",
1252
- "genre": null,
1253
- "id": 325826,
1254
- "image": "https://cdn.sanity.io/images/4032r8py/staging/52e8e79926d2b7a88250daf24d8f394493ebacfa-1920x1080.jpg",
1255
- "length_in_seconds": 1079,
1256
- "lesson_count": null,
1257
- "lessons": null,
1258
- "parent_content_data": null,
1259
- "permission_id": [
1260
- 1,
1261
- 91,
1262
- 92
1263
- ],
1264
- "progress_percent": null,
1265
- "published_on": "2021-11-10T18:00:00.000000Z",
1266
- "railcontent_id": 325826,
1267
- "sanity_id": "quick-tips_325826",
1268
- "slug": "10-easy-fills-for-every-beginner-drummer",
1269
- "status": "published",
1270
- "thumbnail": "https://cdn.sanity.io/images/4032r8py/staging/52e8e79926d2b7a88250daf24d8f394493ebacfa-1920x1080.jpg",
1271
- "title": "10 Easy Fills For Every Beginner Drummer",
1272
- "type": "quick-tips",
1273
- "url": "/drumeo/quick-tips/10-easy-fills-for-every-beginner-drummer/325826",
1274
- "web_url_path": "/drumeo/quick-tips/10-easy-fills-for-every-beginner-drummer/325826",
1275
- "xp": 100,
1276
- "need_access": false
1277
- },
1278
- {
1279
- "artist": null,
1280
- "artist_name": "John Wooton",
1281
- "brand": "drumeo",
1282
- "child_count": null,
1283
- "difficulty": 2,
1284
- "difficulty_string": "Beginner",
1285
- "genre": null,
1286
- "id": 373171,
1287
- "image": "https://cdn.sanity.io/images/4032r8py/staging/8a5dbebf43bc3509b8a6f3dd794424324ecd251d-1920x1080.jpg",
1288
- "length_in_seconds": 68,
1289
- "lesson_count": null,
1290
- "lessons": null,
1291
- "parent_content_data": null,
1292
- "permission_id": [
1293
- 1,
1294
- 91,
1295
- 92
1296
- ],
1297
- "progress_percent": null,
1298
- "published_on": "2022-10-03T13:40:00.000000Z",
1299
- "railcontent_id": 373171,
1300
- "sanity_id": "rudiment_373171",
1301
- "slug": "single-stroke-roll",
1302
- "status": "published",
1303
- "thumbnail": "https://cdn.sanity.io/images/4032r8py/staging/8a5dbebf43bc3509b8a6f3dd794424324ecd251d-1920x1080.jpg",
1304
- "title": "Single Stroke Roll",
1305
- "type": "rudiment",
1306
- "url": "/drumeo/rudiments/single-stroke-roll/373171",
1307
- "web_url_path": "/drumeo/rudiments/single-stroke-roll/373171",
1308
- "xp": 100,
1309
- "need_access": false
1310
- },
1311
- {
1312
- "artist": {
1313
- "_ref": "artist_toto",
1314
- "_type": "reference"
1315
- },
1316
- "artist_name": "Toto",
1317
- "brand": "drumeo",
1318
- "child_count": 1,
1319
- "difficulty": 7,
1320
- "difficulty_string": "Advanced",
1321
- "genre": [
1322
- "Rock"
1323
- ],
1324
- "id": 260677,
1325
- "image": "https://cdn.sanity.io/images/4032r8py/staging/d16f12dd5f51020677e78b4abcf98c0aba00b17e-1500x1500.jpg",
1326
- "length_in_seconds": 330,
1327
- "lesson_count": 1,
1328
- "lessons": null,
1329
- "parent_content_data": null,
1330
- "permission_id": [
1331
- 94,
1332
- 78,
1333
- 92
1334
- ],
1335
- "progress_percent": null,
1336
- "published_on": "2020-06-16T18:47:16.000000Z",
1337
- "railcontent_id": 260677,
1338
- "sanity_id": "song_260677",
1339
- "slug": "rosanna-toto",
1340
- "status": "published",
1341
- "thumbnail": "https://cdn.sanity.io/images/4032r8py/staging/d16f12dd5f51020677e78b4abcf98c0aba00b17e-1500x1500.jpg",
1342
- "title": "Rosanna ",
1343
- "type": "song",
1344
- "url": "/drumeo/songs/rosanna-toto/260677",
1345
- "web_url_path": "/drumeo/songs/rosanna-toto/260677",
1346
- "xp": 0,
1347
- "need_access": false
1348
- },
1349
- {
1350
- "artist": null,
1351
- "artist_name": "Emmanuelle Caplette",
1352
- "brand": "drumeo",
1353
- "child_count": null,
1354
- "difficulty": 3,
1355
- "difficulty_string": "Beginner",
1356
- "genre": null,
1357
- "id": 402009,
1358
- "image": "https://cdn.sanity.io/images/4032r8py/staging/1c75d30bee7dacb3186966725fad31c62eff031f-1920x1080.jpg",
1359
- "length_in_seconds": 363,
1360
- "lesson_count": null,
1361
- "lessons": null,
1362
- "parent_content_data": null,
1363
- "permission_id": [
1364
- 91,
1365
- 92,
1366
- 1
1367
- ],
1368
- "progress_percent": null,
1369
- "published_on": "2023-12-28T00:01:00.000000Z",
1370
- "railcontent_id": 402009,
1371
- "sanity_id": "workout_402009",
1372
- "slug": "beginner-pad-warm-up",
1373
- "status": "published",
1374
- "thumbnail": "https://cdn.sanity.io/images/4032r8py/staging/1c75d30bee7dacb3186966725fad31c62eff031f-1920x1080.jpg",
1375
- "title": "Beginner Pad Warm-Up",
1376
- "type": "workout",
1377
- "url": "/drumeo/workouts/beginner-pad-warm-up/402009",
1378
- "web_url_path": "/drumeo/workouts/beginner-pad-warm-up/402009",
1379
- "xp": 100,
1380
- "need_access": false
1381
- },
1382
- {
1383
- "artist": null,
1384
- "artist_name": "Brandon Toews",
1385
- "brand": "drumeo",
1386
- "child_count": null,
1387
- "difficulty": 2,
1388
- "difficulty_string": "Beginner",
1389
- "genre": null,
1390
- "id": 402021,
1391
- "image": "https://cdn.sanity.io/images/4032r8py/staging/adf501ca588e590529717d7049ea4d14ae478d7b-1920x1080.jpg",
1392
- "length_in_seconds": 653,
1393
- "lesson_count": null,
1394
- "lessons": null,
1395
- "parent_content_data": null,
1396
- "permission_id": [
1397
- 91,
1398
- 92,
1399
- 1
1400
- ],
1401
- "progress_percent": null,
1402
- "published_on": "2023-12-28T00:01:00.000000Z",
1403
- "railcontent_id": 402021,
1404
- "sanity_id": "workout_402021",
1405
- "slug": "weak-hand-warm-up",
1406
- "status": "published",
1407
- "thumbnail": "https://cdn.sanity.io/images/4032r8py/staging/adf501ca588e590529717d7049ea4d14ae478d7b-1920x1080.jpg",
1408
- "title": "Weak Hand Warm-Up",
1409
- "type": "workout",
1410
- "url": "/drumeo/workouts/weak-hand-warm-up/402021",
1411
- "web_url_path": "/drumeo/workouts/weak-hand-warm-up/402021",
1412
- "xp": 100,
1413
- "need_access": false
1414
- },
1415
- {
1416
- "artist": null,
1417
- "artist_name": "Aaron Graham",
1418
- "brand": "drumeo",
1419
- "child_count": null,
1420
- "difficulty": 3,
1421
- "difficulty_string": "Beginner",
1422
- "genre": null,
1423
- "id": 411091,
1424
- "image": "https://cdn.sanity.io/images/4032r8py/staging/cde7b1acc790899ef3c33521973c7a8dbce07f9b-1920x1080.jpg",
1425
- "length_in_seconds": 589,
1426
- "lesson_count": null,
1427
- "lessons": null,
1428
- "parent_content_data": null,
1429
- "permission_id": [
1430
- 78,
1431
- 89,
1432
- 91,
1433
- 92,
1434
- 88,
1435
- 90
1436
- ],
1437
- "progress_percent": null,
1438
- "published_on": "2024-08-08T19:00:00.000000Z",
1439
- "railcontent_id": 411091,
1440
- "sanity_id": "workout_411091",
1441
- "slug": "2-handed-hi-hat-grooves",
1442
- "status": "published",
1443
- "thumbnail": "https://cdn.sanity.io/images/4032r8py/staging/cde7b1acc790899ef3c33521973c7a8dbce07f9b-1920x1080.jpg",
1444
- "title": "2-Handed Hi-Hat Grooves",
1445
- "type": "workout",
1446
- "url": "/drumeo/workouts/2-handed-hi-hat-grooves/411091",
1447
- "web_url_path": "/drumeo/workouts/2-handed-hi-hat-grooves/411091",
1448
- "xp": 100,
1449
- "need_access": false
1450
- }
1451
- ]