사용자 도구

사이트 도구


project:youtubeupload

유튜브에 동영상 일괄 업로드하기

개요

얼마전 휴대전화에 저장된 동영상들을 유튜브에 올려두고 싶었습니다. 그런데 파일이 꽤 있어서 일일이 클릭해서 올리기 힘들고 귀찮았습니다. 분명히 구글의 API를 이용해 배치 작업을 할 수 있도록 만든 무언가가 있을 것 같더군요.

아니나다를까, 누군가 'youtube-upload'라는 파이썬 기반의 프로그램을 제공하고 있었습니다. 이를 이용하면 명령줄 기반으로 간단하게 유튜브에 동영상을 업로드 할 수 있겠더군요. 이번에는 이 스크립트를 기반으로 사용자의 하드디스크에 있는 유튜브 동영상을 일괄 업로드 하는 법을 기록해 보겠습니다.

필요한 것들

파이썬 2.7이 필요합니다. 약간의 파이썬에 관한 지식이 필요합니다. 그리고 쉘 스크립트에 대한 약간의 상식만 있으면 됩니다.

작업 방법

설명하기 편하게 작업한 내역을 각색할 수 있지만, 일단 설명의 편의를 위해 제가 작업한 내역 그대로 적도록 하겠습니다. 적용할 때는 각각의 환경에 맞게 조금씩 다르게 적용하면 됩니다.

일단 사용자가 작업하는 시스템은 두 개입니다.

  1. 데스크탑 PC
    원래 동영상은 이곳에 저장되어 있습니다. 성능이 좋지만 업로드만을 위해 계속 켜놓기 아깝습니다. 윈도우 PC라고 가정합니다.

  2. 홈서버 PC
    저전력으로 돌아가는 서버입니다. 성능이 나쁘지만, 전력 소모가 나쁘지 않으므로 장시간 업로드에는 데스크탑 PC보다는 좀 더 유리합니다. 리눅스(여기서는 gentoo)가 설치되었다고 가정합니다.

위 두 개의 시스템으로 이렇게 작업을 진행할 것입니다.

  1. 촬영 날짜, 파일 목록 가져오기
  2. 동영상 정보 작성
  3. 데스크탑 PC의 동영상을 홈서버로 복사
  4. 홈서버에 스크립트 설치
  5. 스크립트 실행
  6. 로그 분석

진행 순서

동영상의 촬영 날짜와 파일 목록 가져오기

촬영 일자는 상당히 중요한 정보이므로, 무엇보다 영상의 촬영 날짜를 일목요연하게 가져오는 것이 중요하다고 판단했습니다. 그런데 사진의 EXIF 정보와는 달리 윈도우 탐색기에서 보이지 않더군요. 전 Mediainfo를 이용해 폴더의 모든 동영상의 메타데이타를 CSV로 가져와 엑셀에서 촬영 날짜만 추출해 내었습니다. 어떤 기기로 동영상을 촬영하였는지에 따라 메타데이터가 달라질 수 있고, 엑셀에 대해 지나치게 설명이 집중되므로 이 과정을 자세하게 설명하는 것은 생략하도록 하겠습니다.

파일 목록을 가져오는 것은 윈도우 기준으로 볼 때 명령 프롬프트의 한 줄이면 됩니다.

  1. 'cd' 명령으로 일일이 폴더를 옮기기는 힘드니, 일단 탐색기를 통해 동영상이 있는 폴더로 이동합니다.
  2. 적당히 빈 곳을 클릭해, 폴더의 어떤 파일도 선택하지 않은 상태로 만듭니다.
  3. Shift 키를 누른 상태에서 마우스 우측 버튼을 눌러 컨텍스트 메뉴를 엽니다. 그러면 '여기서 명령 창 열기' 메뉴가 보입니다.
    1. 단 윈도우 비스타, 7 이상인 경우 '라이브러리'로 접근한 폴더라면 이 메뉴가 보이지 않습니다. 각 디스크 최상위 경로부터 클릭해 들어가야 합니다.
    2. 윈도우 8는 탐색기 메뉴에 명령창 열기가 기본으로 포함되어 있습니다.
  4. 명령 프롬프트에서 다음 한 줄을 실행하면 됩니다.
    dir /b > file_list.txt

    만일 하위 폴더까지 같이 출력하고자 한다면 '/s' 스위치를 덧붙이면 됩니다.

    dir /b /s > file_list.txt

