Skip to content

Releases

v0.4.0

Choose a tag to compare

@yager yager released this 16 Sep 12:47

ハイライト

GoPro を複数台お使いの方向けの版です。ファイル名の採番は機体ごとに独立しているため、GX010001.MP4 は 2 台目でも普通に生まれます。既定の保存先 {date:%Y-%m-%d}_GoPro は機体を区別しないので、同じ日に 2 台から取り込むと同一フォルダに同名のファイルが集まります。

この版で、保存先を機体ごとに分けるための {serial} を追加し、あわせて同名衝突で完成済みのファイルが黙って上書きされないよう歯止めを入れました。

1 台だけでお使いの場合、設定を変えなければ挙動は変わりません。

追加したこと

保存先のフォルダ名に {serial} が使えます

{model} では同じ機種の 2 台を区別できないため、シリアル番号を使います。全体は 14 文字でフォルダ名には長いので、{serial:4} で末尾 4 文字だけを取り出せます。

folder = {date:%Y-%m-%d}_{model}_{serial:4}    ; → 2026-09-16_MISSION1PROILS_2388

推奨はこの形です。重複を避けるだけなら {serial:4} だけで足りますが、2026-09-16_2388 では後から何で撮ったのか分かりません。{model} を挟むと読めるフォルダ名になります。

シリアル番号自体は以前から gpget probe が表示していました。テンプレートに繋がっていなかっただけです。

同名で中身の違うファイルを上書きしなくなりました

ディスク上のファイルがカメラの申告より大きい場合、置き換えずにその 1 件だけを飛ばします。カメラが言うより長いファイルは、転送が途中で切れたファイルではありえません。別のファイルが同じ名前を名乗っていると判断します。

sync の表示はこうなります。

NAME TAKEN by a different file — skipped (set general.folder per camera, or overwrite = rename)

これまでは既定の overwrite = skip でも1 台目の完全なファイルが 2 台目の中身で上書きされていました。

変わったこと

{cam} から空白が消えます。GoPro 25412388 ではなく GoPro25412388 になります。{model} は元から空白とハイフンを落としていたのに {cam} だけ Wi-Fi の SSID をそのまま出していて、揃っていませんでした。フォルダ名はシェルで打つものなので、区切りは落とします。

gpget probe が表示する wifi ssid は実際の SSID なので、こちらは変わりません。

アップデートするときにやること

folder に {cam} を使っていなければ、バイナリを入れ替えるだけです。設定と保存済みファイルへの影響はありません。

gpget autostart install

folder を変える場合は、先に既存のフォルダを新しい名前に直してください。gpget は「すでに取得済みかどうか」を保存先のパスから判断するので、フォルダ名だけ変えると全件が再ダウンロードになります。

安全な順序はこうです。

  • gpget status で未オフロードが残っていないことを確認する
  • 既存のフォルダを新しい命名に手で改名する(2026-09-16_GoPro → 2026-09-16_MISSION1PROILS_2388)
  • 設定の folder を書き換える
  • gpget status をもう一度実行し、再ダウンロード対象が増えていないことを確認する

{cam} を使っていた場合も同じ手当てが必要です。

検証状況

macOS / MISSION 1 PRO ILS(FW H26.03.03.00.00)の実機で {serial:4} の展開を確認しました。folder = {date:%Y-%m-%d}_{model}_{serial:4} が意図どおりのフォルダを作り、同期が通ります。

同名衝突の側は単体テストのみです。2 台の実機を同時に繋いだ検証はしていません。internal/xfer/collision_test.go で、skip が大きい既存ファイルを残すこと、rename が両方を残すこと、replace が従来どおり上書きすることを固定しています。

Windows・Linux は共通コードなので変更は反映されていますが、自動起動は引き続き実機未検証です。

注意

サイズが偶然一致する衝突は検出できません。gpget は取り込んだファイルがどの機体から来たかをどこにも記録していないため、同名・同サイズのファイルは「すでに取得済み」として飛ばします。チャプター分割は固定サイズで切れるので、この一致は現実に起こりえます。保存先を機体ごとに分けるのが唯一確実な回避策です。

ディスク上のファイルが申告より小さい場合は、従来どおり置き換えます。転送が途中で切れたファイルと区別がつかないためです。両方を残したい場合は overwrite = rename を使ってください。

自動起動は 2 台の同時接続に対応していません。先に応答した 1 台だけを扱います。どちらが先になるかは不定で、1 台目を挿したまま 2 台目を挿しても何もしません。2 台目は手動の gpget sync --ip <addr> で取り込んでください。手動コマンドは複数台を見つけると multiple GoPro-looking cameras found; pass --ip と機体一覧を出して止まります。

