看著慢慢成形的頁面,發現缺少了刪除影片的功能外,還希望這些影片連結,可以用 Grid 的方式排列,顯示一下縮圖吧! 以下繼續開發缺少功能。
/generate-url
一旦確立身份,用來產生上傳影片到 S3 的臨時網址
/login
使用者在登入頁面打完帳號密碼,透過此 API 送給後端程式進行 登入程序
/login
將請求轉導到 網站的
login.html
頁面
/register
使用者在登入頁面打完帳號密碼,透過此 API 送給後端程式進行 註冊程序
/validate
用來檢查使用者瀏覽器中的 jwt 是否有效,藉此 驗證登入狀態
/list-videos
用來檢視之前上傳過的影片、
/generate-subtitle
/translate-url
exsky-backup-media
ffmpeg
mkdir -p layer/bin
cd layer
curl -L https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-amd64-static.tar.xz -o ffmpeg.tar.xz
tar -xJf ffmpeg.tar.xz
mv ffmpeg-*-amd64-static/ffmpeg bin/
mv ffmpeg-*-amd64-static/ffprobe bin/
zip -r ffmpeg-layer.zip bin/
aws s3 cp layer/ffmpeg-layer.zip s3://exsky-vlog-web/ffmpeg-layer.zip
aws lambda publish-layer-version \
--layer-name ffmpeg \
--content S3Bucket=exsky-vlog-web,S3Key=ffmpeg-layer.zip \
--compatible-runtimes python3.9 python3.10 python3.11 python3.12 python3.13
import os
import boto3
import subprocess
s3 = boto3.client("s3")
BUCKET_NAME = os.environ.get("BUCKET_NAME", "exsky-backup-media")
def lambda_handler(event, context):
print("🔎 event:", event)
# 從 S3 事件取出檔案資訊
record = event["Records"][0]
bucket = record["s3"]["bucket"]["name"]
key = record["s3"]["object"]["key"]
if not key.lower().endswith((".mp4", ".mov", ".mkv")):
print("⚠️ Not a video file, skip")
return
# 下載影片到 Lambda 的 /tmp
local_video = f"/tmp/{os.path.basename(key)}"
local_cover = f"/tmp/{os.path.basename(key)}.jpg"
s3.download_file(bucket, key, local_video)
# 用 ffmpeg 擷取 1 秒的畫面作為封面
cmd = [
"/opt/ffmpeg/ffmpeg", # ffmpeg Layer 的路徑(不同 Layer 可能略有不同)
"-i", local_video,
"-ss", "00:00:01", # 擷取 1 秒畫面
"-vframes", "1",
"-vf", "scale=320:-1", # 等比例縮小到寬 320px
local_cover
]
subprocess.run(cmd, check=True)
# 上傳回 S3 → 放在 covers/ 底下
cover_key = f"covers/{os.path.splitext(os.path.basename(key))[0]}.jpg"
s3.upload_file(local_cover, bucket, cover_key, ExtraArgs={"ContentType": "image/jpeg"})
print(f"✅ Cover generated: s3://{bucket}/{cover_key}")
return {
"statusCode": 200,
"body": f"Cover generated at s3://{bucket}/{cover_key}"
}
ObjectCreated:*