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のサンプルコードを参考に作りました。比較的簡単にできたなぁという感想です。

それではまたー。