※ 작성자가 작성한 내용이 일부 틀릴 수도 있음 주의
※ 작성자가 코드 쓰다가 계속 코드 수정함 주의
한 5일 전에 youtube_dl 자체에 문제가 생겼다고 한다.
그 문제를 내가 발견한 날짜는 오늘. 2월 21일 이다.
음악 봇을 오랜만에 켜보려했는데
uploader_id 가 뭔가 문제가 있다고 한다.
ERROR: Unable to extract uploader id; please report this issue on https://yt-dl.org/bug . Make sure you are using the latest version; see https://yt-dl.org/update on how to update. Be sure to call youtube-dl with the --verbose flag and include its complete output.
[2023-02-21 18:52:52] [ERROR ] discord.ext.commands.bot: Ignoring exception in command play
Traceback (most recent call last):
File "C:\Users\USER\AppData\Local\Programs\Python\Python310\lib\site-packages\youtube_dl\YoutubeDL.py", line 815, in wrapper
return func(self, *args, **kwargs)
File "C:\Users\USER\AppData\Local\Programs\Python\Python310\lib\site-packages\youtube_dl\YoutubeDL.py", line 836, in __extract_info
ie_result = ie.extract(url)
File "C:\Users\USER\AppData\Local\Programs\Python\Python310\lib\site-packages\youtube_dl\extractor\common.py", line 534, in extract
ie_result = self._real_extract(url)
File "C:\Users\USER\AppData\Local\Programs\Python\Python310\lib\site-packages\youtube_dl\extractor\youtube.py", line 1794, in _real_extract
'uploader_id': self._search_regex(r'/(?:channel|user)/([^/?&#]+)', owner_profile_url, 'uploader id') if owner_profile_url else None,
File "C:\Users\USER\AppData\Local\Programs\Python\Python310\lib\site-packages\youtube_dl\extractor\common.py", line 1012, in _search_regex
raise RegexNotFoundError('Unable to extract %s' % _name)
youtube_dl.utils.RegexNotFoundError: Unable to extract uploader id; please report this issue on https://yt-dl.org/bug . Make sure you are using the latest version; see https://yt-dl.org/update on how to update. Be sure to call youtube-dl with the --verbose flag and include its complete output.
대충 찾아보면, youtube 에서 건네주는 uploader_id 의 형식이
변경되서 그렇다고 해석을 했는데
정확히는 계속 검색해보면서 찾아야겠다.
(실패한 시도) youtube_dl 은 구식이고 대신 yt-dlp 를 쓰면 될 줄 알았다.
youtube_dl 은 21년 12월에 업데이트가 멈췄다.
대신 yt-dlp 가 그 뒤를 이어 계속 업데이트가 되고 있다.
그러니까 오래된 놈 대신 새로운 놈을 써봤다.
pip 로 yt_dlp 를 다운받았고
음악 봇 코드의 youtube_dl 이 있는 부분을 모두
yt_dlp 로 대체해서 넣어봤다.
하지만... url의 문제가 있었는지...
다음과 같은 에러 메시지만 나오고 재생이 되지 않았다.
FFmpegPCMAudio에서 항상 이렇게 걸렸다.
ffmpeg process 15744 successfully terminated with return code of 1.
그래서 url 이 문제가 있는지 찾아봤고
url 이 "i.ytimg.com" 으로 시작하는 것으로 확인을 했다.
기존에는 너무 잘됐었기 때문에, 기존의 url이 어떤 형식이었는지를 몰라 찾아봤다.
i.ytimg.com 은 유튜브 썸네일을 가진 url 이었다.
즉, 음원과 관련된 데이터가 들어있지 않은 url이었다.
어떻게든 yt-dlp 로 실행시켜보려고 했지만
번번히 실패할 뿐이었다.
내 5시간......
(성공한 시도) 다음 날이 되었다......
https://github.com/ytdl-org/youtube-dl/issues/31530
위의 링크 덕분에 문제를 해결했다.
그 과정에 대해 이야기 해보려한다.
어제 했던 시도들을 일단은 다 털어내고
새로운 접근법으로 찾아보았다.
깃허브의 yt-dlp 스레드? 토론장? 프로젝트? 어쨌든 그곳 말고
순수하게 youtube-dl 에서 다시 찾아보기로 해봤다.
그 중에서 위의 링크의 토론장을 들어갔는데,
똑같은 오류로 헤매던 사람이었다.
거기서 "nicolaasjan" 이라는 사람이 해결법을 제시해줬다.
요약하자면, 직접 youtube_dl 에 관여하는 코드를 자기가 제시해준대로 수정하라는 것이었다.
youtube_dl 의 업데이트가 21년 12월에 멈췄지만,
이 또한 결국 python 으로 이루어진 코드일터
그래서 그를 따라 수정을 했는데,
결과는 성공적이었다!
이제 그 해결 방법을 알려주고자 한다.
※ 해결 방법
초보자가 있을 수 있으니 하나씩 설명하려한다.
컴잘알은 넘길 수 있는 부분은 넘겨도 된다.
1. 환경 변수 창에서 python 라이브러리 위치 찾기 (스킵 가능)
일단은 python 코드 모음집의 위치를 찾아보자.
보통 "시스템 환경 변수" 중에 "Path" 로 안내한 python 의 위치가 있을 것이다.
검색 탭에 "환경" 치면 얼추 나올 것이다.
하단의 환경 변수 눌러주자.
여기서 "시스템 변수" 에서 "Path" 더블 클릭
거기서 "Python" 이 붙은 곳을 찾아내면 된다.
아마 대체로 비슷할 것이라 생각한다.
"Python310" 같이 버전이 써진 곳까지를 일단 복사를 해두자.
2. youtube.py 를 찾기
Python 의 위치를 아는 사람들은 직접 찾아오고,
1번을 거친 사람들은 "내 문서", "내 PC" 등등 들어와서 상단의 폴더 위치에다가 붙여주자.
"%appdata%" 를 윈도우 검색에서 치고 찾아와도 된다.
다들 방법은 다를 것이다.
"Python310", "Python38" 등 버전값까지 들어간 폴더에 왔으면
"Lib/site-packages/youtube_dl/extractor" 폴더로 들어와서
"youtube.py" 파일을 켜주자.
idle 을 사용할 경우, 상단 File -> Open 에 해당 위치를 복사 붙여넣기해주고 불러오자.
3. youtube.py 수정하기
'uploader_id': self.
Ctrl+F 에 위의 문자열을 넣어주고 검색을 하면
딱 하나가 검색될 것이다.
이제 이 줄을
'uploader_id': self._search_regex(r'/(?:channel/|user/|@)([^/?&#]+)', owner_profile_url, 'uploader id', default=None),
이거로 교체해주자. 미세하게나마 차이가 있다. (@)
저장해주고, 음악 봇을 다시 실행해보자.
만세! 음악 봇이 다시 정상 작동을 한다.
어제 몇 시간을 꼬라박았는데
새로운 머리로 30분만에 해결을 할 수 있었다.
여담 (원인 분석)
고치고 보니 저 "@" 가 차이가 있었다는 것인데,
최근에 유튜브에서 단순히 닉네임을 띄우는 것이 아닌 "@" 로 시작하는 뭐더라
어쨌든 그 아이디태그 같은 것으로 바뀐 이후에
내부적으로 "uploader_id" 의 형식이 추가된 것이 원인인 것 같다.
'개발일지 > 디스코드 봇' 카테고리의 다른 글
디스코드 봇 개발 일지 2023-06-26 - TTS (Text to Speech) 봇 (1) - 아이디어 구상 (0) | 2023.06.26 |
---|---|
디스코드 봇 개발 일지 2023-03-03 - OpenAI 업데이트 및 모델(GPT3.5-turbo) 교체 (16) | 2023.03.04 |
디스코드 봇 개발 일지 2023-02-17 - OpenAI / ChatGPT / GPT-3 로 챗봇 만들기 (0) | 2023.02.17 |
디스코드 봇 개발 일지 2023-02-16 - OpenAI / ChatGPT / GPT-3 알아보기 (0) | 2023.02.17 |
디스코드 봇 개발 일지 2023-01-26 - Embed (0) | 2023.01.26 |