//// Walk through every scrobble for an actor by following the `offset` cursor.
////
//// Run with:
//// gleam run -m examples/paginate_scrobbles
import gleam/int
import gleam/io
import gleam/list
import gleam/option
import rocksky
import rocksky/actor
import rocksky/types.{type Scrobble}
const page_size: Int = 50
pub fn main() {
let client = rocksky.new()
let total = walk(client, "tsiry.bsky.social", 0, 0)
io.println("done — counted " <> int.to_string(total) <> " scrobbles")
}
fn walk(
client: rocksky.Client,
did: String,
offset: Int,
counted: Int,
) -> Int {
let result =
actor.get_actor_scrobbles(did: did)
|> rocksky.limit(page_size)
|> rocksky.offset(offset)
|> rocksky.send(client)
case result {
Ok(batch) -> {
let n = list.length(batch)
print_batch(batch, offset)
case n < page_size {
True -> counted + n
False -> walk(client, did, offset + n, counted + n)
}
}
Error(_) -> counted
}
}
fn print_batch(batch: List(Scrobble), start_offset: Int) -> Nil {
list.index_fold(batch, Nil, fn(_acc, scrobble, i) {
io.println(
int.to_string(start_offset + i)
<> ": "
<> option.unwrap(scrobble.title, "?")
<> " — "
<> option.unwrap(scrobble.artist, "?"),
)
Nil
})
}