• 목록
  • 아래로
  • 위로
import youtube_dl, operator, os, glob
from moviepy.editor import *


# 유튜브 영상을 다운받는 함수입니다.
def yt_download(url): 
    ydl_opts = {'outtmpl': '%(title)s.%(ext)s', 
                'format':' bestvideo+bestaudio'
            }
    with youtube_dl.YoutubeDL(ydl_opts) as ydl:
        ydl.download([url])
        info = ydl.extract_info(url, download=False) # 유튜브에 저장된 파일명을 받아옵니다.
        filename = ydl.prepare_filename(info)
        print(filename)
    return filename


# 확장자를 확인하고, 특수문자를 제거하는 함수입니다.
def check_file(filename): 
    if not os.path.isfile(filename):
        name = ''.join(filename.split('.')[:-1])
        filename = glob.glob(name + '.*')[0]
    name, ext = os.path.splitext(filename)
    name_edit = ''.join([x for x in name if x.isalnum() or x.isspace() or x == '_' or x == '-'])
    new_filename = name_edit + ext
    os.rename(filename, new_filename)
    return new_filename


# 영상을 rotation 하는 함수입니다.
def rotate_video(filename): 
    clip = VideoFileClip(filename)
    clip = clip.rotate(270, resample='bicubic') # 270도 또는 90도 rotation 합니다.
    name, ext = os.path.splitext(filename)
    print(ext)
    clip.write_videofile(name + '_rotate.mp4') # MP4로 설정해야 오류가 가장 적네요.
    return


url = 'URL을 입력하세요'
filename = yt_download(url)
filename = check_file(filename)
rotate_video(filename)

 

 

안녕하세요?

 

유튜브 영상 중에 모바일용으로 회전된 영상을 PC용으로 다시 회전시키는 스크립트에요 ^^

 

youtube_dl과 moviepy를 사용했구요.

 

 

이론적으로는 간단하지만 다음과 같은 문제가 있더군요 ㄷㄷ

 

1. 유튜브 서버에 저장된 파일과 실제 다운받은 파일의 확장자가 불일치한 경우가 있어요.

 

youtube_dl에서 merge할 때 확장자를 MKV로 바꿔버리는 경우가 있더군요.

(pytube는 어떨지 모르겠네요 ^^)

 

https://stackoverflow.com/questions/59987612/python-youtube-dl-it-is-possible-to-get-merging-files-extension

 

위와 같은 방식으로 해결한 분이 계시던데, 저는 가능하면 어떠한 확장자에 대해서도 대처할 수 있는 방법으로 구현했네요 :)

 

2. 특수문자가 파일명에 포함되어 있으면 moviepy에서 에러가 발생하는 경우가 있어요 ㅠㅠ

 

3. interpolation 방식은 bicubic이나 bilinear가 무난하던데 아무래도 완벽하지는 않네요~

 

 

일단 MP4, WEBM, MKV파일의 경우를 테스트해봤는데

 

이외에 다른 경우가 또 있을지도 모르겠네요 ㅜㅜ

 

 

그럼 남은 연휴 즐겁게 보내세요!

 

제가 업무 때문에 경황이 없어서 당분간은 글을 작성하지 못할 것 같네요 ㅠㅠ

 

항상 감사드려요 :)

 

 

+) 만약 youtube_dl이 작동하지 않는다면 pytube로 해결하시면 되어요 ^^

작성자
이니스프리 119 Lv. (2%) 4155860/115200000EXP

Make StudyForUs Great Again!

 

CSVpuymXAAAVVpd.jpg

댓글 4

NoYeah
profile image
궁금한 점이 있습니다.
성인 인증이나 비공개와 같은 경우로 반드시 로그인이 필요한 영상의 경우에도 다운로드가 되나요?
comment menu
2020.10.04. 00:49

신고

"NoYeah님의 댓글"

이 댓글을 신고 하시겠습니까?

이니스프리 작성자 → NoYeah
profile image

제가 성인 영상이나 비공개 영상을 본 경험이 없어서 테스트해본 적이 없네요~
구글링해보니 조금 우회적이지만 쿠키를 이용하여 youtube-dl로 비공개 영상을 다운받는 방법에 대한 글이 있긴 하군요 ㄷㄷ
https://daveparrish.net/posts/2018-06-22-How-to-download-private-YouTube-videos-with-youtube-dl.html

comment menu
2020.10.04. 10:00

신고

"이니스프리님의 댓글"

이 댓글을 신고 하시겠습니까?

