mirror of
https://github.com/migatu/conjurer.git
synced 2026-07-14 21:38:38 +00:00
Merge branch 'main' of https://github.com/migatu/conjurer
This commit is contained in:
@@ -929,17 +929,17 @@ async def handle_response(
|
|||||||
"Rozmiar zapytania przed dodaniem historii %s", chat_gpt_config_request_size
|
"Rozmiar zapytania przed dodaniem historii %s", chat_gpt_config_request_size
|
||||||
)
|
)
|
||||||
if request_type == "MUSIC":
|
if request_type == "MUSIC":
|
||||||
algorithm = "gpt-3.5-turbo-0125"
|
algorithm = "gpt-4o"
|
||||||
table = message_table_muzyka
|
table = message_table_muzyka
|
||||||
token_amount = 10700
|
token_amount = 10700
|
||||||
elif request_type == "RANDOM":
|
elif request_type == "RANDOM":
|
||||||
algorithm = "gpt-3.5-turbo-0125"
|
algorithm = "gpt-4o"
|
||||||
table = MESSAGE_TABLE
|
table = MESSAGE_TABLE
|
||||||
token_amount = 10700
|
token_amount = 10700
|
||||||
else:
|
else:
|
||||||
table = MESSAGE_TABLE
|
table = MESSAGE_TABLE
|
||||||
algorithm = "gpt-4"
|
algorithm = "gpt-4o"
|
||||||
token_amount = 7000
|
token_amount = 10700
|
||||||
|
|
||||||
prompt_gpt_request_size = num_tokens_from_string(
|
prompt_gpt_request_size = num_tokens_from_string(
|
||||||
{"role": "user", "content": final_prompt}, "gpt-4"
|
{"role": "user", "content": final_prompt}, "gpt-4"
|
||||||
@@ -1021,26 +1021,33 @@ async def handle_response(
|
|||||||
logger.info(result)
|
logger.info(result)
|
||||||
temp = {"role": "assistant", "content": result}
|
temp = {"role": "assistant", "content": result}
|
||||||
history.append(temp)
|
history.append(temp)
|
||||||
if request_type:
|
if request_type == "MUSIC":
|
||||||
with open(MEMORY_FIVE_MUZYKA, "r+", encoding=ENCODING) as file:
|
with open(MEMORY_FIVE_MUZYKA, "r+", encoding=ENCODING) as file_music_memory:
|
||||||
# First we load existing data into a dict.
|
# First we load existing data into a dict.
|
||||||
file_data = json.load(file)
|
file_data = json.load(file_music_memory)
|
||||||
# Join new_data with file_data inside emp_details
|
# Join new_data with file_data inside emp_details
|
||||||
file_data.append(temp)
|
file_data.append(temp)
|
||||||
# Sets file's current position at offset.
|
file_music_memory.seek(0)
|
||||||
file.seek(0)
|
|
||||||
# convert back to json.
|
# convert back to json.
|
||||||
json.dump(file_data, file, indent=4)
|
json.dump(file_data, file_music_memory, indent=4)
|
||||||
|
elif request_type == "RANDOM":
|
||||||
|
with open(MEMORY_FIVE_SIARA, "r+", encoding=ENCODING) as file_memory:
|
||||||
|
# First we load existing data into a dict.
|
||||||
|
file_data = json.load(file_memory)
|
||||||
|
# Join new_data with file_data inside emp_details
|
||||||
|
file_data.append(temp)
|
||||||
|
file_memory.seek(0)
|
||||||
|
# convert back to json.
|
||||||
|
json.dump(file_data, file_memory, indent=4)
|
||||||
else:
|
else:
|
||||||
with open(MEMORY_FIVE_SIARA, "r+", encoding=ENCODING) as file:
|
with open(MEMORY_FIVE_SIARA, "r+", encoding=ENCODING) as file_memory:
|
||||||
# First we load existing data into a dict.
|
# First we load existing data into a dict.
|
||||||
file_data = json.load(file)
|
file_data = json.load(file_memory)
|
||||||
# Join new_data with file_data inside emp_details
|
# Join new_data with file_data inside emp_details
|
||||||
file_data.append(temp)
|
file_data.append(temp)
|
||||||
# Sets file's current position at offset.
|
file_memory.seek(0)
|
||||||
file.seek(0)
|
|
||||||
# convert back to json.
|
# convert back to json.
|
||||||
json.dump(file_data, file, indent=4)
|
json.dump(file_data, file_memory, indent=4)
|
||||||
return result, MESSAGE_TABLE
|
return result, MESSAGE_TABLE
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -14,8 +14,7 @@ from logging import handlers
|
|||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from platform import uname
|
from platform import uname
|
||||||
from sys import platform
|
from sys import platform
|
||||||
|
from flask import Flask, jsonify, redirect, request, send_from_directory, render_template
|
||||||
from flask import Flask, jsonify, redirect, request, send_from_directory
|
|
||||||
from waitress import serve
|
from waitress import serve
|
||||||
|
|
||||||
HOST_ADDRESS = "192.168.1.15"
|
HOST_ADDRESS = "192.168.1.15"
|
||||||
@@ -246,8 +245,9 @@ def stream_music():
|
|||||||
|
|
||||||
:return: A JSON response containing a key "music_file_list" with the value of the variable `music_file_list`.
|
:return: A JSON response containing a key "music_file_list" with the value of the variable `music_file_list`.
|
||||||
"""
|
"""
|
||||||
return send_from_directory("/tmp/hls", "stream.m3u8")
|
|
||||||
|
|
||||||
|
#return send_from_directory("/tmp/hls", "stream.m3u8")
|
||||||
|
return render_template("/home/pi/Conjurer/stream.html")
|
||||||
|
|
||||||
@app.route("/<string:file_name>")
|
@app.route("/<string:file_name>")
|
||||||
def stream(file_name):
|
def stream(file_name):
|
||||||
@@ -260,10 +260,10 @@ def stream(file_name):
|
|||||||
Returns:
|
Returns:
|
||||||
Response: The response containing the streamed file.
|
Response: The response containing the streamed file.
|
||||||
"""
|
"""
|
||||||
|
# trunk-ignore(bandit/B108)
|
||||||
video_dir = "/tmp/hls"
|
video_dir = "/tmp/hls"
|
||||||
return send_from_directory(video_dir, file_name)
|
return send_from_directory(video_dir, file_name)
|
||||||
|
|
||||||
|
|
||||||
@app.route("/stream_mp3", methods=["GET"])
|
@app.route("/stream_mp3", methods=["GET"])
|
||||||
def stream_music_mp3():
|
def stream_music_mp3():
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -0,0 +1,26 @@
|
|||||||
|
# This Python file uses the following encoding: utf-8
|
||||||
|
"""This module contains utility scripts used by musi radiostation Conjurer"""
|
||||||
|
import time
|
||||||
|
import re
|
||||||
|
|
||||||
|
NAME = "/home/pi/Conjurer/persistence.log"
|
||||||
|
|
||||||
|
def print_top():
|
||||||
|
"""
|
||||||
|
Prints the top 65 lines from a file specified by the NAME variable.
|
||||||
|
"""
|
||||||
|
while True:
|
||||||
|
line = ""
|
||||||
|
buffer = ""
|
||||||
|
with open(NAME, "r", encoding="utf-8") as f:
|
||||||
|
for _ in range (45):
|
||||||
|
line = f.readline()
|
||||||
|
if re.match(".*mp3", line):
|
||||||
|
buffer += line
|
||||||
|
print("=====================================")
|
||||||
|
print(buffer)
|
||||||
|
print("=====================================")
|
||||||
|
time.sleep(180)
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
print_top()
|
||||||
@@ -7,10 +7,15 @@ let json.parse credentials = file.contents("/home/pi/Conjurer/icecast_credentia
|
|||||||
|
|
||||||
# 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
|
||||||
|
|
||||||
|
l = playlog(duration = 72000.0, persistency="/home/pi/Conjurer/persistence.log")
|
||||||
|
|
||||||
|
# Function to check if a track can be played based on its metadata
|
||||||
def check(r)
|
def check(r)
|
||||||
m = request.metadata(r)
|
m = request.metadata(r)
|
||||||
if l.last(m) < 3600. then
|
if l.last(m) < 36000. then
|
||||||
log.info("Rejecting #{m['filename']} (played #{l.last(m)}s ago).")
|
log.info("Rejecting #{m['filename']} (played #{l.last(m)}s ago).")
|
||||||
false
|
false
|
||||||
else
|
else
|
||||||
@@ -19,13 +24,15 @@ let json.parse credentials = file.contents("/home/pi/Conjurer/icecast_credentia
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Define playlists to be used in the stream
|
# Define playlists to be used in the stream
|
||||||
s1 = replaygain(playlist(reload_mode="watch", check_next=check, "/home/pi/Conjurer/all_playlist.playlist"))
|
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"))
|
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"))
|
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()
|
requests_queue = request.queue()
|
||||||
|
|
||||||
|
# Function to process the request queue and add new requests
|
||||||
def queue_processing()
|
def queue_processing()
|
||||||
f1=file.read("/home/pi/Conjurer/request.playlist")
|
f1=file.read("/home/pi/Conjurer/request.playlist")
|
||||||
text = f1()
|
text = f1()
|
||||||
@@ -34,41 +41,46 @@ let json.parse credentials = file.contents("/home/pi/Conjurer/icecast_credentia
|
|||||||
file.remove("/home/pi/Conjurer/request.playlist")
|
file.remove("/home/pi/Conjurer/request.playlist")
|
||||||
f = file.open("/home/pi/Conjurer/request.playlist", create=true)
|
f = file.open("/home/pi/Conjurer/request.playlist", create=true)
|
||||||
f.close()
|
f.close()
|
||||||
log.info("done")
|
|
||||||
else
|
|
||||||
log.info("no requests")
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# Randomly select a playlist with weights
|
# Randomly select a playlist with weights
|
||||||
s = random(id="randomizer", weights=[1, 3, 2], [s1, s2, s3])
|
s4 = random(id="randomizer", weights=[1, 3, 5], [s1, s2, s3])
|
||||||
#s = delay(duration=5., s)
|
|
||||||
#radio = add([delay(1800., jingles), music])
|
# Load jingles playlist
|
||||||
#radio = fallback([delay(1800., jingles), music])
|
jingles = (playlist(reload_mode="watch", "/home/pi/Conjurer/jingles.playlist"))
|
||||||
#p = predicate.signal()
|
|
||||||
#radio = switch([(p, jingles), ({true}, music)])
|
# Create the main stream with random playlist and jingles
|
||||||
#thread.run(every=1200., {p.signal()})
|
s = rotate(id="randomizer", weights=[10, 1], [s4, jingles])
|
||||||
# def cmd(_)
|
|
||||||
# p.signal()
|
s = crossfade(fade_out=2., fade_in=2., duration=4., fallback(id="switcher", track_sensitive=false, [requests_queue, s]))
|
||||||
# "Jingle inserted!"
|
|
||||||
# end
|
|
||||||
# server.register("insert_jingle", cmd)
|
|
||||||
|
|
||||||
# Set up an interactive harbor for controlling the stream
|
# Set up an interactive harbor for controlling the stream
|
||||||
interactive.harbor(port = 9999)
|
interactive.harbor(port = 9999)
|
||||||
|
|
||||||
# Set up interactive controls for bass boost
|
# Set up interactive controls for bass boost
|
||||||
f = interactive.float("f", description="Frequency", min=0., max=1000., unit="Hz", 200.)
|
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.)
|
g = interactive.float("g", description="Gain", min=0., max=20., unit="dB", 8.)
|
||||||
b = bass_boost(frequency=f, gain=g, s)
|
b = bass_boost(frequency=f, gain=g, s)
|
||||||
s = add([s, b])
|
s = add([s, b])
|
||||||
|
|
||||||
# Set up interactive control for main volume
|
# Set up interactive control for main volume
|
||||||
a = interactive.float("main_volume", min=0., max=20., 1.)
|
a = interactive.float("main_volume", min=0., max=20., 1.)
|
||||||
s = compress.multiband.interactive(bands=3, s)
|
s = compress.multiband.interactive(bands=7, s)
|
||||||
|
|
||||||
# Apply audio processing effects
|
# Apply audio processing effects
|
||||||
s = nrj(normalize(s))
|
s = nrj(normalize(s))
|
||||||
s = amplify(a, s)
|
s = amplify(a, s)
|
||||||
|
|
||||||
|
mic = buffer(input.pulseaudio()) # Microphone
|
||||||
|
mic = gate(threshold=-30., range=-80., mic)
|
||||||
|
mic = blank.strip(max_blank=2., min_noise=.1, threshold=-20., mic)
|
||||||
|
|
||||||
|
s = add([s, mic])
|
||||||
|
#w = interactive.float("wetness", min=0., max=1., 1.)
|
||||||
|
#s = dry_wet(w,s,s2)
|
||||||
|
|
||||||
|
|
||||||
# Skip blank sections in the stream
|
# Skip blank sections in the stream
|
||||||
s = blank.skip(max_blank=2., s)
|
s = blank.skip(max_blank=2., s)
|
||||||
|
|
||||||
@@ -76,7 +88,7 @@ let json.parse credentials = file.contents("/home/pi/Conjurer/icecast_credentia
|
|||||||
log_to_stdout = true
|
log_to_stdout = true
|
||||||
log_to_file = true
|
log_to_file = true
|
||||||
logpath = "/home/pi/Conjurer/radio_log.log"
|
logpath = "/home/pi/Conjurer/radio_log.log"
|
||||||
loglevel = 4
|
loglevel = 3
|
||||||
set("log.stdout", log_to_stdout)
|
set("log.stdout", log_to_stdout)
|
||||||
set("log.level", loglevel)
|
set("log.level", loglevel)
|
||||||
|
|
||||||
@@ -86,27 +98,36 @@ let json.parse credentials = file.contents("/home/pi/Conjurer/icecast_credentia
|
|||||||
|
|
||||||
# Set up emergency fallback track
|
# Set up emergency fallback track
|
||||||
emergency = single("/home/pi/RetroPie/mp3/Youtube/Dr. Peacock - Trip to Ireland [GvrvQTUbUcA].mp3")
|
emergency = single("/home/pi/RetroPie/mp3/Youtube/Dr. Peacock - Trip to Ireland [GvrvQTUbUcA].mp3")
|
||||||
|
radio = fallback(id="switcher2", track_sensitive=false, [s, emergency])
|
||||||
|
# Set up an interactive control for skipping tracks
|
||||||
|
p = interactive.bool("Skip track", false)
|
||||||
|
|
||||||
# Create a fallback stream with the main stream and emergency track
|
# Function to process the request queue and skip the current track if requested
|
||||||
cross_s = crossfade(fade_out=3., fade_in=3., duration=5., fallback(id="switcher", track_sensitive=false, [requests_queue, s]))
|
def check_skip()
|
||||||
radio = fallback(id="switcher2", track_sensitive=false, [cross_s, emergency])
|
if p() then
|
||||||
|
log.info("Skipping current track.")
|
||||||
|
radio.skip()
|
||||||
|
p.set(false)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# Run the queue processing function every 60 seconds
|
||||||
thread.run(every=60., queue_processing)
|
thread.run(every=60., queue_processing)
|
||||||
|
|
||||||
# Handle metadata events
|
|
||||||
handle_metadata = fun (m) -> begin
|
# Run the check_skip function every 5 seconds
|
||||||
log.info(m["title"])
|
thread.run(every=15., check_skip)
|
||||||
log.info(m["artist"])
|
|
||||||
log.info(m["filename"])
|
|
||||||
end
|
|
||||||
radio.on_metadata(handle_metadata)
|
|
||||||
|
|
||||||
# Enable persistent script parameters
|
# Enable persistent script parameters
|
||||||
interactive.persistent("script.params")
|
interactive.persistent("script.params")
|
||||||
|
|
||||||
# Configure output formats and destinations
|
# Configure output formats and destinations
|
||||||
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)
|
output.icecast(%mp3, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="mp3-stream", radio)
|
||||||
|
output.pulseaudio(radio)
|
||||||
|
#output.file.hls("/tmp/hls", [("mp3-low", %mp3(bitrate=96)), ("mp3-hi", %mp3(bitrate=160))], radio)
|
||||||
|
# Uncomment the following lines to enable additional output formats
|
||||||
# output.icecast(%opus, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="opus-stream", radio)
|
# output.icecast(%opus, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="opus-stream", radio)
|
||||||
# output.icecast(%ogg, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="ogg-stream", radio)
|
# 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)
|
# output.icecast(%aac, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="aac-stream", radio)
|
||||||
|
|||||||
@@ -0,0 +1,9 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>HTTP Live Streaming Example</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<video src="/tmp/hls/stream.m3u8" height="300" width="400">
|
||||||
|
</video>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -13,3 +13,4 @@ tiktoken
|
|||||||
PyNaCl
|
PyNaCl
|
||||||
flask
|
flask
|
||||||
waitress
|
waitress
|
||||||
|
clickupython
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
import json
|
||||||
|
MEMORY_FIVE_SIARA = "/home/pi/Conjurer/pamiec.json"
|
||||||
|
ENCODING = "utf-8"
|
||||||
|
|
||||||
|
messages = [
|
||||||
|
{"role": "user", "content" : "Hammer: All systems operational"},
|
||||||
|
{"role": "assistant", "content": "Aye, Szefie! Wszystkie systemy działają sprawnie. Gotów do dalszej służby! Co podać?"},
|
||||||
|
{"role": "user", "content" : "Hammer: Podaj coś na orzeźwienie i przebudzenie. COś co rozgrzeje moje stare kości po ciężkiej pracy!"},
|
||||||
|
{"role": "assistant", "content": "Z przyjemnością Szefie! Dla Ciebie przygotuję Midzynarodówkę Interstelarną Wolf's Dragoon - wysoce energetyczny koktajl rozgrzewający i pobudzający jednocześnie."+
|
||||||
|
"Do przygotowania potrzebuję:"+
|
||||||
|
"\n"+
|
||||||
|
"60 ml mocnego rumu z Wolfa (lub innego, jeśli wolisz)"+
|
||||||
|
"30 ml soku z cytryny"+
|
||||||
|
"35 ml domowego syropu z mięty"+
|
||||||
|
"15 ml świeżo zmielonej kawy"+
|
||||||
|
"\n"+
|
||||||
|
"Mieszam wszystko w shakerze z lodem, a potem przelewam przez sitko do kieliszka koktajlowego. W górę serwuję z bigoskiem z miętą i zestem z cytryny. Rozgrzewa, orzeźwia i daje kopa na resztę nocy."+
|
||||||
|
"\n"+
|
||||||
|
"Co powiesz Szefie, podać Ci taki?"},
|
||||||
|
{"role": "user", "content" : "Hammer: Brzmi jak coś co zrobi robotę! Skal!"},
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
for temp in messages:
|
||||||
|
|
||||||
|
with open(MEMORY_FIVE_SIARA, "r+", encoding=ENCODING) as file_memory:
|
||||||
|
# First we load existing data into a dict.
|
||||||
|
file_data = json.load(file_memory)
|
||||||
|
# Join new_data with file_data inside emp_details
|
||||||
|
file_data.append(temp)
|
||||||
|
file_memory.seek(0)
|
||||||
|
# convert back to json.
|
||||||
|
json.dump(file_data, file_memory, indent=4)
|
||||||
Reference in New Issue
Block a user