{"id":50947145,"url":"https://github.com/nananek/so-dsc","last_synced_at":"2026-06-17T21:30:31.610Z","repository":{"id":354695753,"uuid":"1224600397","full_name":"nananek/so-dsc","owner":"nananek","description":"Unofficial third-party Sony DSC Camera Remote API client + Flask viewer + MCP server for AI-driven shooting (tested on DSC-RX100M5A). Not affiliated with Sony.","archived":false,"fork":false,"pushed_at":"2026-04-29T17:09:57.000Z","size":125,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-29T18:13:16.139Z","etag":null,"topics":["ai-photographer","camera-remote-api","claude","dsc-rx100","flask","mcp","mcp-server","playmemories","sony"],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/nananek.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-29T12:48:46.000Z","updated_at":"2026-04-29T17:10:00.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/nananek/so-dsc","commit_stats":null,"previous_names":["nananek/so-dsc"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/nananek/so-dsc","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nananek%2Fso-dsc","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nananek%2Fso-dsc/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nananek%2Fso-dsc/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nananek%2Fso-dsc/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/nananek","download_url":"https://codeload.github.com/nananek/so-dsc/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nananek%2Fso-dsc/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34466928,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-17T02:00:05.408Z","response_time":127,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai-photographer","camera-remote-api","claude","dsc-rx100","flask","mcp","mcp-server","playmemories","sony"],"created_at":"2026-06-17T21:30:30.839Z","updated_at":"2026-06-17T21:30:31.605Z","avatar_url":"https://github.com/nananek.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# so-dsc\n\n**非公式 / サードパーティ実装 (unofficial third-party)**。Sony DSC シリーズ\n(動作確認: **DSC-RX100M5A**) の **Camera Remote API** を再実装した Flask\nビューア + 操作 + コンテンツ取り込み + AI 撮影係用 MCP サーバ。旧\nPlayMemories Mobile / Imaging Edge Mobile の代替。\n\n\u003e ⚠️  **本リポジトリは Sony Group Corporation / Sony Imaging Products \u0026\n\u003e Solutions Inc. と一切関係ありません。** Sony が公開していた Camera\n\u003e Remote API SDK の公開仕様 (`developer.sony.com`、現在は EOL) を参照して、\n\u003e サードパーティが独自に実装したクライアントです。Sony 公式アプリのコード\n\u003e は含まれておらず、暗号化や保護機構を回避するものでもありません。\n\u003e \"Sony\"、\"PlayMemories\"、\"Imaging Edge\"、\"Creators' App\"、\"DSC\"、\n\u003e \"RX100\" は Sony Group Corporation の商標です。\n\nプロトコル仕様: [docs/protocol.md](docs/protocol.md)\n最小再現 (依存なし): [scripts/grab_frame.py](scripts/grab_frame.py)\n\n## 使い方\n\n```sh\n# 1) カメラ本体メニュー: ネットワーク → Bluetooth リモートコントロール →\n#    「常時接続」を ON にしておくと、電源 ON で勝手に Smart Remote が立ち上がる。\n#    そうでなければ:\n#      アプリケーション → スマートリモコン を都度起動 (画面に SSID + PW 表示)\n# 2) PC 側で `DIRECT-XXXX:DSC-RX100M5A` に Wi-Fi 接続\n# 3)\npython3 -m venv .venv \u0026\u0026 source .venv/bin/activate\npip install -r requirements.txt\nSODSC_HOST=192.168.122.1 python run.py\n# → http://127.0.0.1:5050 を開く\n```\n\nカメラ内画像/動画の取り込みは **カメラ本体側で** 「スマートリモコン」を抜けて\n「スマートフォンに送る」を起動する必要がある (RX100M5A は `setCameraFunction`\n未対応のためソフト経由でモード切替できない)。その状態で UI の `Camera content`\nタブの `Load list` を押す。撮影に戻すにはカメラ側で再度「スマートリモコン」へ。\n\n環境変数:\n\n| 名前 | 既定 | 説明 |\n|------|------|------|\n| `SODSC_HOST` | (SSDP 自動発見) | カメラ IP。RX100M5A は AP モードで `192.168.122.1` |\n| `SODSC_DD_PORT` | `64321` | UPnP DD.xml 取得ポート (各サービスポートは DD.xml から動的に取得) |\n| `SODSC_DL_DIR` | `downloads` | カメラから取り込んだ画像の保存先 |\n| `HOST` | `127.0.0.1` | Flask bind host |\n| `PORT` | `5050` | Flask port (5000 を避ける: macOS Monterey 以降の AirPlay Receiver と衝突) |\n\n## 機能\n\n- ライブビュー (Sony 独自バイナリストリームをパースして MJPEG として配信)\n- リモートシャッター + AF (半押し / focusStatus ポーリング付) + ズーム\n- 設定変更: ISO / シャッタースピード / F値 / EV / WB\n- バルブ撮影 / 連写制御\n- 動画記録 (`startMovieRec` / `stopMovieRec` で本体 SD カードへ録画)\n- カメラ内画像/動画一覧 (Camera Remote API avContent または DLNA UPnP 経路自動分岐)\n  - サムネ + Large JPEG (1920×1080 上限) ダウンロード\n  - **DLNA 経路ではフル解像度 RAW (.ARW) は取れない** — Sony 仕様の制約\n- AI 撮影係用 MCP サーバ (Claude Code 等から 18 ツール経由で操作)\n\n仮想カメラ出力 (Zoom / Meet / FaceTime 等):\n- **OBS Studio の Virtual Camera 経由** で対応。ネイティブ実装は不要 — OBS が\n  Mac/Win/Linux 全部に対応してくれる。詳細は下記「仮想カメラとして使う」を参照。\n\n## 仮想カメラとして使う (OBS 経由)\n\nZoom / Google Meet / FaceTime / QuickTime などに **RX100M5A のライブビューを\n仮想カメラとして見せる** やり方。OBS Studio の Virtual Camera 機能を中継に\nするので、ネイティブ Camera Extension / DAL plugin は不要、Mac/Win/Linux\n共通で動きます。\n\n1. **OBS Studio** をインストール (https://obsproject.com)\n2. so-dsc Flask サーバを起動 (`python run.py`)\n3. OBS で **Browser Source** を追加:\n   - URL: `http://127.0.0.1:5050/embed` (PORT が違う場合は合わせる)\n   - Width: `640` / Height: `424` (Sony liveview ネイティブ)\n   - 「Shutdown source when not visible」「Refresh browser when scene becomes active」\n     はお好みで (推奨: ONになってると配信状態が安定する)\n4. シーンに Browser Source を配置・サイズ調整\n5. OBS の右下 **Start Virtual Camera** をクリック\n6. Zoom / Meet / FaceTime のカメラ選択で **OBS Virtual Camera** を選ぶ\n\n`/embed` は OBS Browser Source 用のクロームレスページ — 全画面 `\u003cimg\u003e` で\nliveview を表示し、stale 検知で `\u003cimg\u003e` を自動再アタッチします\n(配信中にカメラが一瞬切れても OBS 側を再起動しなくて済む)。\n\nOBS の他のソース (テロップ、ロゴ、別カメラ、スクリーンキャプチャ) と\n合成できるのも便乗のうれしさ。\n\n## 動画記録\n\nUI の `Movie REC` ボタン (Shoot タブ) または MCP の `start_movie_rec` /\n`stop_movie_rec` ツールで本体 SD カードへ動画を記録します。\n\n**RX100M5A での前提**:\n- カメラ本体ダイヤルを動画ポジションに合わせる必要あり (`setShootMode` は\n  Smart Remote Control __SAK__ で未提供のため、API 側からモード切替はできない)\n- ダイヤルが動画位置になると `startMovieRec` / `stopMovieRec` が\n  `getAvailableApiList` に出現する → UI の `Movie REC` ボタンが有効化\n- 録画中は `cameraStatus` event slot が `MovieRecording` になる\n\n録画したファイルは本体 SD カードに残ります。Wi-Fi 経由で取り込むなら\n本体メニューで「スマートフォンに送る」モードに切り替えて `Camera content`\nタブから DL (DLNA 経由・Large JPEG プレビュー版のみ取得可能、本機種では\nオリジナル動画は SD 直接 or USB 経由でないと取れません)。\n\n## 制約\n\n- カメラの Wi-Fi AP は **同時接続クライアント 1 台** のみ受け付ける。純正アプリと\n  同時には使えない。\n- Flask の reloader は 2 プロセス起動するためカメラ側の 1-client 制限とぶつかる。\n  `run.py` では reloader を無効化済み。\n- `setCameraFunction` 直後はカメラ側状態がしばらく不安定。Flash モード切替直後に\n  `startLiveview` を叩いて Illegal State が返る場合は数秒待って再試行する設計。\n- macOS Safari は `multipart/x-mixed-replace` の挙動が貧弱な場合がある。Chrome /\n  Firefox 推奨。\n- 一部の API (動画記録設定など) は RX100M5A では未対応 (`12 No Such Method`)。\n  事前に `getAvailableApiList` で確認するのが安全。\n\n## ネットワーク的な注意\n\nデフォルトで `127.0.0.1` にだけ bind しています。`HOST=0.0.0.0` で公開する場合は\n**同一 LAN の誰でもカメラを操作・録画閲覧できる** ことに注意してください。認証は\nありません。自宅 LAN かつ信頼できる範囲でのみ晒すこと。\n\n## MCP サーバ (AI 撮影係)\n\nFlask が立っている前提で、`mcp_server/server.py` が **Claude Code / Claude\nDesktop 等の MCP クライアントに stdio で接続できるブリッジ** になります。\nカメラを「AI に渡せるツール」として公開する形:\n\nツール一覧:\n\n| カテゴリ | tool | 説明 |\n|---|---|---|\n| introspect | `get_status` | 現状 (running/idle/available_apis/focus_status/exposure など) |\n| introspect | `reconnect` | 手動再接続トリガ |\n| introspect | `refresh_services` | DD.xml 再取得 (本体側モード切替検知) |\n| vision | `get_liveview_frame` | 最新ライブビュー JPEG を Image で返す (AI が見る) |\n| shoot | `take_picture(save=True)` | 半押し → focusStatus 待ち → シャッター → postview を Image で返す + 保存 |\n| shoot | `half_press(on)` | 半押し AF (位置は本体側で決まる) |\n| shoot | `zoom(direction, movement)` | ズーム |\n| exposure | `set_iso`, `set_shutter`, `set_fnumber`, `set_exposure_compensation` | 露出 |\n| exposure | `set_white_balance_auto`, `set_white_balance_kelvin(K)` | WB |\n| burst | `start_burst` / `stop_burst` | 連写 (postview URL リスト返却) |\n| bulb | `start_bulb` / `stop_bulb` | バルブ撮影 |\n| movie | `start_movie_rec` / `stop_movie_rec` | 本体 SD への動画記録 |\n| content | `list_camera_pictures` / `download_camera_picture` | カメラ内画像 (avContent or DLNA 自動分岐) |\n| storage | `list_saved_pictures` / `get_saved_picture(name)` | host downloads/ |\n\n### Claude Code に登録する\n\n`.mcp.json.example` をコピーして絶対パスを埋めるか、`claude mcp add` で\nプロジェクトスコープに追加します。`.mcp.json` 自体は `.gitignore` 済み\n(ホスト依存)。\n\n```sh\n# Flask は別タームで起動しておく\nSODSC_HOST=192.168.122.1 python run.py\n\n# 方法 A: claude CLI で登録 (推奨)\nclaude mcp add so-dsc -s project \\\n  -e SODSC_API_BASE=http://127.0.0.1:5050 \\\n  -e PYTHONPATH=$(pwd) \\\n  -- $(pwd)/.venv/bin/python -m mcp_server.server\n\n# 方法 B: 手動コピー\ncp .mcp.json.example .mcp.json\n# → .mcp.json を開き \u003cABSOLUTE_PATH_TO_REPO\u003e を実パスに置換\n```\n\n`SODSC_API_BASE` を変えれば別ポートの Flask に向けられます (例: dev で\n`5051` を使ってる場合)。登録後、Claude Code を再起動するとツールが認識\nされます (`mcp__so-dsc__get_status` など)。\n\n### 使用感\n\nClaude に `撮影係になって` と頼むと:\n\n- `get_liveview_frame` で構図を見る\n- 必要なら `set_iso`/`set_shutter`/`set_exposure_compensation` で露出調整\n- `zoom` で寄り/引き\n- `take_picture` で撮る → postview を即見る\n- 「もうちょい寄る?」「明るすぎ、EV-1」みたいな自己フィードバックが回る\n\n**AF 位置だけは指定不可** (RX100M5A 制限)。本体側で Focus Area を決めてお\nくか、`half_press` 中に画面中央へ被写体が来るよう人間 or AI が構図を寄\nせる運用。\n\n## Disclaimer / 免責事項\n\nThis project is an independent, third-party reimplementation of the\npublicly-documented **Camera Remote API** that Sony released as a beta\nSDK (now end-of-life). It is **not affiliated with, endorsed by, or\nsponsored by Sony Group Corporation, Sony Imaging Products \u0026 Solutions\nInc., or any of their subsidiaries**. No source code from any Sony\napplication, SDK, or firmware is included or redistributed. The project\ndoes not bypass any authentication, DRM, or content-protection\nmechanism.\n\nTrademarks \"Sony\", \"PlayMemories\", \"Imaging Edge\", \"Creators' App\",\n\"Camera Remote API\", \"DSC\", \"RX100\", and any associated logos are\nproperty of Sony Group Corporation. They are referenced here solely\nfor compatibility documentation.\n\nUse this software at your own risk. The MIT license below disclaims\nall warranties.\n\n本リポジトリは Sony 公式の Camera Remote API ベータ SDK (現在 EOL) の\n**公開仕様** を参照したサードパーティ独自実装です。**Sony Group Corporation\nおよび関連会社とは一切関係ありません**。Sony 公式アプリ・SDK・ファーム\nウェアのソースコードは含まれていません。認証・DRM・保護機構を回避する\nものでもありません。商標 (\"Sony\"、\"PlayMemories\"、\"Imaging Edge\"、\n\"Creators' App\"、\"Camera Remote API\"、\"DSC\"、\"RX100\" 等) はすべて Sony\nGroup Corporation に帰属し、互換性を説明する目的でのみ言及しています。\n本ソフトウェアは利用者の自己責任でお使いください。\n\n## License\n\nMIT — see [LICENSE](LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnananek%2Fso-dsc","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnananek%2Fso-dsc","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnananek%2Fso-dsc/lists"}