rocksky 0.1.0 → 0.3.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e48d42415ab7937416c2e008a6b637b4e2aef4474f60aae824cf1e089a3814f3
4
- data.tar.gz: eefc4a0023800e5f0d03a4fd41837589b9fc02bd49e4244bcd7a260bc88895a6
3
+ metadata.gz: 49ece2a26c96c4edb2110ec0ac28f0c5dcc46d4eb6e7a1b3526cf0f82b045599
4
+ data.tar.gz: 63a9342d472e413572ef7c5e9c756d930dd95c0571ccac56a16bb5f4e0a1a49b
5
5
  SHA512:
6
- metadata.gz: 11773d9ea99df5d975d9c81636a3cd0058ea69a4a2cfcb9aa7b2579fbdcd0350f7b7c80ef34e4dadadd5b55232fd4d458773a319449d034118e7f436fafab71b
7
- data.tar.gz: 94cf1dba5ddb40fb27781044b27bf3cbe1e3cea3720e522541f4db5ab85d1431b1992af384db625128f13c3971a7a543f22f2747e0e011b936d4de3092219a57
6
+ metadata.gz: 59b15a62bef85d1beb4f281dfa24388b92a0887d0101f2a5f6d88693f947fc0d70affe522ee19191bbce09a101480953ce1f16abe6ac28530dea573ce4af4fec
7
+ data.tar.gz: 728673d1cf68236bacb64c155e086659a22bfd0a57bb1f81ffe1522cd593f40151e4c1d6cbf892afef7ecc3dee043fc2188d1e93f1de2a4e242ba3a38a39f552
data/CHANGELOG.md CHANGED
@@ -1,5 +1,18 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.3.0
4
+
5
+ - `feed.get_stories` now accepts optional `feed:` (at-uri) and `following:`
6
+ (boolean) kwargs. `feed:` narrows results to scrobbles in that feed
7
+ generator; `following: true` restricts to users the viewer follows and
8
+ requires an authenticated client. Filters intersect when both are supplied.
9
+
10
+ ## 0.2.0
11
+
12
+ - Added lexicon-derived `Struct`s under `Rocksky::Generated::*` covering every
13
+ lex `*View*` / `*Record` / `*Input` / `*Output` / `*Params` shape. Generated
14
+ from `apps/api/lexicons/` via `bun run lexgen:types` at the repo root.
15
+
3
16
  ## 0.1.0
4
17
 
5
18
  - Initial release. Coverage for all `app.rocksky.*` XRPC endpoints across the
