A tool to scrobble tracks from your Apple Music data export to Teal.fm.
1export type AppleMusicPlaybackEvent = {
2 "Age Bucket": string;
3 "Album Name": string;
4 "Apple ID Number": string;
5 "Apple Music Subscription": string;
6 "Auto Play": string;
7 "Build Version": string;
8 "Bundle Version": string;
9 "Camera Option": string;
10 "Carrier Name": string;
11 "Client Build Version": string;
12 "Client Device Name": string;
13 "Client IP Address": string;
14 "Client Platform": string;
15 "Container Album Name": string;
16 "Container Artist Name": string;
17 "Container Global Playlist ID": string;
18 "Container ID": string;
19 "Container iTunes Playlist ID": string;
20 "Container Library ID": string;
21 "Container Name": string;
22 "Container Origin Type": string;
23 "Container Personalized ID": string;
24 "Container Playlist Folder ID": string;
25 "Container Playlist ID": string;
26 "Container Radio Station ID": string;
27 "Container Radio Station Version": string;
28 "Container Season ID": string;
29 "Container Type": string;
30 "Contingency": string;
31 "Continuity Microphone Used": string;
32 "Device App Name": string;
33 "Device App Version": string;
34 "Device Identifier": string;
35 "Device OS Name": string;
36 "Device OS Version": string;
37 "Device Type": string;
38 "Display Count": string;
39 "Display Language": string;
40 "Display Type": string;
41 "End Position In Milliseconds": string;
42 "End Reason Type": string;
43 "Evaluation Variant": string;
44 "Event End Timestamp": string;
45 "Event ID": string;
46 "Event Post Date Time": string;
47 "Event Reason Hint Type": string;
48 "Event Received Timestamp": string;
49 "Event Start Timestamp": string;
50 "Event Timestamp": string;
51 "Event Type": string;
52 "Feature Name": string;
53 "Grace Period": string;
54 "Grouping": string;
55 "House ID": string;
56 "IP City": string;
57 "IP Country Code": string;
58 "IP Latitude": string;
59 "IP Longitude": string;
60 "IP Network": string;
61 "IP Network Type": string;
62 "IP Region Code": string;
63 "Is CMA Station": string;
64 "Is Collaborative": string;
65 "Is Delegated": string;
66 "Is Heatseeker Station": string;
67 "Is Heavy Rotation Station": string;
68 "Is Subscription Owner?": string;
69 "Is Vocal Attenuation": string;
70 "ISO Country": string;
71 "Item Type": string;
72 "Key Request": string;
73 "Lease Limit": string;
74 "Legacy Playback ID": string;
75 "Local Radio Station ID": string;
76 "Local Radio Station TuneIn ID": string;
77 "Managed ID": string;
78 "Matched Content": string;
79 "Media Bundle App Name": string;
80 "Media Bundle Type": string;
81 "Media Duration In Milliseconds": string;
82 "Media Type": string;
83 "Metrics Client ID": string;
84 "Milliseconds Since Play": string;
85 "Offline": string;
86 "Ownership Type": string;
87 "Personalized Name": string;
88 "Play Duration Milliseconds": string;
89 "Promotion Scenario ID": string;
90 "Pronunciation Displayed": string;
91 "Provided Audio Bit Depth": string;
92 "Provided Audio Channel": string;
93 "Provided Audio Sample Rate": string;
94 "Provided Bit Rate": string;
95 "Provided Codec": string;
96 "Provided Playback Format": string;
97 "Provider ID": string;
98 "Radio Format": string;
99 "Radio Seed ID": string;
100 "Radio Station Country": string;
101 "Radio Station ID": string;
102 "Radio Station Position": string;
103 "Radio Type": string;
104 "Radio User ID": string;
105 "Referral ID": string;
106 "Repeat Play": string;
107 "Report Type": string;
108 "Royalty Free": string;
109 "Sales Order Vendor ID": string;
110 "Session Is Shared": string;
111 "Shared Activity Devices-Current": string;
112 "Shared Activity Devices-Max": string;
113 "Shared Activity Type": string;
114 "Shelf Content Identifier": string;
115 "Shelf Content Position": string;
116 "Shelf Index": string;
117 "Shelf Type": string;
118 "Shelf Visible": string;
119 "Shuffle Play": string;
120 "Siri Request": string;
121 "Song Name": string;
122 "Source Model": string;
123 "Source Radio Name": string;
124 "Source Radio Type": string;
125 "Source Type": string;
126 "Start Position In Milliseconds": string;
127 "Store Front Name": string;
128 "Subscribed State": string;
129 "Subscription Bundle ID": string;
130 "Subscription Discovery Mode": string;
131 "Subscription Offer ID": string;
132 "Subscription Partner": string;
133 "Subscription Period": string;
134 "Subscription Pool Type": string;
135 "Subscription User ID": string;
136 "Transition Type": string;
137 "Translation Displayed": string;
138 "Use Listening History": string;
139 "User's Transition Type": string;
140 "User's Audio Quality": string;
141 "User's Playback Format": string;
142 "UTC Offset In Seconds": string;
143 "Vocal Attenuation Duration": string;
144 "Vocal Attenuation Model ID": string;
145};
146
147export type AppleMusicContainer = {
148 "Container Description": string;
149 "Container Type": string;
150 "Origin": string;
151 "Date Created": string;
152 "Play Duration Milliseconds": string;
153 "Artist Name": string;
154 "Last Played": string;
155 "Play Count": string;
156 "Genres": string;
157 "Artists": string;
158};
159
160export type AppleMusicTrackHistory = {
161 "Country": string;
162 "Track Identifier": string;
163 "Media type": string;
164 "Date Played": string;
165 "Hours": string;
166 "Play Duration Milliseconds": string;
167 "End Reason Type": string;
168 "Source Type": string;
169 "Play Count": string;
170 "Skip Count": string;
171 "Ignore For Recommendations": string;
172 "Track Reference": string;
173 "Track Description": string;
174};
175
176export type TealfmPlayRecord = {
177 isrc?: string;
178 $type: "fm.teal.alpha.feed.play";
179 //$type: "dev.indexx.teal.feed.play";
180 artists: Array<{
181 artistMbId: string;
182 artistName: string;
183 }>;
184 duration?: number;
185 originUrl?: string;
186 trackName: string;
187 playedTime: string;
188 releaseMbId: string;
189 releaseName: string;
190 recordingMbId: string;
191 submissionClientAgent: string;
192 musicServiceBaseDomain?: "music.apple.com";
193};
194
195export type XRPCError = {
196 error?: string;
197 message?: string;
198};
199
200export type ResolveHandleSuccess = {
201 did: string;
202 error?: never;
203 message?: never;
204};
205
206export type ResolveHandleFailure = XRPCError & {
207 did?: never;
208};
209
210export type ResolveHandleRes = ResolveHandleSuccess | ResolveHandleFailure;