2023年4月14日金曜日

PhotoshopのPhotomergeコマンドでパノラマ画像を作成してみた!

新年度が始まり、会社で懇親会を開催しました。 
その模様を当社のYouTubeチャンネルで公開しています。


今回はいつも使用しているDJI Pocket2ではなく、スマホで撮影しました。このところ、スマホではもっぱらショート動画を撮影していたため、横で撮影するのをすっかり忘れていました💦

動画は何とか横で作成したものの、困ったのはサムネイルです。
いつもは動画から書き出したフレームを使用していますが、横のサムネイルを作成するには縦画像を何枚も並べなければなりません。
調べてみると、Photoshopに複数の画像を1つの画像に合成する機能があるようなので、使ってみました。


Photoshopの「Photomerge」コマンド


Photoshopの「Photomerge」コマンドにより、複数の画像を1つの画像に結合することができます。
使い方は簡単で、ファイルー自動処理ーPhotomergeでダイアログを開き、画像ファイルを指定して、「OK」を押すだけです。

今回指定したファイルは、

の6つで、これらを合成すると下の画像が作成されました。この画像をトリミングしてサムネイルを作成しました。

Adobeのサイトを見ると、「各画像の約40%の領域重ねる」とあり、重なりが多くても少なくてもダメなようで、実際、満足いく合成画像を得るまで、何度か画像を変更して試しました。それでも自動で、ここまでの画像を作成してくれるのですから、助かります。


またいつか、どこかで。

2023年4月7日金曜日

archiveEvery="Day"でローテート!ーNLogでログを出力する③

 

こんにちは、せんです。

NLogを使ったログ出力まとめの3回目です。

第1回:インストールから出力まで

第2回:出力フォーマットのカスタマイズ



アーカイブを残すには



ログを出力するときに合わせて考えるのが、アーカイブとローテートです。

前回までの内容で、App.configのターゲット要素は以下のようになっています。
<target name="logFile"
	xsi:type="File"
	encoding="UTF-8"
	fileName="logs/${processname}.log"
	layout="${date} ${level:uppercase=true:padding=-5} -${message} ${exception:format=tostring}" />

この状態でプログラムを数回実行すると、


と、こんな感じで内容が追記されていきます。

ログ出力の日時が書かかれているとはいえ、延々と一つのファイルに書き込まれるのでは、確認が大変ですよね。

というわけで今回は

①区切りのいいところでログファイルを分ける。
②古いログファイルを保存する。
③一定のアーカイブファイルがたまったら、それを削除する。

の3つの作業を行うことで、ログファイルを管理していきたいと思います。



① 区切りのいいところでログファイルを分ける

サイズか日時を設定して、ログを「ローテート」します。
archiveEveryや、archiveAboveSizeというプロパティを使用します。


②古いログファイルを保存する

ローテート後の古いログファイルは、ファイル名を変更しアーカイブフォルダに移動させるなどして保存することができます。
使用するプロパティはarchiveFileName、archiveNumbering、archiveDateFormatです。


③一定のアーカイブファイルがたまったら、それを削除する。

ファイルの保存数、もしくはファイルの保存日数を指定することで、それを超過した場合はファイルが自動で削除されます。
maxArchiveFiles、maxArchiveDaysプロパティを使用します。



ターゲットプロパティまとめ



NLog公式の説明から、ローテートとアーカイブに関するターゲットプロパティをまとめます。

archiveEvery:指定した時間が経過するたびにログファイルを自動アーカイブするかどうか。
       年月日時分のほか、毎週〇曜日という指定ができる。
archiveAboveSize:ログファイルが自動的にアーカイブされるサイズをバイト単位で取得、設定。
         archiveNumbering="Date"との併用は不可。