이렇게 하면 한 줄에 하나씩 파일명이 file_list.txt 라는 파일에 기록됩니다. file_list.txt 파일을 열어서 동영상 파일의 내역을 확인합니다. 아, 이 파일 안에는 file_list.txt 파일 자체도 포함되어 있으니 그 줄은 지워 주면 됩니다. 또한 텍스트 편집기의 기능을 이용해 절대 경로를 수정해야 서버에서 작업하기 용이합니다.

동영상의 정보 작성

일괄 업로드라고 해서 정말 동영상만 올리면 허전합니다. 동영상 제목, 설명, 그리고 태그 등도 같이 올릴 때 작성되는 편이 훨씬 좋습니다. 이 부분만큼은 자동화가 어렵겠네요. 동영상을 일일이 보면서 적고 싶은 내용들을 적어야 합니다. :-( 하지만 최대한 힘을 덜 들인 상태에서 집약적으로, 빠른 시간 내에 처리하고 싶습니다.

그러므로 저는 아래 그림과 같이 엑셀을 열어 테이블에 기록하고자 하는 바를 한눈에 보이도록 테이블로 작성했습니다. 스크린을 수직으로 분할해 한편에는 엑셀 창을, 다른 한편에는 탐색기 창을 배치했습니다. 그리고 탐색기 창은 파일을 큰 아이콘으로 보도록 하여 동영상의 섬네일 스냅샷이 보이도록 했습니다. 최대한 스냅샷만 보고 기억나는 동영상들은 굳이 열어 보지 않고도 작업할 수 있으니까요.

테이블의 각 열은 아래 순서대로 정했습니다.

  • 파일명: 각 동영상의 경로를 적었습니다. 현재는 로컬 PC에서 작업 중이지만, 서버에서 실행될 것이므로 경로명에 유념하셔야 합니다.
  • 카테고리: 유튜브의 카테고리입니다. 차후 설명드리겠습니다.
  • 제목: 각 동영상의 제목입니다. 자동 채우기 기능을 이용하면 '아무개 #1', '아무개 #2' 식으로 제목을 일괄적으로 짓는 것이 가능합니다.
  • 설명: 각 동영상의 설명입니다. 동영상에 대한 설명을 정성스럽게 적어도 되지만 이것도 제목처럼 아예 공란으로 두기는 싫은 경우 일괄적으로 복사해서 채워 넣으면 됩니다.
  • 키워드: 태그입니다. 콤마로 구분하면 됩니다.
  • 개인: 동영상을 외부에 공개하고 싶지 않을 때 사용합니다. '개인'으로 설정하면 허락된 사람만 볼 수 있도록 할 수 있습니다. 이와 비슷한 기능으로 '목록에 없음'이 있는데 이는 업로드한 사람이 따로 링크를 주지 않는 이상 공개되지 않도록 하는 옵션입니다. 전 일단 '개인'으로만 작업했습니다.
  • 동영상 링크: 이것은 현재 기록하는 내용이 아닙니다. 동영상을 업로드하면 유튜브가 업로드된 동영상이 어디에 있는지 주소를 알려주는데, 이를 기록하기 위한 필드입니다.

이렇게 테이블을 다 완성하면 CSV로 저장합니다.

동영상 복사

데스크탑의 동영상을 장시간 업로드하려면 파일을 복사해두는 편이 좋습니다. 작업은 서버에게 맡겨두고 데스크탑은 꺼두는 게 좋겠죠. 이것은 문서를 참조하시는 분들의 환경에 맞게 적절히 조절하세요. 삼바를 이용해도 되고, FTP를 이용해도 되고, 뭐 직접 USB로 복사해도 8-o 됩니다. 어떤 식으로든, 업로드하고자 하는 동영상들을 준비했다고 가정하겠습니다. 그리고 만약 서버 PC를 운영하지 않는다면 그냥 데스크탑에서 계속 작업을 하셔야 하겠죠 ;-)