バージョンが 0.x の間は、コマンドの形や設定ファイルの項目が変わることがあります。

gpget v0.3.1

Choose a tag to compare

@yager yager released this 16 Sep 06:42

ハイライト

連続撮影の RAW が取り込まれていなかった不具合を修正しました。interval / timelapse / burst で RAW も記録していた場合、設定で sidecars = gpr,lrv を指定していてもグループ内の .GPR だけがカードに残ったままになっていました。単写の RAW は従来どおり取得できていたため、気付きにくい状態でした。

このバージョンに上げると、過去に取り込んだグループについても不足している .GPR だけを追加で取得します。JPG は再ダウンロードされません。

直したこと

連続撮影(interval / timelapse / burst)の GPR が転送されていなかった

カメラの media/list は、グループのエントリ自体に「RAW あり」を示す情報を返します。gpget はそれを見ていなかったため、グループを JPG だけで「完了」と判定し、.GPR が永久に取り残されていました。

gpget list の表示も変わり、グループ内に RAW があることが分かります。

G    2026-09-16 10:59    40.2M  [timelapse ×5(+GPR)] GPAC0684.JPG

枚数は主フレーム数のままです(上の例なら「5 コマ + それぞれの RAW」)。RAW を含めて 10 と数え直すことはしないので、これまでの見え方と食い違いません。

その他

  • ビルド時に ld: warning: ignoring duplicate libraries: '-lobjc' が出ていたのを抑止しました。リリースビルドの出力が読みやすくなります

アップデートするときにやること

バイナリを入れ替えるだけです。設定と保存済みファイルへの影響はありません。

gpget autostart install

sidecars に gpr を含めていて、かつ過去に RAW 付きの連続撮影を取り込んでいた場合、次回の同期でそのグループが未オフロードとして再び現れます。これは正常です。取得されるのは欠けている .GPR だけで、JPG はディスク上のものがそのまま使われます。

カードに RAW 付きのグループが多く残っている場合、表示される残り容量より実際の転送量が大きくなります(下記「注意」)。

検証状況

macOS / MISSION 1 PRO ILS(FW H26.03.03.00.00)で実機確認しました。

  • 4 コマの interval と 3 コマの timelapse が、RAW を含めて正しく展開される
  • 5 コマの timelapse で JPG 5 枚 + GPR 5 枚(合計 84.2 MiB)を取得
  • アップグレード経路: JPG だけがある状態からカメラを繋ぎ直すと、GPR 5 枚だけが転送され、JPG は一切書き換えられない

Windows・Linux は共通コードなので修正は反映されていますが、自動起動は引き続き実機未検証です。UI 面の変更は今回ありません。

注意

status が表示する未オフロード容量は、RAW の分だけ少なく出ます。カメラはグループの容量として JPG の合計しか返さないため、gpget は RAW のバイト数を事前に知ることができません。実測では、グループを丸ごと取る場合が表示の約 2.1 倍、RAW だけを取る場合が約 2.2 倍でした。件数の表示は正確です。

RAW サイドカーはバイト数の検証ができません。事前にサイズが分からないため、ファイルが存在するかどうかだけで判定します。転送後にローカルでファイルを書き換えても gpget は取り直しません。単写の RAW も以前から同じ挙動です。

バージョンが 0.x の間は、コマンドの形や設定ファイルの項目が変わることがあります。

gpget v0.3.0

Choose a tag to compare

@yager yager released this 11 Sep 09:25

ハイライト

macOS のメニューバーに常駐インジケーターができました。 mode=auto での
転送中、これまでの「通知バナーの連打」に代わって、メニューバーの表示で進捗が
分かるようになります。あわせて正式なアプリアイコンも用意しました。
転送エンジン側にも安定性向上が入っています。

新機能

macOS: メニューバーインジケーター

  • 待機中: 小さいアイコンを表示
  • 転送中: アイコンの代わりに件数を2段(上=完了・下=総数)で表示。
    ホバーで gpget — … のツールチップ
  • クリックでメニュー: Sync Now / Open Destination / Show Log /
    About gpget / Quit gpget
  • 通知バナーは完了・失敗・接続エラーのときだけ。転送中の差し替え通知
    (これまでの「10件ごとに書き換え」)は廃止しました

