musora-content-services 2.167.2 → 2.167.4

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 (140) hide show
  1. package/.agent/decisions/2026-07-20-mu2-1724-songs-lessons-counts.md +33 -0
  2. package/.agent/decisions/2026-07-20-query-builder-tostring.md +37 -0
  3. package/.idea/codeStyles/Project.xml +61 -0
  4. package/.idea/codeStyles/codeStyleConfig.xml +5 -0
  5. package/.idea/modules.xml +8 -0
  6. package/.idea/musora-content-services.iml +8 -0
  7. package/.idea/php.xml +19 -0
  8. package/.idea/prettier.xml +6 -0
  9. package/.idea/vcs.xml +7 -0
  10. package/.yarn/install-state.gz +0 -0
  11. package/CHANGELOG.md +10 -0
  12. package/package.json +2 -1
  13. package/src/contentTypeConfig.js +1 -0
  14. package/src/lib/sanity/query.ts +5 -0
  15. package/src/services/config.js +15 -0
  16. package/src/services/content/artist.ts +1 -3
  17. package/src/services/content/counts.ts +47 -0
  18. package/src/services/content/genre.ts +1 -3
  19. package/src/services/content/instructor.ts +1 -3
  20. package/src/services/multi-user-accounts/multi-user-accounts.ts +1 -0
  21. package/src/services/userActivity.js +2 -0
  22. package/src/version-info.js +1 -0
  23. package/.claude/settings.local.json +0 -53
  24. package/test/initializeTests.js +0 -60
  25. package/test/integration/awards/award-exclusion-handling.test.ts +0 -275
  26. package/test/integration/awards/internal/image-utils.test.ts +0 -86
  27. package/test/integration/content-progress/__mocks__/mocks.ts +0 -104
  28. package/test/integration/content-progress/contentProgress.test.ts +0 -335
  29. package/test/integration/content-progress/e2eOfflineProgress.test.ts +0 -352
  30. package/test/integration/content-progress/e2eProgress.test.ts +0 -612
  31. package/test/integration/content-progress/getters.test.ts +0 -334
  32. package/test/integration/content-progress/helpers.test.ts +0 -263
  33. package/test/integration/content-progress/offlineContentProgress.test.ts +0 -226
  34. package/test/integration/forums.test.ts +0 -209
  35. package/test/integration/infrastructure/FetchRequestExecutor.test.ts +0 -88
  36. package/test/integration/initializeTestDB.ts +0 -80
  37. package/test/integration/learning-paths.test.ts +0 -854
  38. package/test/integration/notifications.test.ts +0 -178
  39. package/test/integration/progress-row/content-card.test.ts +0 -283
  40. package/test/integration/sync/adapters/idb-errors.test.ts +0 -144
  41. package/test/integration/sync/adapters/sqlite-errors.test.ts +0 -173
  42. package/test/integration/sync/fetch.test.ts +0 -224
  43. package/test/integration/sync/repositories/content-likes.test.ts +0 -99
  44. package/test/integration/sync/repositories/practices.test.ts +0 -179
  45. package/test/integration/sync/repositories/progress.test.ts +0 -245
  46. package/test/integration/sync/repositories/user-award-progress.static.test.ts +0 -68
  47. package/test/integration/sync/repositories/user-award-progress.test.ts +0 -387
  48. package/test/integration/sync/store/cross-user-protection.test.ts +0 -217
  49. package/test/integration/sync/store/store-idb.test.ts +0 -180
  50. package/test/integration/sync/store/store.test.ts +0 -361
  51. package/test/integration/user/permissions.test.js +0 -20
  52. package/test/integration/userActivity.test.ts +0 -102
  53. package/test/live/README.md +0 -29
  54. package/test/live/content.test.js +0 -116
  55. package/test/localStorageMock.js +0 -21
  56. package/test/log.js +0 -5
  57. package/test/mockData/award-definitions.js +0 -171
  58. package/test/mockData/mockData_fetchByRailContentIds_one_content.json +0 -35
  59. package/test/mockData/mockData_progress_content.json +0 -182
  60. package/test/mockData/mockData_sanity_progress_content.json +0 -1451
  61. package/test/mockData/mockData_user_practices.json +0 -9
  62. package/test/setupConsole.js +0 -6
  63. package/test/setupNetworkGuard.js +0 -3
  64. package/test/setupTimers.js +0 -13
  65. package/test/unit/HttpClient.test.ts +0 -267
  66. package/test/unit/awards/award-alacarte-observer.test.ts +0 -199
  67. package/test/unit/awards/award-auto-refresh.test.ts +0 -84
  68. package/test/unit/awards/award-calculations.test.ts +0 -34
  69. package/test/unit/awards/award-callbacks.test.ts +0 -144
  70. package/test/unit/awards/award-certificate-display.test.ts +0 -330
  71. package/test/unit/awards/award-collection-edge-cases.test.ts +0 -212
  72. package/test/unit/awards/award-collection-filtering.test.ts +0 -287
  73. package/test/unit/awards/award-completion-flow.test.ts +0 -306
  74. package/test/unit/awards/award-multi-lesson.test.ts +0 -243
  75. package/test/unit/awards/award-observer-integration.test.ts +0 -327
  76. package/test/unit/awards/award-query-messages.test.ts +0 -448
  77. package/test/unit/awards/award-user-collection.test.ts +0 -416
  78. package/test/unit/awards/duplicate-prevention.test.ts +0 -120
  79. package/test/unit/awards/helpers/completion-mock.ts +0 -56
  80. package/test/unit/awards/helpers/index.ts +0 -3
  81. package/test/unit/awards/helpers/mock-setup.ts +0 -79
  82. package/test/unit/awards/helpers/progress-emitter.ts +0 -45
  83. package/test/unit/awards/message-generator.test.ts +0 -162
  84. package/test/unit/content-progress/bubbleTrickle.test.ts +0 -322
  85. package/test/unit/content-progress/helpers.test.ts +0 -329
  86. package/test/unit/content-progress/navigateTo.test.ts +0 -392
  87. package/test/unit/contentLikes.test.ts +0 -62
  88. package/test/unit/contentMetaData.test.ts +0 -58
  89. package/test/unit/dataContext.test.ts +0 -38
  90. package/test/unit/dateUtils.test.ts +0 -188
  91. package/test/unit/endScreen.test.js +0 -712
  92. package/test/unit/eventsAPI.test.ts +0 -159
  93. package/test/unit/imageSRCBuilder.test.ts +0 -37
  94. package/test/unit/imageSRCVerify.test.ts +0 -155
  95. package/test/unit/infrastructure/DefaultHeaderProvider.test.ts +0 -39
  96. package/test/unit/infrastructure/sanity/ContentClient.test.ts +0 -168
  97. package/test/unit/infrastructure/sanity/DefaultConfigProvider.test.ts +0 -93
  98. package/test/unit/infrastructure/sanity/FetchQueryExecutor.test.ts +0 -174
  99. package/test/unit/infrastructure/sanity/SanityClient.test.ts +0 -140
  100. package/test/unit/lib/__snapshots__/filter.test.ts.snap +0 -5
  101. package/test/unit/lib/filter.test.ts +0 -1154
  102. package/test/unit/lib/lastUpdated.test.ts +0 -21
  103. package/test/unit/lib/query.test.ts +0 -1469
  104. package/test/unit/lib/sanity/decorators/base.test.ts +0 -368
  105. package/test/unit/lib/sanity/decorators/navigate-to.test.ts +0 -361
  106. package/test/unit/lib/sanity/decorators/need-access.test.ts +0 -89
  107. package/test/unit/lib/sanity/decorators/need-lifetime-upgrade.test.ts +0 -85
  108. package/test/unit/lib/sanity/decorators/page-type.test.ts +0 -81
  109. package/test/unit/playerSettings.test.ts +0 -73
  110. package/test/unit/progress-row/content-card.test.ts +0 -314
  111. package/test/unit/progress-row/playlist-card.test.ts +0 -104
  112. package/test/unit/progressRows.test.ts +0 -243
  113. package/test/unit/recommendations.test.js +0 -47
  114. package/test/unit/sanityQueryService.test.ts +0 -200
  115. package/test/unit/search.test.ts +0 -44
  116. package/test/unit/sentry.test.ts +0 -62
  117. package/test/unit/services/progress-internal/bubble.test.ts +0 -279
  118. package/test/unit/services/progress.test.ts +0 -396
  119. package/test/unit/streakMessage.test.ts +0 -251
  120. package/test/unit/sync/context.test.ts +0 -51
  121. package/test/unit/sync/effects/logout-warning.test.ts +0 -158
  122. package/test/unit/sync/effects/push-failure-notification.test.ts +0 -196
  123. package/test/unit/sync/errors/sync-errors.test.ts +0 -106
  124. package/test/unit/sync/errors/validators.test.ts +0 -61
  125. package/test/unit/sync/helpers/TestModel.ts +0 -44
  126. package/test/unit/sync/helpers/index.ts +0 -172
  127. package/test/unit/sync/manager.test.ts +0 -303
  128. package/test/unit/sync/models/user-award-progress.test.ts +0 -82
  129. package/test/unit/sync/resolver.test.ts +0 -229
  130. package/test/unit/sync/retry.test.ts +0 -314
  131. package/test/unit/sync/run-scope.test.ts +0 -23
  132. package/test/unit/sync/stale-record-cleanup.test.ts +0 -107
  133. package/test/unit/sync/store/push-coalescer.test.ts +0 -156
  134. package/test/unit/sync/store-configs.test.ts +0 -37
  135. package/test/unit/sync/telemetry/sync-telemetry.test.ts +0 -118
  136. package/test/unit/sync/utils/event-emitter.test.ts +0 -64
  137. package/test/unit/sync/utils/throttle.test.ts +0 -245
  138. package/test/unit/url-builder.test.ts +0 -72
  139. package/test/unit/user/account.test.ts +0 -66
  140. package/test/unit/user/permissions.test.js +0 -191
