Editing and Sharing Home Videos with MediaGoblin

Michael Lynch

MediaGoblin으로 홈 비디오 편집 및 공유하기

목표

이 튜토리얼에서는 디지털화된 비디오 캡처본을 더 작은 클립으로 편집해 비밀번호로 보호되는 자신만의 MediaGoblin 서버에 게시하는 방법을 설명합니다. 무료 Heroku dyno를 사용하므로, 이 비공개 미디어 서버를 운영하는 데 드는 유일한 지속적인 비용은 Google Cloud Storage 스토리지 비용인 GB당 2.3센트뿐입니다.

저는 이 워크플로를 이용해 가족 홈 비디오를 편집하고 공유했으며, 비용은 월 0.77달러에 불과했습니다. 자세한 배경 이야기는 블로그 글 “My Eight-Year Quest to Digitize 45 Videotapes”를 참고하세요. 잘라내어 공유하고 싶은 서브 클립이 많이 포함된 어떤 종류의 비디오 파일에도 이 워크플로를 활용할 수 있습니다.

사전 준비 사항

  • Python 3
  • virtualenv
  • Git
  • Docker
  • ffmpeg
  • 비디오 플레이어
    • 가급적 Adobe Premiere Elements나 OpenShot처럼 편집 타임라인을 제공하는 플레이어가 좋습니다.
  • 무료 Heroku 계정
  • Google Cloud Platform 계정(결제 사용 설정됨)

데모 영상

예시로, 이 튜토리얼 전체에서 사용할 영상은 1950년대 텍사스 가족의 퍼블릭 도메인 홈 비디오입니다.

이 튜토리얼에서 편집·공유할 원본 영상으로 사용하는 퍼블릭 도메인 비디오입니다(참고로 이 비디오에는 오디오가 없습니다)

이 비디오를 다운로드하려면 아래 명령어를 실행하세요.

VIDEO_URL="https://github.com/mtlynch/free-usage-videos/blob/master/texas-farm-family-1952/TexasFar1952.mp4?raw=true"RAW_VIDEOS_DIR="${HOME}/videos-raw"RAW_VIDEO="${RAW_VIDEOS_DIR}/TexasFar1952.mp4"mkdir -p "$RAW_VIDEOS_DIR"wget "$VIDEO_URL" -O "$RAW_VIDEO"

프레임 번호 표시

비디오 파일은 일련의 프레임으로 이루어져 있습니다. 비디오 파일에서 클립의 시작과 끝을 식별하려면 재생 위치에 해당하는 프레임 번호를 알 수 있어야 합니다. 이를 위해 ffmpeg를 사용해 프레임 번호가 표시된 원본 비디오의 작업용 복사본을 만들 수 있습니다.

ANNOTATED_VIDEO=TexasFar1952-annotated.mp4ffmpeg \  -i "$RAW_VIDEO" \  -vf "drawtext=fontfile=Arial.ttf: text='%{frame_num}': start_number=1: x=(w-tw)/2: y=h-(2*lh): fontcolor=black: fontsize=20: box=1: boxcolor=white: boxborderw=5" \  -c:a copy \  "$ANNOTATED_VIDEO"

이렇게 하면 다음과 같은 복사본이 생성됩니다.

프레임 수 오버레이가 추가된 퍼블릭 도메인 비디오

카탈로그 작성

이제 테이프에 담긴 영상을 정리할 차례입니다. 영상을 하나씩 살펴보면서 개별 장면을 구분하고, 누가 등장하는지, 무슨 일이 일어나는지를 파악합니다.

평소 사용하는 비디오 플레이어를 열어 주세요. 저는 Adobe Premiere Elements가 이 작업에 가장 적합하다고 생각하지만, 무료 OpenShot 에디터를 사용해 볼 수도 있습니다. 기술적으로는 어떤 비디오 플레이어로도 가능하지만, 프레임 단위로 이동하고 타임라인을 확대·축소할 수 있는 플레이어를 선택하면 시간을 크게 절약할 수 있습니다.

다음으로 스프레드시트를 만드세요. 제 스프레드시트를 복사해 시작해도 됩니다. 아래에서 각 필드를 설명하겠습니다.

