본문 바로가기

개발일지/디스코드 봇

디스코드 봇 개발 일지 2023-02-21 - youtube_dl uploader_id 문제

 

 

※ 작성자가 작성한 내용이 일부 틀릴 수도 있음 주의

 

※ 작성자가 코드 쓰다가 계속 코드 수정함 주의

 

 

 

한 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

 

[YouTube] Unable to extract uploader id · Issue #31530 · ytdl-org/youtube-dl

This issue is solved: read the Description below Checklist I'm reporting a broken site support I've verified that I'm running youtube-dl version 2021.12.17 I've checked that all pro...

github.com

 

 

위의 링크 덕분에 문제를 해결했다.

 

그 과정에 대해 이야기 해보려한다.

 

 

 

 

어제 했던 시도들을 일단은 다 털어내고

 

새로운 접근법으로 찾아보았다.

 

깃허브의 yt-dlp 스레드? 토론장? 프로젝트? 어쨌든 그곳 말고

 

순수하게 youtube-dl 에서 다시 찾아보기로 해봤다.

 

 

 

그 중에서 위의 링크의 토론장을 들어갔는데,

 

똑같은 오류로 헤매던 사람이었다.

 

거기서 "nicolaasjan" 이라는 사람이 해결법을 제시해줬다.

 

요약하자면, 직접 youtube_dl 에 관여하는 코드를 자기가 제시해준대로 수정하라는 것이었다.

 

 

 

 

youtube_dl 의 업데이트가 21년 12월에 멈췄지만,

 

이 또한 결국 python 으로 이루어진 코드일터

 

그래서 그를 따라 수정을 했는데,

 

결과는 성공적이었다!

 

이제 그 해결 방법을 알려주고자 한다.

 

 

 

 

 

 

※ 해결 방법

 

 

초보자가 있을 수 있으니 하나씩 설명하려한다.

 

컴잘알은 넘길 수 있는 부분은 넘겨도 된다.

 

 

 

 

1. 환경 변수 창에서 python 라이브러리 위치 찾기 (스킵 가능)

 

일단은 python 코드 모음집의 위치를 찾아보자.

 

보통 "시스템 환경 변수" 중에 "Path" 로 안내한 python 의 위치가 있을 것이다.

 

 

 

 

검색 탭에 "환경" 치면 얼추 나올 것이다.

 

 

 

하단의 환경 변수 눌러주기

 

 

하단의 환경 변수 눌러주자.

 

 

Besiege 참 재밌는 게임이다. 만들라는 공성병기는 안 만들고

 

여기서 "시스템 변수" 에서 "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),

 

 

이거로 교체해주자. 미세하게나마 차이가 있다. (@)

 

저장해주고, 음악 봇을 다시 실행해보자.

 

 

 

return code 가 0이고 소리가 들리면 성공이다. 플레이리스트는 비밀이다.

 

 

만세! 음악 봇이 다시 정상 작동을 한다.

 

어제 몇 시간을 꼬라박았는데

 

새로운 머리로 30분만에 해결을 할 수 있었다.

 

 

 

 

 

 

여담 (원인 분석)

 

고치고 보니 저 "@" 가 차이가 있었다는 것인데,

 

최근에 유튜브에서 단순히 닉네임을 띄우는 것이 아닌 "@" 로 시작하는 뭐더라

 

어쨌든 그 아이디태그 같은 것으로 바뀐 이후에

 

내부적으로 "uploader_id" 의 형식이 추가된 것이 원인인 것 같다.

 

 

728x90