본문 바로가기
CODING/Python

파이썬으로 디스코드 음악봇 제작기 - 1

by NOBLESSE 2021. 9. 8.
728x90
반응형

  • 기능(아래의 기능은 개발이 진행되면서 추가 혹은 변경, 제거가 될 수 있습니다.)
    • 유튜브 영상의 음성 출력
    • 추가한 리스트 목록 확인
    • 플레이리스트(추가한 노래 리스트) 저장 및 불러오기
    • 리스트 목록 개별 제거
    • loop 기능
    • leave 기능
    • skip 기능
    • pause 기능
    • resume 기능

일단은 되는대로 소스를 작성하고 완성 후에 변수 및 함수를 정리하도록 하겠습니다.

 

이번 포스팅에는 유튜브 영상의 음원을 가져와서 디스코드에서 재생을 시키는 기능을 구현하겠습니다.

시작하기 앞서 해당 개발에 뼈대가 되는 모듈은 discord.py입니다.

 

디스코드 봇 개발에 대한 기본적인 지식은 함양하고 있는 사람을 기반하여 작성된 글입니다.

추후에 디스코드 봇 개발의 기초적인 부분도 올리려고 하고 있습니다.(초기 설정 부분은 워낙 자료가 많아서...)


  • 간략한 구현 과정
    • youtube_search 모듈을 이용하여 특정 키워드에 대한 영상 중 최상단에 노출되는 영상의 제목과 주소를 가져옴
    • youtube_dl을 이용해서 음원을 다운로드하고, FFMPEG를 이용하여 디스코드 음성 채팅방에 출력
  • 파이썬으로 구현된 코드
    • async def song_start(voice, url):
          try:
              if not voice.is_playing() and not voice.is_paused():
                  ydl_opts = {'format': 'bestaudio'}
                  FFMPEG_OPTIONS = {'before_options': '-reconnect 1 -reconnect_streamed 1 -reconnect_delay_max 5', 'options': '-vn'}
                  with youtube_dl.YoutubeDL(ydl_opts) as ydl:
                      info = ydl.extract_info(f'https://www.youtube.com{url}', download=False) # 파일로 다운로드 하지 않고 재생
                      URL = info['formats'][0]['url']
                  
                  voice.play(discord.FFmpegPCMAudio(URL, **FFMPEG_OPTIONS))
              #voice.play(discord.FFmpegPCMAudio(executable = './ffmpeg-4.4-full_build-shared/bin/ffmpeg.exe', source='./song.mp3'))
      
              while voice.is_playing() or voice.is_paused():
                  await asyncio.sleep(0.1)
          except:
              return
      
      @bot.command(aliases = ['play', 'p', 'ㅔ'])
      async def Play(ctx,*,  keyword):
          try:
              results = YoutubeSearch(keyword, max_results=1).to_dict() # title과 url_suffix를 사용. 자세한 내용은 하단 링크 참고
      
              channel = ctx.author.voice.channel
              if bot.voice_clients == []:
                  await channel.connect()
                  #await ctx.send("connected to the voice channel, " + str(bot.voice_clients[0].channel))
              voice = bot.voice_clients[0]
              
              await song_start(voice, results[0]['url_suffix'])
          except:
              await ctx.send("Play Error")

 

YouTubeSearch 같은 경우에는 다음의 홈페이지를 참고하시면 더 많은 정보를 얻을 수 있습니다.

https://github.com/alexmercerind/youtube-search-python

 

유튜브의 파싱같은 경우는 처음에 beautifulsoup으로 진행하려 했으나 영상을 추천해주는 부분은 모두 동적인 부분이라 불가능했습니다. 이에 selenium으로 경로를 틀던 찰나에 해당 모듈(YouTubeSearch)을 발견하여 이용하게 되었습니다.

 

다음 시간에는 플레이리스트에 관련된 기능을 넣어보겠습니다. 감사합니다.

728x90
반응형

'CODING > Python' 카테고리의 다른 글

파이썬으로 디스코드 음악봇 제작기 - 2  (11) 2021.12.22
[파이썬:Python]달팽이배열  (0) 2020.07.04
[파이썬:Python]타자게임  (0) 2019.06.13