제 Google Sheets 스프레드시트 스크린샷

모든 메타데이터를 제 스프레드시트와 동일한 형식의 스프레드시트에 정리하세요.

  • tape_id: 비디오 파일의 파일명(확장자 제외)입니다.
  • tape_shortname: 이 원본 파일에서 나온 파일들을 식별하기 위해 사용할 짧은 이름입니다. tape_id와 동일하게 해도 됩니다.
  • tape_friendly_name: MediaGoblin에서 이 클립이 어느 테이프에서 왔는지 표시할 때 사용하는 이름입니다. 테이프 파일명보다 더 설명적인 이름이 있다면 여기에 입력하세요.
  • scene_start_frame: 클립이 시작되는 첫 번째 프레임 번호입니다.
    • 예시 텍사스 농장 영상에서는 처음 몇 프레임이 비어 있으므로 첫 번째 클립은 프레임 28부터 시작합니다.
  • title: 이 장면의 제목입니다. 출력 파일명과 MediaGoblin 썸네일의 제목으로 사용됩니다.
    • 영상의 특정 구간을 무시하도록 render_scenes에 지시하려면 제목을 junk로 지정하세요.
  • description: (선택 사항) 장면에서 무슨 일이 일어나는지에 대한 설명입니다. MediaGoblin의 비디오 보기 화면에서 클립 아래에 표시됩니다.
  • hashtags: description 열 뒤에는 해시 표시(#)로 시작하는 태그 열을 만들 수 있습니다. 해시태그 열에 y(또는 어떤 값이라도)가 있는 클립은 MediaGoblin에서 해당 태그가 추가됩니다.
    • 예를 들어 제 스프레드시트의 9행에는 #adam#archie 열에 y가 있습니다. publish_to_mediagoblin이 클립을 MediaGoblin에 추가할 때 adamarchie 태그를 클립에 추가합니다.
    • 이 열들의 목적은 영상에 태그를 지정하고 싶은 가족이나 반려동물이 있다면 해당 해시태그 열을 추가하고, 그들이 등장하는 각 클립의 열에 y를 입력하는 것입니다.
  • date: 클립이 녹화된 날짜입니다.
    • 다음 형식 중 하나로 입력할 수 있습니다.
      • YYYY-MM-DD
      • YYYY-MM
      • YYYY
  • other_tags: 클립에 적용하고 싶은 추가 태그를 쉼표로 구분해 추가합니다.

아래의 render_scenes를 실행하면 다음 명명 규칙에 따라 비디오가 더 짧은 클립으로 잘립니다.

  • [tape_shortname] - [clip index] - [title].mp4

예를 들면 다음과 같습니다.

  • Texas Family - 1952 - 05 - Archie in the Corn Fields.mp4

scenes YAML 파일 만들기

이제 클립 정리가 끝났으니 제 스크립트를 사용해 CSV를 YAML 파일로 변환할 수 있습니다. 이 YAML 파일은 다른 스크립트들이 비디오를 어떻게 자르고 MediaGoblin으로 가져올지를 지시하는 역할을 합니다.

git clone https://github.com/mtlynch/process-home-videos.gitcd process-home-videosmkdir -p ./venvvirtualenv --python python3 ./venv. venv/bin/activatepip install --requirement requirements.txt

다음으로 설정 파일을 만들어야 합니다. process-home-videos에 있는 config.example.yamlconfig.yaml로 복사한 뒤, 파일 안의 안내에 따라 클립에 맞게 수정하세요.

cp config.example.yaml config.yaml

이제 클립 메타데이터의 CSV 및 YAML 파일 경로를 만드세요.

MEDIAGOBLIN_METADATA="${HOME}/mediagoblin-meta"mkdir -p "$MEDIAGOBLIN_METADATA"# Path to the CSV you created.SCENES_CSV="${MEDIAGOBLIN_METADATA}/scenes.csv"# Path to output file to create.SCENES_YAML="${MEDIAGOBLIN_METADATA}/scenes.yaml"

제 스프레드시트 예제를 따라 하고 있다면 CSV로 다운로드할 수 있습니다.

CSV_URL="https://docs.google.com/spreadsheets/d/1kuamVFEYBrOI097IWBQ8sB0q37ZRACYe2o389Ag92zI/export?format=csv&id=1kuamVFEYBrOI097IWBQ8sB0q37ZRACYe2o389Ag92zI&gid=401061703"wget "$CSV_URL" -O "$SCENES_CSV"

다음 스크립트를 실행하여 CSV를 YAML 파일로 변환하세요.

app/csv_to_yaml.py \  --config config.yaml \  "$SCENES_CSV" \  > "$SCENES_YAML"

그러면 다음과 같은 YAML 파일이 생성됩니다.

$ head -n 19 "$SCENES_YAML"- description: 'Abigail and Adam stand outside with Abigail primping Adam''s coat.    Adam is 12.    Recorded between June 1, 1952 and June 30, 1952.    Came from tape "Texas Farm Family - 1952," scene #01.'  duration_frames: 457  raw_source_filename: TexasFar1952.mp4  rendered_filename: Texas Family - 1952 - 01 - Abigail Primping Adam.mp4  tags:  - abigail  - adam  - best of  timecode_start: '0:00:00.934267'  title: Abigail Primping Adam
솔직히 좀 어설픈 설계 선택이었습니다. 다른 스크립트들이 CSV를 바로 읽도록 할 수도 있었는데, 그냥 이렇게 만들었습니다.

클립 자르기

모든 메타데이터가 준비되었으니 이제 큰 비디오 파일을 여러 개의 작은 클립으로 자를 차례입니다.

# Specify the directory where the script should write out the processed clips.PROCESSED_CLIPS_DIR="${HOME}/videos-processed"mkdir -p "$RAW_VIDEOS_DIR"app/render_scenes.py \  --metadata "$SCENES_YAML" \  --raw_videos_dir "$RAW_VIDEOS_DIR" \  --output_clips_dir "$PROCESSED_CLIPS_DIR"

스크립트가 완료되면 다음과 같은 폴더가 생성됩니다.

$ ls "$PROCESSED_CLIPS_DIR"'Texas Family - 1952 - 01 - Abigail Primping Adam.mp4''Texas Family - 1952 - 02 - Abigail Standing on the Stairs.mp4''Texas Family - 1952 - 03 - Adam Plays with Cars on the Sidewalk.mp4''Texas Family - 1952 - 04 - Trudy Working at the Loom.mp4''Texas Family - 1952 - 05 - Archie in the Corn Fields.mp4''Texas Family - 1952 - 06 - Tending to the Cows, Bessie Nursing.mp4''Texas Family - 1952 - 07 - Giving Pigs Belly-Rubs.mp4''Texas Family - 1952 - 08 - Checking on the Chickens and Hens.mp4'

MediaGoblin 파일 생성

클립 처리가 끝났으니 이제 파일을 MediaGoblin에 업로드할 준비가 되었습니다. 먼저 로컬 머신의 MediaGoblin 인스턴스로 비디오와 메타데이터를 가져옵니다. 이를 통해 MediaGoblin이 파일을 클라우드에서 MediaGoblin 인스턴스를 실행할 때 재사용할 수 있는 내부 데이터베이스와 파일 구조로 변환합니다.

먼저 MediaGoblin의 설정 파일인 mediagoblin.ini에 환경 정보를 입력하세요.

참고: 호스트 머신의 경로와 MediaGoblin Docker 컨테이너 내부의 경로를 구분하기 위해 MG_ 접두사는 호스트 머신을, MGC_ 접두사는 Docker 컨테이너 내부 경로를 가리키도록 명명 규칙을 정했습니다.
MG_CONFIG=$(mktemp)wget https://mtlynch.io/digitizing-home-videos-walkthrough/mediagoblin.ini \  -O "$MG_CONFIG"# Path to MediaGoblin's home directory within the container.MGC_HOME="/var/lib/mediagoblin"MGC_DB_PATH="${MGC_HOME}/mediagoblin.db"# Update the relevant lines in the config file.sed \  --in-place \  "s@.*sql_engine = .*@sql_engine = sqlite:///${MGC_DB_PATH}@" \  "$MG_CONFIG"

이제 컨테이너를 실행하세요.

# This is a path on the host machine that will receive the files the MediaGoblin# container generates.MG_SERVING_DIR=$(mktemp --directory)# These are paths within the MediaGoblin container.MGC_INPUT_VOLUME="/opt/input-videos"MGC_APP_DIR="/srv/mediagoblin.example.org/mediagoblin"# Name for MediaGoblin Docker container.MGC_NAME=mediaglindocker run \  --tty \  --detach \  --publish 6543:6543 \  --volume "${PROCESSED_CLIPS_DIR}:${MGC_INPUT_VOLUME}" \  --volume "${MG_CONFIG}:${MGC_APP_DIR}/mediagoblin_host.ini" \  --volume "${MG_SERVING_DIR}:${MGC_HOME}" \  --name "$MGC_NAME" \  mtlynch/mediagoblin

위 명령은 호스트 머신의 여러 경로를 MediaGoblin 컨테이너에 마운트하여 호스트와 MediaGoblin 간에 파일을 공유할 수 있게 합니다.

  • PROCESSED_CLIPS_DIR은 MediaGoblin이 위에서 생성한 클립을 읽을 수 있게 합니다.
  • MG_CONFIG는 MediaGoblin이 사용할 설정 파일을 지정합니다.
  • MG_SERVING_DIR은 MediaGoblin이 로컬 파일 시스템에 배치하는 비디오 및 썸네일 파일을 받습니다.

컨테이너를 실행하면 MediaGoblin이 시작되는 데 몇 초가 걸립니다. 다음 명령으로 진행 상황을 모니터링할 수 있습니다.

docker logs "$MGC_NAME" -f

서버가 준비되면 다음과 같은 로그가 표시됩니다.

Starting server in PID 26.Serving on http://0.0.0.0:6543

http://localhost:6543에 접속하여 MediaGoblin 서버가 정상적으로 실행 중인지 확인할 수 있습니다.

참고: 원하면 사용자 이름 admin, 비밀번호 admin으로 로그인할 수 있지만 필수는 아닙니다.

다음 스크립트를 실행하여 클립과 메타데이터를 MediaGoblin으로 가져오세요.

MEDIAGOBLIN_PUBLISH_HISTORY=$(mktemp)app/publish_to_mediagoblin.py \  "$MGC_INPUT_VOLUME" \  --metadata "$SCENES_YAML" \  --publish_history "$MEDIAGOBLIN_PUBLISH_HISTORY" \  --container_name "$MGC_NAME"

스크립트가 완료되면 http://localhost:6543의 MediaGoblin 웹 인터페이스에 모든 클립이 표시됩니다.

MediaGoblin에 모든 클립이 표시된 모습

MediaGoblin 웹 인터페이스에서 8개 클립 모두의 썸네일을 확인할 수 있습니다.

비디오를 클릭해도 MediaGoblin이 현대적인 스트리밍 최적화 비디오 형식을 지원하지 않는 오래된 웹 플레이어를 사용하므로 일반 비디오 플레이어에서는 재생되지 않습니다. “Original file” 링크를 클릭하면 시청할 수 있습니다.

단일 비디오 보기 화면 스크린샷

로컬 MediaGoblin 인스턴스에서 단일 비디오를 본 모습

걱정하지 마세요. 다음 단계에서 수정하면 모든 비디오를 임베디드 플레이어에서 정상적으로 시청할 수 있게 됩니다.

로컬 컨테이너 작업은 끝났으니 제거하세요.

docker rm --force "$MGC_NAME"

Docker가 공유 폴더의 소유권을 가져갔습니다. 이제 다시 되찾을 차례입니다.

sudo chown "${USER}:${USER}" "$MG_SERVING_DIR" --recursive

해당 디렉터리를 살펴보면 다음과 같이 표시됩니다.

find "$MG_SERVING_DIR" -type f/tmp/tmp.bq7GAbNNNW/media/public/media_entries/8/Texas_Family_-_1952_-_08_-_Checking_on_the_Chickens_and_Hens.mp4/tmp/tmp.bq7GAbNNNW/media/public/media_entries/8/Texas_Family_-_1952_-_08_-_Checking_on_the_Chickens_and_Hens.thumbnail.jpg/tmp/tmp.bq7GAbNNNW/media/public/media_entries/5/Texas_Family_-_1952_-_05_-_Archie_in_the_Corn_Fields.mp4/tmp/tmp.bq7GAbNNNW/media/public/media_entries/5/Texas_Family_-_1952_-_05_-_Archie_in_the_Corn_Fields.thumbnail.jpg/tmp/tmp.bq7GAbNNNW/media/public/media_entries/1/Texas_Family_-_1952_-_01_-_Abigail_Primping_Adam.thumbnail.jpg/tmp/tmp.bq7GAbNNNW/media/public/media_entries/1/Texas_Family_-_1952_-_01_-_Abigail_Primping_Adam.mp4/tmp/tmp.bq7GAbNNNW/media/public/media_entries/4/Texas_Family_-_1952_-_04_-_Trudy_Working_at_the_Loom.thumbnail.jpg/tmp/tmp.bq7GAbNNNW/media/public/media_entries/4/Texas_Family_-_1952_-_04_-_Trudy_Working_at_the_Loom.mp4/tmp/tmp.bq7GAbNNNW/media/public/media_entries/7/Texas_Family_-_1952_-_07_-_Giving_Pigs_Belly-Rubs.mp4/tmp/tmp.bq7GAbNNNW/media/public/media_entries/7/Texas_Family_-_1952_-_07_-_Giving_Pigs_Belly-Rubs.thumbnail.jpg/tmp/tmp.bq7GAbNNNW/media/public/media_entries/6/Texas_Family_-_1952_-_06_-_Tending_to_the_Cows_Bessie_Nursing.thumbnail.jpg/tmp/tmp.bq7GAbNNNW/media/public/media_entries/6/Texas_Family_-_1952_-_06_-_Tending_to_the_Cows_Bessie_Nursing.mp4/tmp/tmp.bq7GAbNNNW/media/public/media_entries/3/Texas_Family_-_1952_-_03_-_Adam_Plays_with_Cars_on_the_Sidewalk.thumbnail.jpg/tmp/tmp.bq7GAbNNNW/media/public/media_entries/3/Texas_Family_-_1952_-_03_-_Adam_Plays_with_Cars_on_the_Sidewalk.mp4/tmp/tmp.bq7GAbNNNW/media/public/media_entries/2/Texas_Family_-_1952_-_02_-_Abigail_Standing_on_the_Stairs.mp4/tmp/tmp.bq7GAbNNNW/media/public/media_entries/2/Texas_Family_-_1952_-_02_-_Abigail_Standing_on_the_Stairs.thumbnail.jpg/tmp/tmp.bq7GAbNNNW/mediagoblin.db/tmp/tmp.bq7GAbNNNW/.cache/gstreamer-1.0/registry.x86_64.bin

Google Cloud Storage 설정

이전 단계의 목적은 MediaGoblin이 모든 클립에 대한 데이터베이스, 파일 레이아웃, 비디오 썸네일을 생성하도록 하는 것이었습니다. 이제 MediaGoblin을 클라우드 서버에 배포하여 로컬 머신뿐만 아니라 어디서든 접속할 수 있도록 할 차례입니다.

새 Google Cloud Platform 프로젝트 만들기(선택 사항)

MediaGoblin 파일을 위한 깨끗한 Google Cloud Platform 프로젝트를 원한다면 아래 명령어로 새로 만들 수 있습니다. 기존 프로젝트를 사용하려면 GCP_PROJECT_ID를 사용하려는 프로젝트 ID로 설정하고 이 섹션을 건너뛰세요.

GCP_PROJECT_NAME="mediagoblin"RANDOM_SUFFIX=$(head /dev/urandom | tr -dc 'a-z0-9' | head -c 16 ; echo '')GCP_PROJECT_ID="${GCP_PROJECT_NAME}-${RANDOM_SUFFIX}"gcloud projects create \  "$GCP_PROJECT_ID" \  --name "$GCP_PROJECT_NAME" \  --set-as-default

새 프로젝트를 결제 계정에 연결해야 합니다. 결제 계정 목록을 보려면 다음 명령을 실행하세요.

gcloud beta billing accounts list

그런 다음 BILLING_ACCOUNT를 이 스토리지 버킷에 청구할 계정으로 바꾸세요.

BILLING_ACCOUNT="0X0X0X-0X0X0X-0X0X0X" # Replace with account from the listgcloud beta billing projects link \  "$GCP_PROJECT_ID" \  --billing-account "$BILLING_ACCOUNT"

스토리지 버킷 만들기

다음으로 파일을 위한 Google Cloud Storage 버킷을 만드세요. 저는 모든 객체를 공개로 설정한 버킷을 만들었지만, 무작위 버킷 이름을 추측하기 어렵다는 점에 의존하고 있습니다.

24자 무작위 접미사는 3624 = 2.24 x 1037가지 경우의 수를 의미합니다. 즉, 공격자가 여러분의 버킷을 찾기까지 약 1037개의 버킷 이름을 추측해야 합니다. 이는 128비트 개인 키를 추측하는 것과 비슷한 수준입니다.
RANDOM_SUFFIX=$(head /dev/urandom | tr -dc 'a-z0-9' | head -c 24 ; echo '')BUCKET_NAME="mediagoblin-${RANDOM_SUFFIX}"# All the videos need to be public for users to access them directly from the# browser, but we're adding enough entropy to the bucket name to make it# infeasible for unauthorized users to access the files by guessing or# enumerating URLs.UNIFORM_ACCESS="on"# Bucket storage properties. You can adjust these depending on your preferences.STORAGE_CLASS="Standard"BUCKET_LOCATION="US-EAST1"# Create the GCS bucket.gsutil mb \  -p "$GCP_PROJECT_ID" \  -c "$STORAGE_CLASS" \  -l "$BUCKET_LOCATION" \  -b "$UNIFORM_ACCESS" \  "gs://${BUCKET_NAME}/"# Set uniform access policy for the bucket.# We use legacyObjectReader because it grants read access to individual files but# prevents clients from exploring the bucket's contents.gsutil iam ch allUsers:roles/storage.legacyObjectReader "gs://${BUCKET_NAME}"

파일을 Google Cloud Storage로 복사하기

MediaGoblin 컨테이너가 생성한 MG_SERVING_DIR 디렉터리의 파일들 기억하시나요? 방금 생성한 Google Cloud Storage 버킷으로 옮기세요.

gsutil -m cp -r "${MG_SERVING_DIR}/media/public/*" "gs://${BUCKET_NAME}/"RANDOM_FOLDER=$(head /dev/urandom | tr -dc 'a-zA-Z0-9' | head -c 16 ; echo '')gsutil cp "${MG_SERVING_DIR}/mediagoblin.db" "gs://${BUCKET_NAME}/${RANDOM_FOLDER}/"# Save the public URL of the mediagoblin.db file.MEDIAGOBLIN_DB_URL="https://storage.googleapis.com/${BUCKET_NAME}/${RANDOM_FOLDER}/mediagoblin.db"
참고: mediagoblin.db의 위치에 무작위성을 한 겹 더 추가했습니다. 그렇지 않으면 버킷 이름을 아는 누구든 데이터베이스 파일을 찾을 수 있기 때문입니다. 이렇게 엔트로피를 추가하면 전체 컬렉션을 노출하지 않고도 개별 비디오를 공유할 수 있습니다.

Heroku에 배포하기

이제 미디어 파일이 Google Cloud Storage의 인터넷 접근 가능한 위치에 있으니 남은 일은 MediaGoblin 서버를 배포하는 것뿐입니다. Heroku는 Docker 컨테이너에 대해 넉넉한 무료 티어를 제공하고 설정이 쉽기 때문에 저는 Heroku를 사용합니다.

이 머신에서 아직 Heroku CLI 인증을 하지 않았다면 Heroku 자격 증명으로 로그인하세요.

heroku login --interactive

다음으로 Heroku 컨테이너 레지스트리에 인증하고 새 Heroku 앱을 만드세요. 기본적으로 생성된 앱은 무료 Heroku dyno가 됩니다.

heroku container:loginRANDOM_SUFFIX=$(head /dev/urandom | tr -dc 'a-z0-9' | head -c 10 ; echo '')HEROKU_APP_NAME="mediagoblin-${RANDOM_SUFFIX}"heroku apps:create "$HEROKU_APP_NAME"

마지막 단계는 인증 설정과 제목으로 Docker 빌드를 커스터마이즈한 뒤 Heroku에 푸시하여 서빙하는 것입니다.

pushd $(mktemp -d)REPO="https://github.com/mtlynch/mediagoblin-docker.git"# This is a special branch I created that adds authentication and adds a few# other features.TARGET_BRANCH="mtlynch-custom"git clone --single-branch --branch "$TARGET_BRANCH" "$REPO" .HTTP_AUTH_USER="mediagoblin" # change this to a username you chooseHTTP_AUTH_PASS="goblinmedia" # change this to a password you choose# Title you want for your MediaGoblin server.HTML_TITLE="My Demo MediaGoblin Server"heroku container:push web \    --app "$HEROKU_APP_NAME" \    --arg "HTTP_AUTH_USER=${HTTP_AUTH_USER},HTTP_AUTH_PASS=${HTTP_AUTH_PASS},GCS_BUCKET=${BUCKET_NAME},MEDIAGOBLIN_DB_URL=${MEDIAGOBLIN_DB_URL},HTML_TITLE=${HTML_TITLE}"heroku container:release --app "$HEROKU_APP_NAME" web && \  printf "Your app is live at https://${HEROKU_APP_NAME}.herokuapp.com/\n"

모든 과정이 잘 진행되었다면 다음과 같이 새 MediaGoblin 인스턴스의 URL이 표시됩니다.

Your app is live at https://mediagoblin-v5lmqis51k.herokuapp.com/
참고: Heroku 무료 티어를 사용하므로 Heroku는 브라우저에서 요청할 때 MediaGoblin 인스턴스를 온디맨드로 실행합니다. 따라서 첫 페이지 로드에는 30~60초가 걸리고 HTTP 502 Gateway Timeout 오류가 표시될 수도 있습니다. 이는 정상입니다. 앱 구동이 시작되면 몇 시간 동안 유휴 상태로 두기 전까지는 빠르고 반응성이 좋습니다.

보너스: 개별 비디오 공유하기

가족 비디오를 저장하기 위해 이 과정을 사용한다면 아마 가족이 모든 비디오를 탐색하고 접근할 수 있기를 바라겠지만, 때로는 전체 컬렉션에 대한 접근 권한을 주지 않고 개별 비디오만 다른 사람과 공유하고 싶을 때도 있을 것입니다.

그렇게 하려면 MediaGoblin 인터페이스에서 “Original file” 링크를 클릭하세요.

'Original file' 링크를 가리키는 스크린샷

이렇게 하면 게스트는 해당 개별 파일에만 접근할 수 있지만, Google Cloud Storage 버킷 권한을 설정한 방식 덕분에 라이브러리를 탐색하거나 다른 비디오에 접근할 수는 없습니다.

“original file” 링크를 클릭하면 다음과 같은 URL이 생성됩니다.

  • https://storage.googleapis.com/mediagoblin-39dpduhfz1wstbprmyk5ak29/media_entries/4/Texas_Family_-_1952_-_04_-_Trudy_Working_at_the_Loom.mp4

보시다시피 위 URL로는 해당 단일 비디오만 시청할 수 있으며, 버킷을 탐색해 다른 비디오를 찾는 것은 불가능합니다.


소스 코드

저장소설명
MediaGoblinMediaGoblin 코어 저장소 미러 + Circle CI 구성.

브랜치 mtlynch-custom에는 내 인스턴스를 위한 커스텀 수정 사항이 포함되어 있습니다(오래된 비디오 플레이어를 교체하고 필요 없는 UI 일부를 정리했습니다).
mediagoblin-dockerMediaGoblin용 Docker 이미지를 빌드합니다.

브랜치 mtlynch-custom은 Google Cloud Storage 버킷을 가리키도록 하고 HTTP Basic Authentication을 추가하는 등의 내 커스터마이즈를 포함하여 빌드합니다.
process-home-videos원본 비디오 파일을 클립으로 자른 뒤 해당 클립을 MediaGoblin에 게시하는 Python 스크립트입니다.

원문은 Michael Lynch님이 에 게재했습니다.

이 글은 muse-spark-1.2-contributor 모델을 사용해 번역했습니다.