홈서버에 스크립트 설치

파이썬 2.7이 정상 동작한다고 가정합니다. 구글 코드에 있는 youtube-upload에 접속하여 파일을 다운로드 받아 설치합니다. youtube-upload는 python-gdata를 필요로 하므로 우선 python-gdata를 설치해야 합니다. 윈도우라면 위 링크를 통해 다운로드 받으시면 되고, 리눅스라면 패키지가 제공될 수 있으므로 저장소를 확인해 보세요. 이 부분은 독자에게 맡깁니다.

  • Gentoo
    # emerge dev-python/gdata
  • Ubuntu, Debian
    # apt-get install python-gdata
  • Fedora
    # rpm -ivh python-gdata

다운로드 받은 youtube-upload는 압축을 풀어 폴더로 접근한 다음

# python setup.py install

로 설치하면 됩니다.

설치가 되었으면 youtube-upload를 실행해 보세요.

$ youtube-upload --help
Usage: youtube-upload [OPTIONS] VIDEO_PATH ...
 
    Upload videos to youtube.
 
Options:
  --version             show program's version number and exit
  -h, --help            show this help message and exit
  -m EMAIL, --email=EMAIL
                        Authentication email or Youtube username
  -p PASSWORD, --password=PASSWORD
                        Authentication password
  -t TITLE, --title=TITLE
                        Video(s) title
  -c CATEGORY, --category=CATEGORY
                        Video(s) category
  --get-categories      Show video categories
  --create-playlist=TITLE|DESCRIPTION|PRIVATE (0=no, 1=yes)
                        Create new playlist and add uploaded video(s) to it
  -d DESCRIPTION, --description=DESCRIPTION
                        Video(s) description
  --keywords=KEYWORDS   Video(s) keywords (separated by commas: tag1,tag2,...)
  --title-template=STRING
                        Title template to use on multiple videos (default:
                        $title [$n/$total])
  --private             Set uploaded video(s) as private
  --unlisted            Set uploaded video(s) as unlisted
  --location=LAT,LON    Video(s) location (lat, lon). example: "43.3,5.42"
  --update-metadata     Update video metadata (title/description)
  --api-upload          Use the API upload instead of pycurl
  --get-upload-form-info
                        Don't upload, get the form info (PATH, TOKEN, URL)
  --add-to-playlist=URI
                        Add video(s) to an existing playlist
  --delete-from-playlist=URI
                        Delete video(s) from an existing playlist
  --wait-processing     Wait until the video(s) has been processed
  --captcha-token=STRING
                        Captcha token
  --captcha-response=STRING
                        Captcha response

스크립트 실행

파이썬에서 직접 명령을 실행할 수도 있지만, 파이썬은 우리가 만든 CSV 테이블을 BASH 쉘 스크립트를 만들어내는 역할만 하도록 하겠습니다. 윈도우로 따지자면 패치 파일인 .bat 파일을 만들어 내는 것이겠죠. 이 편이 훨씬 프로그램하기도 단순하고, 혹여 프로그래밍 중 발생하는 실수에 대처하기도 편리합니다. 물론 파이썬이 아닌 펄, 자바, 쉘 스크립트 등 타 언어로 이 부분을 대치해도 관계없습니다.

서버는 UTF-8을, 데스크탑은 CP949를 쓴다고 가정합니다. CSV 파일 또한 CP949로 작성되었다고 가정합니다.

batch_upload.py
# -*- coding: utf-8 -*-
#!/usr/bin/python
 
import csv
import sys
 
def cp949_to_uni(_in):
    return _in.decode('cp949', 'ignore')
 