Quit gpget について: LaunchAgent は KeepAlive 付きで常駐しているため、
単純にプロセスを終えるだけでは launchd が即座に再起動してしまいます。
そこで「今のログインセッションだけ止める」処理(gpget autostart pause)を
新設し、メニューの Quit はこれを呼びます。plist・.app・ログには一切触れず、
次回ログインで自動的に元に戻ります。今すぐ再開したい場合は
gpget autostart resume で再インストール無しに復帰できます。
自動起動そのものをやめたい場合は、従来どおり gpget autostart uninstall です。

macOS: 正式なアプリアイコン

Finder・About パネル・通知バナーで使われる、正式なアプリアイコンを追加しました。
これまでは未設定で、汎用のアイコンが表示されていました。メニューバーの
白黒テンプレートアイコンとは別物です。

直したこと(転送エンジン)

  • 転送が無応答のまま止まった場合、15 秒で見切って Range 再開するように
    (GPGET_IDLE_TIMEOUT / GPGET_MAX_RESUMES で調整可)
  • 効果のなかった keep-alive ピンガーを撤去(GoPro は HTTP keep-alive 非対応で、
    むしろ別接続として競合していました)
  • GPGET_TIMING 環境変数で、転送 1 本ごとの所要時間を診断ログに出力可能に

検証状況

macOS(Apple Silicon)は実機で検証しました。 メニューバーインジケーターは
ホバー・クリック・⌘ドラッグでの並べ替えを含め、実機で動作確認済みです。

転送エンジンの停止対策は決定論テストでは機構を確認済みですが、実運用での
発生頻度・効果は未実証です。

Windows・Linux は今回 UI 面の変更はありません(メニューバー相当の
トレイアイコンは両 OS とも未着手です)。転送エンジンの修正は共通コードなので
反映されていますが、自動起動自体は前バージョンから引き続き実機未検証です。

アップデートするときにやること

バイナリを入れ替えれば、次にカメラを繋いだタイミングで agent が自分の
.app を自動的に作り直します(self-heal)。すぐにメニューバーインジケーターを
使いたい場合は、手動で入れ替えてください:

gpget autostart install

設定・保存済みファイルへの影響はありません。

注意

バージョンが 0.x の間は、コマンドの形や設定ファイルの項目が変わることがあります。

gpget v0.2.0

Choose a tag to compare

@yager yager released this 05 Sep 22:26

v0.1.0 をお使いの方は、この版に上げてください。
v0.1.0 には、macOS と Windows のそれぞれに、自動起動まわりの重いバグがあります。

  • macOS: 通知の許可が一度も求められないまま「拒否」で固定される。
    転送は動きますが、終わったことが分かりません
  • Windows: 自動起動の登録が失敗しているのに「登録しました」と表示される。
    自動起動がまったく動きません
  • Linux: この版での変更はありません(自動起動は引き続き未検証です)

直したこと

macOS: 通知の許可が一度も出せなかった

v0.1.0 では、.app を ~/Library/Application Support に置いていました。
macOS はここを Launch Services のデータベースに載せないため、通知の担当プロセス
(usernoted)が「このプロセスがそのバンドル ID を名乗ってよいか」を検証できず、
許可のプロンプトを一度も出さないまま拒否していました。しかもその拒否は残るので、
以後は二度と聞かれません。

.app の置き場所を ~/Applications/gpget.app に変えました。ここは
Launch Services が自動で見る場所なので、普通のアプリと同じように許可を聞かれます。

あわせて、通知の許可の求められ方が分かりにくいことも分かりました。
macOS はこれをダイアログではなく、画面右上のバナーで聞いてきます。

  • タイトルが「gpget」、本文が「テキスト、サウンド、アイコンバッジにより通知されます」だけ
  • 許可は**バナー右下の「オプション」→「許可」**からしか出せない
  • バナー本体をクリックすると設定画面が開くだけで、許可にはならない
  • 60 秒で消え、放置すると「拒否」として記録される

gpget autostart install の出力で、この見た目と押し方を先に案内するようにしました。

macOS: install が「テスト通知を送りました」と嘘をついていた

通知の許可が無いとき、gpget は osascript に切り替えて送っていました。これは
macOS がほぼ確実に握りつぶす経路ですが、install は成功と表示していました。
許可が無いユーザーに「大丈夫です」と伝えていたことになります。
どの経路で通ったかを見るようにして、許可が無いときはそう表示します。

Windows: 自動起動の登録が無言で失敗していた