archiveOldFileOnStartup:起動時に古いログファイルをアーカイブするかどうか。
archiveFileName:アーカイブに使用するファイルの名前を取得、設定。
         方法ごとに一連の数字に置き換えられるプレースホルダ{#####}を含められる。
archiveDateFormat:ファイルアーカイブに使用する日付形式を指定。
          archiveNumbering="Date"または”DateAndSequence”の場合にのみ機能する。
archiveNumbering:ファイルアーカイブに番号を付ける方法。
          archiveNumberingMode
           ・Sequence:シーケンススタイル。最新のアーカイブに最大値。
           ・Rolling:ローリングスタイル。最新は常に#0、#1、…、#Nと続く。
           ・Date:日付スタイル。前回の日時を記載する。
           ・DateAndSequence:日付とシーケンススタイル。
maxArchiveFiles:保持するアーカイブファイルの最大数。
maxArchiveDays:保持するアーカイブファイルの最大日数。



組み合わせて使ってみましょう!



まずはこんな組み合わせで実行します。

 archiveEvery="Minute"
 archiveFileName="logs/archives/${processname}_{#}.log"
 archiveNumbering="Date"
 archiveDateFormat="yyyyMMddHHmmss"
 maxArchiveFiles="3"

ついでにプログラムも変更します。

using System;
using NLog;

namespace UseNLogSample
{
    public class Program
    {
        private static Logger logger = LogManager.GetCurrentClassLogger();

        static void Main(string[] args)
        {
            var timer = new System.Threading.Timer(x => GivenMilletDumplings(), null, 1000, 10000);
            Console.ReadKey();
        }

        private static void GivenMilletDumplings()
{ var companions = new string[] { "犬", "猿", "雉" }; foreach (var companion in companions) { logger.Info($"{companion}は桃太郎からきびだんごをもらいました。"); } } } }

プログラムを実行してlogsフォルダを確認します。
archivesフォルダが生成され、その中にアーカイブファイルが三件追加されます。







分単位でローテートしますが、もっとも古いファイルが削除されているので、フォルダ内のファイル数は三件のままです。




次に、内容を少し変えてみます。

 archiveAboveSize="2000"
 archiveFileName="logs/archives/${processname}_{#}.log"
 archiveNumbering="Sequence"
 maxArchiveFiles="5"

archivesフォルダを確認すると、アーカイブファイルには0から始まるシーケンシャルな番号が振られています。



少し後にもう一度覗いてみると、これまた古いファイルが自動削除されました。
maxArchiveFilesの変更が反映されていることも確認できます。




それでは次はこんな感じで。

 archiveAboveSize="2000"
 archiveFileName="logs/archives/${processname}_{#####}.log"
 archiveNumbering="Rolling"
 maxArchiveFiles="10"

アーカイブファイルに割り振られた番号は、指定の通り五桁になっています。



しばらくしてから覗くと、新しいファイルに置き換わっていますが、ファイル名は同じです。





ここからが本題



 archiveEvery="Day"
 archiveFileName="logs/archives/${processname}_{#}.log"
 archiveNumbering="Date"
 archiveDateFormat="yyyyMMdd"
 maxArchiveFiles="10"

上の設定でプログラムを実行します。
(※メモ:archiveDateFormatの値はarchiveNumbering="Date"に対応するデフォルト値と同じなので、ここではarchiveDateFormatプロパティはなくてもよい。)
次の日にもう一度実行すると、前日のファイルがアーカイブフォルダに移されました!!!


うれしいけど...
あれ、前にやったときはarchiveEvery="Day"だとarchiveフォルダすら作られなかったんだけど、なにか設定が違ったかしら???と思い、調べてみたところ、fileNameを固定の値にしないとアーカイブできないという記事を拝見しました。
(参考記事):https://qiita.com/mak_in/items/b64899b27b5fcf472daa

たしかに、前作った設定ファイルは
fileName="logs/NLogSample_${date:format=yyyyMMdd}.log"
という名前にしている...

でもarchiveEvery="Minute"にすると、ローテートできたんですよね...
まだよくわからない...


さらに調べているとこんな記事も。
最初からログファイル名に日付があれば、archiveEvery="Day"もarchiveFileName="○○"もいらないんじゃない?ということが読み取れます。
ファイル名に日付を指定していれば、別日に実行した時点で別のファイルに書き込まざるを得ないからです。

というわけで、以下の設定で実行します。

<target name="logFile"
xsi:type="File"
encoding="UTF-8"
fileName="logs/${processname}_${date:format=yyyyMMddHHmm}.log"
layout="${date} ${level:uppercase=true:padding=-5} -${message} ${exception:format=tostring}"
maxArchiveFiles="5"/>

※時間の都合上、分まで指定しています。

logsフォルダにmaxArchiveFilesの値+1のファイルが保存されます。



わあ、やっぱりできるんだ...
この辺はケースバイケースですが、どちらも頭に置いておきたいです。



まとめ


ということで、全3回でNLogについてまとめてまいりました。
これまでarchiveEvery="Day"でローテートできたことがなかったので、
日付ローテートすることが裏テーマだったのですが、
なんとかひと段落できてよかったです。


2023年3月24日金曜日

レイアウトのカスタマイズーNLogでログを出力する②


こんにちは。せんです。 

今回も前回に引き続き、NLogを使用したログ出力についてまとめていきます。

(前回の内容)インストール、基本設定、出力

今回のテーマは「レイアウトの編集」です。



前回の出力結果を確認します。


まずは、前回の設定でどのようにログが出力されたか振り返ってみましょう。
App.configは前回のままです。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
	<configSections>
		<section name="nlog" type="NLog.Config.ConfigSectionHandler, NLog"/>
	</configSections>
	<startup>
		<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
	</startup>
	<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
		  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
		<targets>
			<target name="logFile"
				xsi:type="File"
				encoding="UTF-8"
				fileName="logs/${processname}.log"
				layout="${date} [${level}] -${message}" />
		</targets>
		<rules>
			<logger name="*" minlevel="Info" writeTo="logFile" />
		</rules>
	</nlog>
</configuration>

Program.csは少し変更しています(例外をキャッチします)。
using System.Security.AccessControl;
using System.Text;
using System.Threading.Tasks;
using NLog;

namespace UseNLogSample
{
    public class Program
    {
        private static Logger logger = LogManager.GetCurrentClassLogger();

        static void Main(string[] args)
        {
            logger.Info("NLogでinformationログを出力します。");
            logger.Warn("NLogでwarningログを出力します。");

            var companions = new string[] { "inu", "saru", "kiji" };

            try
            {
                Console.WriteLine(companions[3]);
            }
            catch (Exception ex)
            {
                logger.Error(ex, "NLogでerrorログを出力します。");
            }
        }
    }
}

これを実行すると、logsフォルダにUseNLogSample.logが生成されます。
その内容はこんな感じです。


これを見ると、なんとなくこう思います。
・ちょっと日付フォーマットを変えたいなあ...
・メッセージの先頭位置を揃えたいなあ...
・IndexOutOfRangeExceptionが発生しているはずなんだけど、これだとわからないなあ...

というわけで、
layout="${date} [${level}] -${message}"
の部分を編集し、いろんなパターンを出力して確認していきます!!!


日時フォーマットを変更してみる


公式ドキュメントのLayout renderersタブを確認すると、Date and timeという項目があります。


先に使用した${date}のほかに4つのパターンがあったので、それぞれ出力してみました。
①${longdate}


②${shortdate}


③${ticks}

④${time}


また、Date and timeの各レンダラーには次のようなパラメータも用意されています。
・universalTime(${ticks}以外):UTC時間を出力
・format(${date}のみ):日付形式を指定
 etc

ここでは2つ目のformatを使って以下のように編集してみます。
layout="${date:format=yyyyMMdd HH\:mm\:ss,fffff} [${level}] -${message}"


➥年月日がyyyyMMdd形式で表示され、ミリ秒が5桁表示されていることがわかります。


ログレベルのフォーマットを変更してみる


それでは次に、ログレベルの部分を見ていきます。

App.configのrules要素にターゲットごとのログレベルが指定できることを先に確認しておきます。
<rules>
	<logger name="*" minlevel="Info" writeTo="logFile" />
</rules>


ログレベルに関する変更は
・すべて大文字で表示する
・5文字幅で、左詰め表示する
の2点です。

まず、すべて大文字で表示するには、パラメータuppercaseをtrueに設定します。
${level:uppercase=true}
と記述します。


➥大文字表記に変わりました。


次に、5文字幅で左詰めします。
この際にはパラメータpaddingを使用します。
公式の通り、padding=(正の数)に設定すると左側が空文字で埋まります(→右詰め)。
padding=(負の数)に設定すると右側が空文字で埋まります(→左詰め)。

というわけで
${level:uppercase=true:padding=-5}
と記述し、実行します。


➥左詰めできたことが確認できます。


ちなみに、公式ドキュメントを確認すると、formatというパラメータもあったので、
${level:uppercase=true:padding=-5:format=FullName}
と書くとどうなるか見てみました。


➥フルネーム表示にしたので、見た目を整えるにはpadding幅の再設定が必要ですね。


メッセージとスタックトレース


例外の内容を出力する方法は大きく二通りあります。
①messageのパラメータwithExceptionをtrueにする
②exceptionレンダラーを使用する

①${message:withException=true}



②${message} ${exception}


➥「❘」で区切られていること以外は同じ内容です。
 私は今回${exception}としたところを今まで${exception:format=tostring}と書いていたんですが、結果は変わらないですね...
 場合によっては違いが出るかもしれないです。


まとめ


ここまで、レイアウトをカスタマイズしながら出力内容を確認してきました。

ちなみに、App.configにレイアウトの属性ごと書かないという方法もあります。
デフォルトの設定はこちらに説明がありますが、出力すると


こんな感じです。

次回はアーカイブとローリングの設定を行っていきます。
ありがとうございました。



2023年3月10日金曜日

NLogでログを出力する①


こんばんは。せんです。

今回から、NLogを使ってログ出力する方法をまとめていきます。

ログ出力と言えば、現在定番なのはこのNLogとlog4netだそうで。

ゴールはまだまだ先ですが、両者を比較するところまで整理したいなと思っています。


NLog編はこんな構成でお届けする予定です。

① インストール、基本の設定、出力確認(→今回)

② レイアウトの編集

③ ローリングとアーカイブ


はじめに


NLogの公式サイトを見てみます。

2006年にv1.0がリリースされており、現在16年半の歴史を持っています。

”柔軟で自由度の高い.NET向けオープンソースロギング”となっていて、簡単に導入できるところがポイントのようです。
.NET Framework3.5-4.8、.NET5-6などをサポートしています。
(ドキュメントにはないですが2023年3月9日時点で.NET 7もサポートされていました。)


さっそく、インストールしてみましょう!!


今回は、Visual Studio 2022でコンソールアプリケーションを作ることにしました。
「新しいプロジェクトの作成」を選び、


「コンソールアプリ(.NET Framework)」を選んで次に進みます。


プロジェクト名は「UseNLogSample」としました。
フレームワークは最初に「.NET Framework4.7.2」が表示されました。
これはNLogのサポート対象なので、このまま進みます。
「作成」をクリック。


プロジェクトが作成されました。



ここから、NLogのパッケージをインストールします。
ソリューションエクスプローラでプロジェクト名を右クリックし、
「NuGetパッケージの管理」を選択します。


こんな感じの画面が表示されます。


左上側の「参照」というところをクリックし、検索ボックスに「NLog」と入力します。

一番上に表示されたNLogというパッケージをインストールします。
ここでサポート情報も確認できます。


バージョンのプルダウンリストを確認すると、これまでのバージョンも選択できるようになっています。

今回は最新の安定版のまま「インストール」ボタンをクリックします。


以下のような画面が表示されたら、「OK」を選びます。


インストールが終了しました。
終了したことは出力ウインドウでも確認できます。




基本の設定を行います


続いて、ログ出力設定を編集します。

①NLog.configというファイルを新規作成するか
②App.configを編集するか
どちらか選びます。

①のメリットは、このファイルだけ再利用することができる。
②のメリットは、ファイル数が増えない。
という感じでしょうか。


今回は②を選び、App.configを編集します。
以下リンクは、公式のドキュメントです。
https://github.com/nlog/NLog/wiki/Configuration-file

(編集後)
<?xml version="1.0" encoding="utf-8"?>
<configuration>
	<configSections>
		<section name="nlog" type="NLog.Config.ConfigSectionHandler, NLog"/>
	</configSections>
	<startup>
		<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
	</startup>
	<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
		  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
		<targets>
			<target name="logFile"
				xsi:type="File"
				encoding="UTF-8"
				fileName="logs/${processname}.log"
				layout="${date} [${level}] -${message}" />
		</targets>
		<rules>
			<logger name="*" minlevel="Info" writeTo="logFile" />
		</rules>
	</nlog>
</configuration>


これで設定ファイルの編集ができました。
次にProgram.csを編集します。

(編集後)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using NLog;

namespace UseNLogSample
{
    public class Program
    {
        private static Logger logger = LogManager.GetCurrentClassLogger();

        static void Main(string[] args)
        {
            logger.Info("NLogでinformationログを出力します。");
            logger.Warn("NLogでwarningログを出力します。");
            logger.Error("NLogでerrorログを出力します。");
        }
    }
}



それではいざ、実行!!


プロジェクトをビルドしてUseNLogSample.exeを実行します。
実行フォルダにlogsフォルダが生成されました。



さらに、この下にUseNLogSample.logが生成されています。
ファイルを開くと、以下の通りログが出力されていました!!

出力レイアウトをかなりシンプルにしたので、メッセージの文頭が揃っていないことに注目です。
このあたりは次回の内容で詳しく見ていきます。


まとめ


今回は
・NLogのNuGetパッケージをインストールする
・App.configとProgram.csを編集する
・プログラムを実行してログファイルを確認する
ところまで進みました。

この記事を書きながら、App.config
	<configSections>
		<section name="nlog" type="NLog.Config.ConfigSectionHandler, NLog"/>
	</configSections>
	<startup>
		<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
	</startup>

の部分で、configSectionsとstartupの順番を逆にすると出力できないことを勉強しました。

次回は出力レイアウトを編集し、結果を比べていきたいと思います。

ご覧いただいてありがとうございました。

2023年2月25日土曜日

NASを音楽サーバーにする

こんにちは、やっまむーです。

近頃は音楽を聴く場合、YoutubeMusic等のサブスクリプションサービスを利用することがほとんどです。
ただ、数年前まではレンタルショップで借りたものをリッピングする方が多く、PC内には結構な数の楽曲があります。
このまま塩漬けにしておくのも勿体ないので、NASを音楽サーバーにして外出中もこれまで集めた楽曲を聴けるようにしました。

NAS(DS218j)に「Audio Station」をインストールして音楽を管理する

まずはパッケージセンターから「Audio Staion」のインストールをします。

インストール作業はボタンを押すだけでOKです。 完了すると、メインメニュー内にAudio Staionのアイコンが追加されます。 起動するとこんなかんじで、見た目は普通のオーディオプレーヤーと大きく変わりません。

楽曲の追加はFile Station(Windowsのエクスプローラー、MacのFinder)から行います。 新しく音楽フォルダができているので、「アップロード」でファイルを追加します。 私は既にNASに音楽を全部アップロードしていたので、従来のフォルダから移動させました。

これでAudio Stationが音楽ファイルを認識するようになり、ライブラリが構築されます。

「DS Audio」でスマホから音楽を聴く

外出中にNASにある音楽を聴く場合は「DS Audio」アプリを使います。

また、外部から接続するためQuickConnectを有効にしておくと便利です。 コントロールパネルのQuickConnectで機能を有効にします。

DS Audioを起動すると、サインイン画面が表示されます。

先ほど有効にしたQuickConnectのID、ログインに使用するユーザーのアカウント名とパスワードを入力してサインインボタンを押します。

Audio Stationのライブラリと同じものが表示されます。 初回はデータの同期に時間がかかりましたが、以降は多少の読み込み時間こそあれどそれなりの速度で表示されます。

「DS Audio」を実際に使ってみて

これまで集めた楽曲がどこでも利用できるのはやはり便利です。 以前は大容量のSDカードに入れて聴いていましたが、最近のスマホはSDカードが無いタイプも出てきており、全てのデータを持ち歩くことが難しくなりました。 その点が克服できたので個人的にとてもよかったです。

難点を上げるとすれば、曲の再生開始に時間がかかる点が気になりました。 曲のデータをある程度(おそらく再生時間の20%程度?)取得するまでは再生が始まらないので曲を試し聴きしながら探す際にストレスを感じます。 また、曲送りをした時も同じ挙動をします。 曲の終端までいって曲が変わる時は発生しないので、流し聴きする分には問題ありません。

まとめると、

  • 音楽データが大量にあり、持ち運びが難しい
  • プレイリストやアルバム・アーティスト単位で流し聴きする

といった方に向いていると思います。
NASを運用されている方は一度試してみてはいかがでしょうか。

ではではー。

2023年2月11日土曜日

GAS(Google Apps Script)でYouTubeのデータ取得②

こんばんは。ざわです。

前回、GAS(Google Apps Script)を使って YouTube の動画情報を取得してみました。

この時は特定の動画のURLを指定して取得する方法で、1件分だけの取得だったのですが、

今回はそれを改良し、特定のチャンネルから複数の動画情報を取得してスプレッドシートに一覧出力してみようと思います。

動画情報を取得するチャンネルは、弊社の「AIMEKチャンネル」です。

最初にチャンネルIDが必要なのですが、チャンネルIDはURLの末尾部分から取得できます。

AIMEKチャンネルの場合、URLは下記で、URL末尾の青字部分がチャンネルIDに該当します。
  https://www.youtube.com/channel/UCmatd8FfLKg0Pmi4iitAJYg

YouTube Data APIの以下リソースを使用して実装してみました。
 ・Channels
 ・PlaylistItems
 ・Videos

できあがったソースがこちら。

function myFunction() {
    // チャンネルID
    const channelId = "UCmatd8FfLKg0Pmi4iitAJYg"
 
    // ビデオID 取得
    const videoIds = getVideoIds(channelId)
    if (!videoIds || videoIds.length === 0) {
      console.log('No VideoId found.');
      return;
    }
 
    // スプレッドシートにヘッダ行をセット
    const sheet = SpreadsheetApp.getActiveSheet();
    sheet.getRange(1, 1).setValue("タイトル");
    sheet.getRange(1, 2).setValue("再生回数");
    sheet.getRange(1, 3).setValue("いいね数");
    sheet.getRange(1, 4).setValue("コメント数");
    sheet.getRange(1, 5).setValue("投稿日時");
    sheet.getRange(1, 6).setValue("概要");
 
    // 動画情報を取得し、取得値をスプレッドシートに出力
    for (let i = 0; i < videoIds.length; i++) {
      const {
        title,
        publishedAt,
        description,
        viewCount,
        likeCount,
        commentCount
      } = getVideoData(videoIds[i])
 
      let row = i + 2;
      sheet.getRange(row, 1).setValue(title);
      sheet.getRange(row, 2).setValue(viewCount);
      sheet.getRange(row, 3).setValue(likeCount);
      sheet.getRange(row, 4).setValue(commentCount);
      sheet.getRange(row, 5).setValue(publishedAt);
      sheet.getRange(row, 6).setValue(description);
    }
}

function getVideoIds(channelId) {
    try {
      let results = [];
     
      // チャンネルIDを指定して、channelリソースを取得
      const lstChannels = YouTube.Channels.list("contentDetails", {id: channelId});
      if (!lstChannels || lstChannels.items.length === 0) {
        console.log('No Channels found.');
        return;
      }
 
      for (let i = 0; i < lstChannels.items.length; i++) {
       
        // チャンネルのアップロード済み動画を含む再生リストIDを取得
        const item = lstChannels.items[i];
        const playlistId = item.contentDetails.relatedPlaylists.uploads;
       
        let nextPageToken = null;
        do {
          // 再生リストIDを指定して、playlistItems.list メソッドを使って対応するリストを取得
          const playlistResponse = YouTube.PlaylistItems.list('snippet', {
            playlistId: playlistId,
            maxResults: 50,
            pageToken: nextPageToken
          });
          if (!playlistResponse || playlistResponse.items.length === 0) {
            console.log('No Playlist found.');
            break;
          }
         
          // ビデオID 取得
          for (let j = 0; j < playlistResponse.items.length; j++) {
            const playlistItem = playlistResponse.items[j];
            results.push(playlistItem.snippet.resourceId.videoId);
          }        
          nextPageToken = playlistResponse.nextPageToken;
        } while (nextPageToken);
      }
      return results;
 
    } catch (err) {
      console.log('Failed with err %s', err.message);
    }
}

function getVideoData(videoId) {
    // ビデオIDを指定して、動画情報を取得
    const results = YouTube.Videos.list('snippet,statistics', { id: videoId });
    const { items } = results
    const { statistics, snippet } = items[0]
    const { title, publishedAt, description } = snippet
    const { viewCount, likeCount, commentCount } = statistics
 
    return { title, publishedAt, description, viewCount, likeCount, commentCount }
}


実行結果の一覧がこちらになります。


YouTube Data APIのサンプルコードを参考に作りました。比較的簡単にできたなぁという感想です。

それではまたー。