Python – M3u8 파일 다운로드 프로그램 (ffmpeg) 보조 프로그램

강좌가 아니라 소스를 제공하는 글입니다!

m3u8 링크를 입력해서 ffmpeg명령어를 반환하자!

잠깐!

m3u8파일을 ffmpeg로 받는걸 모르시는 분들은 아래 링크를 참고해주세요!!

m3u8 다운로드 방법에 대해 상세히 설명한 포스팅 글입니다.
https://m.blog.naver.com/nevergu1004/221786580635
(저작자: nevergu1004님)


(프로그램 사용 예시)

‘ffmpeg’ 프로그램을 이용하면 m3u8파일을 다운로드할 수 있습니다.
그러나 일일이 ffmpeg 명령어를 변경하기에는 꽤나 번거롭습니다.
이 때, 사용자는 (보조 프로그램)을 사용해서 m3u8링크만 입력 시, 해당 링크가 첨가된 ffmpeg 명령어를 받을 수 있습니다.


(프로그램 진행 화면)

1. bin폴더에 save디렉토리를 만들어주세요!
그리고 M3u8 Command가 보조 프로그램입니다!


2. M3u8 Command에 m3u8링크를 입력하고 엔터를 친 결과입니다. mp4파일 이름은 랜덤된 영어 5글자이므로 겹치지 않습니다!

참고) Chrome Play Hls 가 첨가된 링크를 입력해도 인식됩니다.
ex) chrome-extension://ckblfogh/player.html#http://helloworld.m3u8


3. pre-copy 버튼을 누르면 ffmpeg가 있는 디렉토리로 이동하는 명령어가 복사됩니다. -> CMD에 붙여 넣기!

전 D드라이브에 ffmpeg가 있어서 D: 명령어를 이용했습니다.


4. Copy & Delete버튼을 누르면, Return영역의 ffmpeg (실행) 명령어가 복사됩니다. Entry란과 Return란은 재사용할 수 있게 지워집니다! -> 다시 CMD에 붙여 넣기!

ffmpeg 프로그램이 돌아가는 과정 (다소 시간이 걸릴 수 있음)


5. bin의 save 폴더 내에 mp4파일이 저장된 모습입니다.

(Update) cmd버튼 생성 : 누르면 ‘명령 프롬프트’ 실행 /2020.06.28
=> py.exe가 명령 프롬프트 형태를 지닙니다.


소스 제공)
사용자 입장에 맞춰서 아래 line 8은 변경해서 사용해주세요!!

  win.clipboard_append("cd C:"+chr(92)+"ffmpeg conversion"+chr(92)+"ffmpeg-20200620-29ea4e1-win64-static"+chr(92)+"bin")
# chr(92) == '\' (ASCII Code)

(ffmpeg 폴더가 C드라이브 바로 아래에 있고 이름이 ffmpeg conversion이면 문제가 생기지 않습니다.)

from threading import Thread
import tkinter as tk
import random
import os 

def cmd_start():
    x=win.winfo_screenwidth()/2+300
    y=win.winfo_screenheight()/2-150
    win.wm_geometry("+%d+%d"%(x,y))
    thread=Thread(target=real_start)
    thread.setDaemon(True)
    thread.start() # 타겟된 메소드를 다른 코어에서 일 시작 

def real_start():
    os.system("%windir%\system32\cmd.exe")
  
              
# 명령어(ffmpeg 파일이 있는 디렉토리로 이동) 복사
def precopy():
    win.clipboard_clear()
    win.clipboard_append("cd C:"+chr(92)+"ffmpeg conversion"+chr(92)+"ffmpeg-20200620-29ea4e1-win64-static"+chr(92)+"bin")
    entry.delete(0,tk.END)
    entry.insert(0,'precopy ok')
    
# 명령어 코드 반환
def html(event):
    
    # 파일 이름 랜덤 제작 (5철자)
    random_values=[0 for i in range(5)]
    name=''
    for i in range(5):
        random_values[i]=random.randint(97,122)
        if i==0:
            name=chr(random_values[i])
        else: 
            name=name+chr(random_values[i])
    
    # 코드 제작 및 반환 파트
    global s
    s1='ffmpeg.exe -i "'
    
    s2=id.get()
    try:
        # 크롬 플러그인 복사 링크일 때 
        # 영상 파일 링크 중 '#'를 기준으로 문자열을 나누고 두 번째 요소를 가져옴
        s2=s2.split('#')[1]
    except:
        # 크롬 플러그인 복사한 링크가 아닐 때
        pass
    
    s3='" -bsf:a aac_adtstoasc -c copy ./save/'+str(name)+'.mp4'
    s=s1+s2+s3 # 글로벌 변수 s
    text.insert('1.0',s)

# 엔트리 내용 제거, 텍스트 내용 복사 및 제거 
def delcopy():
    global s
    print("Paste command into CMD :\n"+s+"\n(It has been already copied!)\n")
    win.clipboard_clear()
    win.clipboard_append(s)
    win.update() # now it stays on the clipboard after the window is closed
    text.delete('1.0','end')
    entry.delete(0,tk.END)
    entry.focus()


#윈도우 생성 
win=tk.Tk()
win.title("M3u8 Command")
win.geometry("330x190")

# 변수 파트 
id=tk.StringVar() #입력 엔트리에 바인딩할 변수
global s,cmd_check # 글로벌 변수(입력값 합친거,cmd창 열렸나 체크)
s=str('0')

# 윈도우 가운데 
x=win.winfo_screenwidth()/2-150
y=win.winfo_screenheight()/2-150
win.wm_geometry("+%d+%d"%(x,y))

# 라벨
tk.Label(win,text="Entry:",foreground='red',background="#EAEAEA").grid(row=0,column=0,pady=2,padx=2)
tk.Label(win,text="Return:",foreground='red',background="#EAEAEA").grid(row=1,column=0,pady=2,padx=2)

# 엔트리 (입력)
entry=tk.Entry(win,width=40,textvariable=id)
entry.grid(row=0,column=1,pady=2,columnspan=3)
entry.bind('<Return>',html)

# 텍스트 (결과)
text=tk.Text(win,width=40,height=10)
text.grid(row=1,column=1,pady=2,columnspan=3)

# 버튼
cmd=tk.Button(win,command=cmd_start,text="cmd")
cmd.grid(row=2,column=1,pady=1)

pre=tk.Button(win,command=precopy,text="pre-copy")
pre.grid(row=2,column=2,pady=1)

delete=tk.Button(win,command=delcopy,text="Copy & Delete")
delete.grid(row=2,column=3,pady=1)

# 포커스 및 메인루프
entry.focus()
win.mainloop()

간단한 로직 설명)

< 랜덤 파일 이름 생성 >

random모듈의 randint함수를 사용해서 97에서 122사이의 랜덤 값 5개를 생성 -> 97에서 122는 아스키코드(a~z)이므로 chr()함수를 이용하면 다시 문자로 변경이 가능 -> 파이썬은 ‘+’연산자로 문자열이 합쳐지므로 name문자열 뒤에 chr(97)따위를 n회 합쳐서 제작함

< ffmpeg명령어 반환 >

s1에 m3u8링크가 위치하지 전 소스를 저장함 -> s2에 m3u8링크를 저장함 -> s3에 m3u8링크가 위치한 다음의 소스를 저장함 -> 글로벌 변수 s에 ‘+’연산자를 사용해서 문자열 s1+s2+s3를 저장함.
<정적인 소스는 그대로 두고 동적인 소스만 변경하는 방식!>


Leave a Reply

Your email address will not be published. Required fields are marked *