NoYeah → 이니스프리
profile image
음.. 약간 성인 영상이라고 하니 좀 그렇긴한데;;
의외로 로그인을 꼭해야 볼 수 있는 영상들이 많더라구요. 항상 로그인 되어 있어서 몰랐는데 다운받으려고 하니 의의로 많더라구요;;
comment menu
2020.10.05. 00:51

신고

"NoYeah님의 댓글"

이 댓글을 신고 하시겠습니까?

이니스프리 작성자 → NoYeah
profile image
제가 근무 시작한지 얼마 안 되어서 정신이 없네요 ㅠㅠ
오늘도 방금 퇴근했구요 ㅜㅜ

미국의 R등급 같은 취지로 말씀드렸어요~
마약이 영상에 등장하거나 자살을 다루면 당연히 R등급이고
심지어 비긴 어게인이나 킹스 스피치 같은 영화도 욕설이 등장해서 R등급 아닌가요?? ㄷㄷ

유튜브의 영상 수위에 대한 규제 기준을 모르지만 대략 비슷하지 않을까 추측해보네요~
그럼 일교차가 큰데 감기 조심하시고 굿밤 되세요!
감사합니다 :)
comment menu
2020.10.06. 23:59

신고

"이니스프리님의 댓글"

이 댓글을 신고 하시겠습니까?

권한이 없습니다.
번호 제목 글쓴이 날짜 조회 수
공지 시스템 점검 작업 완료 안내 10 마스터 마스터 24.09.05.16:25 2086
공지 [중요] 호스팅 만료와 관련하여 일부 수칙이 변경됩니다. 4 마스터 마스터 23.01.14.02:23 8875
460 [Python] 리스트의 순서를 유지하되 중복되는 요소를 제거하기 이니스프리 이니스프리 20.11.15.14:54 383
459 [Python] 네이버 블로그 크롤링할 때 PostList.nhn 관련 팁 (문자열에서 첫번째 행을 제거하기) 이니스프리 이니스프리 20.11.08.18:16 269
458 [Python] 문자열에서 파일명 또는 폴더명으로 시스템상 지원되는 글자를 제외하고 삭제하기 이니스프리 이니스프리 20.11.01.14:37 137
457 [Python] Pytube를 이용하여 유튜브 영상을 간단히 다운받는 법에 대한 설명 이니스프리 이니스프리 20.11.01.14:25 530
456 [Python] 특정 단어가 들어가는 폴더 또는 파일을 옮기기 이니스프리 이니스프리 20.11.01.14:14 4057
455 [Python] 2개의 리스트를 딕셔너리로 변환하는 3가지 방법 이니스프리 이니스프리 20.10.25.15:34 1093
454 [Python] HWP 파일 읽기 6 이니스프리 이니스프리 20.10.18.12:19 2196
453 [Python] 디렉토리 내 0바이트 파일 찾기 이니스프리 이니스프리 20.10.11.11:19 259
[Python] 유튜브 영상을 PC에 다운받은 후 영상파일을 90도 rotation 하기 (youtube_dl + moviepy) 4 이니스프리 이니스프리 20.10.03.17:58 494
451 [Python] 폴더 및 하위 폴더 내의 파일에서 문자열을 일괄적으로 replace하는 스크립트 (ver 1.1) 이니스프리 이니스프리 20.10.02.11:58 459
450 [Amina] 그누보드 + 아미나 설치 방법 (처음 시작하는 분들을 위한 간단 매뉴얼) 이니스프리 이니스프리 20.10.01.16:48 461
449 JavaScript와 Canvas로 이미지의 배경값을 자동으로 산출하기 Seia Seia 20.09.12.06:37 423
448 React 그리고 Redux 쉽게 이해하기 image Seia Seia 20.09.12.06:31 232
447 [Python] 폴더의 모든 파일명을 랜덤하게 변경하기 이니스프리 이니스프리 20.08.30.15:06 1143
446 [Selenium] 요소가 완전히 로드될 때까지 기다리기 이니스프리 이니스프리 20.08.23.20:22 513
445 [Selenium] 크롬 익스텐션 사용하기 1 이니스프리 이니스프리 20.08.23.19:35 1604
444 [MoviePy] 폴더의 모든 MP4 파일을 적절한 크기의 GIF 파일로 변환하기 이니스프리 이니스프리 20.08.23.14:18 419
443 [Python] 확장자 확인 및 변경 이니스프리 이니스프리 20.08.23.12:17 2849
442 [Python] 폴더 내 이미지의 height를 측정하여 height < n 미만인 파일을 삭제하기 이니스프리 이니스프리 20.08.13.20:08 265
441 glob.glob()를 이용하여 recursive하게 하위 폴더까지 모든 파일과 디렉토리를 검색하기 이니스프리 이니스프리 20.08.12.16:22 1807