Spaces:
Running
Running
File size: 4,093 Bytes
d772d81 550cc96 b43f3e0 7c5e2c8 34f228d 7c5e2c8 d772d81 7c5e2c8 b43f3e0 d772d81 7c5e2c8 d772d81 7c5e2c8 d772d81 7c5e2c8 d772d81 6d485ba a61fcdb 6d485ba d772d81 6d485ba a61fcdb 63b83fd 6d485ba 63b83fd d772d81 21d568c 550cc96 21d568c b43f3e0 21d568c a61fcdb 7c5e2c8 d772d81 3632a28 7c5e2c8 d772d81 7c5e2c8 d772d81 7c5e2c8 d772d81 35f72da |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 |
from flask import Flask, render_template, send_from_directory
import schedule
import threading
import time
import subprocess
import os
import shutil
import stat
import logging
# ロギング設定
logging.basicConfig(level=logging.INFO, format="%(asctime)s [%(levelname)s] %(message)s")
# 定数
REPO_URL = "https://github.com/SharkPool-SP/SharkPools-Extensions.git"
REPO_DIR = "SharkPools-Extensions"
TARGET_FILE = os.path.join(REPO_DIR, "pages", "startup.js")
# Flask アプリケーション設定
app = Flask(__name__, template_folder="templates", static_folder="static")
@app.route("/")
def index():
return render_template("index.html")
@app.route('/<path:filename>')
def serve_static(filename):
return send_from_directory(app.static_folder, filename)
# 読み取り専用ファイルを削除できるようにする
def remove_readonly(func, path, excinfo):
os.chmod(path, stat.S_IWRITE)
func(path)
def clone_or_update_repo():
logging.info("リポジトリの更新を開始します。")
if not os.path.exists(REPO_DIR):
logging.info("リポジトリをクローン中...")
subprocess.run(["git", "clone", REPO_URL])
else:
logging.info("リポジトリをプル中...")
result = subprocess.run(["git", "-C", REPO_DIR, "pull"], capture_output=True, text=True)
logging.info(result.stdout)
if result.stderr:
logging.error(result.stderr)
src_target_file = os.path.join(REPO_DIR, "pages", "startup.js")
dest_pages = os.path.join("static", "pages")
if not os.path.exists(src_target_file):
logging.warning(f"{src_target_file} が存在しません。")
else:
if os.path.exists(dest_pages):
shutil.rmtree(dest_pages, onerror=remove_readonly)
shutil.copytree(os.path.join(REPO_DIR, "pages"), dest_pages)
target_file_copy = os.path.join(dest_pages, "startup.js")
with open(target_file_copy, "r", encoding="utf-8") as f:
content = f.read()
logging.info(f"コピー後のstartup.jsの内容抜粋:\n{content[:200]}")
logging.info("startup.js を修正中...")
new_content = content.replace(
'}, "https://studio.penguinmod.com");',
'}, "*");'
)
if content == new_content:
logging.warning("置換対象の文字列が見つかりませんでした。")
else:
with open(target_file_copy, "w", encoding="utf-8") as f:
f.write(new_content)
logging.info("置換が完了しました。")
# index.html をコピー
os.makedirs("templates", exist_ok=True)
shutil.copy(os.path.join(REPO_DIR, "index.html"), "templates/index.html")
# ここで <base href="..."> を削除
index_path = os.path.join("templates", "index.html")
with open(index_path, "r", encoding="utf-8") as f:
html = f.read()
import re
# <base href="https://sharkpools-extensions.vercel.app/"> を削除
new_html = re.sub(r'<base\s+href="https://sharkpools-extensions\.vercel\.app/"\s*/?>', '', html, flags=re.IGNORECASE)
if html == new_html:
logging.warning("<base href=...> タグが見つかりませんでした。")
else:
with open(index_path, "w", encoding="utf-8") as f:
f.write(new_html)
logging.info("<base href=...> タグの削除が完了しました。")
logging.info("リポジトリの更新が完了しました。")
# スケジューラを実行する関数(1分ごと)
def run_scheduler():
schedule.every(60).minutes.do(clone_or_update_repo)
try:
while True:
schedule.run_pending()
time.sleep(1)
except Exception as e:
logging.error(f"スケジューラでエラーが発生しました: {e}")
# 初回実行およびスケジューラ起動
clone_or_update_repo()
scheduler_thread = threading.Thread(target=run_scheduler, daemon=True)
scheduler_thread.start()
# アプリ起動
if __name__ == "__main__":
app.run(debug=True, host="0.0.0.0", port=7860)
|