見出し画像

RG35XX(GarlicOS)の自動アップデートをPythonで書く

以前に紹介したようにGarlicOSのアップデートは配布サイトからダウンロードしたRG35XX-CopyPasteOnTopOfStock.7zを解凍して同名のフォルダ、ファイルをRG35XXのマイクロSDカードに上書きするだけなのですが、更新頻度も多いので手作業ではなくPythonで自動更新できるようにしました。

2023/2/10にv1.05がリリースされていましたので、このバージョンで試したいと思います。以下の環境で作りました。

1.開発環境

  • Windows11 22H2

  • Python:v3.11.2(v3.8以降推奨)

  • 追加したPythonライブラリ

    • psutil (実行中のプロセスやシステム利用状況の情報をPythonで取得できます)

    • py7zr (7zipファイルの圧縮、解凍をします)

2.事前準備

  • Pythonコードが動作する環境を作ります

  • Windows Power Shellからpsutilとpy7zrをpipコマンドでインストールします

  • GarlicOSのアップデートファイルを配布サイトからダウンロードします

  • RG35XXからマイクロSDカードを抜いてパソコンに読み込ませます

3.実行

  1. Pythonファイルをダブルクリックするとプログラムが起動します

  2. ファイル選択ウィンドウが表示されますので、GarlicOSのアップデートファイル(RG35XX-CopyPasteOnTopOfStock.7z)を開いてください

  3. しばらく待つとコピー完了です

プログラム開始直後に表示されます

4.プログラム動作の流れ

  1. GarlicOSのアップデートファイル(RG35XX-CopyPasteOnTopOfStock.7z)の保存場所を選択する画面を表示します

  2. GarlicOSのアップデートファイルを解凍し、同名のフォルダに展開します

  3. パソコンが認識するドライブからRG35XXのシステムドライブとデータドライブを探します

  4. GarlicOSのアップデートファイルをRG35XXのシステムドライブとデータドライブに上書きします

  5. 解凍したGarlicOSのアップデートファイルのフォルダを削除します

5.ご注意

以下に紹介しているPythonコードを使用する上で以下の3点に関してご注意ください。

  • v1.05のアップデートファイルで動作確認は行い、こちらの環境でセーブデータが消える、パソコンのOSに影響を及ぼすなどの現象は起きておりませんが、ご自身の責任で運用ください

  • パソコンに他の外付けドライブ(ハードディスクなど)を接続して偶然RG35XXと同じファイルシステム、フォルダ名がありますとRG35XXのドライブと誤認識する可能性があります。使うときにはマイクロSDカード以外を接続しないなど予防策を講じて実施ください

  • 今後、GarlicOSのアップデートでフォルダ構成が変更された場合には対応できなくなる可能性があります

6.Pythonコード

今回のプログラムはGarlicOSのアップデートファイルを選択する以外に入力することがないため、ファイル指定のところのみtkinterを使いました。
気を付けていただきたいのは、shutil.copytreeで指定しているdirs_exist_ok=Trueはコピー先に同じフォルダ名があっても上書きするオプションですが、Python v3.8以降で追加されたオプションですので使用しているPythonバージョンに気を付けてください。

今回は不明なところをChatGPTに質問しながら進めるやり方でプログラムを書いてみました。的確なコードを提示することはもちろんですが、調査範囲を狭める意味でも非常に重宝しました。「〇〇の機能をPythonで書きたい」と質問するだけですので手軽で、さらに詳細を知りたいときにも追加で質問できますので非常に良いと思いました。

また下記コードをコピーしてChatGPTに貼り付けますと自然言語で処理の内容を解説してくれますので、そのような用途でもおすすめします。

import os
import psutil
import py7zr
import shutil
from tkinter import filedialog

# マイクロSDカードのドライブ名を初期化する
misc_drv = ''
roms_drv = ''

# tkinterでGarlicOSのアップデートファイルを指定する
f_type = [('Update file', 'RG35XX-CopyPasteOnTopOfStock.7z')]
sel_file = os.path.abspath(os.path.dirname(__file__))
fil_path = filedialog.askopenfilename(filetype = f_type, initialdir = sel_file)
fil_path = os.path.normpath(fil_path)
fol_path, ext = os.path.splitext(fil_path)

# GarlicOSがインストールされたマイクロSDカードをパソコンが認識しているか確認する
for i in psutil.disk_partitions():
    if i.opts == 'rw,removable':
        os.chdir(i.device)
        if ('modules' in os.listdir()) and (i.fstype == 'FAT'):
            if os.path.isdir('modules') == True:
                misc_drv = i.device
        elif (('BIOS' and 'CFW' and 'Roms') in os.listdir()) and \
                (i.fstype == 'FAT32'):
            if (os.path.isdir('BIOS') == True) and \
                (os.path.isdir('CFW') == True) and \
                (os.path.isdir('Roms') == True):
                    roms_drv = i.device

# GarlicOSがインストールされたマイクロSDカードであれば更新する
if misc_drv != '':

    # 7zipファイルと同じディレクトリにフォルダを作成してファイルを解凍する
    if not os.path.exists(fol_path):
        os.makedirs(fol_path)
    with py7zr.SevenZipFile(fil_path, mode='r') as archive:
        archive.extractall(fol_path)

    # GarlicOSのアップデートファイルをマイクロSDカードに上書きする
    src_fol = os.path.join(fol_path,'misc')
    dst_fol = misc_drv
    shutil.copytree(src_fol, dst_fol, dirs_exist_ok=True)
    print('miscファイルの更新が完了しました')
    if roms_drv != '':
        src_fol = os.path.join(fol_path,'roms')
        dst_fol = roms_drv
        shutil.copytree(src_fol, dst_fol, dirs_exist_ok=True)
        print('romsファイルの更新が完了しました')
    else:
        print('GarlicOSのマイクロSDカードがデータ破損している可能性があります')

    # 解凍したGarlicOSのアップデートフォルダを削除する
    shutil.rmtree(fol_path)
else:
    print('GarlicOSのマイクロSDカードをパソコンに挿してください')


この記事が気に入ったらサポートをしてみませんか?