PR

【Invidious API】apiの基礎的な使い方のメモ。動画を検索したり、音楽を取得したりしよう!

Rintaが書いた

皆さんこんにちは。今回はinvidious apiの基本的な使い方を伝えていきます。

なお、アプリ製作をメインとしたいのでFlutterでで製作していきます

スポンサーリンク
スポンサーリンク

今回勉強するもの

invidious apiを使用して、検索&音楽が鳴らせるようにする。
youtubeを見れるアプリを自作する。

私は↑のようなアプリを作りました。
今回作ったのは、https://github.com/rintaro-s/YT-musicに挙げてあります。

invidiousとは

https://invidious.io/

invidiousとは、youtubeの動画を広告なし・動画のダウンロード機能を搭載したクライアントで、
youtubeの非公式apiみたいな位置づけです。

youtubeの規約的にどうなの?

と思うはずです。普通にアウトだと思います。 開発者はセーフだと主張していますが、youtubeとしては使ってほしくないでしょう。


ただ、youtube data apiとは違って動画そのものを取得したり、微妙にめんどくさいgoogle cloudを経由せずに使えるので今回書いていこうと思います。

invidious apiのライセンスは、ここで確認してください。

apiの使い方

apiの投げ先サーバー

invidiousは、非公式のサービスのためサーバーがかなり不安定です。不安定なものを選ぶと、場合によってはせっかく作ったアプリが動かなくなったりしてしまう恐れがあるので安定性のあるサーバーを選びましょう。
https://uptime.invidious.io/ ここから、サーバーの状態が見れるのでよさげなサーバーを見つけて下さい。今回は、https: yewtu.beが良さそうでした。

投げ先(エンドポイントURL)

公式ドキュメントはこちらにあり、すべての機能を使いたい方は見てください。
また、dartではエンドポイントURLは以下のように処理させました。

  String _server = 'https:yewtu.be';
  // 動画を検索するための非同期メソッド
  Future<void> _searchVideos(String query) async {
    try {
      // APIにリクエストを送信
      final response = await http.get(Uri.parse('$_server/api/v1/search?q=$query'));
      if (response.statusCode == 200) {
        // 成功した場合、動画リストを更新
        setState(() {
          _videos = json.decode(utf8.decode(response.bodyBytes)); // JSONをデコードしてリストに格納
        });
      } else {
        // エラーメッセージを表示
        _showError('検索結果の読み込みに失敗しました');
      }
    } catch (e) {
      // エラーメッセージを表示
      _showError('エラー: $e');
    }
  }

検索:GET /api/v1/search

リクエストの構造
  • HTTPメソッド: GET
  • エンドポイント/api/v1/search
  • クエリパラメータ:
    • q: 検索クエリ(必須)
    • page: ページ番号(オプション、デフォルトは1)
    • sort_by: ソート方法(オプション、例: relevanceratingupload_date

以下は、qパラメータに「music」を指定して検索する例です。

GET /api/v1/search?q=music HTTP/1.1
Host: invidious.example.com
レスポンスの例

レスポンスはJSON形式で返されます。以下は、レスポンスの一部の例です。

JSON

{
    type: "video",
    title: String,
    videoId: String,
    author: String,
    authorId: String,
    authorUrl: String,
    videoThumbnails: [
      {
        quality: String,
        url: String,
        width: Int32,
        height: Int32
      }
    ],
    description: String,
    descriptionHtml: String,
    viewCount: Int64,
    published: Int64,
    publishedText: String,
    lengthSeconds: Int32,
    liveNow: Bool,
    paid: Bool,
    premium: Bool
  },
使用例(@python)
import requests

url = "https://example.com/api/v1/search"
params = {
    "q": "music",
    "page": 1,
    "sort_by": "relevance"
}

response = requests.get(url, params=params)
data = response.json()

for video in data:
    print(f"Title: {video['title']}, Author: {video['author']}")

GET /api/v1/videos/:id

このエンドポイントは、特定の動画の詳細情報を取得します。

  • HTTPメソッド: GET
  • エンドポイント/api/v1/videos/:id
  • URLパラメータ:
    • id: 動画のID(必須)
GET /api/v1/videos/dQw4w9WgXcQ HTTP/1.1
Host: invidious.example.com
レスポンスの例

JSON

{
  "title": "Example Video",
  "videoId": "dQw4w9WgXcQ",
  "author": "Example Author",
  "authorId": "UC1234567890",
  "lengthSeconds": 213,
  "viewCount": 123456,
  "published": "2023-01-01T00:00:00Z",
  "description": "This is an example description."
}
使用例
import requests

video_id = "example"
url = f"https://example.com/api/v1/videos/{video_id}"

response = requests.get(url)
data = response.json()

print(f"Title: {data['title']}")
print(f"Author: {data['author']}")
print(f"Views: {data['viewCount']}")

  "title": "Example Video",
  "videoId": "dQw4w9WgXcQ",
  "author": "Example Author",
  "authorId": "UC1234567890",
  "lengthSeconds": 213,
  "viewCount": 123456,
  "published": "2023-01-01T00:00:00Z",
  "description": "This is an example description."
}

 GET /api/v1/channels/:id

このエンドポイントは、特定のチャンネルの詳細情報を取得します。

  • HTTPメソッド: GET
  • エンドポイント/api/v1/channels/:id
  • URLパラメータ:
    • id: チャンネルのID(必須)
GET /api/v1/channels/UC1234567890 HTTP/1.1
Host: invidious.example.com
レスポンスの例

JSON

{
  "author": "Example Author",
  "authorId": "UC1234567890",
  "subCount": 1000000,
  "totalViews": 50000000,
  "joined": "2010-01-01T00:00:00Z",
  "description": "This is an example channel description."
}
使用例
import requests

channel_id = "UC1234567890"
url = f"https://invidious.example.com/api/v1/channels/{channel_id}"

response = requests.get(url)
data = response.json()

print(f"Author: {data['author']}")
print(f"Subscribers: {data['subCount']}")
print(f"Total Views: {data['totalViews']}")

GET /api/v1/trending

このエンドポイントは、現在のトレンド動画を取得します。

  • HTTPメソッド: GET
  • エンドポイント/api/v1/trending
  • クエリパラメータ:
    • region: 地域コード(オプション、例: USJP
GET /api/v1/trending?region=JP HTTP/1.1
Host: invidious.example.com
レスポンスの例

JSON

[
  {
    "title": "Trending Video 1",
    "videoId": "dQw4w9WgXcQ",
    "author": "Trending Author 1",
    "viewCount": 1000000,
    "published": "2023-01-01T00:00:00Z"
  },
  {
    "title": "Trending Video 2",
    "videoId": "eYq7W9WgXcQ",
    "author": "Trending Author 2",
    "viewCount": 2000000,
    "published": "2023-01-02T00:00:00Z"
  }
]
使用例
import requests

url = "https://invidious.example.com/api/v1/trending"
params = {
    "region": "JP"
}

response = requests.get(url, params=params)
data = response.json()

for video in data:
    print(f"Title: {video['title']}, Author: {video['author']}, Views: {video['viewCount']}")

終わりに

主なinvidious apiの使い方を書いてみました。
youtubeが見れない環境下でもこれを使用すれば使用可能な場合もあるので覚えておいても面白いかもしれません。
自分も調べながらだったので質問等には答えられないと思いますが、何か間違い等あればコメントで教えてください。
ありがとうございました。


コメント

タイトルとURLをコピーしました