From 2b9ce5d94358fe96c0181f424f951bfb77afe45f Mon Sep 17 00:00:00 2001 From: chopmozzi <44396392+chopmozzi@users.noreply.github.com> Date: Thu, 30 Nov 2023 21:49:47 +0900 Subject: [PATCH] =?UTF-8?q?:wrench:=20=EB=AA=A8=EB=8D=B8=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iOS/Layover/Layover/Models/Board.swift | 2 +- iOS/Layover/Layover/Models/Member.swift | 2 +- iOS/Layover/Layover/Models/Post.swift | 2 +- .../Layover/Network/DTOs/MemberDTO.swift | 2 +- .../Layover/Scenes/Home/HomeInteractor.swift | 4 +- .../Layover/Scenes/Home/HomeModels.swift | 6 +- .../Layover/Scenes/Home/HomeRouter.swift | 15 +--- .../Scenes/Home/HomeViewController.swift | 87 ++++++++++++------- .../Layover/Scenes/Map/MapInteractor.swift | 4 +- .../Layover/Scenes/Map/MapModels.swift | 6 +- .../Layover/Scenes/Map/MapRouter.swift | 14 +-- .../Scenes/Map/MapViewController.swift | 87 ++++++++++++------- .../Scenes/Playback/Cell/PlaybackCell.swift | 6 +- .../Scenes/Playback/PlaybackInteractor.swift | 6 +- .../Scenes/Playback/PlaybackModels.swift | 13 +-- .../Playback/PlaybackViewController.swift | 9 +- .../Scenes/Playback/PlaybackWorker.swift | 8 +- 17 files changed, 151 insertions(+), 122 deletions(-) diff --git a/iOS/Layover/Layover/Models/Board.swift b/iOS/Layover/Layover/Models/Board.swift index 9570e71..e492aed 100644 --- a/iOS/Layover/Layover/Models/Board.swift +++ b/iOS/Layover/Layover/Models/Board.swift @@ -8,7 +8,7 @@ import Foundation -struct Board { +struct Board: Hashable { let identifier: Int let title: String let description: String? diff --git a/iOS/Layover/Layover/Models/Member.swift b/iOS/Layover/Layover/Models/Member.swift index f165fdf..2e67123 100644 --- a/iOS/Layover/Layover/Models/Member.swift +++ b/iOS/Layover/Layover/Models/Member.swift @@ -8,7 +8,7 @@ import Foundation -struct Member { +struct Member: Hashable { let identifier: Int let username: String let introduce: String diff --git a/iOS/Layover/Layover/Models/Post.swift b/iOS/Layover/Layover/Models/Post.swift index 24b658c..636226e 100644 --- a/iOS/Layover/Layover/Models/Post.swift +++ b/iOS/Layover/Layover/Models/Post.swift @@ -8,7 +8,7 @@ import Foundation -struct Post { +struct Post: Hashable { let member: Member let board: Board let tag: [String] diff --git a/iOS/Layover/Layover/Network/DTOs/MemberDTO.swift b/iOS/Layover/Layover/Network/DTOs/MemberDTO.swift index e58a073..46de918 100644 --- a/iOS/Layover/Layover/Network/DTOs/MemberDTO.swift +++ b/iOS/Layover/Layover/Network/DTOs/MemberDTO.swift @@ -8,7 +8,7 @@ import Foundation -struct MemberDTO: Decodable { +struct MemberDTO: Codable { let id: Int let username, introduce: String let profileImageURL: String diff --git a/iOS/Layover/Layover/Scenes/Home/HomeInteractor.swift b/iOS/Layover/Layover/Scenes/Home/HomeInteractor.swift index 2e64855..e04f171 100644 --- a/iOS/Layover/Layover/Scenes/Home/HomeInteractor.swift +++ b/iOS/Layover/Layover/Scenes/Home/HomeInteractor.swift @@ -14,7 +14,7 @@ protocol HomeBusinessLogic { } protocol HomeDataStore { - var videos: [VideoDTO]? { get set } + var videos: [Post]? { get set } var index: Int? { get set } } @@ -26,7 +26,7 @@ final class HomeInteractor: HomeDataStore { var presenter: HomePresentationLogic? - var videos: [VideoDTO]? + var videos: [Post]? var index: Int? } diff --git a/iOS/Layover/Layover/Scenes/Home/HomeModels.swift b/iOS/Layover/Layover/Scenes/Home/HomeModels.swift index 33419ab..6f690db 100644 --- a/iOS/Layover/Layover/Scenes/Home/HomeModels.swift +++ b/iOS/Layover/Layover/Scenes/Home/HomeModels.swift @@ -28,17 +28,17 @@ enum HomeModels { enum MoveToPlaybackScene { struct Request { let index: Int - let videos: [VideoDTO] + let videos: [Post] } struct Response { let index: Int - let videos: [VideoDTO] + let videos: [Post] } struct ViewModel { let index: Int - let videos: [VideoDTO] + let videos: [Post] } } } diff --git a/iOS/Layover/Layover/Scenes/Home/HomeRouter.swift b/iOS/Layover/Layover/Scenes/Home/HomeRouter.swift index 1635e20..6a17134 100644 --- a/iOS/Layover/Layover/Scenes/Home/HomeRouter.swift +++ b/iOS/Layover/Layover/Scenes/Home/HomeRouter.swift @@ -38,20 +38,13 @@ final class HomeRouter: NSObject, HomeRoutingLogic, HomeDataPassing { else { return } destination.parentView = .home destination.index = source.index - destination.videos = transDTO(videos: source.videos ?? []) + destination.videos = transData(videos: source.videos ?? []) viewController?.navigationController?.pushViewController(playbackViewController, animated: true) } - // Interactor가 해줄 역할? 고민 필요 - private func transDTO(videos: [VideoDTO]) -> [PlaybackModels.Board] { - videos.map { videoDTO in - return PlaybackModels.Board( - title: videoDTO.title, - content: videoDTO.content, - tags: videoDTO.tags, - sdUrl: videoDTO.sdURL, - hdURL: videoDTO.hdURL, - memeber: videoDTO.member) + private func transData(videos: [Post]) -> [PlaybackModels.PlaybackVideo] { + videos.map { video in + return PlaybackModels.PlaybackVideo(post: video) } } // MARK: - Data Passing diff --git a/iOS/Layover/Layover/Scenes/Home/HomeViewController.swift b/iOS/Layover/Layover/Scenes/Home/HomeViewController.swift index d9f19b7..c1e2493 100644 --- a/iOS/Layover/Layover/Scenes/Home/HomeViewController.swift +++ b/iOS/Layover/Layover/Scenes/Home/HomeViewController.swift @@ -44,38 +44,61 @@ final class HomeViewController: BaseViewController { cell.setVideo(url: url, loopingAt: .zero) cell.configure(title: "요리왕 비룡 데뷔", tags: ["#천상의맛", "#갈갈갈", "#빨리주세요"]) cell.moveToPlaybackSceneCallback = { - self.interactor?.moveToPlaybackScene(with: Models.MoveToPlaybackScene.Request(index: indexPath.row, videos: [ - VideoDTO(title: "찹모찌1", - content: "찹모찌의 뜻은 뭘 까?", - location: "첫번째 우주", - tags: ["찹"], - member: MemberDTO( - username: "찹모찌", - introduce: "찹모찌임당", - profileImageURL: URL(string: "https://i.ibb.co/qML8vdN/2023-11-25-9-08-01.png")!), - sdURL: URL(string: "https://bitmovin-a.akamaihd.net/content/art-of-motion_drm/m3u8s/11331.m3u8")!, - hdURL: URL(string: "https://bitmovin-a.akamaihd.net/content/art-of-motion_drm/m3u8s/11331.m3u8")!), - VideoDTO(title: "찹모찌2", - content: "찹모찌의 뜻은 뭘 까??", - location: "첫번째 우주", - tags: ["찹", "모"], - member: MemberDTO( - username: "찹모찌", - introduce: "찹모찌임당", - profileImageURL: URL(string: "https://i.ibb.co/qML8vdN/2023-11-25-9-08-01.png")!), - sdURL: URL(string: "https://bitmovin-a.akamaihd.net/content/art-of-motion_drm/m3u8s/11331.m3u8")!, - hdURL: URL(string: "https://bitmovin-a.akamaihd.net/content/art-of-motion_drm/m3u8s/11331.m3u8")!), - VideoDTO(title: "찹모찌3", - content: "찹모찌의 뜻은 뭘 까??", - location: "첫번째 우주", - tags: ["찹", "모"], - member: MemberDTO( - username: "찹모찌", - introduce: "찹모찌임당", - profileImageURL: URL(string: "https://i.ibb.co/qML8vdN/2023-11-25-9-08-01.png")!), - sdURL: URL(string: "https://bitmovin-a.akamaihd.net/content/art-of-motion_drm/m3u8s/11331.m3u8")!, - hdURL: URL(string: "https://bitmovin-a.akamaihd.net/content/art-of-motion_drm/m3u8s/11331.m3u8")!) - ])) + self.interactor?.moveToPlaybackScene( + with: Models.MoveToPlaybackScene.Request( + index: indexPath.row, + videos: [ + Post( + member: Member( + identifier: 1, + username: "찹모찌", + introduce: "찹모찌데스", + profileImageURL: URL(string: "https://i.ibb.co/qML8vdN/2023-11-25-9-08-01.png")!), + board: Board( + identifier: 1, + title: "찹찹찹", + description: "찹모찌의 뜻은 뭘까?", + thumbnailImageURL: nil, + videoURL: URL(string: "https://bitmovin-a.akamaihd.net/content/art-of-motion_drm/m3u8s/11331.m3u8")!, + latitude: nil, + longitude: nil), + tag: ["찹", "모", "찌"] + ), + Post( + member: Member( + identifier: 2, + username: "로인설", + introduce: "로인설데스", + profileImageURL: URL(string: "https://i.ibb.co/qML8vdN/2023-11-25-9-08-01.png")!), + board: Board( + identifier: 2, + title: "설설설", + description: "로인설의 뜻은 뭘까?", + thumbnailImageURL: nil, + videoURL: URL(string: "https://bitmovin-a.akamaihd.net/content/art-of-motion_drm/m3u8s/11331.m3u8")!, + latitude: nil, + longitude: nil), + tag: ["로", "인", "설"] + ), + Post( + member: Member( + identifier: 3, + username: "콩콩콩", + introduce: "콩콩콩데스", + profileImageURL: URL(string: "https://i.ibb.co/qML8vdN/2023-11-25-9-08-01.png")!), + board: Board( + identifier: 1, + title: "콩콩콩", + description: "콩콩콩의 뜻은 뭘까?", + thumbnailImageURL: nil, + videoURL: URL(string: "https://bitmovin-a.akamaihd.net/content/art-of-motion_drm/m3u8s/11331.m3u8")!, + latitude: nil, + longitude: nil), + tag: ["콩", "콩", "콩"] + ) + ] + ) + ) } cell.addLoopingViewGesture() return cell diff --git a/iOS/Layover/Layover/Scenes/Map/MapInteractor.swift b/iOS/Layover/Layover/Scenes/Map/MapInteractor.swift index 1180ddd..5ddf928 100644 --- a/iOS/Layover/Layover/Scenes/Map/MapInteractor.swift +++ b/iOS/Layover/Layover/Scenes/Map/MapInteractor.swift @@ -16,7 +16,7 @@ protocol MapBusinessLogic { } protocol MapDataStore { - var videos: [VideoDTO]? { get set } + var videos: [Post]? { get set } var index: Int? { get set } } @@ -34,7 +34,7 @@ final class MapInteractor: NSObject, MapBusinessLogic, MapDataStore { var index: Int? - var videos: [VideoDTO]? + var videos: [Post]? var presenter: MapPresentationLogic? diff --git a/iOS/Layover/Layover/Scenes/Map/MapModels.swift b/iOS/Layover/Layover/Scenes/Map/MapModels.swift index fe5b1c6..b5b6ad4 100644 --- a/iOS/Layover/Layover/Scenes/Map/MapModels.swift +++ b/iOS/Layover/Layover/Scenes/Map/MapModels.swift @@ -36,17 +36,17 @@ enum MapModels { enum MoveToPlaybackScene { struct Request { let index: Int - let videos: [VideoDTO] + let videos: [Post] } struct Response { let index: Int - let videos: [VideoDTO] + let videos: [Post] } struct ViewModel { let index: Int - let videos: [VideoDTO] + let videos: [Post] } } diff --git a/iOS/Layover/Layover/Scenes/Map/MapRouter.swift b/iOS/Layover/Layover/Scenes/Map/MapRouter.swift index a7a57ad..40549bd 100644 --- a/iOS/Layover/Layover/Scenes/Map/MapRouter.swift +++ b/iOS/Layover/Layover/Scenes/Map/MapRouter.swift @@ -32,19 +32,13 @@ final class MapRouter: MapRoutingLogic, MapDataPassing { else { return } destination.parentView = .other destination.index = source.index - destination.videos = transDTO(videos: source.videos ?? []) + destination.videos = transData(videos: source.videos ?? []) viewController?.navigationController?.pushViewController(playbackViewController, animated: true) } - private func transDTO(videos: [VideoDTO]) -> [PlaybackModels.Board] { - videos.map { videoDTO in - return PlaybackModels.Board( - title: videoDTO.title, - content: videoDTO.content, - tags: videoDTO.tags, - sdUrl: videoDTO.sdURL, - hdURL: videoDTO.hdURL, - memeber: videoDTO.member) + private func transData(videos: [Post]) -> [PlaybackModels.PlaybackVideo] { + videos.map { video in + return PlaybackModels.PlaybackVideo(post: video) } } diff --git a/iOS/Layover/Layover/Scenes/Map/MapViewController.swift b/iOS/Layover/Layover/Scenes/Map/MapViewController.swift index 638b77d..0e401f2 100644 --- a/iOS/Layover/Layover/Scenes/Map/MapViewController.swift +++ b/iOS/Layover/Layover/Scenes/Map/MapViewController.swift @@ -63,38 +63,61 @@ final class MapViewController: BaseViewController { for: indexPath) as? MapCarouselCollectionViewCell else { return UICollectionViewCell() } cell.configure(url: item.videoURL) cell.moveToPlaybackSceneCallback = { - self.interactor?.moveToPlaybackScene(with: Models.MoveToPlaybackScene.Request(index: indexPath.row, videos: [ - VideoDTO(title: "찹모찌1", - content: "찹모찌의 뜻은 뭘 까?", - location: "첫번째 우주", - tags: ["찹"], - member: MemberDTO( - username: "찹모찌", - introduce: "찹모찌임당", - profileImageURL: URL(string: "https://i.ibb.co/qML8vdN/2023-11-25-9-08-01.png")!), - sdURL: URL(string: "https://bitmovin-a.akamaihd.net/content/art-of-motion_drm/m3u8s/11331.m3u8")!, - hdURL: URL(string: "https://bitmovin-a.akamaihd.net/content/art-of-motion_drm/m3u8s/11331.m3u8")!), - VideoDTO(title: "찹모찌2", - content: "찹모찌의 뜻은 뭘 까??", - location: "첫번째 우주", - tags: ["찹", "모"], - member: MemberDTO( - username: "찹모찌", - introduce: "찹모찌임당", - profileImageURL: URL(string: "https://i.ibb.co/qML8vdN/2023-11-25-9-08-01.png")!), - sdURL: URL(string: "https://bitmovin-a.akamaihd.net/content/art-of-motion_drm/m3u8s/11331.m3u8")!, - hdURL: URL(string: "https://bitmovin-a.akamaihd.net/content/art-of-motion_drm/m3u8s/11331.m3u8")!), - VideoDTO(title: "찹모찌3", - content: "찹모찌의 뜻은 뭘 까??", - location: "첫번째 우주", - tags: ["찹", "모"], - member: MemberDTO( - username: "찹모찌", - introduce: "찹모찌임당", - profileImageURL: URL(string: "https://i.ibb.co/qML8vdN/2023-11-25-9-08-01.png")!), - sdURL: URL(string: "https://bitmovin-a.akamaihd.net/content/art-of-motion_drm/m3u8s/11331.m3u8")!, - hdURL: URL(string: "https://bitmovin-a.akamaihd.net/content/art-of-motion_drm/m3u8s/11331.m3u8")!) - ])) + self.interactor?.moveToPlaybackScene( + with: Models.MoveToPlaybackScene.Request( + index: indexPath.row, + videos: [ + Post( + member: Member( + identifier: 1, + username: "찹모찌", + introduce: "찹모찌데스", + profileImageURL: URL(string: "https://i.ibb.co/qML8vdN/2023-11-25-9-08-01.png")!), + board: Board( + identifier: 1, + title: "찹찹찹", + description: "찹모찌의 뜻은 뭘까?", + thumbnailImageURL: nil, + videoURL: URL(string: "https://bitmovin-a.akamaihd.net/content/art-of-motion_drm/m3u8s/11331.m3u8")!, + latitude: nil, + longitude: nil), + tag: ["찹", "모", "찌"] + ), + Post( + member: Member( + identifier: 2, + username: "로인설", + introduce: "로인설데스", + profileImageURL: URL(string: "https://i.ibb.co/qML8vdN/2023-11-25-9-08-01.png")!), + board: Board( + identifier: 2, + title: "설설설", + description: "로인설의 뜻은 뭘까?", + thumbnailImageURL: nil, + videoURL: URL(string: "https://bitmovin-a.akamaihd.net/content/art-of-motion_drm/m3u8s/11331.m3u8")!, + latitude: nil, + longitude: nil), + tag: ["로", "인", "설"] + ), + Post( + member: Member( + identifier: 3, + username: "콩콩콩", + introduce: "콩콩콩데스", + profileImageURL: URL(string: "https://i.ibb.co/qML8vdN/2023-11-25-9-08-01.png")!), + board: Board( + identifier: 1, + title: "콩콩콩", + description: "콩콩콩의 뜻은 뭘까?", + thumbnailImageURL: nil, + videoURL: URL(string: "https://bitmovin-a.akamaihd.net/content/art-of-motion_drm/m3u8s/11331.m3u8")!, + latitude: nil, + longitude: nil), + tag: ["콩", "콩", "콩"] + ) + ] + ) + ) } cell.addLoopingViewGesture() return cell diff --git a/iOS/Layover/Layover/Scenes/Playback/Cell/PlaybackCell.swift b/iOS/Layover/Layover/Scenes/Playback/Cell/PlaybackCell.swift index 1920a6f..f3d4c27 100644 --- a/iOS/Layover/Layover/Scenes/Playback/Cell/PlaybackCell.swift +++ b/iOS/Layover/Layover/Scenes/Playback/Cell/PlaybackCell.swift @@ -22,9 +22,9 @@ final class PlaybackCell: UICollectionViewCell { } // TODO: VideoModel 받아서 처리 - func setPlaybackContents(viewModel: PlaybackModels.Board) { - playbackView.descriptionView.titleLabel.text = viewModel.title - playbackView.descriptionView.setText(viewModel.content) + func setPlaybackContents(viewModel: PlaybackModels.PlaybackVideo) { + playbackView.descriptionView.titleLabel.text = viewModel.post.board.title + playbackView.descriptionView.setText(viewModel.post.board.description ?? "") } diff --git a/iOS/Layover/Layover/Scenes/Playback/PlaybackInteractor.swift b/iOS/Layover/Layover/Scenes/Playback/PlaybackInteractor.swift index b6e1522..94eacd5 100644 --- a/iOS/Layover/Layover/Scenes/Playback/PlaybackInteractor.swift +++ b/iOS/Layover/Layover/Scenes/Playback/PlaybackInteractor.swift @@ -20,7 +20,7 @@ protocol PlaybackBusinessLogic { } protocol PlaybackDataStore: AnyObject { - var videos: [PlaybackModels.Board]? { get set } + var videos: [PlaybackModels.PlaybackVideo]? { get set } var parentView: PlaybackModels.ParentView? { get set } var prevCell: PlaybackCell? { get set } var index: Int? { get set } @@ -36,7 +36,7 @@ final class PlaybackInteractor: PlaybackBusinessLogic, PlaybackDataStore { lazy var worker = PlaybackWorker() var presenter: PlaybackPresentationLogic? - var videos: [Models.Board]? + var videos: [PlaybackModels.PlaybackVideo]? var parentView: Models.ParentView? @@ -52,7 +52,7 @@ final class PlaybackInteractor: PlaybackBusinessLogic, PlaybackDataStore { guard let parentView: Models.ParentView else { return } - guard var videos: [PlaybackModels.Board] else { + guard var videos: [PlaybackModels.PlaybackVideo] else { return } if parentView == .other { diff --git a/iOS/Layover/Layover/Scenes/Playback/PlaybackModels.swift b/iOS/Layover/Layover/Scenes/Playback/PlaybackModels.swift index b5b412c..9d55e50 100644 --- a/iOS/Layover/Layover/Scenes/Playback/PlaybackModels.swift +++ b/iOS/Layover/Layover/Scenes/Playback/PlaybackModels.swift @@ -10,14 +10,9 @@ import Foundation enum PlaybackModels { // MARK: - Properties Type - struct Board: Hashable { + struct PlaybackVideo: Hashable { var id: UUID = UUID() - let title: String - let content: String - let tags: [String] - let sdUrl: URL - let hdURL: URL - let memeber: MemberDTO + let post: Post } enum ParentView { @@ -33,11 +28,11 @@ enum PlaybackModels { } struct Response { - let videos: [Board] + let videos: [PlaybackVideo] } struct ViewModel { - let videos: [Board] + let videos: [PlaybackVideo] } } diff --git a/iOS/Layover/Layover/Scenes/Playback/PlaybackViewController.swift b/iOS/Layover/Layover/Scenes/Playback/PlaybackViewController.swift index 8b3e3ae..74e270a 100644 --- a/iOS/Layover/Layover/Scenes/Playback/PlaybackViewController.swift +++ b/iOS/Layover/Layover/Scenes/Playback/PlaybackViewController.swift @@ -40,7 +40,7 @@ final class PlaybackViewController: BaseViewController { // MARK: - Properties - private var dataSource: UICollectionViewDiffableDataSource? + private var dataSource: UICollectionViewDiffableDataSource? typealias Models = PlaybackModels var router: (NSObjectProtocol & PlaybackRoutingLogic & PlaybackDataPassing)? @@ -111,7 +111,7 @@ final class PlaybackViewController: BaseViewController { extension PlaybackViewController: PlaybackDisplayLogic { func displayVideoList(viewModel: Models.LoadPlaybackVideoList.ViewModel) { - var snapshot = NSDiffableDataSourceSnapshot() + var snapshot = NSDiffableDataSourceSnapshot() snapshot.appendSections([.main]) snapshot.appendItems(viewModel.videos) dataSource?.apply(snapshot, animatingDifferences: false) @@ -177,10 +177,11 @@ private extension PlaybackViewController { return } playbackCollectionView.register(PlaybackCell.self, forCellWithReuseIdentifier: PlaybackCell.identifier) - dataSource = UICollectionViewDiffableDataSource(collectionView: playbackCollectionView) { (collectionView, indexPath, video) -> UICollectionViewCell? in + dataSource = UICollectionViewDiffableDataSource(collectionView: playbackCollectionView) { (collectionView, indexPath, video) -> UICollectionViewCell? in guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: PlaybackCell.identifier, for: indexPath) as? PlaybackCell else { return PlaybackCell() } + guard let videoURL: URL = video.post.board.videoURL else { return PlaybackCell()} cell.setPlaybackContents(viewModel: video) - cell.addAVPlayer(url: video.hdURL) + cell.addAVPlayer(url: videoURL) cell.setPlayerSlider(tabbarHeight: tabbarHeight) return cell } diff --git a/iOS/Layover/Layover/Scenes/Playback/PlaybackWorker.swift b/iOS/Layover/Layover/Scenes/Playback/PlaybackWorker.swift index 8d236a7..62ab097 100644 --- a/iOS/Layover/Layover/Scenes/Playback/PlaybackWorker.swift +++ b/iOS/Layover/Layover/Scenes/Playback/PlaybackWorker.swift @@ -16,11 +16,11 @@ final class PlaybackWorker { // MARK: - Methods - func makeInfiniteScroll(videos: [Models.Board]) -> [Models.Board] { - var tempVideos: [Models.Board] = videos - var tempLastVideo: Models.Board = videos[tempVideos.count-1] + func makeInfiniteScroll(videos: [Models.PlaybackVideo]) -> [Models.PlaybackVideo] { + var tempVideos: [Models.PlaybackVideo] = videos + var tempLastVideo: Models.PlaybackVideo = videos[tempVideos.count-1] tempLastVideo.id = UUID() - var tempFirstVideo: Models.Board = videos[1] + var tempFirstVideo: Models.PlaybackVideo = videos[1] tempFirstVideo.id = UUID() tempVideos.insert(tempLastVideo, at: 0) tempVideos.append(tempFirstVideo)