「アップデート」に怒ったから、PHP で歌リク管理ツールを自作した話
요약
특정 스트리밍 앱 '토피아'의 업데이트(무과금 리스너 포인트에 90일 소비 기한 부여)에 불만을 품은 개발자가, 무과금 팬들의 노력이 제대로 보상받지 못하는 상황을 개선하기 위해 직접 노래 요청 관리 및 포인트 시스템을 갖춘 대체 도구 '포이포이토피아'를 개발하게 된 이야기입니다. 이 과정에서 PHP 버전 문제 해결, Google Sheets API 연동, iTunes API 활용 등 다양한 웹 개발 기술과 노하우를 습득하고 적용했습니다.
핵심 포인트
- 서비스의 정책 변화(90일 포인트 기한)가 개인 프로젝트 개발의 강력한 동기 부여가 될 수 있음을 보여줍니다.
- AI 코딩 도구(DeepSeek 등)와 협업하여 기술적 구현을 진행하는 현대적인 개발 워크플로우를 경험했습니다.
- iTunes API, Google Sheets API 등을 활용하여 단순 요청 관리 기능을 넘어선 고도화된 사용자 경험(자동 완성, 포인트 자동 기록)을 구축할 수 있습니다.
- PHP 버전 문제나 세션 ID 설계 등 실제 운영 환경에서 발생하는 기술적 난관들을 해결하는 과정이 중요합니다.
はじめに
事の発端は、ある配信アプリのアップデートだった。
そのアプリは「トピア」。カラオケ配信に特化したアプリで、リスナーがリクエストした曲を歌う「歌凸」文化が根付いている。配信者とリスナーの交流を支える、いいアプリだった。あのアップデートまでは。
その日、無課金リスナーの努力が「消滅」することになった
ある日、運営からこんな告知が出た。
「ギフトポイントに 90 日の消費期限をつけました!」
つまり何が起きるのか。
毎日配信に通って、無料のギフトポイントをコツコツ貯めてくれていた無課金リスナーが、90 日間配信に来られなくなったら──その努力が全部ゼロになる。
彼らは「お金じゃ測れない応援」を形にしてくれていた。その気持ちに、運営は「90 日で消えます」と言ったのだ。
正直なところ、私は運営でもないし、責任を感じる立場でもない。
ただ──「気に入らんにゃ」と思った。
無課金でコツコツ応援してくれるリスナーが報われない仕組みが、どうしても許せなかった。
ならば自分で作ろう。運営がダメなら、こっちで受け皿を作ればいい。
そうして「ぽいぽいトピア」の開発が始まった。
求めていたもの
トピアの代替として、以下の機能を備えたツールが必要だった。
| 機能 | 内容 |
|---|---|
| 🎵 歌凸リクエスト管理 | 誰が何の曲をリクエストしたか記録 |
| 📊 ポイント管理 | リスナーに還元できる仕組み |
| 🌐 サーバー不要 | ブラウザだけで動く |
開発パートナーは AI
開発のパートナーは DeepSeek(通称クジラ)。私はコードを書けるわけではない。だから「ああしろ、こうしろ」と仕様を伝え、AI がコードを書く。動かなければ「動かない」と伝え、修正させる。この役割分担が、結果的にうまく機能した。
最初は HTML/JavaScript のみでプロトタイプを作成。PWA 対応させれば、スマホのホーム画面に追加してアプリのように使える。
「動いた!」という感動もつかの間、問題が発生した。
500 エラーとの戦い
ロリポップサーバーにアップロードした途端、HTTP ERROR 500。
原因は PHP のバージョンだった。ロリポップの初期設定は PHP 5.6。しかし自作ツールは PHP 7.4 以上が必要。管理画面から PHP バージョンを変更し、無事に動作。レンタルサーバーあるあるをまた一つ学んだ。
Google Sheets との連携
実は Google Sheets API との連携は、以前開発した「ポイぼっくす」で経験済みだった。今回はその知見を流用し、リクエスト受付や歌唱完了時のポイント自動記帳を実装。一度経験した技術を使い回せるのも、自作ツールの強みだ。
こだわりの機能ベスト 5
- 🎵 iTunes API で曲名検索&ジャケ写表示
曲名の手入力は面倒だし、タイプミスも起きやすい。そこで iTunes Search API を使って、曲名の一部を入力するだけで候補をリスト表示するようにした。選択した曲のジャケ写は NOW SINGING 表示時に自動で表示される。
- 👤 リスナー名サジェスト
同じリスナーが何度もリクエストしてくれるのは嬉しいが、毎回名前を手打ちするのは負担になる。一度入力した名前を localStorage と datalist で保存し、次回からは頭文字を打つだけで候補が出るようにした。
- 📡 配信セッション ID で日付またぎ問題を解決
深夜配信で 0 時を超えるとログが別ファイルになる問題を、配信ごとにユニークなセッション ID を発行することで解決した。
function get_stream_session_id() {
$key = session_key('stream_session_id');
if (!isset($_SESSION[$key])) {
...
}
}
- 🖼️ NOW SINGING にアートワーク表示
iTunes 検索時に取得したジャケ写を NOW SINGING に表示。たったこれだけで配信画面のクオリティが一段上がる。
- 🔑 URL パラメータでマルチユーザー対応
同じサーバーで複数の配信者が使えるよう、URL パラメータでユーザー ID を切り替えられるようにした。セッションもログも Google Sheets も、ユーザー ID ごとに完全分離される。
現在の「ぽいぽいトピア」
| 機能 | 実装 |
|---|---|
| 🎵 曲名検索 | iTunes API で自動補完+ジャケ写表示 |
| 👤 名前サジェスト | 過去の入力から自動候補表示 |
| 📡 配信セッション管理 | 日付またぎ問題を完全解決 |
| 📊 Google Sheets 連携 | ポイぼっくすの知見を流用 |
| 🔑 マルチユーザー | URL パラメータで完全分離 |
| 📁 過去ログ DL | いつでも過去の配信を振り返り |
まとめ
クソアップデートは、時に人を動かす。
あの日、トピアが無課金リスナーの努力に「90 日の消費期限」をつけなければ、私は PHP のバージョンを調べることも、iTunes API を叩くことも、配信セッション ID を設計することもなかった。
「気に入らんにゃ。なら自分で作るにゃ」 その一念が、今の私を形作っている。
このツールは完全無料で公開している。 同じように困っている配信者がいたら、ぜひ使ってみてほしい。
さく猫 - 配信ツール作者 / 元トピア難民
#PHP #配信ツール #個人開発 #トピア #ポエム #やってみた
AI 자동 생성 콘텐츠
본 콘텐츠는 Zenn AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기