강좌가 아니라 소스를 제공하는 글입니다!
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에 붙여 넣기!


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


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를 저장함.
<정적인 소스는 그대로 두고 동적인 소스만 변경하는 방식!>