Spaces:
Sleeping
Sleeping
File size: 5,932 Bytes
c2a8ece d5896b5 14d78d0 d5896b5 a37914c d5896b5 14d78d0 d5896b5 eb5bcea 14d78d0 d5896b5 14d78d0 64bcfa7 79c1109 260a17e b11cea5 260a17e 14d78d0 260a17e 14d78d0 260a17e 79c1109 260a17e 5ae0f46 260a17e 5ae0f46 260a17e 5ae0f46 d5896b5 260a17e d5896b5 14d78d0 d5896b5 14d78d0 d5896b5 1934d31 e02afe7 1934d31 d5896b5 1934d31 d5896b5 1934d31 d5896b5 14d78d0 1934d31 14d78d0 d5896b5 14d78d0 d5896b5 |
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 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 |
from flask import Flask, render_template, send_from_directory, abort
import schedule
import threading
import time
import subprocess
import os
import shutil
import stat
import logging
import re
# ロギング設定をDEBUGに
logging.basicConfig(level=logging.DEBUG, 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 アプリケーション設定
# static_folder=None にして組み込みの静的配信はOFFにする
app = Flask(
__name__,
template_folder="templates",
static_folder=None,
static_url_path=None
)
# FlaskのロガーもDEBUGに
app.logger.setLevel(logging.DEBUG)
@app.route("/")
def index():
return render_template("index.html")
@app.route("/<path:filepath>")
def serve_any(filepath):
app.logger.debug(f"📥 リクエストされたパス: {filepath!r}")
# 1) static フォルダ
static_path = os.path.join("static", filepath) # app.static_folder は None なので手動で指定
exists_static = os.path.isfile(static_path)
app.logger.debug(f"→ static をチェック: {static_path!r} 存在? {exists_static}")
if exists_static:
app.logger.info(f"✅ static から返却: {filepath}")
directory, filename = os.path.split(static_path)
return send_from_directory(directory, filename)
# 2) リポジトリ直下
full_path = os.path.join(REPO_DIR, filepath)
exists_repo = os.path.isfile(full_path)
app.logger.debug(f"→ repo をチェック: {full_path!r} 存在? {exists_repo}")
if exists_repo:
directory, filename = os.path.split(full_path)
app.logger.info(f"✅ repo から返却: ディレクトリ={directory!r}, ファイル名={filename!r}")
return send_from_directory(directory, filename)
app.logger.warning(f"❌ ファイルが見つからない: {filepath!r}")
abort(404)
# 読み取り専用ファイルを削除できるようにする
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")
index_path = os.path.join("templates", "index.html")
with open(index_path, "r", encoding="utf-8") as f:
html = f.read()
# <base href=...> を削除
new_html = re.sub(
r'<base\s+href="https://sharkpools-extensions\.vercel\.app/"\s*/?>',
'',
html,
flags=re.IGNORECASE
)
# <span> の直後に <h1> を追加
insertion_text = '<br><h2 style="color: red">これらの拡張機能はSharkPoolによって作成されました。</h2><span style="color: red">CORS制限の問題から、自動で置き換えするクリプトを使用し別のホストでホストされていますが、拡張機能は一日ごとに自動で更新されます。'
pattern = r'(<span style="color:\s*pink">\s*Please Load Extensions Unsandboxed, otherwise they will not Load\.\s*</span>)'
if re.search(pattern, new_html):
new_html = re.sub(pattern, r'\1' + insertion_text, new_html)
logging.info("✅ <h1>タグを挿入しました。")
else:
logging.warning("⚠️ 挿入対象の <span> タグが見つかりませんでした。")
with open(index_path, "w", encoding="utf-8") as f:
f.write(new_html)
logging.info("index.html の修正が完了しました。")
logging.info("リポジトリの更新が完了しました。")
# スケジューラを実行する関数(60分ごと)
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)
|