Skip to content

Commit

Permalink
Merge commit '51c1cb6d7dc0c62d719e49cfce10317aab16055c'
Browse files Browse the repository at this point in the history
  • Loading branch information
tristiisch committed Nov 13, 2023
2 parents e074f44 + 51c1cb6 commit 444b057
Show file tree
Hide file tree
Showing 18 changed files with 387 additions and 236 deletions.
19 changes: 16 additions & 3 deletions docker-compose.yml
Original file line number Diff line number Diff line change
@@ -1,13 +1,26 @@
version: '3.7'
name: 'pyramid-dev'

services:

pyramid:
image: tristiisch/pyramid:latest
volumes:
- ./config.yml:/app/config.yml
- ./logs:/app/logs
- ./songs:/app/songs
- type: bind
source: ./config.yml
target: /app/config.yml
bind:
create_host_path: false
- type: bind
source: ./logs
target: /app/logs
bind:
create_host_path: true
- type: bind
source: ./songs
target: /app/songs
bind:
create_host_path: true
restart: always
networks:
- pyramid_network
Expand Down
3 changes: 1 addition & 2 deletions src/pyramid/__main__.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@

from data.functional.main import Main
from tools.test_dev import TestDev

Expand All @@ -13,5 +12,5 @@

test_dev = TestDev(main._config, main.logger)
# test_dev.test_deezer()
main.init()
main.start()
main.stop()
53 changes: 10 additions & 43 deletions src/pyramid/connector/deezer/downloader.py
Original file line number Diff line number Diff line change
@@ -1,15 +1,17 @@
import argparse
import asyncio
import logging
import os
import time
from typing import Callable

import pydeezer.util
from pydeezer import Deezer
from pydeezer.constants import track_formats
from pydeezer.exceptions import LoginError

from data.track import Track, TrackMinimal
from data.track import Track
from connector.deezer.downloader_progress_bar import DownloaderProgressBar
from urllib3.exceptions import MaxRetryError


class DeezerDownloader:
Expand Down Expand Up @@ -49,21 +51,6 @@ async def dl_track_by_id(self, track_id) -> Track | None:
track_downloaded = Track(track_info["DATA"], file_path)
return track_downloaded

def get_track_by_name(self, name) -> TrackMinimal | None:
tracks_found = self.__deezer_dl_api.search_tracks(name)
if not tracks_found:
return None
track = TrackMinimal(tracks_found[0])
return track

async def dl_track_by_name(self, name) -> Track | None:
track: TrackMinimal | None = self.get_track_by_name(name)
if track is None:
return None

track_downloaded = await self.dl_track_by_id(track.id)
return track_downloaded

def __dl_track(self, func: Callable[..., None], track_info, file_name: str) -> bool:
try:
func(
Expand All @@ -77,35 +64,15 @@ def __dl_track(self, func: Callable[..., None], track_info, file_name: str) -> b
False, # lyrics
", ", # separator for multiple artists
False, # show messages
None, # Custom progress bar
DownloaderProgressBar(), # Custom progress bar
)
return True
except MaxRetryError:
track = Track(track_info["DATA"], None)
logging.warning("Downloader MaxRetryError %s", track)
time.sleep(5)
return self.__dl_track(func, track_info, file_name)
except Exception:
track = Track(track_info["DATA"], None)
logging.warning("Unable to dl track %s", track, exc_info=True)
return False


async def cli():
folder_path = "./songs/"

parser = argparse.ArgumentParser()
parser.add_argument("-t", help="song title", metavar="title")
parser.add_argument("-id", help="id of the track", metavar="id")
parser.add_argument("-arl", help="arl deezer account", metavar="arl")

args = parser.parse_args()

if args.arl:
deezer_dl = DeezerDownloader(args.arl, folder_path)
else:
print("Missing Deezer ARL")
exit(1)

if args.id:
print("Asked Track ", args.t)
await deezer_dl.dl_track_by_id(args.id)
elif args.t:
await deezer_dl.dl_track_by_name(args.t.replace("%20", " "))
else:
print("Missing Args")
69 changes: 69 additions & 0 deletions src/pyramid/connector/deezer/downloader_progress_bar.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
import logging
import time
from pydeezer.ProgressHandler import BaseProgressHandler


def convert_bytes_to_appropriate_unit(bytes_per_second):
units = ["bps", "Kbps", "Mbps", "Gbps", "Tbps"]
factor = 1000
for unit in units:
if bytes_per_second < factor:
return f"{round(bytes_per_second)} {unit}"
bytes_per_second /= factor

return f"{round(bytes_per_second)} {units[-1]}"


class DownloaderProgressBar(BaseProgressHandler):
def __init__(self):
pass

