mirror of
https://github.com/migatu/conjurer.git
synced 2026-07-17 07:12:09 +00:00
Compare commits
27 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 0e40741288 | |||
| 253122e671 | |||
| c0a0389d46 | |||
| 14693d9015 | |||
| 897a9c1313 | |||
| 96a106b477 | |||
| 37df223233 | |||
| 3cd6a850c4 | |||
| 74f1c5dead | |||
| b5caed0622 | |||
| 8cde1e741c | |||
| df347b71d3 | |||
| dc14794421 | |||
| 7383391902 | |||
| 59558ba1af | |||
| 3b8833cd3b | |||
| c043726ab2 | |||
| e44bc7f64a | |||
| 8f006b4323 | |||
| 97f0c7d33d | |||
| 1a75f5588d | |||
| 430a66c3ba | |||
| 4d8218003d | |||
| fbecb7f82e | |||
| 0134ce240f | |||
| 4cc828373b | |||
| a521724857 |
@@ -693,19 +693,17 @@ async def check_data_q():
|
|||||||
ctx = fresh_data.ctx
|
ctx = fresh_data.ctx
|
||||||
message += f' Dzielny poszukiwaczu @{searcher} w odpowiedzi na twoje zapytanie {query} nr {fresh_data.uuid}'
|
message += f' Dzielny poszukiwaczu @{searcher} w odpowiedzi na twoje zapytanie {query} nr {fresh_data.uuid}'
|
||||||
else:
|
else:
|
||||||
ctx = client.get_channel(1062047571557744721)
|
ctx = client.get_channel(1062047367337095268)
|
||||||
message += f' Mam wynik dla zapytania {fresh_data.uuid} ale że Hammer coś grzebał nie pamiętam kto to chciał i co chciał'
|
message += f' Mam wynik dla zapytania {fresh_data.uuid} ale że Hammer coś grzebał nie pamiętam kto to chciał i co chciał'
|
||||||
|
|
||||||
|
|
||||||
message += 'nasza biblioteka służy Ci odpowiedzią. Przy dźwięku fanfar winda się otwiera a w środku '
|
message += 'nasza biblioteka służy Ci odpowiedzią. Przy dźwięku fanfar winda się otwiera a w środku '
|
||||||
if len(entries)<1:
|
if len(entries)<1:
|
||||||
message += "niestety nie ma nic"
|
message += "niestety nie ma nic"
|
||||||
await ctx.send(message)
|
|
||||||
elif len(entries)>=1 and len(entries)<5:
|
elif len(entries)>=1 and len(entries)<5:
|
||||||
message += " znajduje się coś:\n"
|
message += " znajduje się coś:\n"
|
||||||
for item in entries:
|
for item in entries:
|
||||||
message+=item
|
message+=item
|
||||||
await ctx.send(message)
|
|
||||||
else:
|
else:
|
||||||
message+= " znajduje się cholernie dużo:\n"
|
message+= " znajduje się cholernie dużo:\n"
|
||||||
for item in entries:
|
for item in entries:
|
||||||
@@ -714,6 +712,7 @@ async def check_data_q():
|
|||||||
await ctx.send(message)
|
await ctx.send(message)
|
||||||
message = ""
|
message = ""
|
||||||
|
|
||||||
|
await ctx.send(message)
|
||||||
#Kept for sentimental reasons
|
#Kept for sentimental reasons
|
||||||
#await ctx.send(f"O. A tak będzie wyglądało coś ciekawego w przyszłości: {data}")
|
#await ctx.send(f"O. A tak będzie wyglądało coś ciekawego w przyszłości: {data}")
|
||||||
except Empty:
|
except Empty:
|
||||||
@@ -1065,15 +1064,11 @@ async def get_file(ctx, source, link):
|
|||||||
if source == "Spotify":
|
if source == "Spotify":
|
||||||
dir_path = None
|
dir_path = None
|
||||||
item_type, item_id = spotify.parse_spotify_url(link)
|
item_type, item_id = spotify.parse_spotify_url(link)
|
||||||
if item_type in ["album", "track", "playlist"] and item_id:
|
if item_id:
|
||||||
logger.info(item_type)
|
coro = asyncio.to_thread(spotify.fetch_tracks, spotify_ctrl, item_type, link)
|
||||||
logger.info(item_id)
|
file_list = await coro
|
||||||
logger.info("Spotify link provided")
|
coro = asyncio.to_thread(spotify.get_item_name, spotify_ctrl, item_type, item_id)
|
||||||
file_list = await asyncio.to_thread(spotify.fetch_tracks, spotify_ctrl, item_type, link)
|
directory_name = await coro
|
||||||
logger.info(file_list)
|
|
||||||
directory_name = await asyncio.to_thread(spotify.get_item_name, spotify_ctrl, item_type, item_id)
|
|
||||||
logger.info(directory_name)
|
|
||||||
logger.info("Spotify scrape done")
|
|
||||||
url_data = {"urls": []}
|
url_data = {"urls": []}
|
||||||
url_dict = {}
|
url_dict = {}
|
||||||
url_dict["save_path"] = Path(
|
url_dict["save_path"] = Path(
|
||||||
@@ -1083,7 +1078,6 @@ async def get_file(ctx, source, link):
|
|||||||
url_dict["songs"] = file_list
|
url_dict["songs"] = file_list
|
||||||
url_data["urls"].append(url_dict.copy())
|
url_data["urls"].append(url_dict.copy())
|
||||||
file_name_f = youtube_download.default_filename
|
file_name_f = youtube_download.default_filename
|
||||||
logger.info("YT-DL")
|
|
||||||
coro = asyncio.to_thread(
|
coro = asyncio.to_thread(
|
||||||
youtube_download.download_songs,
|
youtube_download.download_songs,
|
||||||
songs=url_data,
|
songs=url_data,
|
||||||
@@ -1099,7 +1093,6 @@ async def get_file(ctx, source, link):
|
|||||||
proxy="",
|
proxy="",
|
||||||
)
|
)
|
||||||
_ = await coro
|
_ = await coro
|
||||||
logger.info("YT-DL done")
|
|
||||||
dir_path = (url_dict["save_path"].resolve()).as_posix()
|
dir_path = (url_dict["save_path"].resolve()).as_posix()
|
||||||
if platform == "win32":
|
if platform == "win32":
|
||||||
dir_path = dir_path.replace("/", "\\")
|
dir_path = dir_path.replace("/", "\\")
|
||||||
@@ -1836,8 +1829,9 @@ async def wyczysc_ulubione(ctx):
|
|||||||
"""
|
"""
|
||||||
async with ctx.typing():
|
async with ctx.typing():
|
||||||
coroutine = asyncio.to_thread(
|
coroutine = asyncio.to_thread(
|
||||||
requests.get,
|
requests.post,
|
||||||
f"{FILE_SERVICE_ADDRESS}{CLEAR_PRIO}",
|
f"{FILE_SERVICE_ADDRESS}{CLEAR_PRIO}",
|
||||||
|
json={},
|
||||||
timeout=360,
|
timeout=360,
|
||||||
)
|
)
|
||||||
_ = await coroutine
|
_ = await coroutine
|
||||||
|
|||||||
@@ -102,19 +102,18 @@ def scan_incoming(_logger):
|
|||||||
try:
|
try:
|
||||||
answer = incoming_q.get(block=False)
|
answer = incoming_q.get(block=False)
|
||||||
_logger.info("DATA FOUND")
|
_logger.info("DATA FOUND")
|
||||||
record_stored = False
|
|
||||||
for record in awaiting_q:
|
for record in awaiting_q:
|
||||||
if record.uuid in answer.keys():
|
if record.uuid in answer.keys():
|
||||||
record_stored = True
|
|
||||||
record.stop = True
|
|
||||||
record.entries = answer[record.uuid]
|
|
||||||
IN_COMM_Q.put(record)
|
|
||||||
if not record_stored:
|
|
||||||
for key in answer.keys():
|
|
||||||
record = QueryControl("Orphaned", key, "Orphan", _logger, None)
|
|
||||||
record.stop = True
|
record.stop = True
|
||||||
record.entries = answer[record.uuid]
|
record.entries = answer[record.uuid]
|
||||||
IN_COMM_Q.put(record)
|
IN_COMM_Q.put(record)
|
||||||
|
else:
|
||||||
|
for key in answer.keys():
|
||||||
|
record = QueryControl("Orphaned", key, "Orphan", _logger, None)
|
||||||
|
record.stop = True
|
||||||
|
record.entries = answer[record.uuid]
|
||||||
|
record.uuid = "000000"
|
||||||
|
IN_COMM_Q.put(record)
|
||||||
except Empty:
|
except Empty:
|
||||||
time.sleep(1)
|
time.sleep(1)
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
habanero
|
habanero
|
||||||
waitress
|
waitress
|
||||||
flask[async]
|
flask
|
||||||
@@ -35,7 +35,7 @@ DATABASE_PATH = r"C:\\Database\\chunks\\"
|
|||||||
ENCODING = "utf-8"
|
ENCODING = "utf-8"
|
||||||
CHUNK = "_chunk.txt"
|
CHUNK = "_chunk.txt"
|
||||||
_sentinel = object()
|
_sentinel = object()
|
||||||
WORK_Q_SIZE = 35500000
|
WORK_Q_SIZE = 15500000
|
||||||
|
|
||||||
|
|
||||||
def producer(out_q, control_q, filename, _logger):
|
def producer(out_q, control_q, filename, _logger):
|
||||||
@@ -68,7 +68,7 @@ def producer(out_q, control_q, filename, _logger):
|
|||||||
|
|
||||||
|
|
||||||
# IMPORTANT!!! ONLY ONE CONSUMER THREAD AS WE ARE NOT PUTTING SENTINELS BACK
|
# IMPORTANT!!! ONLY ONE CONSUMER THREAD AS WE ARE NOT PUTTING SENTINELS BACK
|
||||||
def consumer(in_q, control_q, doi, live_results, result_list, control_dict, no, _logger):
|
def consumer(in_q, control_q, doi, live_results, result_list, control_dict, _logger):
|
||||||
"""
|
"""
|
||||||
Consumes items from an input queue and checks if DOI exists in the live results list.
|
Consumes items from an input queue and checks if DOI exists in the live results list.
|
||||||
|
|
||||||
@@ -79,34 +79,29 @@ def consumer(in_q, control_q, doi, live_results, result_list, control_dict, no,
|
|||||||
live_results (list): List to store the search results.
|
live_results (list): List to store the search results.
|
||||||
_logger: Logger object for logging.
|
_logger: Logger object for logging.
|
||||||
"""
|
"""
|
||||||
_logger.info("Consumer thread started:%s", no)
|
|
||||||
for item in doi:
|
for item in doi:
|
||||||
result_list.append({"DOI": item[0], "exists": False, "data": item[1]})
|
result_list.append({"DOI": item[0], "exists": False, "data": item[1]})
|
||||||
while True:
|
while True:
|
||||||
done_check = True
|
done_check = True
|
||||||
try:
|
data = in_q.get()
|
||||||
data = in_q.get(block=False)
|
if data is _sentinel:
|
||||||
if data is _sentinel:
|
_logger.info("Worker finished")
|
||||||
_logger.info("Worker finished")
|
control_dict["sentinels"] += 1
|
||||||
control_dict["sentinels"] += 1
|
else:
|
||||||
else:
|
for item in result_list:
|
||||||
for item in result_list:
|
if item["DOI"] in data and not item["exists"]:
|
||||||
if item["DOI"] in data and not item["exists"]:
|
_logger.info(data)
|
||||||
_logger.info(data)
|
_logger.info("HIT")
|
||||||
_logger.info("HIT")
|
item["exists"] = True
|
||||||
item["exists"] = True
|
live_results.append(item)
|
||||||
live_results.append(item)
|
done_check = done_check and item["exists"]
|
||||||
done_check = done_check and item["exists"]
|
if done_check:
|
||||||
if done_check:
|
control_q.put(_sentinel)
|
||||||
control_q.put(_sentinel)
|
|
||||||
except Empty:
|
|
||||||
pass
|
|
||||||
if control_dict["sentinels"] >= MAXTHREADS:
|
if control_dict["sentinels"] >= MAXTHREADS:
|
||||||
_logger.info("All workers finished")
|
_logger.info("All workers finished")
|
||||||
break
|
break
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def search_for_doi(doi, live_results, _logger):
|
def search_for_doi(doi, live_results, _logger):
|
||||||
"""
|
"""
|
||||||
Search for DOI in live_results using _logger for logging.
|
Search for DOI in live_results using _logger for logging.
|
||||||
@@ -121,9 +116,9 @@ def search_for_doi(doi, live_results, _logger):
|
|||||||
threads = []
|
threads = []
|
||||||
work_q = Queue(maxsize=WORK_Q_SIZE)
|
work_q = Queue(maxsize=WORK_Q_SIZE)
|
||||||
control_q = Queue()
|
control_q = Queue()
|
||||||
for i in range (0, (len(doi)//1000)+2):
|
for _ in range (1, len(doi)//1000+1):
|
||||||
t_cons = Thread(
|
t_cons = Thread(
|
||||||
target=consumer, args=(work_q, control_q, doi, live_results, result_list, control_dict, i, _logger)
|
target=consumer, args=(work_q, control_q, doi, live_results, result_list, control_dict, _logger)
|
||||||
)
|
)
|
||||||
_logger.info("Consumer thread created")
|
_logger.info("Consumer thread created")
|
||||||
threads.append(t_cons)
|
threads.append(t_cons)
|
||||||
|
|||||||
@@ -1,45 +0,0 @@
|
|||||||
import asyncio
|
|
||||||
import json
|
|
||||||
import logging
|
|
||||||
from json.decoder import JSONDecodeError
|
|
||||||
from logging import handlers
|
|
||||||
import requests
|
|
||||||
|
|
||||||
MAIN_BOT_ADDRESS = "http://192.168.1.191:5000"
|
|
||||||
SEND_RESULTS = "/conjurer"
|
|
||||||
|
|
||||||
async def send_results():
|
|
||||||
logger = logging.getLogger()
|
|
||||||
logger.setLevel(logging.DEBUG)
|
|
||||||
h1 = handlers.RotatingFileHandler(
|
|
||||||
filename="D:\\logs\\librarian.log",
|
|
||||||
encoding="utf-8",
|
|
||||||
mode="a",
|
|
||||||
maxBytes=6 * 1024 * 1024,
|
|
||||||
backupCount=6,
|
|
||||||
)
|
|
||||||
|
|
||||||
logger.addHandler(h1)
|
|
||||||
|
|
||||||
with open("s_results.json", "r+", encoding="utf-8") as s_file:
|
|
||||||
try:
|
|
||||||
database = json.load(s_file)
|
|
||||||
except JSONDecodeError:
|
|
||||||
pass
|
|
||||||
result = database["4bacbca0-ce3b-45c6-90a1-05c70b46b740"]
|
|
||||||
result = {"4bacbca0-ce3b-45c6-90a1-05c70b46b740":result}
|
|
||||||
|
|
||||||
coroutine = asyncio.to_thread(
|
|
||||||
requests.post,
|
|
||||||
f"{MAIN_BOT_ADDRESS}{SEND_RESULTS}",
|
|
||||||
json=result,
|
|
||||||
timeout=360,
|
|
||||||
)
|
|
||||||
logger.info("SENT")
|
|
||||||
result = await coroutine
|
|
||||||
logger.info(result.status_code)
|
|
||||||
logger.info("SEND CONFIRMED")
|
|
||||||
async def main():
|
|
||||||
await send_results()
|
|
||||||
if __name__ == "__main__":
|
|
||||||
asyncio.run(main())
|
|
||||||
@@ -41,6 +41,41 @@ if platform in ("linux", "linux2"):
|
|||||||
music_file_list = []
|
music_file_list = []
|
||||||
priority_list = []
|
priority_list = []
|
||||||
|
|
||||||
|
|
||||||
|
def create_playlist():
|
||||||
|
"""
|
||||||
|
Reads a JSON file containing a playlist and writes the playlist items to a text file.
|
||||||
|
|
||||||
|
The JSON file path is '/home/pi/Conjurer/playlist.json',
|
||||||
|
and the text file path is '/home/pi/Conjurer/all_playlist.playlist'.
|
||||||
|
|
||||||
|
Raises:
|
||||||
|
JSONDecodeError: If the JSON file cannot be decoded.
|
||||||
|
|
||||||
|
"""
|
||||||
|
with open("/home/pi/Conjurer/playlist.json", "r+", encoding="utf-8") as r_file:
|
||||||
|
with open(
|
||||||
|
"/home/pi/Conjurer/all_playlist.playlist", "w", encoding="utf-8"
|
||||||
|
) as w_file:
|
||||||
|
try:
|
||||||
|
playlist = json.load(r_file)
|
||||||
|
for item in playlist:
|
||||||
|
w_file.write(item)
|
||||||
|
w_file.write("\n")
|
||||||
|
except json.JSONDecodeError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
with open("/home/pi/Conjurer/prio_playlist.json", "r+", encoding="utf-8") as r_file:
|
||||||
|
with open("/home/pi/Conjurer/hit.playlist", "w", encoding="utf-8") as w_file:
|
||||||
|
try:
|
||||||
|
playlist = json.load(r_file)
|
||||||
|
for item in playlist:
|
||||||
|
w_file.write(item)
|
||||||
|
w_file.write("\n")
|
||||||
|
except json.JSONDecodeError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
def rescan():
|
def rescan():
|
||||||
"""
|
"""
|
||||||
The `rescan` function logs a message, scans for mp3 files in a specified folder,
|
The `rescan` function logs a message, scans for mp3 files in a specified folder,
|
||||||
@@ -60,22 +95,18 @@ def rescan():
|
|||||||
temp_music_file = temp_music_file.replace("/", "\\")
|
temp_music_file = temp_music_file.replace("/", "\\")
|
||||||
priority_list.append(temp_music_file)
|
priority_list.append(temp_music_file)
|
||||||
|
|
||||||
with open(
|
with open("/home/pi/Conjurer/playlist.json", "r+", encoding="utf-8") as s_file:
|
||||||
"/home/pi/Conjurer/all_playlist.playlist", "w", encoding="utf-8"
|
database = music_file_list
|
||||||
) as w_file:
|
# self.app.logger.info("DUMPING DATA")
|
||||||
try:
|
s_file.truncate(0)
|
||||||
for item in music_file_list:
|
s_file.seek(0)
|
||||||
w_file.write(item)
|
json.dump(database, s_file)
|
||||||
w_file.write("\n")
|
with open("/home/pi/Conjurer/prio_playlist.json", "r+", encoding="utf-8") as s_file:
|
||||||
except json.JSONDecodeError:
|
# self.app.logger.info("DUMPING DATA")
|
||||||
pass
|
s_file.truncate(0)
|
||||||
with open("/home/pi/Conjurer/hit.playlist", "w", encoding="utf-8") as w_file:
|
s_file.seek(0)
|
||||||
try:
|
json.dump(priority_list, s_file)
|
||||||
for item in priority_list:
|
create_playlist()
|
||||||
w_file.write(item)
|
|
||||||
w_file.write("\n")
|
|
||||||
except json.JSONDecodeError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
def thread_rescan():
|
def thread_rescan():
|
||||||
@@ -282,10 +313,10 @@ def clear_pr_pls():
|
|||||||
|
|
||||||
:return: A JSON response indicating the success of the operation.
|
:return: A JSON response indicating the success of the operation.
|
||||||
"""
|
"""
|
||||||
app.logger.info("CLEARING PLAYLIST")
|
with open(
|
||||||
with open('/home/pi/Conjurer/priority_queue.playlist', 'w', encoding='utf-8') as cleared_pl:
|
"/home/pi/Conjurer/priority_queue.playlist", "w", encoding="utf-8"
|
||||||
cleared_pl.write('')
|
) as s_file:
|
||||||
|
s_file.truncate(0)
|
||||||
return_data = jsonify(isError=False, message="Success", statusCode=200, data=[])
|
return_data = jsonify(isError=False, message="Success", statusCode=200, data=[])
|
||||||
return return_data, 200
|
return return_data, 200
|
||||||
|
|
||||||
|
|||||||
@@ -5,156 +5,135 @@
|
|||||||
# Load icecast credentials from a JSON file
|
# Load icecast credentials from a JSON file
|
||||||
let json.parse credentials = file.contents("/home/pi/Conjurer/icecast_credentials.json")
|
let json.parse credentials = file.contents("/home/pi/Conjurer/icecast_credentials.json")
|
||||||
|
|
||||||
# Enable replaygain metadata processing
|
# Enable replaygain metadata processing
|
||||||
enable_replaygain_metadata()
|
enable_replaygain_metadata()
|
||||||
|
l = playlog(duration = 14400.0, persistency="/home/pi/Conjurer/persistence.log")
|
||||||
# Set up a playlog for tracking played tracks
|
def check(r)
|
||||||
l = playlog(duration = 14400.0, persistency="/home/pi/Conjurer/persistence.log")
|
m = request.metadata(r)
|
||||||
|
if l.last(m) < 3600. then
|
||||||
# Function to check if a track can be played based on its metadata
|
log.info("Rejecting #{m['filename']} (played #{l.last(m)}s ago).")
|
||||||
def check(r)
|
false
|
||||||
m = request.metadata(r)
|
else
|
||||||
if l.last(m) < 3600. then
|
l.add(m)
|
||||||
log.info("Rejecting #{m['filename']} (played #{l.last(m)}s ago).")
|
true
|
||||||
false
|
end
|
||||||
else
|
|
||||||
l.add(m)
|
|
||||||
true
|
|
||||||
end
|
end
|
||||||
end
|
|
||||||
|
|
||||||
# Define playlists to be used in the stream
|
|
||||||
s1 = replaygain(playlist(reload_mode="watch", check_next=check, "/home/pi/Conjurer/all_playlist.playlist"))
|
|
||||||
s2 = replaygain(playlist(reload_mode="watch", check_next=check, "/home/pi/Conjurer/priority_queue.playlist"))
|
|
||||||
s3 = replaygain(playlist(reload_mode="watch", check_next=check, "/home/pi/Conjurer/hit.playlist"))
|
|
||||||
|
|
||||||
# Create a request queue for user-generated requests
|
|
||||||
requests_queue = request.queue()
|
|
||||||
|
|
||||||
# Function to process the request queue and add new requests
|
# Define playlists to be used in the stream
|
||||||
def queue_processing()
|
s1 = replaygain(playlist(reload_mode="watch", check_next=check, "/home/pi/Conjurer/all_playlist.playlist"))
|
||||||
f1=file.read("/home/pi/Conjurer/request.playlist")
|
s2 = replaygain(playlist(reload_mode="watch", check_next=check, "/home/pi/Conjurer/priority_queue.playlist"))
|
||||||
text = f1()
|
s3 = replaygain(playlist(reload_mode="watch", check_next=check, "/home/pi/Conjurer/hit.playlist"))
|
||||||
if text != "" then
|
requests_queue = request.queue()
|
||||||
requests_queue.push.uri(text)
|
def queue_processing()
|
||||||
file.remove("/home/pi/Conjurer/request.playlist")
|
f1=file.read("/home/pi/Conjurer/request.playlist")
|
||||||
f = file.open("/home/pi/Conjurer/request.playlist", create=true)
|
text = f1()
|
||||||
f.close()
|
if text != "" then
|
||||||
log.info("done")
|
requests_queue.push.uri(text)
|
||||||
else
|
file.remove("/home/pi/Conjurer/request.playlist")
|
||||||
log.info("no requests")
|
f = file.open("/home/pi/Conjurer/request.playlist", create=true)
|
||||||
|
f.close()
|
||||||
|
log.info("done")
|
||||||
|
else
|
||||||
|
log.info("no requests")
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
thread.run(every=60., queue_processing)
|
||||||
|
|
||||||
# Randomly select a playlist with weights
|
# Randomly select a playlist with weights
|
||||||
s4 = random(id="randomizer", weights=[1, 3, 2], [s1, s2, s3])
|
s = random(id="randomizer", weights=[1, 3, 2], [s1, s2, s3])
|
||||||
|
#s = delay(duration=5., s)
|
||||||
|
#radio = add([delay(1800., jingles), music])
|
||||||
|
#radio = fallback([delay(1800., jingles), music])
|
||||||
|
#p = predicate.signal()
|
||||||
|
#radio = switch([(p, jingles), ({true}, music)])
|
||||||
|
#thread.run(every=1200., {p.signal()})
|
||||||
|
# def cmd(_)
|
||||||
|
# p.signal()
|
||||||
|
# "Jingle inserted!"
|
||||||
|
# end
|
||||||
|
# server.register("insert_jingle", cmd)
|
||||||
|
|
||||||
# Load jingles playlist
|
# Set up an interactive harbor for controlling the stream
|
||||||
jingles = (playlist(reload_mode="watch", "/home/pi/Conjurer/jingles.playlist"))
|
interactive.harbor(port = 9999)
|
||||||
|
# Set up interactive controls for bass boost
|
||||||
|
f = interactive.float("f", description="Frequency", min=0., max=1000., unit="Hz", 200.)
|
||||||
|
g = interactive.float("g", description="Gain", min=0., max=20., unit="dB", 8.)
|
||||||
|
b = bass_boost(frequency=f, gain=g, s)
|
||||||
|
s = add([s, b])
|
||||||
|
# Set up interactive control for main volume
|
||||||
|
a = interactive.float("main_volume", min=0., max=20., 1.)
|
||||||
|
s = compress.multiband.interactive(bands=3, s)
|
||||||
|
|
||||||
# Create the main stream with random playlist and jingles
|
# Apply audio processing effects
|
||||||
s = rotate(id="randomizer", weights=[20, 1], [s4, jingles])
|
s = nrj(normalize(s))
|
||||||
|
s = crossfade(fade_out=3., fade_in=3., duration=5., s)
|
||||||
|
s = amplify(a, s)
|
||||||
|
|
||||||
# Set up an interactive harbor for controlling the stream
|
# Skip blank sections in the stream
|
||||||
interactive.harbor(port = 9999)
|
s = blank.skip(max_blank=2., s)
|
||||||
|
|
||||||
# Set up interactive controls for bass boost
|
# Configure logging settings
|
||||||
f = interactive.float("f", description="Frequency", min=0., max=1000., unit="Hz", 200.)
|
log_to_stdout = true
|
||||||
g = interactive.float("g", description="Gain", min=0., max=20., unit="dB", 8.)
|
log_to_file = true
|
||||||
b = bass_boost(frequency=f, gain=g, s)
|
logpath = "/home/pi/Conjurer/radio_log.log"
|
||||||
s = add([s, b])
|
loglevel = 4
|
||||||
|
set("log.stdout", log_to_stdout)
|
||||||
|
set("log.level", loglevel)
|
||||||
|
|
||||||
# Set up interactive control for main volume
|
# Enable logging to file
|
||||||
a = interactive.float("main_volume", min=0., max=20., 1.)
|
set("log.file", log_to_file)
|
||||||
s = compress.multiband.interactive(bands=3, s)
|
set("log.file.path", logpath)
|
||||||
|
|
||||||
# Apply audio processing effects
|
# Set up emergency fallback track
|
||||||
s = nrj(normalize(s))
|
emergency = single("/home/pi/RetroPie/mp3/Youtube/Dr. Peacock - Trip to Ireland [GvrvQTUbUcA].mp3")
|
||||||
s = amplify(a, s)
|
|
||||||
|
|
||||||
# Skip blank sections in the stream
|
# Create a fallback stream with the main stream and emergency track
|
||||||
s = blank.skip(max_blank=2., s)
|
radio = fallback(id="switcher", track_sensitive=true, [requests_queue, s, emergency])
|
||||||
|
|
||||||
# Configure logging settings
|
# Handle metadata events
|
||||||
log_to_stdout = true
|
handle_metadata = fun (m) -> begin
|
||||||
log_to_file = true
|
log.info(m["title"])
|
||||||
logpath = "/home/pi/Conjurer/radio_log.log"
|
log.info(m["artist"])
|
||||||
loglevel = 4
|
log.info(m["filename"])
|
||||||
set("log.stdout", log_to_stdout)
|
|
||||||
set("log.level", loglevel)
|
|
||||||
|
|
||||||
# Enable logging to file
|
|
||||||
set("log.file", log_to_file)
|
|
||||||
set("log.file.path", logpath)
|
|
||||||
|
|
||||||
# Set up emergency fallback track
|
|
||||||
emergency = single("/home/pi/RetroPie/mp3/Youtube/Dr. Peacock - Trip to Ireland [GvrvQTUbUcA].mp3")
|
|
||||||
|
|
||||||
# Create a fallback stream with the main stream and emergency track
|
|
||||||
cross_s = crossfade(fade_out=3., fade_in=3., duration=5., fallback(id="switcher", track_sensitive=false, [requests_queue, s]))
|
|
||||||
radio = fallback(id="switcher2", track_sensitive=false, [cross_s, emergency])
|
|
||||||
|
|
||||||
# Function to process the request queue and skip the current track if requested
|
|
||||||
def check_skip()
|
|
||||||
if p() then
|
|
||||||
log.info("Skipping current track.")
|
|
||||||
radio.skip()
|
|
||||||
p.set(false)
|
|
||||||
end
|
end
|
||||||
end
|
radio.on_metadata(handle_metadata)
|
||||||
|
|
||||||
# Run the queue processing function every 60 seconds
|
# Enable persistent script parameters
|
||||||
thread.run(every=60., queue_processing)
|
interactive.persistent("script.params")
|
||||||
|
|
||||||
# Set up an interactive control for skipping tracks
|
# Configure output formats and destinations
|
||||||
p = interactive.bool("r1", false)
|
output.file.hls("/tmp/hls", [("mp3-low", %mp3(bitrate=96)), ("mp3-hi", %mp3(bitrate=160))], radio)
|
||||||
|
output.icecast(%mp3, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="mp3-stream", radio)
|
||||||
# Run the check_skip function every 5 seconds
|
# output.icecast(%opus, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="opus-stream", radio)
|
||||||
thread.run(every=5., check_skip)
|
# output.icecast(%ogg, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="ogg-stream", radio)
|
||||||
|
# output.icecast(%aac, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="aac-stream", radio)
|
||||||
# Handle metadata events
|
# output.icecast(%flac, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="flac-stream", radio)
|
||||||
handle_metadata = fun (m) -> begin
|
# output.icecast(%vorbis, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="vorbis-stream", radio)
|
||||||
log.info(m["title"])
|
# output.icecast(%speex, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="speex-stream", radio)
|
||||||
log.info(m["artist"])
|
# output.icecast(%wav, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="wav-stream", radio)
|
||||||
log.info(m["filename"])
|
# output.icecast(%pcm, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="pcm-stream", radio)
|
||||||
end
|
# output.icecast(%raw, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="raw-stream", radio)
|
||||||
radio.on_metadata(handle_metadata)
|
# output.icecast(%s16l, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="s16l-stream", radio)
|
||||||
|
# output.icecast(%s16b, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="s16b-stream", radio)
|
||||||
# Enable persistent script parameters
|
# output.icecast(%s24l, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="s24l-stream", radio)
|
||||||
interactive.persistent("script.params")
|
# output.icecast(%s24b, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="s24b-stream", radio)
|
||||||
|
# output.icecast(%s32l, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="s32l-stream", radio)
|
||||||
# Configure output formats and destinations
|
# output.icecast(%s32b, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="s32b-stream", radio)
|
||||||
output.file.hls("/tmp/hls", [("mp3-low", %mp3(bitrate=96)), ("mp3-hi", %mp3(bitrate=160))], radio)
|
# output.icecast(%s64l, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="s64l-stream", radio)
|
||||||
output.icecast(%mp3, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="mp3-stream", radio)
|
# output.icecast(%s64b, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="s64b-stream", radio)
|
||||||
# Uncomment the following lines to enable additional output formats
|
# output.icecast(%s128l, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="s128l-stream", radio)
|
||||||
# output.icecast(%opus, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="opus-stream", radio)
|
# output.icecast(%s128b, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="s128b-stream", radio)
|
||||||
# output.icecast(%ogg, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="ogg-stream", radio)
|
# output.icecast(%s256l, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="s256l-stream", radio)
|
||||||
# output.icecast(%aac, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="aac-stream", radio)
|
# output.icecast(%s256b, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="s256b-stream", radio)
|
||||||
# output.icecast(%flac, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="flac-stream", radio)
|
# output.icecast(%s512l, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="s512l-stream", radio)
|
||||||
# output.icecast(%vorbis, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="vorbis-stream", radio)
|
# output.icecast(%s512b, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="s512b-stream", radio)
|
||||||
# output.icecast(%speex, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="speex-stream", radio)
|
# output.icecast(%s1024l, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="s1024l-stream", radio)
|
||||||
# output.icecast(%wav, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="wav-stream", radio)
|
# output.icecast(%s1024b, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="s1024b-stream", radio)
|
||||||
# output.icecast(%pcm, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="pcm-stream", radio)
|
# output.icecast(%s2048l, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="s2048l-stream", radio)
|
||||||
# output.icecast(%raw, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="raw-stream", radio)
|
# output.icecast(%s2048b, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="s2048b-stream", radio)
|
||||||
# output.icecast(%s16l, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="s16l-stream", radio)
|
# output.icecast(%s4096l, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="s4096l-stream", radio)
|
||||||
# output.icecast(%s16b, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="s16b-stream", radio)
|
# output.icecast(%s4096b, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="s4096b-stream", radio)
|
||||||
# output.icecast(%s24l, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="s24l-stream", radio)
|
# output.icecast(%s8192l, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="s8192l-stream", radio)
|
||||||
# output.icecast(%s24b, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="s24b-stream", radio)
|
# output.icecast(%s8192b, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="s8192b-stream", radio)
|
||||||
# output.icecast(%s32l, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="s32l-stream", radio)
|
|
||||||
# output.icecast(%s32b, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="s32b-stream", radio)
|
|
||||||
# output.icecast(%s64l, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="s64l-stream", radio)
|
|
||||||
# output.icecast(%s64b, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="s64b-stream", radio)
|
|
||||||
# output.icecast(%s128l, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="s128l-stream", radio)
|
|
||||||
# output.icecast(%s128b, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="s128b-stream", radio)
|
|
||||||
# output.icecast(%s256l, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="s256l-stream", radio)
|
|
||||||
# output.icecast(%s256b, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="s256b-stream", radio)
|
|
||||||
# output.icecast(%s512l, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="s512l-stream", radio)
|
|
||||||
# output.icecast(%s512b, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="s512b-stream", radio)
|
|
||||||
# output.icecast(%s1024l, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="s1024l-stream", radio)
|
|
||||||
# output.icecast(%s1024b, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="s1024b-stream", radio)
|
|
||||||
# output.icecast(%s2048l, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="s2048l-stream", radio)
|
|
||||||
# output.icecast(%s2048b, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="s2048b-stream", radio)
|
|
||||||
# output.icecast(%s4096l, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="s4096l-stream", radio)
|
|
||||||
# output.icecast(%s4096b, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="s4096b-stream", radio)
|
|
||||||
# output.icecast(%s8192l, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="s8192l-stream", radio)
|
|
||||||
# output.icecast(%s8192b, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="s8192b-stream", radio)
|
|
||||||
|
|||||||
@@ -204,13 +204,6 @@
|
|||||||
false,
|
false,
|
||||||
false
|
false
|
||||||
],
|
],
|
||||||
"same plusy\\b": [
|
|
||||||
"Jak na cmentarzu Szefie. Jak na cmentarzu",
|
|
||||||
15.0,
|
|
||||||
0,
|
|
||||||
false,
|
|
||||||
false
|
|
||||||
],
|
|
||||||
"kld\\b": [
|
"kld\\b": [
|
||||||
"KLD? Mieli tam burdel większy niż u Hammera. Ale o ile Hammer sprzątnął już nawet całkiem nieźle - to tam śmieci wyniosły się same. Uczcijmy ich minutą śmiechu.",
|
"KLD? Mieli tam burdel większy niż u Hammera. Ale o ile Hammer sprzątnął już nawet całkiem nieźle - to tam śmieci wyniosły się same. Uczcijmy ich minutą śmiechu.",
|
||||||
15.0,
|
15.0,
|
||||||
|
|||||||
@@ -239,8 +239,6 @@ def get_item_name(sp, item_type, item_id):
|
|||||||
name = sp.album(album_id=item_id).get("name")
|
name = sp.album(album_id=item_id).get("name")
|
||||||
elif item_type == "track":
|
elif item_type == "track":
|
||||||
name = sp.track(track_id=item_id).get("name")
|
name = sp.track(track_id=item_id).get("name")
|
||||||
elif item_type == "artist_top_tracks":
|
|
||||||
name = sp.artist_top_tracks(artist_id=item_id).get("name")
|
|
||||||
return sanitize(name)
|
return sanitize(name)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user