def print_script(entries):
    EMAIL = u'유튜브 계정'
    PASS  = u'유튜브 비밀번호'
 
    print '#!/bin/bash'
 
    for entry in entries:
        command =  u'youtube-upload '
        command += u'--email=\"'       + EMAIL                + '\" '
        command += u'--password=\"'    + PASS                 + '\" '
        command += u'--category=\"'    + entry['category']    + '\" '
        command += u'--title=\"'       + entry['title']       + '\" '
        command += u'--description=\"' + entry['description'] + '\" '
        command += u'--keywords=\"'    + entry['keywords']    + '\" '
 
        if entry['private'] == u'TRUE':
            command += u'--private '
 
        command += entry['filename']
        print command.encode('utf-8')
 
def main(argv):
    if len(argv) != 2:
        print "Please specify your csv file."
        return 1
 
    entries = []
 
    with open(argv[1], 'rb') as csvfile:
        reader = csv.reader(csvfile, delimiter=',', quotechar='\"')
        for filename, category, title, description, keywords, is_private in reader:
            entries.append(
                    {
                        'filename':    cp949_to_uni(filename),
                        'category':    cp949_to_uni(category),
                        'title':       cp949_to_uni(title),
                        'description': cp949_to_uni(description),
                        'keywords':    cp949_to_uni(keywords),
                        'private':     cp949_to_uni(is_private)
                    }
            )
 
    print_script(entries)
    return 0
 
if __name__ == '__main__':
    sys.exit(main(sys.argv))

스크립트를 실행하면 CSV 파일을 기반으로 BASH 쉘 스크립트를 만들어 냅니다. 쉘 스크립트가 올바로 동작하는지 확인해 보세요. 만일 윈도우의 .bat 파일이 필요하시다면 “print '#!/bin/bash'” 부분만 주석 처리한 후, bat 파일로 리다이렉션 하면 됩니다.

python batch_upload.py csv파일 > upload.sh   # 리눅스
python batch_upload.py csv파일 > upload.bat  # 윈도우

이렇게 만들어낸 sh(bat) 파일을 쉘에서 실행시키면 업로드가 일괄적으로 진행되겠지요. 일단 쉘 스크립트 파일(sh) 첫번째 줄을 따로 복사해 그것 하나만 올바로 동작하는지 확해 보았습니다. 프로그램이 생성한 스크립트이므로 첫번째 것만 무사히 진행되면 나머지 작업도 별다른 문제가 없는 한 순조롭게 될 것입니다. 여러 파일에 대해 일괄적인, 그리고 장시간의 작업을 수행하는 것이므로 꼼꼼하게 테스트하는 것이 중요합니다. 미리 처리한 줄은 맨 앞에 '#' 기호를 붙여 주석하는 것을 잊지 마세요. (bat 파일의 경우 'REM' 명령을 사용합니다.)

한편 서버에 장시간 업로드를 할 경우, 로그아웃을 하더라도 작업이 진행되어야 합니다. 그럴 때는 nohup 명령을 이용합니다.

$nohup upload.sh > youtube_upload_status.txt

이렇게 하면 로그아웃을 하더라도 작업이 끝까지 진행됩니다.

로그 분석

nohup에 의해 youtube-upload 명령어가 출력하는 메시지가 youtube_upload_status.txt에 저장되었습니다. 여기서 업로드된 파일이 어떤 URL로 지정되었는지 파악해서 아까의 CSV (혹은 XLS, XLSX) 파일에 다시 기록해둡니다. 파이썬을, 혹은 프로그래밍에 익숙하신 분이라면 여기서 '로그 파일 파싱?'을 생각할지 모릅니다만, 골치아프게 이것까지 프로그래밍을 할 필요는 없는 것 같습니다. 그냥 적당히 텍스트 편집기를 열여 찾기-바꾸기를 이용해 필요한 부분만 걷어내는 방식으로 해도 무방할 듯합니다.

project/youtubeupload.txt · 마지막으로 수정됨: 2014/10/09 21:24 저자 127.0.0.1

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki