사용자 도구

사이트 도구


project:youtubeupload

차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

양쪽 이전 판이전 판
다음 판
이전 판
project:youtubeupload [2013/03/25 16:44] – [동영상 복사] changwooproject:youtubeupload [2014/10/09 21:24] (현재) – 바깥 편집 127.0.0.1
줄 4: 줄 4:
 얼마전 휴대전화에 저장된 동영상들을 유튜브에 올려두고 싶었습니다. 그런데 파일이 꽤 있어서 일일이 클릭해서 올리기 힘들고 귀찮았습니다. 분명히 구글의 API를 이용해 배치 작업을 할 수 있도록 만든 무언가가 있을 것 같더군요. 얼마전 휴대전화에 저장된 동영상들을 유튜브에 올려두고 싶었습니다. 그런데 파일이 꽤 있어서 일일이 클릭해서 올리기 힘들고 귀찮았습니다. 분명히 구글의 API를 이용해 배치 작업을 할 수 있도록 만든 무언가가 있을 것 같더군요.
  
-아니나다를까, 누군가 'youtube-upload'라는 파이썬 기반의 프로그램을 제공하고 있었습니다. 이를 이용하면 명령줄 기반으로 간단하게 유튜브에 동영상을 업로드 할 수 있겠더군요. 이번에는 이 스크립트를 기반으로 사용자의 하드디스크에 있는 유튜브 동영상을 일괄 업로드 하는 법을 기록해 보겠습니다.+아니나다를까, 누군가 '[[http://code.google.com/p/youtube-upload/|youtube-upload]]'라는 파이썬 기반의 프로그램을 제공하고 있었습니다. 이를 이용하면 명령줄 기반으로 간단하게 유튜브에 동영상을 업로드 할 수 있겠더군요. 이번에는 이 스크립트를 기반으로 사용자의 하드디스크에 있는 유튜브 동영상을 일괄 업로드 하는 법을 기록해 보겠습니다.
  
 ===== 필요한 것들 ===== ===== 필요한 것들 =====
줄 19: 줄 19:
   - 촬영 날짜, 파일 목록 가져오기   - 촬영 날짜, 파일 목록 가져오기
   - 동영상 정보 작성   - 동영상 정보 작성
-  - 데스크탑 PC의 동영상을 홈서버로 이동+  - 데스크탑 PC의 동영상을 홈서버로 복사
   - 홈서버에 스크립트 설치   - 홈서버에 스크립트 설치
   - 스크립트 실행   - 스크립트 실행
줄 62: 줄 62:
 데스크탑의 동영상을 장시간 업로드하려면 파일을 복사해두는 편이 좋습니다. 작업은 서버에게 맡겨두고 데스크탑은 꺼두는 게 좋겠죠. 이것은 문서를 참조하시는 분들의 환경에 맞게 적절히 조절하세요. 삼바를 이용해도 되고, FTP를 이용해도 되고, 뭐 직접 USB로 복사해도 8-o 됩니다. 어떤 식으로든, 업로드하고자 하는 동영상들을 준비했다고 가정하겠습니다. 그리고 만약 서버 PC를 운영하지 않는다면 그냥 데스크탑에서 계속 작업을 하셔야 하겠죠 ;-) 데스크탑의 동영상을 장시간 업로드하려면 파일을 복사해두는 편이 좋습니다. 작업은 서버에게 맡겨두고 데스크탑은 꺼두는 게 좋겠죠. 이것은 문서를 참조하시는 분들의 환경에 맞게 적절히 조절하세요. 삼바를 이용해도 되고, FTP를 이용해도 되고, 뭐 직접 USB로 복사해도 8-o 됩니다. 어떤 식으로든, 업로드하고자 하는 동영상들을 준비했다고 가정하겠습니다. 그리고 만약 서버 PC를 운영하지 않는다면 그냥 데스크탑에서 계속 작업을 하셔야 하겠죠 ;-)
  
 +==== 홈서버에 스크립트 설치 ====
 +파이썬 2.7이 정상 동작한다고 가정합니다. 구글 코드에 있는 [[http://code.google.com/p/youtube-upload/|youtube-upload]]에 접속하여 파일을 다운로드 받아 설치합니다. youtube-upload는 [[http://code.google.com/p/gdata-python-client/|python-gdata]]를 필요로 하므로 우선 python-gdata를 설치해야 합니다. 윈도우라면 위 링크를 통해 다운로드 받으시면 되고, 리눅스라면 패키지가 제공될 수 있으므로 저장소를 확인해 보세요. 이 부분은 독자에게 맡깁니다.
  
 +  * Gentoo <code bash># emerge dev-python/gdata</code>
 +  * Ubuntu, Debian <code bash># apt-get install python-gdata</code>
 +  * Fedora <code bash># rpm -ivh python-gdata</code>
  
 +다운로드 받은 youtube-upload는 압축을 풀어 폴더로 접근한 다음 <code bash># python setup.py install</code>로 설치하면 됩니다.
 +
 +설치가 되었으면 youtube-upload를 실행해 보세요.
 +<code bash>
 +$ 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
 +</code>
 +
 +
 +==== 스크립트 실행 ====
 +파이썬에서 직접 명령을 실행할 수도 있지만, 파이썬은 우리가 만든 CSV 테이블을 BASH 쉘 스크립트를 만들어내는 역할만 하도록 하겠습니다. 윈도우로 따지자면 패치 파일인 .bat 파일을 만들어 내는 것이겠죠. 이 편이 훨씬 프로그램하기도 단순하고, 혹여 프로그래밍 중 발생하는 실수에 대처하기도 편리합니다. 물론 파이썬이 아닌 펄, 자바, 쉘 스크립트 등 타 언어로 이 부분을 대치해도 관계없습니다.
 +
 +서버는 UTF-8을, 데스크탑은 CP949를 쓴다고 가정합니다. CSV 파일 또한 CP949로 작성되었다고 가정합니다.
 +
 +<code python 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))
 +</code>
 +
 +스크립트를 실행하면 CSV 파일을 기반으로 BASH 쉘 스크립트를 만들어 냅니다. 쉘 스크립트가 올바로 동작하는지 확인해 보세요. 
 +만일 윈도우의 .bat 파일이 필요하시다면 "print '#!/bin/bash'" 부분만 주석 처리한 후, bat 파일로 리다이렉션 하면 됩니다.
 +
 +<code bash>
 +python batch_upload.py csv파일 > upload.sh   # 리눅스
 +</code>
 +<code dos>
 +python batch_upload.py csv파일 > upload.bat  # 윈도우
 +</code>
 +
 +이렇게 만들어낸 sh(bat) 파일을 쉘에서 실행시키면 업로드가 일괄적으로 진행되겠지요. 일단 쉘 스크립트 파일(sh) 첫번째 줄을 따로 복사해 그것 하나만 올바로 동작하는지 확해 보았습니다. 프로그램이 생성한 스크립트이므로 첫번째 것만 무사히 진행되면 나머지 작업도 별다른 문제가 없는 한 순조롭게 될 것입니다. 여러 파일에 대해 일괄적인, 그리고 장시간의 작업을 수행하는 것이므로 꼼꼼하게 테스트하는 것이 중요합니다. 미리 처리한 줄은 맨 앞에 '#' 기호를 붙여 주석하는 것을 잊지 마세요. (bat 파일의 경우 'REM' 명령을 사용합니다.) 
 +
 +한편 서버에 장시간 업로드를 할 경우, 로그아웃을 하더라도 작업이 진행되어야 합니다. 그럴 때는 nohup 명령을 이용합니다.
 +<code bash>
 +$nohup upload.sh > youtube_upload_status.txt
 +</code>
 +이렇게 하면 로그아웃을 하더라도 작업이 끝까지 진행됩니다.
 +==== 로그 분석 ====
 +nohup에 의해 youtube-upload 명령어가 출력하는 메시지가 youtube_upload_status.txt에 저장되었습니다. 여기서 업로드된 파일이 어떤 URL로 지정되었는지 파악해서 아까의 CSV (혹은 XLS, XLSX) 파일에 다시 기록해둡니다. 파이썬을, 혹은 프로그래밍에 익숙하신 분이라면 여기서 '로그 파일 파싱?'을 생각할지 모릅니다만, 골치아프게 이것까지 프로그래밍을 할 필요는 없는 것 같습니다. 그냥 적당히 텍스트 편집기를 열여 찾기-바꾸기를 이용해 필요한 부분만 걷어내는 방식으로 해도 무방할 듯합니다.
  
project/youtubeupload.1364229891.txt.gz · 마지막으로 수정됨: 2014/10/09 21:23 (바깥 편집)

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki