HELL YEAHHH

This commit is contained in:
Francesco 2025-04-08 20:17:22 +02:00
parent aadea3f178
commit 89c8311809
6 changed files with 51 additions and 49 deletions

View file

@ -920,6 +920,20 @@ class CustomMediaPlayerViewController: UIViewController {
} }
DispatchQueue.main.async { DispatchQueue.main.async {
let remainingPercentage = (self.duration - self.currentTimeVal) / self.duration
if remainingPercentage < 0.1 && self.module.metadata.type == "anime" && self.aniListID != 0 {
let aniListMutation = AniListMutation()
aniListMutation.updateAnimeProgress(animeId: self.aniListID, episodeNumber: self.episodeNumber) { result in
switch result {
case .success:
Logger.shared.log("Successfully updated AniList progress for episode \(self.episodeNumber)", type: "General")
case .failure(let error):
Logger.shared.log("Failed to update AniList progress: \(error.localizedDescription)", type: "Error")
}
}
}
self.sliderHostingController?.rootView = MusicProgressSlider( self.sliderHostingController?.rootView = MusicProgressSlider(
value: Binding( value: Binding(
get: { max(0, min(self.sliderViewModel.sliderValue, self.duration)) }, get: { max(0, min(self.sliderViewModel.sliderValue, self.duration)) },
@ -1623,7 +1637,7 @@ class CustomMediaPlayerViewController: UIViewController {
func setupTimeControlStatusObservation() { func setupTimeControlStatusObservation() {
playerTimeControlStatusObserver = player.observe(\.timeControlStatus, options: [.new]) { [weak self] player, _ in playerTimeControlStatusObserver = player.observe(\.timeControlStatus, options: [.new]) { [weak self] player, _ in
guard let self = self else { return } guard self != nil else { return }
if player.timeControlStatus == .paused, if player.timeControlStatus == .paused,
let reason = player.reasonForWaitingToPlay { let reason = player.reasonForWaitingToPlay {
// If we are paused for a stall/minimize stalls reason, forcibly resume: // If we are paused for a stall/minimize stalls reason, forcibly resume:

View file

@ -101,8 +101,9 @@ class VideoPlayerViewController: UIViewController {
guard let player = self.player else { return } guard let player = self.player else { return }
let interval = CMTime(seconds: 1.0, preferredTimescale: CMTimeScale(NSEC_PER_SEC)) let interval = CMTime(seconds: 1.0, preferredTimescale: CMTimeScale(NSEC_PER_SEC))
timeObserverToken = player.addPeriodicTimeObserver(forInterval: interval, queue: .main) { time in timeObserverToken = player.addPeriodicTimeObserver(forInterval: interval, queue: .main) { [weak self] time in
guard let currentItem = player.currentItem, guard let self = self,
let currentItem = player.currentItem,
currentItem.duration.seconds.isFinite else { currentItem.duration.seconds.isFinite else {
return return
} }
@ -112,26 +113,37 @@ class VideoPlayerViewController: UIViewController {
UserDefaults.standard.set(currentTime, forKey: "lastPlayedTime_\(fullURL)") UserDefaults.standard.set(currentTime, forKey: "lastPlayedTime_\(fullURL)")
UserDefaults.standard.set(duration, forKey: "totalTime_\(fullURL)") UserDefaults.standard.set(duration, forKey: "totalTime_\(fullURL)")
}
let remainingPercentage = (duration - currentTime) / duration
if let currentItem = player.currentItem, currentItem.duration.seconds > 0,
let streamUrl = streamUrl { if remainingPercentage < 0.1 && self.module.metadata.type == "anime" && self.aniListID != 0 {
let currentTime = UserDefaults.standard.double(forKey: "lastPlayedTime_\(fullUrl)") let aniListMutation = AniListMutation()
let duration = currentItem.duration.seconds aniListMutation.updateAnimeProgress(animeId: self.aniListID, episodeNumber: self.episodeNumber) { result in
let progress = currentTime / duration switch result {
let item = ContinueWatchingItem( case .success:
id: UUID(), Logger.shared.log("Successfully updated AniList progress for episode \(self.episodeNumber)", type: "General")
imageUrl: episodeImageUrl, case .failure(let error):
episodeNumber: episodeNumber, Logger.shared.log("Failed to update AniList progress: \(error.localizedDescription)", type: "Error")
mediaTitle: mediaTitle, }
progress: progress, }
streamUrl: streamUrl, }
fullUrl: fullUrl,
subtitles: subtitles, if let streamUrl = self.streamUrl {
aniListID: aniListID, let progress = currentTime / duration
module: module let item = ContinueWatchingItem(
) id: UUID(),
ContinueWatchingManager.shared.save(item: item) imageUrl: self.episodeImageUrl,
episodeNumber: self.episodeNumber,
mediaTitle: self.mediaTitle,
progress: progress,
streamUrl: streamUrl,
fullUrl: self.fullUrl,
subtitles: self.subtitles,
aniListID: self.aniListID,
module: self.module
)
ContinueWatchingManager.shared.save(item: item)
}
} }
} }

View file

@ -233,6 +233,7 @@ struct ContinueWatchingCell: View {
videoPlayerViewController.episodeNumber = item.episodeNumber videoPlayerViewController.episodeNumber = item.episodeNumber
videoPlayerViewController.mediaTitle = item.mediaTitle videoPlayerViewController.mediaTitle = item.mediaTitle
videoPlayerViewController.subtitles = item.subtitles ?? "" videoPlayerViewController.subtitles = item.subtitles ?? ""
videoPlayerViewController.aniListID = item.aniListID ?? 0
videoPlayerViewController.modalPresentationStyle = .fullScreen videoPlayerViewController.modalPresentationStyle = .fullScreen
if let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene, if let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene,

View file

@ -694,6 +694,7 @@ struct MediaInfoView: View {
videoPlayerViewController.episodeImageUrl = selectedEpisodeImage videoPlayerViewController.episodeImageUrl = selectedEpisodeImage
videoPlayerViewController.mediaTitle = title videoPlayerViewController.mediaTitle = title
videoPlayerViewController.subtitles = subtitles ?? "" videoPlayerViewController.subtitles = subtitles ?? ""
videoPlayerViewController.aniListID = itemID ?? 0
videoPlayerViewController.modalPresentationStyle = .fullScreen videoPlayerViewController.modalPresentationStyle = .fullScreen
if let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene, if let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene,

View file

@ -45,7 +45,6 @@
13B7F4C12D58FFDD0045714A /* Shimmer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13B7F4C02D58FFDD0045714A /* Shimmer.swift */; }; 13B7F4C12D58FFDD0045714A /* Shimmer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13B7F4C02D58FFDD0045714A /* Shimmer.swift */; };
13C0E5EA2D5F85EA00E7F619 /* ContinueWatchingManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13C0E5E92D5F85EA00E7F619 /* ContinueWatchingManager.swift */; }; 13C0E5EA2D5F85EA00E7F619 /* ContinueWatchingManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13C0E5E92D5F85EA00E7F619 /* ContinueWatchingManager.swift */; };
13C0E5EC2D5F85F800E7F619 /* ContinueWatchingItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13C0E5EB2D5F85F800E7F619 /* ContinueWatchingItem.swift */; }; 13C0E5EC2D5F85F800E7F619 /* ContinueWatchingItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13C0E5EB2D5F85F800E7F619 /* ContinueWatchingItem.swift */; };
13C285F62DA56B6F009FB0D0 /* SlideOverCard in Frameworks */ = {isa = PBXBuildFile; productRef = 13C285F52DA56B6F009FB0D0 /* SlideOverCard */; };
13CBA0882D60F19C00EFE70A /* VTTSubtitlesLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13CBA0872D60F19C00EFE70A /* VTTSubtitlesLoader.swift */; }; 13CBA0882D60F19C00EFE70A /* VTTSubtitlesLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13CBA0872D60F19C00EFE70A /* VTTSubtitlesLoader.swift */; };
13CBEFDA2D5F7D1200D011EE /* String.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13CBEFD92D5F7D1200D011EE /* String.swift */; }; 13CBEFDA2D5F7D1200D011EE /* String.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13CBEFD92D5F7D1200D011EE /* String.swift */; };
13D842552D45267500EBBFA6 /* DropManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13D842542D45267500EBBFA6 /* DropManager.swift */; }; 13D842552D45267500EBBFA6 /* DropManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13D842542D45267500EBBFA6 /* DropManager.swift */; };
@ -129,7 +128,6 @@
isa = PBXFrameworksBuildPhase; isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
13C285F62DA56B6F009FB0D0 /* SlideOverCard in Frameworks */,
13B77E192DA44F8300126FDF /* MarqueeLabel in Frameworks */, 13B77E192DA44F8300126FDF /* MarqueeLabel in Frameworks */,
132E35232D959E410007800E /* Kingfisher in Frameworks */, 132E35232D959E410007800E /* Kingfisher in Frameworks */,
132E35202D959E1D0007800E /* FFmpeg-iOS-Lame in Frameworks */, 132E35202D959E1D0007800E /* FFmpeg-iOS-Lame in Frameworks */,
@ -438,7 +436,6 @@
132E351F2D959E1D0007800E /* FFmpeg-iOS-Lame */, 132E351F2D959E1D0007800E /* FFmpeg-iOS-Lame */,
132E35222D959E410007800E /* Kingfisher */, 132E35222D959E410007800E /* Kingfisher */,
13B77E182DA44F8300126FDF /* MarqueeLabel */, 13B77E182DA44F8300126FDF /* MarqueeLabel */,
13C285F52DA56B6F009FB0D0 /* SlideOverCard */,
); );
productName = Sora; productName = Sora;
productReference = 133D7C6A2D2BE2500075467E /* Sulfur.app */; productReference = 133D7C6A2D2BE2500075467E /* Sulfur.app */;
@ -472,7 +469,6 @@
132E351E2D959E1D0007800E /* XCRemoteSwiftPackageReference "FFmpeg-iOS-Lame" */, 132E351E2D959E1D0007800E /* XCRemoteSwiftPackageReference "FFmpeg-iOS-Lame" */,
132E35212D959E410007800E /* XCRemoteSwiftPackageReference "Kingfisher" */, 132E35212D959E410007800E /* XCRemoteSwiftPackageReference "Kingfisher" */,
13B77E172DA44F8300126FDF /* XCRemoteSwiftPackageReference "MarqueeLabel" */, 13B77E172DA44F8300126FDF /* XCRemoteSwiftPackageReference "MarqueeLabel" */,
13C285F42DA56B6F009FB0D0 /* XCRemoteSwiftPackageReference "SlideOverCard" */,
); );
productRefGroup = 133D7C6B2D2BE2500075467E /* Products */; productRefGroup = 133D7C6B2D2BE2500075467E /* Products */;
projectDirPath = ""; projectDirPath = "";
@ -816,14 +812,6 @@
version = 4.2.1; version = 4.2.1;
}; };
}; };
13C285F42DA56B6F009FB0D0 /* XCRemoteSwiftPackageReference "SlideOverCard" */ = {
isa = XCRemoteSwiftPackageReference;
repositoryURL = "https://github.com/joogps/SlideOverCard";
requirement = {
kind = exactVersion;
version = 3.0.1;
};
};
/* End XCRemoteSwiftPackageReference section */ /* End XCRemoteSwiftPackageReference section */
/* Begin XCSwiftPackageProductDependency section */ /* Begin XCSwiftPackageProductDependency section */
@ -847,11 +835,6 @@
package = 13B77E172DA44F8300126FDF /* XCRemoteSwiftPackageReference "MarqueeLabel" */; package = 13B77E172DA44F8300126FDF /* XCRemoteSwiftPackageReference "MarqueeLabel" */;
productName = MarqueeLabel; productName = MarqueeLabel;
}; };
13C285F52DA56B6F009FB0D0 /* SlideOverCard */ = {
isa = XCSwiftPackageProductDependency;
package = 13C285F42DA56B6F009FB0D0 /* XCRemoteSwiftPackageReference "SlideOverCard" */;
productName = SlideOverCard;
};
/* End XCSwiftPackageProductDependency section */ /* End XCSwiftPackageProductDependency section */
}; };
rootObject = 133D7C622D2BE2500075467E /* Project object */; rootObject = 133D7C622D2BE2500075467E /* Project object */;

View file

@ -45,15 +45,6 @@
"revision": "cffb6938940d3242882e6a2f9170b7890a4729ea", "revision": "cffb6938940d3242882e6a2f9170b7890a4729ea",
"version": "4.2.1" "version": "4.2.1"
} }
},
{
"package": "SlideOverCard",
"repositoryURL": "https://github.com/joogps/SlideOverCard",
"state": {
"branch": null,
"revision": "e38be074ab7a5b46d0a18f550bf94972a0f582c6",
"version": "3.0.1"
}
} }
] ]
}, },