トップ/記事一覧
Notion Blog で YouTube 動画埋め込みを実現する【Notion Blog 徹底解説 #3】
📆2020/05/28(最終更新日:2020/06/30)🔖 Notion BlogNotion
🐈 「(少しマニアックな)Notion の使い方まとめ」という note マガジンでも、毎週1本 Notion の使い方に関する記事を発信をしています。 もしよければそちらも覗いてみてください。
⚠ この記事は最終更新日から1年以上が経過しています。内容が古い箇所がある可能性があるためご注意ください。
(👩💻 2020/05/28 リライトしました。)
Notion Blog 徹底解説シリーズの第三弾です。今回は Notion Blog に YouTube 動画を埋め込む実装をしていきたいと思います。Notion Blog はデフォルトでは YouTube 動画埋め込みをサポートしていないので、その機能の付け方を解説していきたいと思います。
⚠ この記事から、エンジニアリングの話がちょこちょこ登場してきます。Notion Blog は Next.js で出来ているので、カスタマイズするには React の知識が必要になるのですが、知識がない人でもなるべくコピペで実現出来るように丁寧に解説したいと思います。例によって、分からない方は、@___35d まで質問ください。
🔥 YouYube 動画の埋め込みを実現する
Notion Blog への YouTube 動画の埋め込みは、以下の2ステップで実現することができます。
一つ一つ解説していきたいと思います。
1. YouTube 動画埋め込み用の React ライブラリのインストール
react-youtube というライブラリを使用します。スター数 1,000 以上で、メンテも頻繁に行われているので、信頼できるライブラリだと思います。
JavaScript
$ yarn add react-youtube
👆のコマンドで、ライブラリをインストールします。
2. [slug].tsx を編集
Notion Blog では、[slug].tsx 内で Notion のブロックを1つ1つ解析して、見出しだったら heading タグに変換、通常テキストだったら p タグに変換、みたいなことをしています。
今回で言うと、video として解析された場合の処理を YouTube 埋め込みに対応させるようにして、 react-youtubeを使用するようにします。
コードとしては、以下のようになります。
JavaScript
// [slug].tsx import YouTube from 'react-youtube' // 追加 // 既存コード if (isImage) { toRender.push( <Comp key={id} src={`/api/asset?assetUrl=${encodeURIComponent(format.display_source as any)}&blockId=${id}`} controls={!isImage} alt={isImage ? 'An image from Notion' : undefined} loop={!isImage} muted={!isImage} autoPlay={!isImage} style={{ width }} /> ) // ここに、以下のように条件を追加 } else { const youtubeId = properties.source[0][0].match(/\?v=([^&]+)/) toRender.push(<YouTube videoId={youtubeId[1]} key={youtubeId[1]} />) }
🚀 完成
これで YouTube 動画の埋め込みができるようになりました。Notion に埋め込んだ YouTube 動画が、Notion Blog にも反映されているのが分かるかと思います。
今回の YouTube 動画埋め込みの実装は、生配信しながら実装してみました。以下に配信アーカイブが上がっているので、どこに何を実装するのか、より詳しく見たい方、思考の過程を見たい方は、以下の動画を参考にしてもらえればと思います。(⚠ 生配信なので多少のグダりはあります)
🐈
⚠ 今回は video タグ内で通常の動画埋め込みと YouTube 動画埋め込みの分岐をしていないので、通常の動画埋め込みをサポートしていない状態になってしまっています。僕はたぶん通常の動画埋め込みをしないと思うので大丈夫ですが、もし通常の動画埋め込みをしたい場合は、さらに分岐を足す必要があると思います。ご注意ください。
不明点あれば @___35d までお気軽にどうぞ🙌