default effects
This commit is contained in:
parent
0ce4c6c75b
commit
2c28e1a6d2
@ -8,6 +8,7 @@ from v6d3music.core.yt_audios import yt_audios
|
|||||||
from v6d3music.utils.assert_admin import assert_admin
|
from v6d3music.utils.assert_admin import assert_admin
|
||||||
from v6d3music.utils.catch import catch
|
from v6d3music.utils.catch import catch
|
||||||
from v6d3music.utils.effects_for_preset import effects_for_preset
|
from v6d3music.utils.effects_for_preset import effects_for_preset
|
||||||
|
from v6d3music.utils.entries_effects_for_args import default_effects, set_default_effects
|
||||||
from v6d3music.utils.options_for_effects import options_for_effects
|
from v6d3music.utils.options_for_effects import options_for_effects
|
||||||
from v6d3music.utils.presets import allowed_presets
|
from v6d3music.utils.presets import allowed_presets
|
||||||
|
|
||||||
@ -110,6 +111,32 @@ async def effects_(ctx: Context, args: list[str]) -> None:
|
|||||||
yta.set_seconds(seconds)
|
yta.set_seconds(seconds)
|
||||||
|
|
||||||
|
|
||||||
|
@at('commands', 'default')
|
||||||
|
async def default(ctx: Context, args: list[str]) -> None:
|
||||||
|
await catch(
|
||||||
|
ctx, args, '''
|
||||||
|
`default - effects`
|
||||||
|
`default + preset`
|
||||||
|
`default none`
|
||||||
|
''', 'help'
|
||||||
|
)
|
||||||
|
match args:
|
||||||
|
case ['-', effects]:
|
||||||
|
pass
|
||||||
|
case ['+', preset]:
|
||||||
|
effects = effects_for_preset(preset)
|
||||||
|
case ['none']:
|
||||||
|
effects = None
|
||||||
|
case []:
|
||||||
|
await ctx.reply(f'current default effects: {default_effects(ctx.guild.id)}')
|
||||||
|
return
|
||||||
|
case _:
|
||||||
|
raise Explicit('misformatted')
|
||||||
|
assert_admin(ctx.member)
|
||||||
|
await set_default_effects(ctx.guild.id, effects)
|
||||||
|
await ctx.reply(f'effects set to `{effects}`')
|
||||||
|
|
||||||
|
|
||||||
@at('commands', 'queue')
|
@at('commands', 'queue')
|
||||||
async def queue_(ctx: Context, args: list[str]) -> None:
|
async def queue_(ctx: Context, args: list[str]) -> None:
|
||||||
await catch(
|
await catch(
|
||||||
|
@ -20,6 +20,7 @@ class QueueAudio(discord.AudioSource):
|
|||||||
for audio in respawned:
|
for audio in respawned:
|
||||||
self.append(audio)
|
self.append(audio)
|
||||||
self.guild = guild
|
self.guild = guild
|
||||||
|
self.loop = asyncio.get_running_loop()
|
||||||
|
|
||||||
def _update_sources(self):
|
def _update_sources(self):
|
||||||
for i in range(PRE_SET_LENGTH):
|
for i in range(PRE_SET_LENGTH):
|
||||||
@ -58,17 +59,24 @@ class QueueAudio(discord.AudioSource):
|
|||||||
audio.set_source_if_necessary()
|
audio.set_source_if_necessary()
|
||||||
self.queue.append(audio)
|
self.queue.append(audio)
|
||||||
|
|
||||||
def read(self) -> bytes:
|
def _popleft(self, audio: YTAudio):
|
||||||
if not self.queue:
|
if self.queue and self.queue[0] is audio:
|
||||||
return FILL
|
|
||||||
audio = self.queue[0]
|
|
||||||
audio.set_source_if_necessary()
|
|
||||||
frame = audio.read()
|
|
||||||
if len(frame) != discord.opus.Encoder.FRAME_SIZE:
|
|
||||||
self.queue.popleft().cleanup()
|
self.queue.popleft().cleanup()
|
||||||
self._update_sources()
|
self._update_sources()
|
||||||
frame = FILL
|
|
||||||
return frame
|
def read(self) -> bytes:
|
||||||
|
for i in range(len(self.queue)):
|
||||||
|
try:
|
||||||
|
audio = self.queue[i]
|
||||||
|
except IndexError:
|
||||||
|
break
|
||||||
|
audio.set_source_if_necessary()
|
||||||
|
frame = audio.read()
|
||||||
|
if len(frame) == discord.opus.Encoder.FRAME_SIZE:
|
||||||
|
return frame
|
||||||
|
else:
|
||||||
|
self.loop.call_soon_threadsafe(self._popleft, audio)
|
||||||
|
return FILL
|
||||||
|
|
||||||
def skip_at(self, pos: int, member: discord.Member) -> bool:
|
def skip_at(self, pos: int, member: discord.Member) -> bool:
|
||||||
if pos < len(self.queue):
|
if pos < len(self.queue):
|
||||||
|
@ -10,7 +10,7 @@ from v6d3music.utils.info_tuple import info_tuple
|
|||||||
|
|
||||||
async def yt_audios(ctx: Context, args: list[str]) -> AsyncIterable[YTAudio]:
|
async def yt_audios(ctx: Context, args: list[str]) -> AsyncIterable[YTAudio]:
|
||||||
tuples: list[info_tuple] = []
|
tuples: list[info_tuple] = []
|
||||||
async for info, effects, already_read, tor in entries_effects_for_args(args):
|
async for info, effects, already_read, tor in entries_effects_for_args(args, ctx.guild.id):
|
||||||
tuples.append((info, effects, already_read, tor))
|
tuples.append((info, effects, already_read, tor))
|
||||||
if len(tuples) >= 5:
|
if len(tuples) >= 5:
|
||||||
async for audio in create_ytaudios(ctx, tuples):
|
async for audio in create_ytaudios(ctx, tuples):
|
||||||
|
@ -18,6 +18,7 @@ from v6d3music.core.cache_url import cache_db
|
|||||||
from v6d3music.core.mainasrc import main_for_raw_vc, mainasrcs
|
from v6d3music.core.mainasrc import main_for_raw_vc, mainasrcs
|
||||||
from v6d3music.core.mainaudio import volume_db
|
from v6d3music.core.mainaudio import volume_db
|
||||||
from v6d3music.core.queueaudio import queue_db
|
from v6d3music.core.queueaudio import queue_db
|
||||||
|
from v6d3music.utils.entries_effects_for_args import effects_db
|
||||||
|
|
||||||
loop = asyncio.new_event_loop()
|
loop = asyncio.new_event_loop()
|
||||||
asyncio.set_event_loop(loop)
|
asyncio.set_event_loop(loop)
|
||||||
@ -125,7 +126,7 @@ async def setup_tasks():
|
|||||||
|
|
||||||
|
|
||||||
async def main():
|
async def main():
|
||||||
async with volume_db, queue_db, cache_db, session_db:
|
async with volume_db, queue_db, cache_db, session_db, effects_db:
|
||||||
if 'guerilla' in sys.argv:
|
if 'guerilla' in sys.argv:
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
tokenpath = Path('.token.txt')
|
tokenpath = Path('.token.txt')
|
||||||
|
@ -1,13 +1,35 @@
|
|||||||
from typing import AsyncIterable
|
from typing import AsyncIterable, Optional
|
||||||
|
|
||||||
|
from ptvp35 import Db, KVJson
|
||||||
|
from v6d2ctx.context import Explicit
|
||||||
|
|
||||||
|
from v6d3music.config import myroot
|
||||||
from v6d3music.utils.effects_for_preset import effects_for_preset
|
from v6d3music.utils.effects_for_preset import effects_for_preset
|
||||||
from v6d3music.utils.entries_for_url import entries_for_url
|
from v6d3music.utils.entries_for_url import entries_for_url
|
||||||
from v6d3music.utils.info_tuple import info_tuple
|
from v6d3music.utils.info_tuple import info_tuple
|
||||||
from v6d3music.utils.options_for_effects import options_for_effects
|
from v6d3music.utils.options_for_effects import options_for_effects
|
||||||
|
from v6d3music.utils.presets import allowed_effects
|
||||||
from v6d3music.utils.sparq import sparq
|
from v6d3music.utils.sparq import sparq
|
||||||
|
|
||||||
|
|
||||||
async def entries_effects_for_args(args: list[str]) -> AsyncIterable[info_tuple]:
|
effects_db = Db(myroot / 'effects.db', kvrequest_type=KVJson)
|
||||||
|
|
||||||
|
|
||||||
|
def default_effects(gid: int) -> Optional[str]:
|
||||||
|
effects = effects_db.get(gid, None)
|
||||||
|
if effects in allowed_effects:
|
||||||
|
return effects
|
||||||
|
else:
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
async def set_default_effects(gid: int, effects: Optional[str]) -> None:
|
||||||
|
if effects is not None and effects not in allowed_effects:
|
||||||
|
raise Explicit('these effects are not allowed')
|
||||||
|
await effects_db.set(gid, effects)
|
||||||
|
|
||||||
|
|
||||||
|
async def entries_effects_for_args(args: list[str], gid: int) -> AsyncIterable[info_tuple]:
|
||||||
while args:
|
while args:
|
||||||
match args:
|
match args:
|
||||||
case [url, '-', effects, *args]:
|
case [url, '-', effects, *args]:
|
||||||
@ -15,7 +37,7 @@ async def entries_effects_for_args(args: list[str]) -> AsyncIterable[info_tuple]
|
|||||||
case [url, '+', preset, *args]:
|
case [url, '+', preset, *args]:
|
||||||
effects = effects_for_preset(preset)
|
effects = effects_for_preset(preset)
|
||||||
case [url, *args]:
|
case [url, *args]:
|
||||||
effects = None
|
effects = default_effects(gid)
|
||||||
case _:
|
case _:
|
||||||
raise RuntimeError
|
raise RuntimeError
|
||||||
seconds = 0
|
seconds = 0
|
||||||
|
@ -1,13 +1,16 @@
|
|||||||
|
normal = 'loudnorm=i=-12'
|
||||||
|
# _prefix = f'{normal},'
|
||||||
|
_prefix = f''
|
||||||
presets: dict[str, str] = {
|
presets: dict[str, str] = {
|
||||||
'cursed': 'aeval=val(0)*2*sin(440*t)+val(1)*2*cos(622*t)|val(1)*2*sin(622*t)+val(0)*2*cos(440*t)',
|
'cursed': 'aeval=val(0)*2*sin(440*t)+val(1)*2*cos(622*t)|val(1)*2*sin(622*t)+val(0)*2*cos(440*t)',
|
||||||
'bassboost': 'bass=g=10',
|
'bassboost': f'{_prefix}bass=g=10',
|
||||||
'bassbooboost': 'bass=g=30',
|
'bassbooboost': f'{_prefix}bass=g=30',
|
||||||
'nightcore': 'asetrate=67882',
|
'nightcore': f'{_prefix}asetrate=67882',
|
||||||
'daycore': 'atempo=.9,aecho=1.0:0.5:20:0.5',
|
'daycore': f'{_prefix}atempo=.9,aecho=1.0:0.5:20:0.5',
|
||||||
'пришествие анимешне': 'bass=g=15,asetrate=67882,bass=g=15',
|
'пришествие анимешне': 'bass=g=15,asetrate=67882,bass=g=15',
|
||||||
'difference': 'aeval=val(0)-val(1)|val(1)-val(0)',
|
'difference': 'aeval=val(0)-val(1)|val(1)-val(0)',
|
||||||
'mono': 'aeval=.5*val(0)+.5*val(1)|.5*val(1)+.5*val(0)',
|
'mono': f'{_prefix}aeval=.5*val(0)+.5*val(1)|.5*val(1)+.5*val(0)',
|
||||||
'normal': 'loudnorm=i=-12',
|
'normal': f'{normal}',
|
||||||
}
|
}
|
||||||
allowed_presets = ['bassboost', 'bassbooboost', 'nightcore', 'daycore', 'mono', 'normal', ]
|
allowed_presets = ['bassboost', 'bassbooboost', 'nightcore', 'daycore', 'mono', 'normal', ]
|
||||||
allowed_effects = {'', *(presets[key] for key in allowed_presets)}
|
allowed_effects = {'', *(presets[key] for key in allowed_presets)}
|
||||||
|
Loading…
Reference in New Issue
Block a user