본문 바로가기
공대생/무작정 해보는 파이썬

Python 유튜브 영상/음원 추출 (2)

by 흔한 공대생 2020. 4. 5.
728x90
반응형

본 포스팅은 윈도우10, 파이썬 3.7을 기반으로, Youtube dl을 이용한 유튜브 영상/음원 추출에 대하여 다룬다.


 

이전 포스팅에 이어서 youtube dl을 파이썬으로 간단하게 사용하는 법을 알아보자.

 

youtube dl과 관련된 부분이 이해되지 않는다면 이전 포스팅을 참고.

https://commonengineerr.tistory.com/13

 

Python 유튜브 영상/음원 추출 (1)

본 포스팅은 윈도우10 기반, Youtube dl을 이용한 유튜브 영상/음원 추출에 대하여 다룬다. 요즘 같은 시국에, 침대에 누워 유튜브 영상을 돌려보다 보면 소장각이 나오는 영상들을 발견할 수 있다. 혹은 구하기..

commonengineerr.tistory.com

 


 

01. subprocess

subprocess 모듈에 대해 소개한다.

subprocess 모듈은 파이썬에서 외부 프로세스를 실행, 조작하기 위해 사용한다. 우리의 경우 cmd 창을 조작하기 위해 사용한다.

 

목표는 단순하다. youtube dl을 사용할 때 .\youtube-dl.exe -F 라든가 .\youtube-dl.exe -citw -f 같이 반복해서 입력해주어야 하는 명령어는 사람을 귀찮게 만든다. 그냥 url만 붙여 넣고 손가락 까딱하면 알아서 다운로드되는 프로그램을 만들고 싶다. 따라서 명령어를 자동으로 입력되게만 만들어주면 되는 것이다.

 

시작하기에 앞서, 아직 subprocess에 대한 완벽한 이해가 이루어지지 않은 채, 본래 목적에 부합하는 정도까지만 시도하고 포스팅한다는 점을 밝힌다.

또한 이런 식으로 다운로드한 자료는 절대 개인적으로만 사용해야 한다. (물론 다운로드 받는다는 사실도 떳떳하지는 않지만..) 저작권을 준수하는 성숙한 현대 시민이 되자.


 

02. 영상 추출

먼저 영상 추출을 시도해보자. 이전 포스팅에서 밝힌 내용에 따르면, 영상 추출은 두 번의 작업을 거쳐야 한다. 다운로드할 파일을 확인하고, 실제로 다운로드하는 두 단계다. 따라서 우리가 만들 프로그램은 다음과 같아야 한다.

  1. 영상의 url을 입력한다.
  2. 항목 리스트가 표출된다.
  3. 통합 파일을 받을 것인지, 두 파일을 합칠 것인지 선택한다.
  4. 항목 번호를 입력하고 다운로드한다.

 

subprocess의 가장 간단한 실행은 subprocess.run, subprocess.call이다. 두 함수의 차이는 잘 모르겠지만, run은 실행 후 종료되지 않지만 call은 실행 후 종료됨을 확인했다. 이유는 모르겠다.

또한 .py 파일의 위치는 이전 포스팅에서 cmd 창을 실행시키는 위치였던 bin 폴더여야 한다. 명령을 연속적으로 실행시키는 법을 찾지 못했기에, 강제로 실행 위치를 지정해주어야 하기 때문이다. 만약 .py 파일 위치가 잘못되거나 ffmpeg, youtube dl 파일이 없다면 오류가 발생할 수 있다.

위에 따르면 리스트 표출의 경우 run을 사용해야 한다. 후속 작업이 이루어져야 하기 때문이다.

소스코드는 다음과 같다.

import subprocess

url = input('url: ')  #url 입력

r = subprocess.run('.\youtube-dl.exe -F '+url, shell = True, stdout = subprocess.PIPE, encoding='utf-8')

re = r.stdout.split('\n')

for i in re:
    print(i)

 

subprocess 모듈을 import 하고 url을 입력, .run 함수로 명령을 실행시킨다.

이때 shell = True는 문장으로 된 명령('.\youtube-dl.exe -F '+url)을 인식하기 위함이고, stdout은 출력한다는 점을 알린다. 혹시 모르는 상황에 대비해 utd-8로 인코딩했다.

실제로 출력해보면 원하는 리스트가 출력되긴 하지만, 알아보기 쉬운 형식은 아니었다. 자세히 보니 엔터를 뜻하는 "\n"이 명령이 아닌 문자열로 인식되었기 때문이었다. 그래서 re를 선언하여 "\n"을 기준으로 문자열을 나누고, for문으로 한줄한줄 출력해주었다.

이랬던 것을

이런 식으로.

 

이제 각 항목을 확인했으면 통합 파일을 받을 것인지, 아니면 두 파일을 받아 합칠 것인지 선택해야 한다. 그리고 각 상황에 맞게 format code를 받아 명령을 실행해야 한다. url은 이전에 받았던 것을 재사용하면 되기에 다시 입력받을 필요가 없다.

소스코드는 다음과 같다.

import subprocess

url = input('url: ')

r = subprocess.run('.\youtube-dl.exe -F '+url, shell = True, stdout = subprocess.PIPE, encoding='utf-8')
re = r.stdout.split('\n')
for i in re:
    print(i)

c = input('통합파일 다운로드는 1, 개별파일 다운로드 후 통합은 2: ')

if c == '1':
    mp4 = input('파일 번호: ')
    subprocess.call('.\youtube-dl.exe -citw -f '+mp4+' '+url, shell = True)

else:
    mp4 = input('영상 번호: ')
    mp3 = input('음원 번호: ')
    subprocess.call('.\youtube-dl.exe -citw -f '+mp4+'+'+mp3+' '+url, shell = True)

 

항목 표출 부분을 이해했다면 크게 어렵지 않게 위 코드를 받아 들일 수 있을 것이다.

실행을 시켜보면 cmd 창은 알아서 종료되고, 영상 파일이 생겼음을 확인할 수 있다.

 

이때 mp4 파일이 아니라 webm 파일인 사실이 거슬린다면 인코딩을 통하여 확장자를 바꿀 수 있다. 굳이 구현하지는 않았지만, 다음 명령어를 사용하면 된다.

ffmpeg -i "원본.webm" "결과.mp4"

 

아니면 애초에 통합 mp4 파일을 받거나 mp4 파일과 m4a 파일을 합치는 방법이 있다.


 

03. 음원 추출

음원 추출은 더 간단하다. 명령도 한 줄이었기에 url만 입력받고 명령을 실행시키면 된다.

소스코드는 다음과 같다.

import subprocess

url = input('url: ')

subprocess.call('youtube-dl -x --audio-format mp3 --audio-quality 0 '+url, shell = True)

 

04. 마무리

이렇게 url을 입력하고 파일을 선택하면 원하는 영상 원하는 음원을 다운로드할 수 있는 프로그램을 만들어보았다. 하지만 아직 .py 파일의 위치를 바꾸어도 오류가 나지 않도록, youtube dl 파일과 ffmpeg 파일의 위치를 찾아 지정해줄 수 있게 개선해야 할 필요가 있다.

다시 한번 강조하지만 이렇게 얻은 파일은 공부용, 소장용으로만 사용해야 한다. 저작권을 준수하는 성숙한 현대 시민이 되도록 하자.

728x90
반응형

댓글