Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. Weโ€™ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

๐Ÿ”€ :: (#1205) ์œ ํŠœ๋ธŒ ๋ฎค์ง ํ”Œ๋ ˆ์ด๋ฆฌ์ŠคํŠธ ์žฌ์ƒ ์ง€์› #1241

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
Original file line number Diff line number Diff line change
Expand Up @@ -322,7 +322,10 @@ extension ArtistMusicContentViewController: PlayButtonGroupViewDelegate {
return
}
PlayState.shared.loadAndAppendSongsToPlaylist(songs)
UIApplication.shared.open(url)
if let components = URLComponents(url: url, resolvingAgainstBaseURL: false),
let listID = components.queryItems?.first(where: { $0.name == "list" })?.value {
WakmusicYoutubePlayer(listID: listID).play()
}

case .shufflePlay: // ๋ฏธ์‚ฌ์šฉ
break
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -251,7 +251,10 @@ extension NewSongsContentViewController: SingleActionButtonViewDelegate {
output.showToast.onNext("ํ•ด๋‹น ๊ธฐ๋Šฅ์€ ์ค€๋น„ ์ค‘์ž…๋‹ˆ๋‹ค.")
return
}
UIApplication.shared.open(url)
if let components = URLComponents(url: url, resolvingAgainstBaseURL: false),
let listID = components.queryItems?.first(where: { $0.name == "list" })?.value {
WakmusicYoutubePlayer(listID: listID).play()
}

let songs: [SongEntity] = output.dataSource.value.map {
return SongEntity(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -318,7 +318,10 @@ extension WakmusicPlaylistDetailViewController: SingleActionButtonViewDelegate {

LogManager.analytics(PlaylistAnalyticsLog.clickPlaylistPlayButton(type: "all", key: reactor?.key ?? ""))
PlayState.shared.append(contentsOf: songs.map { PlaylistItem(item: $0) })
UIApplication.shared.open(url)
if let components = URLComponents(url: url, resolvingAgainstBaseURL: false),
let listID = components.queryItems?.first(where: { $0.name == "list" })?.value {
WakmusicYoutubePlayer(listID: listID).play()
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,14 @@ private enum OpenerPlatform {
case youtubeMusic
}

private enum VideoPlayType {
case videos(ids: [String])
case playlist(listID: String)
}

public struct WakmusicYoutubePlayer: WakmusicPlayer {
private let youtubeURLGenerator: any YoutubeURLGeneratable
private let ids: [String]
private let youtubeVideoType: VideoPlayType
private var openerPlatform: OpenerPlatform {
let platform = PreferenceManager.songPlayPlatformType ?? .youtube
switch platform {
Expand All @@ -22,20 +27,33 @@ public struct WakmusicYoutubePlayer: WakmusicPlayer {
id: String,
youtubeURLGenerator: any YoutubeURLGeneratable = YoutubeURLGenerator()
) {
self.ids = [id]
self.youtubeVideoType = .videos(ids: [id])
self.youtubeURLGenerator = youtubeURLGenerator
}

public init(
ids: [String],
youtubeURLGenerator: any YoutubeURLGeneratable = YoutubeURLGenerator()
) {
self.ids = ids
self.youtubeVideoType = .videos(ids: ids)
self.youtubeURLGenerator = youtubeURLGenerator
}

public init(
listID: String,
youtubeURLGenerator: any YoutubeURLGeneratable = YoutubeURLGenerator()
) {
self.youtubeVideoType = .playlist(listID: listID)
self.youtubeURLGenerator = youtubeURLGenerator
}

public func play() {
playYoutube(ids: ids)
switch youtubeVideoType {
case let .videos(ids):
playYoutube(ids: ids)
case let .playlist(listID):
playPlaylistYoutube(listID: listID)
}
}
}

Expand All @@ -48,6 +66,13 @@ private extension WakmusicYoutubePlayer {
await UIApplication.shared.open(url)
}
}

func playPlaylistYoutube(listID: String) {
guard let url = urlForYoutubePlaylist(listID: listID) else {
return
}
UIApplication.shared.open(url)
}
}

private extension WakmusicYoutubePlayer {
Expand Down Expand Up @@ -117,7 +142,25 @@ private extension WakmusicYoutubePlayer {
}
return nil
}
}

private extension WakmusicYoutubePlayer {
func urlForYoutubePlaylist(listID: String) -> URL? {
switch openerPlatform {
case .youtube:
let appURL = openableURL(youtubeURLGenerator.generateYoutubePlaylistAppURL(id: listID))
let webURL = openableURL(youtubeURLGenerator.generateYoutubePlaylistWebURL(id: listID))
return appURL ?? webURL

case .youtubeMusic:
let appURL = openableURL(youtubeURLGenerator.generateYoutubeMusicPlaylistAppURL(id: listID))
let webURL = openableURL(youtubeURLGenerator.generateYoutubeMusicPlaylistWebURL(id: listID))
return appURL ?? webURL
}
}
}

private extension WakmusicYoutubePlayer {
func openableURL(_ urlString: String) -> URL? {
guard let url = URL(string: urlString), UIApplication.shared.canOpenURL(url) else { return nil }
return url
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@ public protocol YoutubeURLGeneratable {
func generateYoutubeVideoWebURL(id: String) -> String
func generateYoutubeVideoAppURL(ids: [String]) -> String
func generateYoutubeVideoWebURL(ids: [String]) -> String
func generateYoutubePlaylistAppURL(id: String) -> String
func generateYoutubePlaylistWebURL(id: String) -> String

func generateYoutubeMusicVideoAppURL(id: String) -> String
func generateYoutubeMusicVideoWebURL(id: String) -> String
func generateYoutubeMusicPlaylistAppURL(id: String) -> String
Expand All @@ -16,6 +19,8 @@ public protocol YoutubeURLGeneratable {
public struct YoutubeURLGenerator: YoutubeURLGeneratable {
public init() {}

// MARK: Youtube

public func generateThumbnailURL(id: String) -> String {
"https://i.ytimg.com/vi/\(id)/mqdefault.jpg"
}
Expand All @@ -40,6 +45,16 @@ public struct YoutubeURLGenerator: YoutubeURLGeneratable {
"https://youtube.com/watch_videos?video_ids=\(ids.joined(separator: ","))"
}

public func generateYoutubePlaylistAppURL(id: String) -> String {
"youtube://playlist?list=\(id)"
}

public func generateYoutubePlaylistWebURL(id: String) -> String {
"https://youtube.com/playlist?list=\(id)"
}

// MARK: Youtube Music

public func generateYoutubeMusicVideoAppURL(id: String) -> String {
return "youtubemusic://watch?v=\(id)"
}
Expand Down
Loading