From 1b38489d0f90716d536069893701622ca4d19835 Mon Sep 17 00:00:00 2001 From: Mathijs Bernson Date: Mon, 11 Aug 2025 13:25:48 +0200 Subject: [PATCH] Remember the last set playback speed Fixes #25 --- HackerTube/Domain/UserDefaultsKey.swift | 12 +++++++++++ .../Features/Talk/TalkPlayerViewModel.swift | 2 ++ .../VideoPlayer/VideoPlayerView.swift | 12 +++++++++++ HackerTube/HackerTubeApp.swift | 2 ++ HackerTube/HackerTubeAppDelegate.swift | 21 +++++++++++++++++++ 5 files changed, 49 insertions(+) create mode 100644 HackerTube/Domain/UserDefaultsKey.swift create mode 100644 HackerTube/HackerTubeAppDelegate.swift 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, + ]) + } +}