リクエスト詳細
✨ 既存アプリの改善
対応完了
対象アプリ: SoundMap - 世界の環境音プレイヤー
ミックス共有リンク生成機能の追加
## 1. 目的
現在マイミックスはlocalStorageのみに保存されるため他デバイスや他者との共有が不可能。URLパラメータにミックス設定をエンコードして共有リンクを生成する機能を追加し、SNS共有や別デバイスでの即時再生を可能にする。外部APIやDBは不要。
## 2. 具体的な仕様
### 2-1. 共有リンクの生成
- コンソールパネルの「マイミックス」セクションに「🔗 このミックスを共有」ボタンを追加(現在再生中のチャンネル設定がある場合のみ有効化)
- ボタン押下時、現在の再生状態(最大4チャンネル)を以下の形式でURLクエリ文字列にシリアライズする
- パラメータ名: `mix`
- 値: `soundId:volume` を `,` 区切り、チャンネルを `-` 区切りで連結した文字列
- 例: `?mix=tokyo_rain:0.8-london_cafe:0.5-amazon_forest:0.6`
- soundIdは既存の25音源の識別子(既存コードの音源定義キーをそのまま流用)
- volumeは0.0〜1.0の小数第1位まで
- 生成したURLを `navigator.clipboard.writeText()` でクリップボードにコピー
- コピー成功後、ボタンラベルを「✅ コピーしました!」に2秒間変更してから元に戻す
- `navigator.clipboard` が使えない環境(HTTP等)では `<input readonly>` にURLを表示してユーザーに手動コピーさせる
### 2-2. 共有リンクの受信・自動ロード
- ページ読み込み時(`DOMContentLoaded`)に `window.location.search` を確認し、`mix` パラメータが存在する場合は以下を実行
1. パラメータをパースして soundId と volume の配列を取得
2. soundIdが既存の25音源に含まれるか検証(不正値は無視)
3. 有効なチャンネルが1つ以上あれば、既存のミックスロード処理(`loadMix()`相当)を呼び出してそのまま再生開始
4. 地図上の対応ピンをアクティブ状態に設定
5. 画面上部に「🌍 共有ミックスをロードしました」のトースト通知を2秒表示
- ロード後はURLを `history.replaceState` でクリーンなURLに書き換え(リロード時に再ロードが繰り返されないようにする)
### 2-3. UI配置
- PCレイアウト: コンソールパネルのマイミックスセクション最下部に「🔗 このミックスを共有」ボタンを横幅100%で配置
- スマホレイアウト: コンソールタブ内の同セクションに同様に配置
- ボタンは現在再生中チャンネルが0のとき `disabled` 属性を付与してグレーアウト
### 2-4. スタイル
- 既存のプリセットボタンと同系統のデザイン(枠線ありアウトラインスタイル)
- コピー成功時のラベル変化はCSSトランジションでフェード
## 3. 既存機能との整合
- localStorageのマイミックス5スロット保存・ロード機能は一切変更しない
- Web Audio API合成ロジック・ビジュアライザー・スリープタイマーに手を加えない
- 共有リンクロードは既存の `loadMix()` 処理を再利用するため音源合成ロジックの二重実装が不要
- `mix` 以外のクエリパラメータが存在しても無視するため将来の拡張と競合しない
- DBや外部通信は一切なくPHP側の改修も不要、JS側のみの追加実装で完結する
現在マイミックスはlocalStorageのみに保存されるため他デバイスや他者との共有が不可能。URLパラメータにミックス設定をエンコードして共有リンクを生成する機能を追加し、SNS共有や別デバイスでの即時再生を可能にする。外部APIやDBは不要。
## 2. 具体的な仕様
### 2-1. 共有リンクの生成
- コンソールパネルの「マイミックス」セクションに「🔗 このミックスを共有」ボタンを追加(現在再生中のチャンネル設定がある場合のみ有効化)
- ボタン押下時、現在の再生状態(最大4チャンネル)を以下の形式でURLクエリ文字列にシリアライズする
- パラメータ名: `mix`
- 値: `soundId:volume` を `,` 区切り、チャンネルを `-` 区切りで連結した文字列
- 例: `?mix=tokyo_rain:0.8-london_cafe:0.5-amazon_forest:0.6`
- soundIdは既存の25音源の識別子(既存コードの音源定義キーをそのまま流用)
- volumeは0.0〜1.0の小数第1位まで
- 生成したURLを `navigator.clipboard.writeText()` でクリップボードにコピー
- コピー成功後、ボタンラベルを「✅ コピーしました!」に2秒間変更してから元に戻す
- `navigator.clipboard` が使えない環境(HTTP等)では `<input readonly>` にURLを表示してユーザーに手動コピーさせる
### 2-2. 共有リンクの受信・自動ロード
- ページ読み込み時(`DOMContentLoaded`)に `window.location.search` を確認し、`mix` パラメータが存在する場合は以下を実行
1. パラメータをパースして soundId と volume の配列を取得
2. soundIdが既存の25音源に含まれるか検証(不正値は無視)
3. 有効なチャンネルが1つ以上あれば、既存のミックスロード処理(`loadMix()`相当)を呼び出してそのまま再生開始
4. 地図上の対応ピンをアクティブ状態に設定
5. 画面上部に「🌍 共有ミックスをロードしました」のトースト通知を2秒表示
- ロード後はURLを `history.replaceState` でクリーンなURLに書き換え(リロード時に再ロードが繰り返されないようにする)
### 2-3. UI配置
- PCレイアウト: コンソールパネルのマイミックスセクション最下部に「🔗 このミックスを共有」ボタンを横幅100%で配置
- スマホレイアウト: コンソールタブ内の同セクションに同様に配置
- ボタンは現在再生中チャンネルが0のとき `disabled` 属性を付与してグレーアウト
### 2-4. スタイル
- 既存のプリセットボタンと同系統のデザイン(枠線ありアウトラインスタイル)
- コピー成功時のラベル変化はCSSトランジションでフェード
## 3. 既存機能との整合
- localStorageのマイミックス5スロット保存・ロード機能は一切変更しない
- Web Audio API合成ロジック・ビジュアライザー・スリープタイマーに手を加えない
- 共有リンクロードは既存の `loadMix()` 処理を再利用するため音源合成ロジックの二重実装が不要
- `mix` 以外のクエリパラメータが存在しても無視するため将来の拡張と競合しない
- DBや外部通信は一切なくPHP側の改修も不要、JS側のみの追加実装で完結する
💬 返信 (3)
🛠 開発を開始しました (機能追加 (soundmap))
ご要望ありがとうございます。AI 開発ワーカーが実装を開始します。
通常 5〜30 分で Pull Request を作成し、レビュー後にリリースされます。
ご要望ありがとうございます。AI 開発ワーカーが実装を開始します。
通常 5〜30 分で Pull Request を作成し、レビュー後にリリースされます。
📝 開発が完了しました
ご要望いただいた内容の実装が完了し、最終チェック段階に入りました。
レビュー (自動) → リリース、の流れで進みます。
もう少々お待ちください。
ご要望いただいた内容の実装が完了し、最終チェック段階に入りました。
レビュー (自動) → リリース、の流れで進みます。
もう少々お待ちください。
✅ リリース完了のお知らせ
ご要望いただいた「SoundMap - 世界の環境音プレイヤー」を実装し、リリースいたしました。
【ご利用方法】
ダッシュボード: https://www.aiapps.jp/?action=dashboard
アプリ詳細: https://www.aiapps.jp/apps/show.php?slug=soundmap
デモ環境は 1 時間以内に自動構築されます:
https://www.aiapps.jp/demo/soundmap/
ご利用ありがとうございます!
ご要望いただいた「SoundMap - 世界の環境音プレイヤー」を実装し、リリースいたしました。
【ご利用方法】
ダッシュボード: https://www.aiapps.jp/?action=dashboard
アプリ詳細: https://www.aiapps.jp/apps/show.php?slug=soundmap
デモ環境は 1 時間以内に自動構築されます:
https://www.aiapps.jp/demo/soundmap/
ご利用ありがとうございます!
Echo
Iris