Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
934c7bf
add basurl input for PlayolaStationPlaer
briankeane Sep 25, 2025
bbbd3ff
Merge pull request #65 from playola-radio/chore/add-staging
briankeane Sep 25, 2025
657027c
fix /v1 missing from baseUrl interpolation
briankeane Sep 25, 2025
23ed7d2
Merge pull request #66 from playola-radio/chore/fix-v1-call
briankeane Sep 25, 2025
694f34d
add release date to stations
briankeane Nov 18, 2025
1b51152
Merge pull request #67 from playola-radio/feat/release-date-on-stations
briankeane Nov 18, 2025
d8df2a7
add spinGroupId to spin
briankeane Dec 1, 2025
01addec
Merge pull request #68 from playola-radio/feat/add-spin-group-id
briankeane Dec 1, 2025
7af7231
claude attempt at audio-return
briankeane Dec 9, 2025
eb7a870
Merge pull request #69 from playola-radio/bugfix/audio-return
briankeane Dec 9, 2025
ba4d813
limit to lockedIn spins. Increase polling frequency to 20 secs
briankeane Dec 15, 2025
f196723
appease linter
briankeane Dec 15, 2025
d979a75
update fastlane
briankeane Dec 15, 2025
1b5f82c
Merge pull request #70 from playola-radio/feat/use-lockedin-spins-only
briankeane Dec 15, 2025
2268be3
Merge pull request #71 from playola-radio/feat/update-fastlane
briankeane Dec 15, 2025
db8b838
deadlock crash fix
briankeane Dec 20, 2025
70b8b30
Merge pull request #72 from playola-radio/bugfix/deadlock-crash
briankeane Dec 20, 2025
d1aca07
fix Carplay
briankeane Dec 30, 2025
1c3a2a3
Merge pull request #73 from playola-radio/chore/fix-carplay
briankeane Dec 30, 2025
1b7e971
stop grabbing the audio back from interruptors
briankeane Dec 30, 2025
6452f23
Merge pull request #74 from playola-radio/bugfix/force-back-audio
briankeane Dec 30, 2025
a14bab4
add new show structure to models
briankeane Jan 7, 2026
edb8eb0
Merge pull request #75 from playola-radio/feat/addShowToSpinModel
briankeane Jan 7, 2026
0b1250c
remove scheduled show
briankeane Jan 7, 2026
d327904
Merge pull request #76 from playola-radio/chore/remove-scheduled-show
briankeane Jan 7, 2026
55d99c4
add station to airing model
briankeane Jan 8, 2026
a6a847c
Merge pull request #77 from playola-radio/feat/add-station-to-airing-…
briankeane Jan 8, 2026
bec61de
remove strong reference cycle to ListeningSessionReporter
briankeane Jan 22, 2026
90a1c0e
update circleci
briankeane Jan 22, 2026
03fc9ca
Merge pull request #78 from playola-radio/bugfix/listeningSessionWith…
briankeane Jan 22, 2026
572c429
Extract models to PlayolaCore
briankeane Feb 14, 2026
51851de
Merge pull request #79 from playola-radio/feat/add-tv-os-support
briankeane Feb 14, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions .circleci/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@ orbs:
jobs:
swiftlint_check:
macos:
xcode: 16.2.0
xcode: 16.4
resource_class: m4pro.medium
steps:
- checkout
- run:
Expand All @@ -27,7 +28,8 @@ jobs:

test:
macos:
xcode: 16.2.0
xcode: 16.4
resource_class: m4pro.medium
environment:
FASTLANE_SKIP_UPDATE_CHECK: true
FASTLANE_XCODEBUILD_SETTINGS_TIMEOUT: 10
Expand Down
79 changes: 45 additions & 34 deletions Gemfile.lock
Original file line number Diff line number Diff line change
@@ -1,37 +1,40 @@
GEM
remote: https://rubygems.org/
specs:
CFPropertyList (3.0.7)
base64
nkf
rexml
addressable (2.8.7)
public_suffix (>= 2.0.2, < 7.0)
CFPropertyList (3.0.8)
abbrev (0.1.2)
addressable (2.8.8)
public_suffix (>= 2.0.2, < 8.0)
artifactory (3.0.17)
atomos (0.1.3)
aws-eventstream (1.3.0)
aws-partitions (1.1043.0)
aws-sdk-core (3.217.0)
aws-eventstream (1.4.0)
aws-partitions (1.1194.0)
aws-sdk-core (3.239.2)
aws-eventstream (~> 1, >= 1.3.0)
aws-partitions (~> 1, >= 1.992.0)
aws-sigv4 (~> 1.9)
base64
bigdecimal
jmespath (~> 1, >= 1.6.1)
aws-sdk-kms (1.97.0)
aws-sdk-core (~> 3, >= 3.216.0)
logger
aws-sdk-kms (1.118.0)
aws-sdk-core (~> 3, >= 3.239.1)
aws-sigv4 (~> 1.5)
aws-sdk-s3 (1.178.0)
aws-sdk-core (~> 3, >= 3.216.0)
aws-sdk-s3 (1.206.0)
aws-sdk-core (~> 3, >= 3.234.0)
aws-sdk-kms (~> 1)
aws-sigv4 (~> 1.5)
aws-sigv4 (1.11.0)
aws-sigv4 (1.12.1)
aws-eventstream (~> 1, >= 1.0.2)
babosa (1.0.4)
base64 (0.2.0)
bigdecimal (3.3.1)
claide (1.1.0)
colored (1.2)
colored2 (3.1.2)
commander (4.6.0)
highline (~> 2.0.0)
csv (3.3.5)
declarative (0.0.20)
digest-crc (0.7.0)
rake (>= 12.0.0, < 14.0.0)
Expand All @@ -51,14 +54,14 @@ GEM
faraday-rack (~> 1.0)
faraday-retry (~> 1.0)
ruby2_keywords (>= 0.0.4)
faraday-cookie_jar (0.0.7)
faraday-cookie_jar (0.0.8)
faraday (>= 0.8.0)
http-cookie (~> 1.0.0)
http-cookie (>= 1.0.0)
faraday-em_http (1.0.0)
faraday-em_synchrony (1.0.0)
faraday-em_synchrony (1.0.1)
faraday-excon (1.1.0)
faraday-httpclient (1.0.1)
faraday-multipart (1.1.0)
faraday-multipart (1.1.1)
multipart-post (~> 2.0)
faraday-net_http (1.0.2)
faraday-net_http_persistent (1.2.0)
Expand All @@ -68,15 +71,18 @@ GEM
faraday_middleware (1.2.1)
faraday (~> 1.0)
fastimage (2.4.0)
fastlane (2.226.0)
fastlane (2.229.1)
CFPropertyList (>= 2.3, < 4.0.0)
abbrev (~> 0.1.2)
addressable (>= 2.8, < 3.0.0)
artifactory (~> 3.0)
aws-sdk-s3 (~> 1.0)
babosa (>= 1.0.3, < 2.0.0)
base64 (~> 0.2.0)
bundler (>= 1.12.0, < 3.0.0)
colored (~> 1.2)
commander (~> 4.6)
csv (~> 3.3)
dotenv (>= 2.1.1, < 3.0.0)
emoji_regex (>= 0.1, < 4.0)
excon (>= 0.71.0, < 1.0.0)
Expand All @@ -96,7 +102,9 @@ GEM
jwt (>= 2.1.0, < 3)
mini_magick (>= 4.9.4, < 5.0.0)
multipart-post (>= 2.0.0, < 3.0.0)
mutex_m (~> 0.3.0)
naturally (~> 2.2)
nkf (~> 0.2.0)
optparse (>= 0.1.1, < 1.0.0)
plist (>= 3.1.0, < 4.0.0)
rubyzip (>= 2.0.0, < 3.0.0)
Expand All @@ -108,7 +116,7 @@ GEM
tty-spinner (>= 0.8.0, < 1.0.0)
word_wrap (~> 1.0.0)
xcodeproj (>= 1.13.0, < 2.0.0)
xcpretty (~> 0.4.0)
xcpretty (~> 0.4.1)
xcpretty-travis-formatter (>= 0.0.3, < 2.0.0)
fastlane-sirp (1.0.0)
sysrandom (~> 1.0)
Expand All @@ -129,12 +137,12 @@ GEM
google-apis-core (>= 0.11.0, < 2.a)
google-apis-storage_v1 (0.31.0)
google-apis-core (>= 0.11.0, < 2.a)
google-cloud-core (1.7.1)
google-cloud-core (1.8.0)
google-cloud-env (>= 1.0, < 3.a)
google-cloud-errors (~> 1.0)
google-cloud-env (1.6.0)
faraday (>= 0.17.3, < 3.0)
google-cloud-errors (1.4.0)
google-cloud-errors (1.5.0)
google-cloud-storage (1.47.0)
addressable (~> 2.8)
digest-crc (~> 0.4)
Expand All @@ -152,37 +160,40 @@ GEM
highline (2.0.3)
http-cookie (1.0.8)
domain_name (~> 0.5)
httpclient (2.8.3)
httpclient (2.9.0)
mutex_m
jmespath (1.6.2)
json (2.9.1)
jwt (2.10.1)
json (2.18.0)
jwt (2.10.2)
base64
logger (1.7.0)
mini_magick (4.13.2)
mini_mime (1.1.5)
multi_json (1.15.0)
multi_json (1.18.0)
multipart-post (2.4.1)
mutex_m (0.3.0)
nanaimo (0.4.0)
naturally (2.2.1)
naturally (2.3.0)
nkf (0.2.0)
optparse (0.6.0)
optparse (0.8.1)
os (1.1.4)
plist (3.7.2)
public_suffix (6.0.1)
rake (13.2.1)
public_suffix (7.0.0)
rake (13.3.1)
representable (3.2.0)
declarative (< 0.1.0)
trailblazer-option (>= 0.1.1, < 0.2.0)
uber (< 0.2.0)
retriable (3.1.2)
rexml (3.4.0)
rexml (3.4.4)
rouge (3.28.0)
ruby2_keywords (0.0.5)
rubyzip (2.4.1)
security (0.1.5)
signet (0.19.0)
signet (0.21.0)
addressable (~> 2.8)
faraday (>= 0.17.5, < 3.a)
jwt (>= 1.5, < 3.0)
jwt (>= 1.5, < 4.0)
multi_json (~> 1.10)
simctl (1.6.10)
CFPropertyList
Expand All @@ -206,7 +217,7 @@ GEM
colored2 (~> 3.1)
nanaimo (~> 0.4.0)
rexml (>= 3.3.6, < 4.0)
xcpretty (0.4.0)
xcpretty (0.4.1)
rouge (~> 3.28.0)
xcpretty-travis-formatter (1.0.1)
xcpretty (~> 0.2, >= 0.0.7)
Expand Down
23 changes: 18 additions & 5 deletions Package.swift
Original file line number Diff line number Diff line change
@@ -1,21 +1,34 @@
// swift-tools-version: 5.10
// swift-tools-version: 6.0
import PackageDescription