@@ -1,171 +0,0 @@
1
- export const mockAwardDefinitions = [
2
- {
3
- _id: '0238b1e5-ebee-42b3-9390-91467d113575',
4
- award: 'https://cdn.sanity.io/files/4032r8py/staging/309b154d38165788c47674e5c7607d66944d5dde.png',
5
- award_custom_text: null,
6
- badge: 'https://cdn.sanity.io/files/4032r8py/staging/309b154d38165788c47674e5c7607d66944d5dde.png',
7
- brand: 'drumeo',
8
- child_ids: [416448],
9
- content_id: 416446,
10
- content_title: 'Adrian Guided Course Test',
11
- content_type: 'guided-course',
12
- instructor_name: 'Aaron Graham',
13
- instructor_signature: 'https://cdn.sanity.io/files/4032r8py/staging/2e89dcaea7b76bba8c499e80d660e45fe2c06a16.png',
14
- is_active: true,
15
- logo: null,
16
- name: 'Adrian Guided Course Test Award',
17
- type: 'content-award'
18
- },
19
- {
20
- _id: '0f49cb6a-1b23-4628-968e-15df02ffad7f',
21
- award: 'https://cdn.sanity.io/files/4032r8py/staging/d9bdc3a9a7ac688a114264b5804a7add117d6a0f.png',
22
- award_custom_text: 'Huzzah congratz',
23
- badge: 'https://cdn.sanity.io/files/4032r8py/staging/8fb18f7645f9b1820629f7ee643bdeb771da7e28.png',
24
- brand: 'pianote',
25
- child_ids: [417045, 417046, 417047, 417048],
26
- content_id: 417049,
27
- content_title: 'Enrolling w/ Kickoff, has product GC (EC)',
28
- content_type: 'guided-course',
29
- instructor_name: 'Lisa Witt',
30
- instructor_signature: null,
31
- is_active: true,
32
- logo: 'https://cdn.sanity.io/images/4032r8py/staging/dca075e5107fddb33b78778d67f6fce03501f579-2000x1033.svg',
33
- name: 'Enrolling w/ Kickoff, has product GC (EC)',
34
- type: 'content-award'
35
- },
36
- {
37
- _id: '1575d0df-63ff-4611-a472-230e3e688660',
38
- award: 'https://cdn.sanity.io/files/4032r8py/staging/ac68a54931fd8952b8c86844ed341d76ebdc079c.png',
39
- award_custom_text: null,
40
- badge: 'https://cdn.sanity.io/files/4032r8py/staging/f3df910730c5722f52e777c8fc63d6a53bda91ec.png',
41
- brand: 'drumeo',
42
- child_ids: [
43
- 416467, 416468, 416469, 416470, 416471, 416472, 416473,
44
- 416474, 416475, 416476, 416477, 416478, 416479, 416480, 416481,
45
- 416482, 416483, 416484, 416485, 416486, 416487, 416488, 416489
46
- ],
47
- content_id: 416464,
48
- content_title: '30-Day Drummer GC',
49
- content_type: 'guided-course',
50
- instructor_name: 'Domino Santantonio',
51
- instructor_signature: null,
52
- is_active: true,
53
- logo: null,
54
- name: '30 day drummer awardzz',
55
- type: 'content-award'
56
- },
57
- {
58
- _id: '361f3034-c6c9-45f7-bbfb-0d58dbe14411',
59
- award: 'https://cdn.sanity.io/files/4032r8py/staging/20e9a8258d00818074f472700d2ca97d91956e80.png',
60
- award_custom_text: 'AN AWARD!',
61
- badge: 'https://cdn.sanity.io/files/4032r8py/staging/da59100c0b16e446700c9285e827b4545766a7b3.png',
62
- brand: 'drumeo',
63
- child_ids: [
64
- 417105, 417111, 417117, 417106, 417112, 417118, 417107, 417113,
65
- 417119, 416951, 417108, 416952, 417114, 416953, 417121, 416954,
66
- 417109, 416955, 417115, 416956, 417122, 416957
67
- ],
68
- content_id: 417140,
69
- content_title: 'Learn To Play The Drums',
70
- content_type: 'learning-path-v2',
71
- instructor_name: null,
72
- instructor_signature: null,
73
- is_active: true,
74
- logo: null,
75
- name: 'Learning Path 1 Award',
76
- type: 'content-award'
77
- },
78
- {
79
- _id: '7e54cfbd-1543-462f-944a-19f3efb96aa0',
80
- award: 'https://cdn.sanity.io/files/4032r8py/staging/d20959255e9dbc5d955214b86b7dfe8db4cccde3.png',
81
- award_custom_text: 'asadadsafaafafafad yay',
82
- badge: 'https://cdn.sanity.io/files/4032r8py/staging/fdb15efdc07061a6ff54fdf7dd1b6101d4d6dd54.png',
83
- brand: 'pianote',
84
- child_ids: [417035, 417036, 417038],
85
- content_id: 417039,
86
- content_title: 'Enrolling w/o Kickoff, no product GC (LS101)',
87
- content_type: 'course',
88
- instructor_name: 'Lisa Witt',
89
- instructor_signature: null,
90
- is_active: true,
91
- logo: 'https://cdn.sanity.io/images/4032r8py/staging/6ad3b1671d072e866233ee6b471d12c69afff0d0-469x177.png',
92
- name: 'Enrolling w/o Kickoff, no product GC (LS101)',
93
- type: 'content-award'
94
- },
95
- {
96
- _id: 'cae0d533-faeb-4a96-a6b5-07ef8c7861ab',
97
- award: 'https://cdn.sanity.io/files/4032r8py/staging/2e791954fcf7b0fcf32b55bf194395ccdd7228f6.png',
98
- award_custom_text: null,
99
- badge: 'https://cdn.sanity.io/files/4032r8py/staging/1cef6272cc2fd7d1b948c80a995c29cf2a8b47b2.png',
100
- brand: 'drumeo',
101
- child_ids: [416451, 416453, 416454, 416456, 416457, 416458, 416459, 416460, 416461, 416463],
102
- content_id: 416450,
103
- content_title: '10-Day Fills GC',
104
- content_type: 'guided-course',
105
- instructor_name: 'Domino Santantonio',
106
- instructor_signature: null,
107
- is_active: true,
108
- logo: null,
109
- name: 'The Chris award',
110
- type: 'content-award'
111
- },
112
- {
113
- _id: 'f7743699-13e0-4c4e-bfec-94a816cfec3e',
114
- award: 'https://cdn.sanity.io/files/4032r8py/staging/d20959255e9dbc5d955214b86b7dfe8db4cccde3.png',
115
- award_custom_text: 'You did it!! Yaaay',
116
- badge: 'https://cdn.sanity.io/files/4032r8py/staging/ccb12884b7acf0c2a1b0f5dc69be6e93d95228ed.png',
117
- brand: 'drumeo',
118
- child_ids: [416444, 416445],
119
- content_id: 416442,
120
- content_title: 'Development GC 1',
121
- content_type: 'guided-course',
122
- instructor_name: 'BABY BOY DRUMMER',
123
- instructor_signature: 'https://cdn.sanity.io/files/4032r8py/staging/da66880e96fb8288e6d54ed0de3e7be4564c7989.pdf',
124
- is_active: true,
125
- logo: 'https://cdn.sanity.io/images/4032r8py/staging/d20959255e9dbc5d955214b86b7dfe8db4cccde3-722x834.png',
126
- name: "Adrian's cool award",
127
- type: 'content-award'
128
- },
129
- {
130
- _id: 'a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d',
131
- award: 'https://cdn.sanity.io/files/4032r8py/staging/test-skill-pack-award.png',
132
- award_custom_text: null,
133
- badge: 'https://cdn.sanity.io/files/4032r8py/staging/test-skill-pack-badge.png',
134
- brand: 'drumeo',
135
- child_ids: [418001, 418002, 418003],
136
- content_id: 418000,
137
- content_title: 'Drum Rudiments Pack',
138
- content_type: 'skill-pack',
139
- instructor_name: 'Domino Santantonio',
140
- instructor_signature: null,
141
- is_active: true,
142
- logo: null,
143
- name: 'Drum Rudiments Pack Award',
144
- type: 'content-award'
145
- },
146
- {
147
- _id: 'b2c3d4e5-f6a7-4b8c-9d0e-1f2a3b4c5d6e',
148
- award: 'https://cdn.sanity.io/files/4032r8py/staging/test-learning-path-award.png',
149
- award_custom_text: null,
150
- badge: 'https://cdn.sanity.io/files/4032r8py/staging/test-learning-path-badge.png',
151
- brand: 'drumeo',
152
- child_ids: [418003, 418004, 418005],
153
- content_id: 418010,
154
- content_title: 'Beginner Drum Journey',
155
- content_type: 'learning-path-v2',
156
- instructor_name: 'Domino Santantonio',
157
- instructor_signature: null,
158
- is_active: true,
159
- logo: null,
160
- name: 'Beginner Drum Journey Award',
161
- type: 'content-award'
162
- }
163
- ]
164
-
165
- export const getAwardByContentId = (contentId) => {
166
- return mockAwardDefinitions.find(award => award.content_id === contentId)
167
- }
168
-
169
- export const getAwardById = (awardId) => {
170
- return mockAwardDefinitions.find(award => award._id === awardId)
171
- }
@@ -1,35 +0,0 @@
1
- [
2
- {
3
- "permission_id": [
4
- 78,
5
- 89,
6
- 91,
7
- 92,
8
- 88,
9
- 90
10
- ],
11
- "thumbnail": "https://cdn.sanity.io/images/4032r8py/staging/5f15b20b428c06263fd39599fc310ab00eb05fee-1920x1080.jpg",
12
- "difficulty_string": "Beginner",
13
- "url": "/drumeo/quick-tips/how-to-play-drums/415183",
14
- "lesson_count": null,
15
- "id": 415183,
16
- "image": "https://cdn.sanity.io/images/4032r8py/staging/5f15b20b428c06263fd39599fc310ab00eb05fee-1920x1080.jpg",
17
- "web_url_path": "/drumeo/quick-tips/how-to-play-drums/415183",
18
- "type": "quick-tips",
19
- "brand": "drumeo",
20
- "genre": null,
21
- "status": "published",
22
- "xp": 100,
23
- "railcontent_id": 415183,
24
- "artist": null,
25
- "progress_percent": null,
26
- "child_count": null,
27
- "sanity_id": "quick-tips_415183",
28
- "artist_name": "Brandon Toews",
29
- "title": "How To Play Drums",
30
- "difficulty": 3,
31
- "published_on": "2024-12-13T12:00:00.000000Z",
32
- "length_in_seconds": 576,
33
- "slug": "how-to-play-drums"
34
- }
35
- ]
@@ -1,182 +0,0 @@
1
- {
2
- "257242": {
3
- "last_update": 1747657503,
4
- "progress": 13,
5
- "status": "started",
6
- "brand": "drumeo"
7
- },
8
- "257243": {
9
- "last_update": 1747657502,
10
- "progress": 52,
11
- "status": "started",
12
- "brand": "drumeo"
13
- },
14
- "257245": {
15
- "last_update": 1747657470,
16
- "progress": 62,
17
- "status": "started",
18
- "brand": "drumeo"
19
- },
20
- "257249": {
21
- "last_update": 1747657493,
22
- "progress": 100,
23
- "status": "completed",
24
- "brand": "drumeo"
25
- },
26
- "257250": {
27
- "last_update": 1747657502,
28
- "progress": 100,
29
- "status": "completed",
30
- "brand": "drumeo"
31
- },
32
- "259238": {
33
- "last_update": 1747657495,
34
- "progress": 100,
35
- "status": "completed",
36
- "brand": "drumeo"
37
- },
38
- "259240": {
39
- "last_update": 1747657505,
40
- "progress": 100,
41
- "status": "completed",
42
- "brand": "drumeo"
43
- },
44
- "260677": {
45
- "last_update": 1747318330,
46
- "progress": 100,
47
- "status": "completed",
48
- "brand": "drumeo"
49
- },
50
- "274368": {
51
- "last_update": 1747211391,
52
- "progress": 20,
53
- "status": "started",
54
- "brand": "drumeo"
55
- },
56
- "274889": {
57
- "last_update": 1747211391,
58
- "progress": 100,
59
- "status": "completed",
60
- "brand": "drumeo"
61
- },
62
- "280498": {
63
- "last_update": 1747726731,
64
- "progress": 60,
65
- "status": "started",
66
- "brand": "drumeo"
67
- },
68
- "287853": {
69
- "last_update": 1747647688,
70
- "progress": 100,
71
- "status": "completed",
72
- "brand": "drumeo"
73
- },
74
- "287855": {
75
- "last_update": 1747726731,
76
- "progress": 100,
77
- "status": "completed",
78
- "brand": "drumeo"
79
- },
80
- "287858": {
81
- "last_update": 1747653734,
82
- "progress": 100,
83
- "status": "completed",
84
- "brand": "drumeo"
85
- },
86
- "316732": {
87
- "last_update": 1747319258,
88
- "progress": 0,
89
- "status": "started",
90
- "brand": "drumeo"
91
- },
92
- "316752": {
93
- "last_update": 1747402511,
94
- "progress": 80,
95
- "status": "started",
96
- "brand": "drumeo"
97
- },
98
- "316772": {
99
- "last_update": 1747319687,
100
- "progress": 100,
101
- "status": "completed",
102
- "brand": "drumeo"
103
- },
104
- "325826": {
105
- "last_update": 1747324670,
106
- "progress": 41,
107
- "status": "started",
108
- "brand": "drumeo"
109
- },
110
- "335025": {
111
- "last_update": 1747315549,
112
- "progress": 0,
113
- "status": "started",
114
- "brand": "drumeo"
115
- },
116
- "373171": {
117
- "last_update": 1747211114,
118
- "progress": 100,
119
- "status": "completed",
120
- "brand": "drumeo"
121
- },
122
- "373172": {
123
- "last_update": 1747211114,
124
- "progress": 100,
125
- "status": "completed",
126
- "brand": "drumeo"
127
- },
128
- "402009": {
129
- "last_update": 1747293447,
130
- "progress": 100,
131
- "status": "completed",
132
- "brand": "drumeo"
133
- },
134
- "402021": {
135
- "last_update": 1747318769,
136
- "progress": 100,
137
- "status": "completed",
138
- "brand": "drumeo"
139
- },
140
- "402199": {
141
- "last_update": 1747318734,
142
- "progress": 0,
143
- "status": "started",
144
- "brand": "drumeo"
145
- },
146
- "410255": {
147
- "last_update": 1747211224,
148
- "progress": 100,
149
- "status": "completed",
150
- "brand": "drumeo"
151
- },
152
- "410478": {
153
- "last_update": 1747657306,
154
- "progress": 22,
155
- "status": "started",
156
- "brand": "drumeo"
157
- },
158
- "410480": {
159
- "last_update": 1747657295,
160
- "progress": 100,
161
- "status": "completed",
162
- "brand": "drumeo"
163
- },
164
- "410481": {
165
- "last_update": 1747657306,
166
- "progress": 100,
167
- "status": "completed",
168
- "brand": "drumeo"
169
- },
170
- "411091": {
171
- "last_update": 1747318457,
172
- "progress": 100,
173
- "status": "completed",
174
- "brand": "drumeo"
175
- },
176
- "415585": {
177
- "last_update": 1747319147,
178
- "progress": 100,
179
- "status": "completed",
180
- "brand": "drumeo"
181
- }
182
- }