0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

YouTubeで再生地点指定するのってどうしてんの??

Posted at

はじめに

YouTube大好き!!
週に17時間26分見るくらい好き!!
この時間を法律の勉強に充てれば大体4年で司法試験に合格できる。

最近気になってるのが
履歴から動画再生したら前停止したとこから再生できるんだけど?!?!?!?!
めっちゃ便利なんで?!これなんで?!

目的

YTSwiftyPlayerの基本的な使用法を学ぶ。
evaluateJavaScriptメソッドの使用法を理解する。
YouTube動画のシーク操作を理解する。

YoutubeKit

結論から言うとよくわからんかった

でもYoutubeKitというライブラリを見つけた。
この中にシークバーに関するメソッドも存在したのでそこから想像してみたいと思う。

YoutubeKitについてChatGPTに雑に投げてみた。

YoutubeKitは、Youtube IFrame APIおよびYoutubeDataAPIを完全にサポートするビデオプレーヤーです。
これにより、Youtubeアプリケーションを簡単に作成できます。
このライブラリは、rinovによってGitHubで公開されており、Swiftで書かれています。

主な特徴:
YTSwiftyPlayer: Youtube IFrame APIをサポートするビデオプレーヤーです。これにより、高性能でメモリ効率の良いビデオプレーヤーを実装できます。
YoutubeDataAPI: YoutubeDataAPI(v3)をサポートしており、様々なAPIリクエストを行うことができます。

使用方法:
YoutubeKitを使用すると、Youtubeビデオの再生や、YoutubeDataAPIを使用したビデオ情報の取得などが可能になります。また、認証リクエストもサポートしており、GoogleSignInを使用してアクセストークンを取得できます。

以下が再生地点に関するメソッド群

    public func seek(to seconds: Int, allowSeekAhead: Bool) {
        evaluatePlayerCommand("seekTo(\(seconds),\(allowSeekAhead ? 1 : 0))")
    }
    // Evaluate javascript command and convert to simple error(nil) if an error is occurred.
    private func evaluatePlayerCommand(_ commandName: String, callbackHandler: ((Any?) -> ())? = nil) {
        let command = "player.\(commandName);"
        evaluateJavaScript(command) { (result, error) in
            callbackHandler?(error != nil ? nil : result)
        }
    }

何してるの?

  1. public func seek(to seconds: Int, allowSeekAhead: Bool)
    動画を特定の時間位置にシークするためのメソッド。evaluatePlayerCommandメソッドを呼び出してJavaScriptコマンドを評価します。

  2. private func evaluatePlayerCommand(_ commandName: String, callbackHandler: ((Any?) -> ())? = nil)
    JavaScriptスクリプトを評価し、その結果またはエラーをオプショナルなコールバックハンドラーに渡すメソッド。

動作の流れ:
シークメソッドの呼び出し:

seek(to: 30, allowSeekAhead: true)
# この呼び出しにより、evaluatePlayerCommandメソッドが以下のコマンドで呼び出されます。

"seekTo(30,1)"
# evaluatePlayerCommandメソッドは、構築したコマンドをevaluateJavaScriptメソッドで評価します。

"player.seekTo(30,1);"
# このJavaScriptコマンドが評価され、動画は30秒の位置にシークします。

結果の処理:
コマンドの評価が完了すると結果またはエラーがコールバックハンドラーに渡されます。`必要に応じて結果の処理やエラーハンドリングを追加できます

直接player.seekTo()呼ぶじゃダメなの?

  • player.seekTo()はJavaScriptのメソッドで、Swiftから直接呼び出すことはできません。
    SwiftからJavaScriptのメソッドを呼び出すには、evaluateJavaScriptのようなメソッドを使用してJavaScriptコードを定義する必要があります。
  • evaluatePlayerCommand(_:)メソッドは、このJavaScriptコードの定義をカプセル化し、SwiftのコードからJavaScriptのメソッドを簡単に呼び出すためのインターフェースを提供する。

まとめ

seekToの内部処理までおいたかったが断念。
ただ、上記ライブラリのような書き方、特に単一責任の原則がきっちり守られてて美しいコードを書けるようになりたいと思いました。
YouTubeおもれぇからみんなも見ようぜ。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?