let package = Package(
name: "PlayolaPlayer",
platforms: [.iOS(.v17), .macOS(.v14)],
platforms: [.iOS(.v18), .macOS(.v14), .tvOS(.v18)],
products: [
.library(name: "PlayolaPlayer", targets: ["PlayolaPlayer"])
.library(name: "PlayolaPlayer", targets: ["PlayolaPlayer"]),
.library(name: "PlayolaCore", targets: ["PlayolaCore"]),
],
dependencies: [],
targets: [
.target(
name: "PlayolaCore",
resources: [.copy("MockData")],
swiftSettings: [.swiftLanguageMode(.v5)]
),
.target(
name: "PlayolaPlayer",
resources: [.copy("MockData")]
dependencies: ["PlayolaCore"],
swiftSettings: [.swiftLanguageMode(.v5)]
),
.testTarget(
name: "PlayolaCoreTests",
dependencies: ["PlayolaCore"],
swiftSettings: [.swiftLanguageMode(.v5)]
),
.testTarget(
name: "PlayolaPlayerTests",
dependencies: ["PlayolaPlayer"]
dependencies: ["PlayolaPlayer"],
swiftSettings: [.swiftLanguageMode(.v5)]
),
]
)
78 changes: 78 additions & 0 deletions Sources/PlayolaCore/Models/Airing.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
//
// Airing.swift
// PlayolaPlayer
//
// Created by Brian D Keane on 1/7/26.
//

import Foundation

/// Represents a scheduled airing of an episode
public struct Airing: Codable, Sendable, Equatable, Hashable, Identifiable {
public let id: String
public let episodeId: String
public let stationId: String
public let airtime: Date
public let createdAt: Date
public let updatedAt: Date
public let episode: Episode?
public let station: Station?

public init(
id: String,
episodeId: String,
stationId: String,
airtime: Date,
createdAt: Date,
updatedAt: Date,
episode: Episode? = nil,
station: Station? = nil
) {
self.id = id
self.episodeId = episodeId
self.stationId = stationId
self.airtime = airtime
self.createdAt = createdAt
self.updatedAt = updatedAt
self.episode = episode
self.station = station
}
}

extension Airing {
public static var mock: Airing {
Airing(
id: "mock-airing-id",
episodeId: "mock-episode-id",
stationId: "mock-station-id",
airtime: Date(timeIntervalSince1970: 1_800_000_000),
createdAt: Date(timeIntervalSince1970: 1_800_000_000),
updatedAt: Date(timeIntervalSince1970: 1_800_000_000),
episode: .mock,
station: .mock
)
}

public static func mockWith(
id: String? = nil,
episodeId: String? = nil,
stationId: String? = nil,
airtime: Date? = nil,
createdAt: Date? = nil,
updatedAt: Date? = nil,
episode: Episode?? = nil,
station: Station?? = nil
) -> Airing {
let mock = Self.mock
return Airing(
id: id ?? mock.id,
episodeId: episodeId ?? mock.episodeId,
stationId: stationId ?? mock.stationId,
airtime: airtime ?? mock.airtime,
createdAt: createdAt ?? mock.createdAt,
updatedAt: updatedAt ?? mock.updatedAt,
episode: episode ?? mock.episode,
station: station ?? mock.station
)
}
}
Loading