def initialize(self, *args, **kwargs):
super().initialize(*args)
self.current_chunk_size: int
self.total_size: int

self.start_time = time.time()
self.last_print = self.start_time
logging.info("Start download\t%s (%s)", self.track_title, self.track_quality)

def update(self, *args, **kwargs):
super().update(**kwargs)
self.log_progress()

def close(self, *args, **kwargs):
total_time = time.time() - self.start_time
average_speed = self.size_downloaded / total_time
logging.info(
"End download\t%s in %.2f seconds - %s",
self.track_title,
total_time,
convert_bytes_to_appropriate_unit(average_speed),
)

def log_progress(self):
current_time = time.time()
percentage = self.size_downloaded / self.total_size * 100
duration_last_print = current_time - self.last_print
if duration_last_print < 1:
return

duration = current_time - self.start_time
if duration == 0:
return

current_speed = self.current_chunk_size / duration
remaining_size = self.total_size - self.size_downloaded
time_remaining = remaining_size / current_speed if current_speed > 0 else 0

if percentage == 100:
return

logging.info(
"Downloading %s %.2f%% - %s - %.2f seconds remaining",
self.track_title,
percentage,
convert_bytes_to_appropriate_unit(current_speed),
time_remaining,
)
self.last_print = current_time
11 changes: 7 additions & 4 deletions src/pyramid/connector/deezer/search.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,15 @@
from data.track import TrackMinimalDeezer
from data.a_search import ASearch

DEFAULT_LIMIT = 100


class DeezerSearch(ASearch):
def __init__(self):
self.client = Client()
self.tools = DeezerTools()
self.strict = False
self.default_limit = 10
self.default_limit = DEFAULT_LIMIT

def search_track(self, search) -> TrackMinimalDeezer | None:
search_results = self.client.search(query=search)
Expand All @@ -34,7 +36,7 @@ def get_track_by_id(self, track_id: int) -> TrackMinimalDeezer | None:
return None
return TrackMinimalDeezer(track)

def search_tracks(self, search, limit=10) -> list[TrackMinimalDeezer] | None:
def search_tracks(self, search, limit=DEFAULT_LIMIT) -> list[TrackMinimalDeezer] | None:
search_results = self.client.search(query=search, strict=self.strict)

if not search_results or len(search_results) == 0:
Expand Down Expand Up @@ -107,7 +109,7 @@ def get_album_tracks_by_id(
return None
return [TrackMinimalDeezer(element) for element in album.get_tracks()], []

def get_top_artist(self, artist_name, limit=10) -> list[TrackMinimalDeezer] | None:
def get_top_artist(self, artist_name, limit=DEFAULT_LIMIT) -> list[TrackMinimalDeezer] | None:
search_results = self.client.search_artists(query=artist_name, strict=self.strict)
if not search_results or len(search_results) == 0:
return None
Expand All @@ -116,7 +118,7 @@ def get_top_artist(self, artist_name, limit=10) -> list[TrackMinimalDeezer] | No
return [TrackMinimalDeezer(element) for element in top_tracks]

def get_top_artist_by_id(
self, artist_id: int, limit=10
self, artist_id: int, limit=DEFAULT_LIMIT
) -> tuple[list[TrackMinimalDeezer], list[TrackMinimalDeezer]] | None:
artist = self.client.get_artist(artist_id) # TODO handle HTTP errors
if not artist:
Expand Down Expand Up @@ -176,6 +178,7 @@ def search_exact_track(
i = err_json["code"] # type: ignore
if int(i) == 4:
time.sleep(5)
logging.warning("Search RateLimit %s - %s", artist_name, track_title)
return self.search_exact_track(artist_name, album_title, track_title)
else:
raise err
Expand Down
9 changes: 8 additions & 1 deletion src/pyramid/connector/discord/bot.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import logging
import time
import traceback
from logging import Logger
from typing import Dict
Expand Down Expand Up @@ -45,6 +46,7 @@ def __init__(
"deezer": DeezerSearch(),
}
)
self.__started = time.time()

intents = discord.Intents.default()
# intents.members = True
Expand All @@ -59,7 +61,12 @@ def create(self):
self.__logger.info("Discord bot creating with discord.py v%s ...", discord.__version__)
self.listeners = BotListener(self.bot, self.__logger, self.__information)
self.cmd = BotCmd(
self.bot, self.__get_guild_cmd, self.__logger, self.__information, self.__environment
self.bot,
self.__get_guild_cmd,
self.__logger,
self.__information,
self.__environment,
self.__started,
)

@self.bot.event
Expand Down
Loading

0 comments on commit 444b057

Please sign in to comment.