From 5c31d6f7a8c3291b2dd6d6e8a5ff29e23fc026bc Mon Sep 17 00:00:00 2001 From: Hellow <74311245+HeIIow2@users.noreply.github.com> Date: Wed, 14 Jun 2023 17:43:20 +0200 Subject: [PATCH] fixed and finish sponsor block --- .idea/modules.xml | 1 + .idea/music-downloader.iml | 1 + .idea/vcs.xml | 1 + requirements.txt | 4 +++- src/music_kraken/audio/codec.py | 18 +++++++++--------- src/music_kraken/pages/youtube.py | 22 ++++++++++++++-------- 6 files changed, 29 insertions(+), 18 deletions(-) diff --git a/.idea/modules.xml b/.idea/modules.xml index 7b56bcd..56fe61a 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -4,6 +4,7 @@ + \ No newline at end of file diff --git a/.idea/music-downloader.iml b/.idea/music-downloader.iml index 95b8e80..e7dba2c 100644 --- a/.idea/music-downloader.iml +++ b/.idea/music-downloader.iml @@ -7,5 +7,6 @@ + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml index 35eb1dd..1a15e6d 100644 --- a/.idea/vcs.xml +++ b/.idea/vcs.xml @@ -2,5 +2,6 @@ + \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index a67d5a0..1771286 100644 --- a/requirements.txt +++ b/requirements.txt @@ -14,4 +14,6 @@ tqdm~=4.65.0 peewee~=3.15.4 ffmpeg-python~=0.2.0 platformdirs~=3.2.0 -transliterate~=1.10.2 \ No newline at end of file +transliterate~=1.10.2 +sponsorblock~=0.1.3 +regex~=2022.9.13 \ No newline at end of file diff --git a/src/music_kraken/audio/codec.py b/src/music_kraken/audio/codec.py index 8e37b01..d2b9fd1 100644 --- a/src/music_kraken/audio/codec.py +++ b/src/music_kraken/audio/codec.py @@ -10,17 +10,17 @@ def remove_intervals(target: Target, interval_list: List[Tuple[float, float]]): if not target.exists: LOGGER.warning(f"Target doesn't exist: {target.file_path}") return - - temp_target = Target( + + output_target = Target( path=target._path, - file=str(target._file) + ".temp" + file=str(target._file) + "." + AUDIO_FORMAT ) - target.copy_content(temp_target) # https://stackoverflow.com/questions/50594412/cut-multiple-parts-of-a-video-with-ffmpeg aselect_list: List[str] = [] start = 0 + next_start = 0 for end, next_start in interval_list: aselect_list.append(f"between(t,{start},{end})") @@ -29,13 +29,13 @@ def remove_intervals(target: Target, interval_list: List[Tuple[float, float]]): aselect_list.append(f"gte(t,{next_start})") select = f"aselect='{'+'.join(aselect_list)}',asetpts=N/SR/TB" - - command = f"ffmpeg -i {str(temp_target.file_path)} -af \"{select}\" {str(target.file_path)}" - r = subprocess.run(command) + + r = subprocess.run(["ffmpeg", "-i", str(target.file_path), "-af", select, str(output_target.file_path)]) if r.stderr != "": LOGGER.debug(r.stderr) - - temp_target.delete() + + output_target.copy_content(target) + output_target.delete() def correct_codec(target: Target, bitrate_kb: int = BITRATE, audio_format: str = AUDIO_FORMAT): diff --git a/src/music_kraken/pages/youtube.py b/src/music_kraken/pages/youtube.py index 12f6b7b..b3ce15b 100644 --- a/src/music_kraken/pages/youtube.py +++ b/src/music_kraken/pages/youtube.py @@ -3,11 +3,9 @@ from urllib.parse import urlparse, urlunparse, parse_qs from enum import Enum import sponsorblock +from sponsorblock.errors import HTTPException, NotFoundException -from music_kraken.objects import Song, Target -from music_kraken.utils.support_classes import DownloadResult - -from ..objects import Source, DatabaseObject +from ..objects import Source, DatabaseObject, Song, Target from .abstract import Page from ..objects import ( Artist, @@ -145,7 +143,7 @@ class YouTube(Page): ) # the stuff with the connection is, to ensure sponsorblock uses the proxies, my programm does - _sponsorblock_connection: Connection = Connection() + _sponsorblock_connection: Connection = Connection(host="https://sponsor.ajay.app/") self.sponsorblock_client = sponsorblock.Client(session=_sponsorblock_connection.session) super().__init__(*args, **kwargs) @@ -390,7 +388,7 @@ class YouTube(Page): if not ENABLE_SPONSOR_BLOCK: return - # find the youtube id + # find the YouTube id source_list = song.source_collection.get_sources_from_page(self.SOURCE_TYPE) if len(source_list) <= 0: self.LOGGER.warning(f"Couldn't find a youtube source in the post_processing_hook for {song.option_string}") @@ -403,5 +401,13 @@ class YouTube(Page): return # call the sponsorblock api, and remove the segments from the audio - segments = self.sponsorblock_client.get_skip_segments(video_id=parsed.id) - remove_intervals(temp_target, [(segment.start, segment.end) for segment in segments]) + segments = [] + try: + segments = self.sponsorblock_client.get_skip_segments(parsed.id) + except NotFoundException: + self.LOGGER.debug(f"No sponsor found for the video {parsed.id}.") + except HTTPException as e: + self.LOGGER.warning(f"{e}") + + if len(segments) <= 0: + remove_intervals(temp_target, [(segment.start, segment.end) for segment in segments])