data/README.md CHANGED
@@ -132,7 +132,7 @@ pre-loaded with a `client` bound to your environment.
132
132
  ```bash
133
133
  $ gem install rocksky
134
134
  $ ROCKSKY_TOKEN=eyJ... rocksky-console
135
- Rocksky 0.1.0 — interactive console
135
+ Rocksky 0.2.0 — interactive console
136
136
  base_url : https://api.rocksky.app
137
137
  token : present (set via ROCKSKY_TOKEN)
138
138
 
@@ -194,6 +194,11 @@ client = Rocksky.new(open_timeout: 2, read_timeout: 5)
194
194
  | `open_timeout` | `10` seconds | — |
195
195
  | `read_timeout` | `30` seconds | — |
196
196
 
197
+ ## Types
198
+
199
+ Lexicon-derived `Struct` types are available under `Rocksky::Generated::*`, mirroring every lex `*View*` / `*Record` / `*Input` / `*Output` / `*Params` shape from [the Rocksky lexicons](https://tangled.org/rocksky.app/rocksky/tree/main/apps/api/lexicons). Regenerate with `bun run lexgen:types` at the repo root.
200
+
201
+
197
202
  ## Examples
198
203
 
199
204
  The `examples/` directory contains runnable scripts:
@@ -0,0 +1,219 @@
1
+ # frozen_string_literal: true
2
+ # AUTO-GENERATED FILE -- DO NOT EDIT.
3
+ # Source: apps/api/lexicons/**/*.json
4
+ # Regenerate via: bun run lexgen:types
5
+
6
+ module Rocksky
7
+ module Generated
8
+ BlobRef = Struct.new(:type, :ref, :mimeType, :size, keyword_init: true)
9
+
10
+ ActorArtistViewBasic = Struct.new(:id, :name, :picture, :uri, :user1Rank, :user2Rank, :weight, keyword_init: true)
11
+ ActorCompatibilityViewBasic = Struct.new(:compatibilityLevel, :compatibilityPercentage, :sharedArtists, :topSharedArtistNames, :topSharedDetailedArtists, :user1ArtistCount, :user2ArtistCount, keyword_init: true)
12
+ ActorNeighbourViewBasic = Struct.new(:userId, :did, :handle, :displayName, :avatar, :sharedArtistsCount, :similarityScore, :topSharedArtistNames, :topSharedArtistsDetails, keyword_init: true)
13
+ ActorProfileViewBasic = Struct.new(:id, :did, :handle, :displayName, :avatar, :createdAt, :updatedAt, keyword_init: true)
14
+ ActorProfileViewDetailed = Struct.new(:id, :did, :handle, :displayName, :avatar, :createdAt, :updatedAt, keyword_init: true)
15
+ ActorTrackView = Struct.new(:name, :artist, :album, :albumCoverUrl, :durationMs, :source, :recordingMbId, keyword_init: true)
16
+ AddDirectoryToQueueParams = Struct.new(:playerId, :directory, :position, :shuffle, keyword_init: true)
17
+ AddItemsToQueueParams = Struct.new(:playerId, :items, :position, :shuffle, keyword_init: true)
18
+ AlbumRecord = Struct.new(:title, :artist, :duration, :releaseDate, :year, :genre, :albumArt, :albumArtUrl, :tags, :youtubeLink, :spotifyLink, :tidalLink, :appleMusicLink, :createdAt, keyword_init: true)
19
+ AlbumViewBasic = Struct.new(:id, :uri, :title, :artist, :artistUri, :year, :albumArt, :releaseDate, :sha256, :playCount, :uniqueListeners, keyword_init: true)
20
+ AlbumViewDetailed = Struct.new(:id, :uri, :title, :artist, :artistUri, :year, :albumArt, :releaseDate, :sha256, :playCount, :uniqueListeners, :tags, :tracks, keyword_init: true)
21
+ ApiKeyView = Struct.new(:id, :name, :description, :createdAt, keyword_init: true)
22
+ ArtistListenerViewBasic = Struct.new(:id, :did, :handle, :displayName, :avatar, :mostListenedSong, :totalPlays, :rank, keyword_init: true)
23
+ ArtistMbid = Struct.new(:mbid, :name, keyword_init: true)
24
+ ArtistRecentListenerView = Struct.new(:id, :did, :handle, :displayName, :avatar, :timestamp, :scrobbleUri, keyword_init: true)
25
+ ArtistRecord = Struct.new(:name, :bio, :picture, :pictureUrl, :tags, :born, :died, :bornIn, :createdAt, keyword_init: true)
26
+ ArtistSongViewBasic = Struct.new(:uri, :title, :playCount, keyword_init: true)
27
+ ArtistViewBasic = Struct.new(:id, :uri, :name, :picture, :sha256, :playCount, :uniqueListeners, :tags, keyword_init: true)
28
+ ArtistViewDetailed = Struct.new(:id, :uri, :name, :picture, :sha256, :playCount, :uniqueListeners, :tags, keyword_init: true)
29
+ ChartsScrobbleViewBasic = Struct.new(:date, :count, keyword_init: true)
30
+ ChartsView = Struct.new(:scrobbles, keyword_init: true)
31
+ CreateApikeyInput = Struct.new(:name, :description, keyword_init: true)
32
+ CreatePlaylistParams = Struct.new(:name, :description, keyword_init: true)
33
+ CreateScrobbleInput = Struct.new(:title, :artist, :album, :duration, :mbId, :isrc, :albumArt, :trackNumber, :releaseDate, :year, :discNumber, :lyrics, :composer, :copyrightMessage, :label, :artistPicture, :spotifyLink, :lastfmLink, :tidalLink, :appleMusicLink, :youtubeLink, :deezerLink, :timestamp, keyword_init: true)
34
+ CreateShoutInput = Struct.new(:message, keyword_init: true)
35
+ CreateSongInput = Struct.new(:title, :artist, :albumArtist, :album, :duration, :mbId, :isrc, :albumArt, :trackNumber, :releaseDate, :year, :discNumber, :lyrics, keyword_init: true)
36
+ DescribeFeedGeneratorOutput = Struct.new(:did, :feeds, keyword_init: true)
37
+ DescribeFeedGeneratorParams = Struct.new(keyword_init: true)
38
+ DislikeShoutInput = Struct.new(:uri, keyword_init: true)
39
+ DislikeSongInput = Struct.new(:uri, keyword_init: true)
40
+ DownloadFileParams = Struct.new(:fileId, keyword_init: true)
41
+ DropboxFileListView = Struct.new(:files, keyword_init: true)
42
+ DropboxFileView = Struct.new(:id, :name, :pathLower, :pathDisplay, :clientModified, :serverModified, keyword_init: true)
43
+ DropboxTemporaryLinkView = Struct.new(:link, keyword_init: true)
44
+ FeedGeneratorsView = Struct.new(:feeds, keyword_init: true)
45
+ FeedGeneratorView = Struct.new(:id, :name, :description, :uri, :avatar, :creator, keyword_init: true)
46
+ FeedItemView = Struct.new(:scrobble, keyword_init: true)
47
+ FeedRecommendationsView = Struct.new(:recommendations, :cursor, keyword_init: true)
48
+ FeedRecommendationView = Struct.new(:title, :artist, :album, :albumArt, :trackUri, :artistUri, :albumUri, :genres, :recommendationScore, :source, :likesCount, keyword_init: true)
49
+ FeedRecommendedAlbumsView = Struct.new(:albums, :cursor, keyword_init: true)
50
+ FeedRecommendedAlbumView = Struct.new(:id, :uri, :title, :artist, :artistUri, :year, :albumArt, :recommendationScore, :source, keyword_init: true)
51
+ FeedRecommendedArtistsView = Struct.new(:artists, :cursor, keyword_init: true)
52
+ FeedRecommendedArtistView = Struct.new(:id, :uri, :name, :picture, :genres, :recommendationScore, :source, keyword_init: true)
53
+ FeedSearchResultsView = Struct.new(:hits, :processingTimeMs, :limit, :offset, :estimatedTotalHits, keyword_init: true)
54
+ FeedStoriesView = Struct.new(:stories, keyword_init: true)
55
+ FeedStoryView = Struct.new(:album, :albumArt, :albumArtist, :albumUri, :artist, :artistUri, :avatar, :createdAt, :did, :handle, :id, :title, :trackId, :trackUri, :uri, keyword_init: true)
56
+ FeedUriView = Struct.new(:uri, keyword_init: true)
57
+ FeedView = Struct.new(:feed, :cursor, keyword_init: true)
58
+ FollowAccountOutput = Struct.new(:subject, :followers, :cursor, keyword_init: true)
59
+ FollowAccountParams = Struct.new(:account, keyword_init: true)
60
+ FollowRecord = Struct.new(:createdAt, :subject, :via, keyword_init: true)
61
+ GeneratorRecord = Struct.new(:did, :avatar, :displayName, :description, :createdAt, keyword_init: true)
62
+ GetActorAlbumsOutput = Struct.new(:albums, keyword_init: true)
63
+ GetActorAlbumsParams = Struct.new(:did, :limit, :offset, :startDate, :endDate, keyword_init: true)
64
+ GetActorArtistsOutput = Struct.new(:artists, keyword_init: true)
65
+ GetActorArtistsParams = Struct.new(:did, :limit, :offset, :startDate, :endDate, keyword_init: true)
66
+ GetActorCompatibilityOutput = Struct.new(:compatibility, keyword_init: true)
67
+ GetActorCompatibilityParams = Struct.new(:did, keyword_init: true)
68
+ GetActorLovedSongsOutput = Struct.new(:tracks, keyword_init: true)
69
+ GetActorLovedSongsParams = Struct.new(:did, :limit, :offset, keyword_init: true)
70
+ GetActorNeighboursOutput = Struct.new(:neighbours, keyword_init: true)
71
+ GetActorNeighboursParams = Struct.new(:did, keyword_init: true)
72
+ GetActorPlaylistsOutput = Struct.new(:playlists, keyword_init: true)
73
+ GetActorPlaylistsParams = Struct.new(:did, :limit, :offset, keyword_init: true)
74
+ GetActorScrobblesOutput = Struct.new(:scrobbles, keyword_init: true)
75
+ GetActorScrobblesParams = Struct.new(:did, :limit, :offset, keyword_init: true)
76
+ GetActorSongsOutput = Struct.new(:songs, keyword_init: true)
77
+ GetActorSongsParams = Struct.new(:did, :limit, :offset, :startDate, :endDate, keyword_init: true)
78
+ GetAlbumParams = Struct.new(:uri, keyword_init: true)
79
+ GetAlbumRecommendationsParams = Struct.new(:did, :limit, keyword_init: true)
80
+ GetAlbumShoutsOutput = Struct.new(:shouts, keyword_init: true)
81
+ GetAlbumShoutsParams = Struct.new(:uri, :limit, :offset, keyword_init: true)
82
+ GetAlbumsOutput = Struct.new(:albums, keyword_init: true)
83
+ GetAlbumsParams = Struct.new(:limit, :offset, :genre, keyword_init: true)
84
+ GetAlbumTracksOutput = Struct.new(:tracks, keyword_init: true)
85
+ GetAlbumTracksParams = Struct.new(:uri, keyword_init: true)
86
+ GetApikeysOutput = Struct.new(:apiKeys, keyword_init: true)
87
+ GetApikeysParams = Struct.new(:offset, :limit, keyword_init: true)
88
+ GetArtistAlbumsOutput = Struct.new(:albums, keyword_init: true)
89
+ GetArtistAlbumsParams = Struct.new(:uri, keyword_init: true)
90
+ GetArtistListenersOutput = Struct.new(:listeners, keyword_init: true)
91
+ GetArtistListenersParams = Struct.new(:uri, :offset, :limit, keyword_init: true)
92
+ GetArtistParams = Struct.new(:uri, keyword_init: true)
93
+ GetArtistRecentListenersOutput = Struct.new(:listeners, keyword_init: true)
94
+ GetArtistRecentListenersParams = Struct.new(:uri, :offset, :limit, keyword_init: true)
95
+ GetArtistRecommendationsParams = Struct.new(:did, :limit, keyword_init: true)
96
+ GetArtistShoutsOutput = Struct.new(:shouts, keyword_init: true)
97
+ GetArtistShoutsParams = Struct.new(:uri, :limit, :offset, keyword_init: true)
98
+ GetArtistsOutput = Struct.new(:artists, keyword_init: true)
99
+ GetArtistsParams = Struct.new(:limit, :offset, :names, :genre, keyword_init: true)
100
+ GetArtistTracksOutput = Struct.new(:tracks, keyword_init: true)
101
+ GetArtistTracksParams = Struct.new(:uri, :limit, :offset, keyword_init: true)
102
+ GetCurrentlyPlayingParams = Struct.new(:playerId, :actor, keyword_init: true)
103
+ GetFeedGeneratorOutput = Struct.new(:view, keyword_init: true)
104
+ GetFeedGeneratorParams = Struct.new(:feed, keyword_init: true)
105
+ GetFeedGeneratorsParams = Struct.new(:size, keyword_init: true)
106
+ GetFeedParams = Struct.new(:feed, :limit, :cursor, keyword_init: true)
107
+ GetFeedSkeletonOutput = Struct.new(:scrobbles, :cursor, keyword_init: true)
108
+ GetFeedSkeletonParams = Struct.new(:feed, :limit, :offset, :cursor, keyword_init: true)
109
+ GetFileParams = Struct.new(:fileId, keyword_init: true)
110
+ GetFilesParams = Struct.new(:at, keyword_init: true)
111
+ GetFollowersOutput = Struct.new(:subject, :followers, :cursor, :count, keyword_init: true)
112
+ GetFollowersParams = Struct.new(:actor, :limit, :dids, :cursor, keyword_init: true)
113
+ GetFollowsOutput = Struct.new(:subject, :follows, :cursor, :count, keyword_init: true)
114
+ GetFollowsParams = Struct.new(:actor, :limit, :dids, :cursor, keyword_init: true)
115
+ GetGlobalStatsParams = Struct.new(keyword_init: true)
116
+ GetKnownFollowersOutput = Struct.new(:subject, :followers, :cursor, keyword_init: true)
117
+ GetKnownFollowersParams = Struct.new(:actor, :limit, :cursor, keyword_init: true)
118
+ GetMetadataParams = Struct.new(:path, keyword_init: true)
119
+ GetMirrorSourcesOutput = Struct.new(:sources, keyword_init: true)
120
+ GetMirrorSourcesParams = Struct.new(keyword_init: true)
121
+ GetPlaybackQueueParams = Struct.new(:playerId, keyword_init: true)
122
+ GetPlaylistParams = Struct.new(:uri, keyword_init: true)
123
+ GetPlaylistsOutput = Struct.new(:playlists, keyword_init: true)
124
+ GetPlaylistsParams = Struct.new(:limit, :offset, keyword_init: true)
125
+ GetProfileParams = Struct.new(:did, keyword_init: true)
126
+ GetProfileShoutsOutput = Struct.new(:shouts, keyword_init: true)
127
+ GetProfileShoutsParams = Struct.new(:did, :offset, :limit, keyword_init: true)
128
+ GetRecommendationsParams = Struct.new(:did, :limit, keyword_init: true)
129
+ GetScrobbleParams = Struct.new(:uri, keyword_init: true)
130
+ GetScrobblesChartParams = Struct.new(:did, :artisturi, :albumuri, :songuri, :genre, :from, :to, keyword_init: true)
131
+ GetScrobblesOutput = Struct.new(:scrobbles, keyword_init: true)
132
+ GetScrobblesParams = Struct.new(:did, :following, :limit, :offset, keyword_init: true)
133
+ GetShoutRepliesOutput = Struct.new(:shouts, keyword_init: true)
134
+ GetShoutRepliesParams = Struct.new(:uri, :limit, :offset, keyword_init: true)
135
+ GetSongParams = Struct.new(:uri, :mbid, :isrc, :spotifyId, keyword_init: true)
136
+ GetSongRecentListenersOutput = Struct.new(:listeners, keyword_init: true)
137
+ GetSongRecentListenersParams = Struct.new(:uri, :offset, :limit, keyword_init: true)
138
+ GetSongsOutput = Struct.new(:songs, keyword_init: true)
139
+ GetSongsParams = Struct.new(:limit, :offset, :genre, :mbid, :isrc, :spotifyId, keyword_init: true)
140
+ GetStatsParams = Struct.new(:did, keyword_init: true)
141
+ GetStoriesParams = Struct.new(:size, :feed, :following, keyword_init: true)
142
+ GetTemporaryLinkParams = Struct.new(:path, keyword_init: true)
143
+ GetTopArtistsOutput = Struct.new(:artists, keyword_init: true)
144
+ GetTopArtistsParams = Struct.new(:limit, :offset, :startDate, :endDate, keyword_init: true)
145
+ GetTopTracksOutput = Struct.new(:tracks, keyword_init: true)
146
+ GetTopTracksParams = Struct.new(:limit, :offset, :startDate, :endDate, keyword_init: true)
147
+ GetTrackShoutsOutput = Struct.new(:shouts, keyword_init: true)
148
+ GetTrackShoutsParams = Struct.new(:uri, keyword_init: true)
149
+ GetWrappedParams = Struct.new(:did, :year, keyword_init: true)
150
+ GoogledriveFileListView = Struct.new(:files, keyword_init: true)
151
+ GoogledriveFileView = Struct.new(:id, keyword_init: true)
152
+ # indicates that a handle or DID could not be resolved
153
+ GraphNotFoundActor = Struct.new(:actor, :notFound, keyword_init: true)
154
+ GraphRelationship = Struct.new(:did, :following, :followedBy, keyword_init: true)
155
+ InsertDirectoryParams = Struct.new(:uri, :directory, :position, keyword_init: true)
156
+ InsertFilesParams = Struct.new(:uri, :files, :position, keyword_init: true)
157
+ LikeRecord = Struct.new(:createdAt, :subject, keyword_init: true)
158
+ LikeShoutInput = Struct.new(:uri, keyword_init: true)
159
+ LikeSongInput = Struct.new(:uri, keyword_init: true)
160
+ MatchSongParams = Struct.new(:title, :artist, :mbId, :isrc, keyword_init: true)
161
+ MirrorSourceView = Struct.new(:provider, :enabled, :externalUsername, :hasCredentials, :lastPolledAt, :lastScrobbleSeenAt, keyword_init: true)
162
+ NextParams = Struct.new(:playerId, keyword_init: true)
163
+ PauseParams = Struct.new(:playerId, keyword_init: true)
164
+ PlayDirectoryParams = Struct.new(:playerId, :directoryId, :shuffle, :recurse, :position, keyword_init: true)
165
+ PlayerCurrentlyPlayingViewDetailed = Struct.new(:title, keyword_init: true)
166
+ PlayerPlaybackQueueViewDetailed = Struct.new(:tracks, keyword_init: true)
167
+ PlayFileParams = Struct.new(:playerId, :fileId, keyword_init: true)
168
+ PlaylistItemRecord = Struct.new(:subject, :createdAt, :track, :order, keyword_init: true)
169
+ PlaylistRecord = Struct.new(:name, :description, :picture, :pictureUrl, :createdAt, :spotifyLink, :tidalLink, :youtubeLink, :appleMusicLink, keyword_init: true)
170
+ # Basic view of a playlist, including its metadata
171
+ PlaylistViewBasic = Struct.new(:id, :title, :uri, :curatorDid, :curatorHandle, :curatorName, :curatorAvatarUrl, :description, :coverImageUrl, :createdAt, :trackCount, keyword_init: true)
172
+ # Detailed view of a playlist, including its tracks and metadata
173
+ PlaylistViewDetailed = Struct.new(:id, :title, :uri, :curatorDid, :curatorHandle, :curatorName, :curatorAvatarUrl, :description, :coverImageUrl, :createdAt, :tracks, keyword_init: true)
174
+ PlayParams = Struct.new(:playerId, keyword_init: true)
175
+ PreviousParams = Struct.new(:playerId, keyword_init: true)
176
+ ProfileRecord = Struct.new(:displayName, :description, :avatar, :banner, :labels, :joinedViaStarterPack, :createdAt, keyword_init: true)
177
+ PutMirrorSourceInput = Struct.new(:provider, :enabled, :externalUsername, :apiKey, keyword_init: true)
178
+ RadioRecord = Struct.new(:name, :url, :description, :genre, :logo, :website, :createdAt, keyword_init: true)
179
+ RadioViewBasic = Struct.new(:id, :name, :description, :createdAt, keyword_init: true)
180
+ RadioViewDetailed = Struct.new(:id, :name, :description, :website, :url, :genre, :logo, :createdAt, keyword_init: true)
181
+ RemoveApikeyParams = Struct.new(:id, keyword_init: true)
182
+ RemovePlaylistParams = Struct.new(:uri, keyword_init: true)
183
+ RemoveShoutParams = Struct.new(:id, keyword_init: true)
184
+ RemoveTrackParams = Struct.new(:uri, :position, keyword_init: true)
185
+ ReplyShoutInput = Struct.new(:shoutId, :message, keyword_init: true)
186
+ ReportShoutInput = Struct.new(:shoutId, :reason, keyword_init: true)
187
+ ScrobbleFirstScrobbleView = Struct.new(:handle, :avatar, :timestamp, keyword_init: true)
188
+ ScrobbleRecord = Struct.new(:title, :artist, :artists, :albumArtist, :album, :duration, :trackNumber, :discNumber, :releaseDate, :year, :genre, :tags, :composer, :lyrics, :copyrightMessage, :wiki, :albumArt, :albumArtUrl, :youtubeLink, :spotifyLink, :tidalLink, :appleMusicLink, :createdAt, :mbid, :label, :isrc, keyword_init: true)
189
+ ScrobbleViewBasic = Struct.new(:id, :user, :userDisplayName, :userAvatar, :title, :artist, :artistUri, :album, :albumUri, :cover, :date, :uri, :sha256, :liked, :likesCount, keyword_init: true)
190
+ ScrobbleViewDetailed = Struct.new(:id, :user, :title, :artist, :artistUri, :album, :albumUri, :cover, :date, :uri, :sha256, :liked, :likesCount, :listeners, :scrobbles, :artists, :firstScrobble, keyword_init: true)
191
+ SearchParams = Struct.new(:query, keyword_init: true)
192
+ SeekParams = Struct.new(:playerId, :position, keyword_init: true)
193
+ ShoutAuthor = Struct.new(:id, :did, :handle, :displayName, :avatar, keyword_init: true)
194
+ ShoutRecord = Struct.new(:message, :createdAt, :parent, :subject, keyword_init: true)
195
+ ShoutView = Struct.new(:id, :message, :parent, :createdAt, :author, keyword_init: true)
196
+ SongFirstScrobbleView = Struct.new(:handle, :avatar, :timestamp, keyword_init: true)
197
+ SongRecentListenerView = Struct.new(:id, :did, :handle, :displayName, :avatar, :timestamp, :scrobbleUri, keyword_init: true)
198
+ SongRecord = Struct.new(:title, :artist, :artists, :albumArtist, :album, :duration, :trackNumber, :discNumber, :releaseDate, :year, :genre, :tags, :composer, :lyrics, :copyrightMessage, :wiki, :albumArt, :albumArtUrl, :youtubeLink, :spotifyLink, :tidalLink, :appleMusicLink, :createdAt, :mbid, :label, :isrc, keyword_init: true)
199
+ SongViewBasic = Struct.new(:id, :title, :artist, :albumArtist, :albumArt, :uri, :album, :duration, :trackNumber, :discNumber, :playCount, :uniqueListeners, :albumUri, :artistUri, :sha256, :mbid, :isrc, :tags, :createdAt, keyword_init: true)
200
+ SongViewDetailed = Struct.new(:id, :title, :artist, :albumArtist, :albumArt, :uri, :album, :duration, :trackNumber, :discNumber, :playCount, :uniqueListeners, :albumUri, :artistUri, :sha256, :mbid, :isrc, :tags, :createdAt, :artists, :firstScrobble, keyword_init: true)
201
+ SpotifyTrackView = Struct.new(:id, :name, :artist, :album, :duration, :previewUrl, keyword_init: true)
202
+ StartPlaylistParams = Struct.new(:uri, :shuffle, :position, keyword_init: true)
203
+ StatsGlobalStatsView = Struct.new(:scrobbles, :users, :artists, :albums, :tracks, keyword_init: true)
204
+ StatsView = Struct.new(:scrobbles, :artists, :lovedTracks, :albums, :tracks, keyword_init: true)
205
+ StatsWrappedAlbum = Struct.new(:id, :title, :artist, :albumArt, :uri, :playCount, keyword_init: true)
206
+ StatsWrappedArtist = Struct.new(:id, :name, :picture, :uri, :playCount, keyword_init: true)
207
+ StatsWrappedDayCount = Struct.new(:date, :count, keyword_init: true)
208
+ StatsWrappedGenreCount = Struct.new(:genre, :count, keyword_init: true)
209
+ StatsWrappedMilestone = Struct.new(:trackTitle, :artistName, :timestamp, :trackUri, keyword_init: true)
210
+ StatsWrappedMonthCount = Struct.new(:month, :count, keyword_init: true)
211
+ StatsWrappedTrack = Struct.new(:id, :title, :artist, :albumArt, :uri, :artistUri, :albumUri, :playCount, keyword_init: true)
212
+ StatsWrappedView = Struct.new(:year, :totalScrobbles, :totalListeningTimeMinutes, :topArtists, :topTracks, :topAlbums, :topGenres, :scrobblesPerMonth, :mostActiveDay, :mostActiveHour, :newArtistsCount, :longestStreak, :firstScrobble, :lastScrobble, keyword_init: true)
213
+ StatusRecord = Struct.new(:track, :startedAt, :expiresAt, keyword_init: true)
214
+ StrongRef = Struct.new(:uri, :cid, keyword_init: true)
215
+ UnfollowAccountOutput = Struct.new(:subject, :followers, :cursor, keyword_init: true)
216
+ UnfollowAccountParams = Struct.new(:account, keyword_init: true)
217
+ UpdateApikeyInput = Struct.new(:id, :name, :description, keyword_init: true)
218
+ end
219
+ end
@@ -27,9 +27,11 @@ module Rocksky
27
27
  query("app.rocksky.feed.getFeed", feed: feed, limit: limit, cursor: cursor)
28
28
  end
29
29
 
30
- # Stories (recent highlights).
31
- def get_stories(size: nil)
32
- query("app.rocksky.feed.getStories", size: size)
30
+ # Latest scrobble per user. Pass `feed:` (at-uri) to restrict to scrobbles
31
+ # in that feed generator, and/or `following: true` to restrict to users
32
+ # the viewer follows (requires an authenticated client).
33
+ def get_stories(size: nil, feed: nil, following: nil)
34
+ query("app.rocksky.feed.getStories", size: size, feed: feed, following: following)
33
35
  end
34
36
 
35
37
  # Track recommendations for an actor.
@@ -1,3 +1,3 @@
1
1
  module Rocksky
2
- VERSION = "0.1.0".freeze
2
+ VERSION = "0.3.0".freeze
3
3
  end
data/lib/rocksky.rb CHANGED
@@ -19,6 +19,7 @@ require "rocksky/resources/song"
19
19
  require "rocksky/resources/spotify"
20
20
  require "rocksky/resources/stats"
21
21
  require "rocksky/client"
22
+ require "rocksky/generated/types"
22
23
 
23
24
  module Rocksky
24
25
  # Build a new Rocksky client.
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rocksky
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rocksky
@@ -81,6 +81,7 @@ files:
81
81
  - lib/rocksky.rb
82
82
  - lib/rocksky/client.rb
83
83
  - lib/rocksky/error.rb
84
+ - lib/rocksky/generated/types.rb
84
85
  - lib/rocksky/http.rb
85
86
  - lib/rocksky/resources/actor.rb
86
87
  - lib/rocksky/resources/album.rb