MediaGoblin으로 홈 비디오 편집하고 공유하기
원문은 Michael Lynch님이 에 게재했습니다. 이 블로그 구독하기
목표
이 튜토리얼에서는 디지털화된 비디오 파일을 더 작은 클립으로 편집해 직접 운영하는 비밀번호 보호 MediaGoblin 서버에 게시하는 방법을 설명합니다. 무료 Heroku dyno를 사용하므로, 이 비공개 미디어 서버를 운영하는 데 드는 지속적인 비용은 GB당 2.3센트인 Google Cloud Storage 저장 비용뿐입니다.
저는 이 워크플로를 이용해 가족 홈 비디오를 편집하고 공유했으며, 비용은 한 달에 단 0.77달러였습니다. 자세한 배경 이야기는 블로그 글 “My Eight-Year Quest to Digitize 45 Videotapes”에서 확인할 수 있습니다. 이 워크플로는 잘라내어 공유하고 싶은 서브 클립이 많이 포함된 모든 종류의 비디오 파일에 활용할 수 있습니다.
사전 준비물
- Python 3
- virtualenv
- Git
- Docker
- ffmpeg
- 비디오 플레이어
- 이상적으로는 Adobe Premiere Elements나 OpenShot 같은 편집 타임라인이 있는 플레이어입니다.
- 무료 Heroku 계정
- 그리고 Heroku CLI
- Google Cloud Platform 계정(결제 활성화 필요)
- 그리고 Google Cloud SDK
데모 영상
예시로, 이 튜토리얼 전반에서 사용하는 영상은 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 editor를 써도 됩니다. 기술적으로는 어떤 플레이어든 사용할 수 있지만, 프레임 단위로 이동하고 타임라인을 확대할 수 있는 플레이어를 선택하면 시간을 절약할 수 있습니다.
다음으로 스프레드시트를 만드세요. 제 스프레드시트에서 시작해도 됩니다. 아래에서 각 필드를 설명하겠습니다:

모든 메타데이터를 제 스프레드시트와 동일한 형식의 스프레드시트에 정리하세요.
tape_id: 비디오 파일의 파일명(확장자 제외)입니다.tape_shortname: 이 원본 파일에서 나온 파일들을 식별하기 위해 사용할 짧은 이름입니다.tape_id와 동일해도 됩니다.tape_friendly_name: MediaGoblin에서 이 클립이 어떤 테이프에서 왔는지 표시할 때 이 필드를 사용합니다. 파일명보다 더 설명적인 이름이 있다면 여기에 입력하세요.scene_start_frame: 클립이 시작되는 첫 프레임의 번호입니다.- 예시인 Texas Farm 영상에서는 앞부분 몇 프레임이 빈 화면이므로 첫 클립은 28번 프레임에서 시작합니다.
title: 이 장면의 제목입니다. 출력 파일명과 MediaGoblin 썸네일에 사용되는 제목이 됩니다.render_scenes가 특정 구간을 무시하도록 하려면 제목을junk로 지정하세요.
description: (선택 사항) 장면에서 일어나는 일에 대한 설명입니다. MediaGoblin의 비디오 시청 화면에서 클립 아래에 표시됩니다.- hashtags:
description열 뒤에 해시(#)로 시작하는 태그를 만들 수 있습니다. 해시태그 열에y(또는 아무 값이라도)가 있는 클립은 MediaGoblin에서 해당 태그가 추가됩니다.- 예를 들어 제 스프레드시트의 9번째 행은
#adam과#archie열에y가 있습니다.publish_to_mediagoblin이 클립을 MediaGoblin에 추가할 때adam과archie태그를 클립에 추가합니다. - 가족 구성원이나 반려동물을 비디오에 태그하고 싶다면 해시태그로 열을 추가하고 해당 클립에 등장할 때마다 이 열에
y를 입력하면 됩니다.
- 예를 들어 제 스프레드시트의 9번째 행은
date: 클립이 녹화된 날짜입니다.- 다음 형식 중 하나로 입력할 수 있습니다:
YYYY-MM-DDYYYY-MMYYYY
- 다음 형식 중 하나로 입력할 수 있습니다:
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.yaml을 config.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클립 자르기
이제 모든 메타데이터가 준비되었으니, 큰 비디오 파일을 여러 개의 작은 클립으로 자를 차례입니다:
# 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에 환경 정보를 입력하세요.
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:6543http://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 웹 인터페이스에 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.binGoogle 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 버킷을 만드세요. 저는 모든 객체를 공개로 설정한 버킷을 만들었지만, 무작위 버킷 이름을 추측하기 어렵다는 점에 의존하고 있습니다.
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/보너스: 개별 비디오 공유하기
이 과정을 가족 비디오를 저장하는 데 사용한다면, 아마 가족 모두가 모든 비디오를 탐색하고 접근할 수 있기를 원하겠지만, 때로는 전체 컬렉션에 대한 접근 권한을 주지 않고 개별 비디오만 다른 사람과 공유하고 싶을 때가 있습니다.
그렇게 하려면 MediaGoblin 인터페이스에서 “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로는 해당 비디오 하나만 시청할 수 있을 뿐, 버킷을 탐색해 다른 비디오를 찾는 것은 불가능합니다.
소스 코드
| 저장소 | 설명 |
|---|---|
| MediaGoblin | MediaGoblin 핵심 저장소의 미러 + Circle CI 설정. mtlynch-custom 브랜치에는 제 인스턴스를 위한 커스텀 수정 사항이 포함되어 있습니다(오래된 비디오 플레이어를 교체하고 필요 없는 UI 일부를 정리했습니다). |
| mediagoblin-docker | MediaGoblin용 Docker 이미지를 빌드합니다. mtlynch-custom 브랜치는 Google Cloud Storage 버킷을 가리키고 HTTP Basic Authentication을 추가하는 등의 커스터마이징을 포함해 빌드됩니다. |
| process-home-videos | 원본 비디오 파일을 클립으로 자르고 해당 클립을 MediaGoblin에 게시하기 위한 Python 스크립트입니다. |
글을 무작위로 읽기


댓글
로그인하고 댓글 남기기