onsen downloader 개발기
만 하루동안 파이썬 30줄짜기 repo
기존 onsen은 라디오를 따로 다운할 방법이 없어 ffmpeg를 사용해서 다운을 받아야했다.
기존 다운방식
내가 이 동안 다운받던 방식은
- f12를 연다.
- 라디오 실행.
- f12 - network에서 m3u8 검색
- 검색해서나온 playlist.m3u8 파일의 링크를 복사.
- ffmpeg로 ts파일로 변환.
- 샤나인코더로 mp3파일로 변환
의 과정을 거쳤다. 보통 2주마다 업로드가 되니 2주마다 이짓을 해야한다. 실제로 반년 넘게 해왔었고 너~~~~~~~~~무 귀찮다. 이제는 못참고 자동화를 해보기로 했다. 기본적으론 내가 사용하려고 만들지만 가능하면 아예모르는 사람도 실행파일하나로 쓸 수 있게 배포하는게 목적이다.
서칭과정과 사용방식들.
txt파일에다가 url을 쭉 넣어놓고 순서대로 받아오는 식으로 짜려고 생각했다.
웹크롤링으론 beautifulsoup이나 크롬드라이버써본 수준밖에 없다.
없는게 없는 python에서 url하나 던지면 m3u8 파일을 받아주는 라이브러리 하나쯤은 있지않을까 했다. m3u8라이브러리가 있긴있던데 받아주는건아니었고 뒤져본결과 못찾았다.
m3u8 링크뽑기
그러던 중 이 사이트를 찾았다.
[Python crawler] Crawl webpage video, parse m3u8 file, get ts and synthesize mp4
대충보니 html에서 m3u8파일이 있으니 이걸로 어쩌고저쩌고 했다는 글인데 혹시 싶어서 내가 타깃으로하는 페이지도 있는가 검색해보니 m3u8파일 링크가 있었다. 이제 이것만 뽑아내면된다. 중간에 \u002F이런게 덕지덕지있던데 이거는 유니코드 뭐시기 인거같으니 일단 뽑고 나중에 변환만해주면 해결될듯 했다. 이제 뽑는게 문젠데.
html 구성이 특이하고 태그로 딱딱 분류되어있지도않아서 beautifulsoup으로 제대로 뽑아 낼 수 있을거같지않았다. m3u8이 들어간 링크는 단 한개라서 그냥 문자열에서 서칭을 돌리면 될것같았다. 하지만 문자열 함수들 중에 그것만 뽑아내는 뾰족한 방법은 나는 잘 모르겠다. 단서라는건 http 로시작하고 m3u8로 끝나는 링크인데 정규표현식을 사용하는거 말고는 생각나는게 없었다. 한번도 써본적 없었는데 쓰는법 찾아보기시작.
정규표현식 기본문법은 이 사이트 저 사이트 짜다리 나열되어있는데서 쭉 읽어서 이해하려고 노력했다.
그러고 http
로 시작하고 m3u8
사이까지는 어떤 문자가나와도 상관않게 규식이를 짰다. 그러던 중 문제가 나왔다. http
가 유일하지 못해서 가장 처음에 http
가 나온게 m3u8
까지 이어진게 문자열로 선택되었다.
따라서 http
가 한번나오면 m3u8
사이에는 http
가 존재해선 안된다.
다음의 사이트를 찾아서 참고했다.
match가 아닌 search를 사용해야함.
1
re.search("http((?!http).)*m3u8", b)
unicode 변환
https://stackoverflow.com/questions/45527763/python-3-6-cant-convert-unicode-in-a-string
이제 링크를 추출하였다.
https://onsen-ma3phlsvod.sslcs.cdngc.net/onsen-ma3pvod/_definst_/202102/iine2102258sid-36.mp4/playlist.m3u8
여기서 파일이름으로 쓰기위해서 추가적으로 정규식을 썼다. iine2102258sid-36
을 일관적으로 뽑아내기위해서 /
와 .mp
사이의 값을 뽑아내려했다. 위의 코드를 조금만 응용하면 되는 수준인데 문제는 .mp
는 결과값에 안나오게 하고싶은데 방법을 도저히 모르겠다 그래서 그냥 split으로 .
기준으로 짤라버리게했다.
ffmpeg
ffmpeg를 실행파일로 나두고 커맨드로 쓰는게 솔직히 마음에 들지않았다. 처음엔 python-ffmpeg
생각하다가 그냥 쓰기로함. m3u8파일을 다운받아야하는데 이부분이 지원을 안하는 듯 존재하지않는 파일이면 따로 사용이 어려운듯했다.
혹시 ts
파일을 mp3
로 바꿀 수 있는가 했는데 다행이 있었다.
https://ffmpeg.org/ffmpeg-all.html#mp3
1
ffmpeg -i input.wav -write_xing 0 -id3v2_version 0 out.mp3
이제 기본적인것만 신경쓰면 됐다.
pyintaller
다음 사이트에서 참고해서 icon넣고 exe로 바꿨다.
1
pyinstaller --icon=test.ico --onefile test.py