お父にゃんの電子工作 -15ページ目

お父にゃんの電子工作

暇なおじさんが、電子工作(主にラジオ製作)をして勝手な感想を書く

ちょっとづつ、Raspberry Pi Zero 2 WでWebラジオを作っていて、ようやく前の記事のように、Webラジオとしての基本的な機能は実現できた。

 

しかし、これはESP32S3で前に作った物とほぼ同じ物なのである。

 

もちろん、ESP32では上手く再生できないステーションも、問題なく再生できるので、それだけでも価値が有ると言えるのだが、Raspberry Piだからこそ出来る、というものを作りたい。

そこで、再生しているアーティスト、曲名からアルバムアートをネットから取得して表示させてみたい。

 

と、いうことで早速、ChatGPTにお願いしてみた。

何度かやり取りして、"アーティスト - 曲名" を渡すと iTunes APIで取得して160 × 160サイズに圧縮して表示させるプログラムを書いてくれた。

from PIL import Image, ImageDraw, ImageFont
from luma.core.interface.serial import spi
from luma.lcd.device import st7789
import requests
from io import BytesIO
 
# === フォント設定 ===
font = ImageFont.load_default()
 
# SPI設定、LCD初期化
serial = spi(port=0, device=0, gpio_DC=24, gpio_RST=25,gpio_LIGHT=None,bus_speed_hz=52000000)
device = st7789(serial, width=320, height=240, rotate=0)
 
# LCD反転OFF
device.command(0x20)  # INVOFF
 
def get_album_art(artist, title):
    """iTunes APIを使ってより正確にアルバムアートを取得"""
    query = f"{artist} {title}"
    url = (
        "https://itunes.apple.com/search?"
        f"term={requests.utils.quote(query)}"
        "&entity=musicTrack"
        "&attribute=songTerm"
        "&limit=5"
        "&country=JP"
    )
    try:
        response = requests.get(url, timeout=5)
        data = response.json()
 
        if data['resultCount'] > 0:
            # アーティスト名が一致するものを優先的に探す
            for result in data['results']:
                if artist.lower() in result.get('artistName', '').lower():
                    art_url = result['artworkUrl100'].replace("100x100", "600x600")
                    img_data = requests.get(art_url, timeout=5).content
                    return Image.open(BytesIO(img_data)).convert("RGB")
 
            # 見つからなければ最初の結果を使用
            art_url = data['results'][0]['artworkUrl100'].replace("100x100", "600x600")
            img_data = requests.get(art_url, timeout=5).content
            return Image.open(BytesIO(img_data)).convert("RGB")
 
    except Exception as e:
        print("Error:", e)
 
    return None
 
def display_from_string(song_str):
    """"Artist - Title" 形式の文字列を解析して表示"""
    if " - " in song_str:
        artist, title = song_str.split(" - ", 1)
    else:
        artist, title = song_str, ""
 
    print(f"Artist: {artist}")
    print(f"Title: {title}")
 
    # 背景画像を生成
    img = Image.new("RGB", (320, 240), "black")
    draw = ImageDraw.Draw(img)
 
    # 曲情報を表示
    draw.text((10, 10), f"Artist: {artist}", font=font, fill="white")
    draw.text((10, 30), f"Title:  {title}", font=font, fill="white")
 
    # アルバムアート取得
    art = get_album_art(artist, title)
    if art:
        art = art.resize((160, 160))
        img.paste(art, (320 - 160, 240 - 160))  # 右下に貼り付け
    else:
        draw.text((170, 200), "No Art Found", font=font, fill="red")
 
    # LCDへ描画
    device.display(img)
    print("Display updated.")
 
# === テスト ===
song_data = "Lady Gaga, Bruno Mars - Die With A Smile"
display_from_string(song_data)

 

LCDの解像度も低いので鮮明な画像とは言い難いが、何となくそれっぽい

 

そして、これを前に作ったプログラムに組み込んでみる。

 

ちなみに、回路図はこちら

GPIO12をLCDのバックライト制御pinに接続(操作後、しばらくすると光量ダウン)

 

ちょっと、いろいろあったのだが、なんとか無事に動いた

アルバムアートが見つかった場合、右下に表示。アーティストと曲名は左側に小さく表示する。

 

右上はコーデックとビットレートの両方を表示するように変更

 

画像が粗いのは仕方ないが、アルバムアートを表示したことで、まぁ、なんか、それっぽい感じがするのである。

まだ、動きが怪しい部分もあるが、使って使えなくもないレベルには仕上がったと思っている。

にゃんとなく良い感じなのである。

全てはChatGPTのおかげなのだが、おじさんも大きく成長したような気になるのである。

 

今回のプログラムは以下に置いておきます。興味のある方はどうぞ。

Web_Radio_V0_32

 

 

「おぬしも、大きく成長したのニャ」

デブ猫2号になりそう。名前が「お餅」だしね

 

 

----------- 補足----------

なお、今回のコードを動かす前に以下作業が必要

●液晶を動かすためにLuma.lcdのインストール
sudo apt update

sudo apt install python3-luma.lcd python3-pil

●日本語対応フォントがインストールされていないので、noto-cjkをインストール。
sudo apt install fonts-noto-cjk

● rpi-lgpioにアップデート
sudo apt remove python3-rpi.gpio
sudo apt install python3-rpi-lgpio 

● I2Sドライバを有効化
sudo nano /boot/firmware/config.txt

ファイルを開いたら以下を追加: 
# PCM5102 用 I2S 設定
dtparam=i2s=on
dtoverlay=hifiberry-dac

 

●pigpioを自動起動に

電源投入時に自動で起動するように設定

sudo systemctl enable pigpiod
sudo systemctl start pigpiod


●pigpioがPCM用タイマを使っているので、PWMタイマーを使う設定にする
sudo mkdir -p /etc/systemd/system/pigpiod.service.d
sudo nano /etc/systemd/system/pigpiod.service.d/override.conf
エディタが開いたら以下を記入
[Service]
ExecStart=
ExecStart=/usr/bin/pigpiod -t 0 -l

保存してリブート 

 

●Webラジオの再生ソフトのmpvをインストール

sudo apt install mpv