diff --git a/HackerTube/Domain/UserDefaultsKey.swift b/HackerTube/Domain/UserDefaultsKey.swift new file mode 100644 index 0000000..9429a3f --- /dev/null +++ b/HackerTube/Domain/UserDefaultsKey.swift @@ -0,0 +1,12 @@ +// +// UserDefaultsKey.swift +// HackerTube +// +// Created by Mathijs Bernson on 11/08/2025. +// + +import Foundation + +enum UserDefaultsKey: String { + case playbackRate = "playbackRate" +} diff --git a/HackerTube/Features/Talk/TalkPlayerViewModel.swift b/HackerTube/Features/Talk/TalkPlayerViewModel.swift index b08ada4..6858ba4 100644 --- a/HackerTube/Features/Talk/TalkPlayerViewModel.swift +++ b/HackerTube/Features/Talk/TalkPlayerViewModel.swift @@ -22,6 +22,8 @@ final class TalkPlayerViewModel { subsystem: Bundle.main.bundleIdentifier!, category: "TalkPlayerViewModel") func prepareForPlayback(recording: Recording, talk: Talk) async { + player.defaultRate = UserDefaults.standard.float(forKey: UserDefaultsKey.playbackRate.rawValue) + let playerItem = AVPlayerItem(url: recording.recordingURL) playerItem.externalMetadata = factory.createMetadataItems(for: recording, talk: talk) diff --git a/HackerTube/Features/VideoPlayer/VideoPlayerView.swift b/HackerTube/Features/VideoPlayer/VideoPlayerView.swift index 531eef4..99607c3 100644 --- a/HackerTube/Features/VideoPlayer/VideoPlayerView.swift +++ b/HackerTube/Features/VideoPlayer/VideoPlayerView.swift @@ -58,6 +58,18 @@ class VideoPlayerCoordinator: NSObject, AVPlayerViewControllerDelegate { } class VideoPlayerViewController: AVPlayerViewController { + private var selectedSpeedObserver: NSKeyValueObservation? + + override func viewDidLoad() { + super.viewDidLoad() + + selectedSpeedObserver = self.observe(\.selectedSpeed, options: [.new]) { controller, change in + if let selectedSpeed = change.newValue.flatMap({ $0 }) { + UserDefaults.standard.set(selectedSpeed.rate, forKey: UserDefaultsKey.playbackRate.rawValue) + } + } + } + override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) diff --git a/HackerTube/HackerTubeApp.swift b/HackerTube/HackerTubeApp.swift index 55e7f64..7ef7206 100644 --- a/HackerTube/HackerTubeApp.swift +++ b/HackerTube/HackerTubeApp.swift @@ -11,6 +11,8 @@ import CCCApi @main struct HackerTubeApp: App { + @UIApplicationDelegateAdaptor var appDelegate: HackerTubeAppDelegate + var body: some Scene { WindowGroup { ContentView() diff --git a/HackerTube/HackerTubeAppDelegate.swift b/HackerTube/HackerTubeAppDelegate.swift new file mode 100644 index 0000000..31ee762 --- /dev/null +++ b/HackerTube/HackerTubeAppDelegate.swift @@ -0,0 +1,21 @@ +// +// HackerTubeAppDelegate.swift +// HackerTube +// +// Created by Mathijs Bernson on 11/08/2025. +// + +import UIKit + +class HackerTubeAppDelegate: NSObject, UIApplicationDelegate { + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool { + registerDefaultSettings() + return true + } + + private func registerDefaultSettings() { + UserDefaults.standard.register(defaults: [ + UserDefaultsKey.playbackRate.rawValue : 1.0 as Float, + ]) + } +}