gpget autostart install が「登録しました」と出すのに、直後の
gpget autostart status が disabled を返す、という報告への対応です。
タスクの繰り返し期間にタスクスケジューラのスキーマが受け付けない値を渡しており、
かつ PowerShell 側でエラーを検出していなかったため、失敗が成功として報告されて
いました。タスク XML を直接渡す方式に変え、登録後に存在確認するようにしました。

タスクが毎分コンソール窓を一瞬出す問題も、同時に直しています。

その他

  • gpget autostart test-notify を .app の外から実行するとクラッシュしていた
  • README にアップデートとアンインストールの手順を追加(これまで無かった)
  • gpget autostart status が、実際に使われている .app の場所を表示するように

上げるときにやること

1. バイナリを入れ替える(インストールと同じコマンド。README 参照)

2. 自動起動を使っているなら、install をやり直す(macOS / Windows とも必須)

gpget autostart install
gpget autostart status
  • macOS: .app の置き場所が変わったため。status の app: 行が
    ~/Applications/gpget.app を指していれば移行できています
  • Windows: v0.1.0 では登録自体が失敗していたため、やり直しが要ります。
    status が enabled を返せば成功です。v0.1.0 では disabled が返っていました
  • Linux: 変更はありませんが、やり直しても害はありません

3. macOS で v0.1.0 を使っていた方は、通知を手で ON にしてください

システム設定 > 通知 > gpget

上げても通知の許可は聞かれません。 拒否はバンドル ID に紐づいて記録されており、
アプリ側から解除する手段がないためです。お手数ですが手動でお願いします。
ON にしたあと、こちらで確認できます:

"$HOME/Applications/gpget.app/Contents/MacOS/gpget" autostart test-notify

設定と、取り込み済みのファイルには影響しません。

検証状況

macOS(Apple Silicon / macOS 15 以降)は実機で検証済みです。
通知の許可については、使い捨てのバンドルを 13 本作って挙動を実測し、
初回インストールから許可・通知までの流れを通しで確認しています。

Windows の修正は実機で確認できていません。 報告された症状の原因は特定し、
Register-ScheduledTask の失敗を検出するようにしましたが、Windows 実機での
end-to-end は未実施です。Linux も未検証のままです。

試していただける方は docs/testing.md(英語) / docs/testing.ja.md(日本語) に
手順と報告方法をまとめてあります。うまくいかなかった報告も歓迎します。

注意

バージョンが 0.x の間は、コマンドの形や設定ファイルの項目が変わることがあります。

gpget v0.1.0

Choose a tag to compare

@yager yager released this 05 Sep 06:45

最初の公開版です。

GoPro を USB でつなぐと、microSD を抜かずに写真・動画を PC へ取り込めます。
カメラ側は完全リードオンリーで、削除・変更は一切しません。

できること

  • gpget sync — 未取得のメディアを日付フォルダへ取り込む
  • gpget status / list — カードの中身と、まだ取り込んでいない量を見る
  • gpget get — ファイル名やワイルドカードで個別に取る
  • gpget autostart — カメラを挿したら自動で取り込む(任意)

グループ(バースト / タイムラプス / インターバル)は 1 単位で扱い、
カメラ側で削除されたフレームは除外します。転送は .part に書いてから
バイト数を検証して確定し、中断した転送は次回に再開します。

検証状況

macOS(Apple Silicon / macOS 15 以降)は実機で検証済みです。
GoPro MISSION 1 PRO ILS(FW H26.03.03.00.00)で、106 ファイル / 約 400MB の
取り込みと自動起動を確認しています。

Windows と Linux はビルドしているだけで、実機で動かせていません。
手動の取り込みは同じコードを通りますが、自動起動(タスクスケジューラ /
systemd user timer)は一度も動作確認できていません。

試していただける方は docs/testing.md に手順と報告方法をまとめてあります。
うまくいかなかった場合の報告も歓迎します。

対応環境

OS アーキテクチャ 下限
macOS Apple Silicon macOS 15
Windows x64 Windows 10
Linux x86_64 / aarch64 systemd(自動起動を使う場合)

カメラは MISSION 1 PRO ILS で検証。/gopro/media/list を有線で公開している
機種(MISSION 1 系 / HERO11〜13 / MAX2 など)でも動く見込みですが、未確認です。

インストール

ブラウザではなく curl で取得してください。 ブラウザ経由だと macOS で
検疫属性が付き、署名していない gpget は Gatekeeper に止められます。
コマンドは README を参照してください。

注意

バージョンが 0.x の間は、コマンドの形や設定ファイルの項目が変わることがあります。