141 lines
4.3 KiB
Python
141 lines
4.3 KiB
Python
|
|
#!/usr/bin/env python3
|
|||
|
|
"""
|
|||
|
|
自动归档照片 - 自动点击确认按钮
|
|||
|
|
卡若AI·卡资(金)
|
|||
|
|
"""
|
|||
|
|
import json
|
|||
|
|
import os
|
|||
|
|
import subprocess
|
|||
|
|
import time
|
|||
|
|
|
|||
|
|
OUTPUT_DIR = os.path.expanduser("~/Documents/个人/卡若AI/01_卡资(金)/照片分类")
|
|||
|
|
|
|||
|
|
def load_classification():
|
|||
|
|
with open(os.path.join(OUTPUT_DIR, "classification.json"), "r") as f:
|
|||
|
|
return json.load(f)
|
|||
|
|
|
|||
|
|
def add_photos_auto(album_name, uuids, batch_size=500):
|
|||
|
|
"""自动添加照片并点击确认"""
|
|||
|
|
total = len(uuids)
|
|||
|
|
added = 0
|
|||
|
|
|
|||
|
|
for i in range(0, total, batch_size):
|
|||
|
|
batch = uuids[i:i+batch_size]
|
|||
|
|
uuid_list = '", "'.join(batch)
|
|||
|
|
|
|||
|
|
# 添加照片并自动点击确认
|
|||
|
|
script = f'''
|
|||
|
|
tell application "Photos"
|
|||
|
|
activate
|
|||
|
|
set targetAlbum to missing value
|
|||
|
|
repeat with a in albums
|
|||
|
|
if name of a is "{album_name}" then
|
|||
|
|
set targetAlbum to a
|
|||
|
|
exit repeat
|
|||
|
|
end if
|
|||
|
|
end repeat
|
|||
|
|
|
|||
|
|
if targetAlbum is not missing value then
|
|||
|
|
set uuidList to {{"{uuid_list}"}}
|
|||
|
|
set photosToAdd to {{}}
|
|||
|
|
repeat with uuid in uuidList
|
|||
|
|
try
|
|||
|
|
set thePhoto to media item id uuid
|
|||
|
|
set end of photosToAdd to thePhoto
|
|||
|
|
end try
|
|||
|
|
end repeat
|
|||
|
|
|
|||
|
|
if (count of photosToAdd) > 0 then
|
|||
|
|
add photosToAdd to targetAlbum
|
|||
|
|
end if
|
|||
|
|
end if
|
|||
|
|
end tell
|
|||
|
|
|
|||
|
|
-- 自动点击确认按钮
|
|||
|
|
delay 0.5
|
|||
|
|
tell application "System Events"
|
|||
|
|
tell process "Photos"
|
|||
|
|
try
|
|||
|
|
-- 查找并点击"应用"按钮
|
|||
|
|
repeat 10 times
|
|||
|
|
if exists (button "应用" of sheet 1 of window 1) then
|
|||
|
|
click button "应用" of sheet 1 of window 1
|
|||
|
|
exit repeat
|
|||
|
|
else if exists (button "Apply" of sheet 1 of window 1) then
|
|||
|
|
click button "Apply" of sheet 1 of window 1
|
|||
|
|
exit repeat
|
|||
|
|
end if
|
|||
|
|
delay 0.2
|
|||
|
|
end repeat
|
|||
|
|
end try
|
|||
|
|
end tell
|
|||
|
|
end tell
|
|||
|
|
'''
|
|||
|
|
try:
|
|||
|
|
result = subprocess.run(
|
|||
|
|
['osascript', '-e', script],
|
|||
|
|
capture_output=True,
|
|||
|
|
text=True,
|
|||
|
|
timeout=180
|
|||
|
|
)
|
|||
|
|
added += len(batch)
|
|||
|
|
except subprocess.TimeoutExpired:
|
|||
|
|
print(f" ⚠️ 超时,继续下一批")
|
|||
|
|
except Exception as e:
|
|||
|
|
print(f" ⚠️ {e}")
|
|||
|
|
|
|||
|
|
progress = min(i + batch_size, total)
|
|||
|
|
print(f" 进度: {progress}/{total} ({progress*100//total}%)")
|
|||
|
|
time.sleep(1)
|
|||
|
|
|
|||
|
|
return added
|
|||
|
|
|
|||
|
|
def main():
|
|||
|
|
print("🚀 照片自动归档(无需确认)")
|
|||
|
|
print("="*60)
|
|||
|
|
|
|||
|
|
data = load_classification()
|
|||
|
|
|
|||
|
|
# 按类别归档
|
|||
|
|
tasks = [
|
|||
|
|
(("个人照片", "手机拍摄"), "📱 手机拍摄"),
|
|||
|
|
(("个人照片", "自拍美颜"), "🤳 自拍美颜"),
|
|||
|
|
(("截图收藏", "屏幕截图"), "📸 屏幕截图"),
|
|||
|
|
(("视频素材", "手机拍摄视频"), "🎬 手机视频"),
|
|||
|
|
(("视频素材", "剪辑导出"), "🎬 剪辑导出"),
|
|||
|
|
(("视频素材", "屏幕录制"), "🎬 屏幕录制"),
|
|||
|
|
(("视频素材", "抖音视频"), "🎬 抖音视频"),
|
|||
|
|
(("内容素材", "网络图片"), "🌐 网络图片"),
|
|||
|
|
]
|
|||
|
|
|
|||
|
|
year_tasks = [
|
|||
|
|
("2018年及以前", "📅 2018年及以前"),
|
|||
|
|
("2019年回顾", "📅 2019年回顾"),
|
|||
|
|
("2020年回顾", "📅 2020年回顾"),
|
|||
|
|
("2021年回顾", "📅 2021年回顾"),
|
|||
|
|
("2022年回顾", "📅 2022年回顾"),
|
|||
|
|
("2023年回顾", "📅 2023年回顾"),
|
|||
|
|
("2024年照片", "📅 2024年照片"),
|
|||
|
|
("2025年照片", "📅 2025年照片"),
|
|||
|
|
]
|
|||
|
|
|
|||
|
|
print("\n📁 内容分类归档...")
|
|||
|
|
for (cat, sub), album in tasks:
|
|||
|
|
if cat in data["categories"] and sub in data["categories"][cat]:
|
|||
|
|
uuids = data["categories"][cat][sub]
|
|||
|
|
print(f"\n→ {album} ({len(uuids)}张)")
|
|||
|
|
add_photos_auto(album, uuids)
|
|||
|
|
|
|||
|
|
print("\n📅 年份归档...")
|
|||
|
|
for src, album in year_tasks:
|
|||
|
|
if src in data["year_albums"]:
|
|||
|
|
uuids = data["year_albums"][src]
|
|||
|
|
print(f"\n→ {album} ({len(uuids)}张)")
|
|||
|
|
add_photos_auto(album, uuids)
|
|||
|
|
|
|||
|
|
print("\n" + "="*60)
|
|||
|
|
print("✅ 全部完成!")
|
|||
|
|
|
|||
|
|
if __name__ == "__main__":
|
|||
|
|
main()
|