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])