this repo has no description
2
fork

Configure Feed

Select the types of activity you want to include in your feed.

support for feeds

+50 -8
+8 -1
Sources/bskyKit/BskyAPI.swift
··· 17 17 case searchActorsTypeahead(query: String, limit: Int) 18 18 19 19 // Feed endpoints 20 + case getFeed(feed: String, limit: Int, cursor: String?) 20 21 case getFeedGenerators(feeds: [String]) 21 22 case getTimeline(limit: Int, cursor: String?) 22 23 case getAuthorFeed(did: String, limit: Int, cursor: String?, filter: String?) ··· 56 57 case .searchActors: "/xrpc/app.bsky.actor.searchActors" 57 58 case .searchActorsTypeahead: "/xrpc/app.bsky.actor.searchActorsTypeahead" 58 59 // Feed 60 + case .getFeed: "/xrpc/app.bsky.feed.getFeed" 59 61 case .getFeedGenerators: "/xrpc/app.bsky.feed.getFeedGenerators" 60 62 case .getTimeline: "/xrpc/app.bsky.feed.getTimeline" 61 63 case .getAuthorFeed: "/xrpc/app.bsky.feed.getAuthorFeed" ··· 79 81 var httpMethod: HTTPMethod { 80 82 switch self { 81 83 case .getPreferences, .getProfile, .getProfiles, .searchActors, .searchActorsTypeahead, 82 - .getFeedGenerators, .getTimeline, .getAuthorFeed, .getPostThread, .getPosts, .getActorLikes, .getLikes, .getRepostedBy, 84 + .getFeed, .getFeedGenerators, .getTimeline, .getAuthorFeed, .getPostThread, .getPosts, .getActorLikes, .getLikes, .getRepostedBy, 83 85 .getFollows, .getFollowers, .getBlocks, .getMutes, 84 86 .listNotifications, .getUnreadCount: 85 87 return .get ··· 113 115 ])) 114 116 115 117 // Feed endpoints 118 + case .getFeed(let feed, let limit, let cursor): 119 + var params: Parameters = ["feed": feed, "limit": limit] 120 + if let cursor { params["cursor"] = cursor } 121 + return .requestParameters(encoding: .urlEncoding(parameters: params)) 122 + 116 123 case .getFeedGenerators(let feeds): 117 124 return .requestParameters(encoding: .urlEncoding(parameters: ["feeds": feeds])) 118 125
+11
Sources/bskyKit/BskyService.swift
··· 119 119 120 120 // MARK: - Feed 121 121 122 + /// Fetches a custom feed by its AT-URI. 123 + /// - Parameters: 124 + /// - feed: The AT-URI of the feed generator. 125 + /// - limit: Maximum number of posts to return (default: 50, max: 100). 126 + /// - cursor: Pagination cursor from a previous response. 127 + /// - Returns: Feed posts with cursor for pagination. 128 + /// - Throws: An error if the feed is not found or the request fails. 129 + public func getFeed(feed: String, limit: Int = 50, cursor: String? = nil) async throws -> AuthorFeed { 130 + try await router.execute(.getFeed(feed: feed, limit: limit, cursor: cursor)) 131 + } 132 + 122 133 /// Fetches information about custom feed generators. 123 134 /// - Parameter feeds: Array of feed generator AT-URIs. 124 135 /// - Returns: Details about the requested feed generators.
+31 -7
Sources/bskyKit/Models/Preferences.swift
··· 8 8 import Foundation 9 9 10 10 public struct Preferences: Codable, Sendable { 11 - public var preferences: [Preference] 11 + public var preferences: [PreferenceItem] 12 12 } 13 13 14 - public struct Preference: Codable, Sendable { 14 + public struct PreferenceItem: Codable, Sendable { 15 15 public let type: String 16 - public var saved: [String] 17 - public var pinned: [String] 18 - 16 + public let items: [SavedFeedItem]? 17 + public let saved: [String]? 18 + public let pinned: [String]? 19 + 19 20 enum CodingKeys: String, CodingKey { 20 21 case type = "$type" 21 - case saved 22 - case pinned 22 + case items, saved, pinned 23 23 } 24 24 } 25 25 26 + public struct SavedFeedItem: Codable, Sendable, Identifiable { 27 + public let id: String 28 + public let type: String 29 + public let value: String 30 + public let pinned: Bool 31 + } 32 + 33 + // MARK: - Convenience 34 + 35 + public extension Preferences { 36 + var savedFeedItems: [SavedFeedItem] { 37 + preferences 38 + .filter { $0.type == "app.bsky.actor.defs#savedFeedsPrefV2" } 39 + .flatMap { $0.items ?? [] } 40 + } 41 + 42 + var pinnedFeeds: [SavedFeedItem] { 43 + savedFeedItems.filter(\.pinned) 44 + } 45 + 46 + var savedFeeds: [SavedFeedItem] { 47 + savedFeedItems.filter { !$0.pinned } 48 + } 49 + }