Compare commits

...

3 Commits

Author SHA1 Message Date
77bec278bd Fix era command output example in README
Correct the example output for era conversion to match actual command results.

Co-Authored-By: Claude Sonnet 4 <noreply@anthropic.com>
2026-03-09 15:01:41 +08:00
0175a07cf1 Fix save_json to save files to lunar_json directory
- Add output_dir parameter (default: "lunar_json")
- Auto-create directory if not exists
- Update output message to show full file path

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-09 14:28:16 +08:00
3407170b8c Add ephemeris download script and update README
- Add download_ephemeris.sh script for automated JPL ephemeris file downloads
- Support de421, de422, and de440s ephemeris files
- Update README.md with download script usage instructions
- All text in Traditional Chinese

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-09 14:15:25 +08:00
3 changed files with 172 additions and 11 deletions

View File

@@ -21,7 +21,8 @@ lunar-converter/
├── api.py # FastAPI REST API 伺服器 ├── api.py # FastAPI REST API 伺服器
├── age_calculator.py # 年齡計算器 ├── age_calculator.py # 年齡計算器
├── generate_lunar_calendar_json.py # 批量生成農曆資料 ├── generate_lunar_calendar_json.py # 批量生成農曆資料
├── de421.bsp / de422.bsp # JPL 星曆檔案(需另行下載) ├── download_ephemeris.sh # JPL 星曆檔案下載腳本
├── de421.bsp / de422.bsp # JPL 星曆檔案
└── lunar_json/ # 生成的農曆資料 JSON 檔案 └── lunar_json/ # 生成的農曆資料 JSON 檔案
``` ```
@@ -46,13 +47,24 @@ pip install skyfield jplephem numpy fastapi uvicorn loguru
### 3. 下載 JPL 星曆檔案 ### 3. 下載 JPL 星曆檔案
從 [JPL 星曆官網](https://naif.jpl.nasa.gov/pub/naif/generic_kernels/spk/planets/) 下載其中一個 使用提供的下載腳本自動下載
- `de421.bsp` (預設,涵蓋 1900-2050) ```bash
- `de422.bsp` (較新,涵蓋更長時間範圍) # 下載預設的 de421 (推薦,涵蓋 1900-2050約 15MB)
- `de440s.bsp` (精簡版,適合 1900-2150) ./download_ephemeris.sh
將檔案放在專案根目錄。 # 或下載其他版本
./download_ephemeris.sh de422 # 涵蓋更長時間範圍,約 500MB
./download_ephemeris.sh de440s # 精簡版1900-2150約 30MB
./download_ephemeris.sh all # 下載全部版本
```
或從 [JPL 星曆官網](https://naif.jpl.nasa.gov/pub/naif/generic_kernels/spk/planets/) 手動下載,將檔案放在專案根目錄。
**各版本說明:**
- `de421.bsp` - 預設推薦,涵蓋 1900-2050約 15MB
- `de422.bsp` - 涵蓋更長時間範圍(-13000+17000約 500MB
- `de440s.bsp` - 精簡版,涵蓋 1900-2150約 30MB
### 4. 生成農曆資料 ### 4. 生成農曆資料
@@ -92,8 +104,6 @@ python converter_with_eras.py era 1900-01-01
輸出示例: 輸出示例:
```json ```json
{ {
"太平天國": "太平天國 50 年",
"民國": "民國 89 年",
"光緒": "光緒 26 年", "光緒": "光緒 26 年",
"明治": "明治 33 年", "明治": "明治 33 年",
"星期": "Monday" "星期": "Monday"

147
download_ephemeris.sh Executable file
View File

@@ -0,0 +1,147 @@
#!/usr/bin/env bash
# 下載 JPL 星曆表檔案用於陰曆計算
# 使用方式: ./download_ephemeris.sh [de421|de422|de440s|all]
# 預設: de421
set -e
# 輸出顏色
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # 無顏色
# JPL 星曆表檔案下載網址
BASE_URL="https://naif.jpl.nasa.gov/pub/naif/generic_kernels/spk/planets"
# 檔案資訊: 名稱 大小mb 說明
declare -A FILES=(
["de421"]="de421.bsp 15 JPL DE421 (1900-2050, ~15MB)"
["de422"]="de422.bsp 500 JPL DE422 (較長時期範圍, ~500MB)"
["de440s"]="de440s.bsp 30 JPL DE440s (1900-2150, ~30MB)"
)
# 輸出資訊
print_info() {
echo -e "${GREEN}[資訊]${NC} $1"
}
# 輸出警告
print_warn() {
echo -e "${YELLOW}[警告]${NC} $1"
}
# 輸出錯誤
print_error() {
echo -e "${RED}[錯誤]${NC} $1"
}
# 下載檔案
download_file() {
local name=$1
local url=$2
local filename=$(basename "$url")
print_info "正在下載 $filename..."
if [ -f "$filename" ]; then
print_warn "$filename 已存在,跳過下載"
return 0
fi
if curl -L -o "$filename" "$url"; then
print_info "$filename 下載完成"
return 0
else
print_error "$filename 下載失敗"
return 1
fi
}
# 驗證檔案大小
verify_file() {
local filename=$1
local expected_size_mb=$2
if [ ! -f "$filename" ]; then
print_error "檔案 $filename 不存在"
return 1
fi
local actual_size=$(du -m "$filename" | cut -f1)
if [ "$actual_size" -lt 1 ]; then
print_error "$filename 檔案大小異常"
rm -f "$filename"
return 1
fi
print_info "$filename 檔案大小: ${actual_size}MB"
return 0
}
# 主下載函式
download_ephemeris() {
local target=${1:-de421}
case "$target" in
de421)
print_info "下載 DE421 (推薦,涵蓋 1900-2050)"
download_file "de421" "$BASE_URL/a_old_versions/de421.bsp"
verify_file "de421.bsp" 15
;;
de422)
print_info "下載 DE422 (大檔案,涵蓋更長時間)"
print_warn "DE422 約 500MB下載可能需要較長時間..."
download_file "de422" "$BASE_URL/a_old_versions/de422.bsp"
verify_file "de422.bsp" 500
;;
de440s)
print_info "下載 DE440s (精簡版,涵蓋 1900-2150)"
download_file "de440s" "$BASE_URL/de440s.bsp"
verify_file "de440s.bsp" 30
;;
all)
print_info "下載所有星曆表檔案"
for key in "${!FILES[@]}"; do
download_ephemeris "$key"
echo
done
;;
list)
echo "可用的星曆表檔案:"
for key in "${!FILES[@]}"; do
echo " - $key: ${FILES[$key]}"
done
;;
*)
print_error "未知的選項: $target"
echo
echo "用法: $0 [de421|de422|de440s|all|list]"
echo
echo "說明:"
for key in "${!FILES[@]}"; do
echo " $key - ${FILES[$key]}"
done
exit 1
;;
esac
}
# 無參數時顯示說明
if [ $# -eq 0 ]; then
echo "下載 JPL 星曆表檔案"
echo
echo "用法: $0 [de421|de422|de440s|all|list]"
echo
echo "預設下載: de421"
echo
download_ephemeris "list"
echo
read -p "按 Enter 下載 de421或按 Ctrl+C 取消..."
download_ephemeris "de421"
else
download_ephemeris "$1"
fi
print_info "完成!"

View File

@@ -205,13 +205,17 @@ class LunarCalendar:
return result return result
def save_json(self, filename: str | None = None): def save_json(self, filename: str | None = None, output_dir: str = "lunar_json"):
"""將該年日曆輸出為 JSON 檔""" """將該年日曆輸出為 JSON 檔"""
import os
data = self.build_calendar() data = self.build_calendar()
os.makedirs(output_dir, exist_ok=True)
fname = filename or f"{self.year}.json" fname = filename or f"{self.year}.json"
with open(fname, "w", encoding="utf-8") as f: filepath = os.path.join(output_dir, fname)
with open(filepath, "w", encoding="utf-8") as f:
json.dump(data, f, ensure_ascii=False, indent=2) json.dump(data, f, ensure_ascii=False, indent=2)
print(f"完成!已輸出:{fname}") print(f"完成!已輸出:{filepath}")
if __name__ == "__main__": if __name__ == "__main__":