ajout de mémoire avec fichier
This commit is contained in:
@@ -0,0 +1,103 @@
|
|||||||
|
import os
|
||||||
|
import json
|
||||||
|
|
||||||
|
class PersistentStorage:
|
||||||
|
def __init__(self, storage_dir="storage"):
|
||||||
|
"""
|
||||||
|
Initialise l'environnement de stockage avec un répertoire dédié.
|
||||||
|
:param storage_dir: Chemin du répertoire de stockage.
|
||||||
|
"""
|
||||||
|
self.storage_dir = storage_dir
|
||||||
|
if not os.path.exists(storage_dir):
|
||||||
|
os.makedirs(storage_dir)
|
||||||
|
|
||||||
|
def _get_file_path(self, filename):
|
||||||
|
"""Renvoie le chemin complet d'un fichier dans le répertoire de stockage."""
|
||||||
|
return os.path.join(self.storage_dir, filename + ".json")
|
||||||
|
|
||||||
|
def read(self, filename):
|
||||||
|
"""
|
||||||
|
Lit et retourne le contenu d'un fichier sous forme de dictionnaire.
|
||||||
|
:param filename: Nom du fichier (sans extension).
|
||||||
|
:return: Dictionnaire des données du fichier ou {} si le fichier est vide/inexistant.
|
||||||
|
"""
|
||||||
|
file_path = self._get_file_path(filename)
|
||||||
|
try:
|
||||||
|
with open(file_path, 'r', encoding='utf-8') as file:
|
||||||
|
return json.load(file)
|
||||||
|
except (FileNotFoundError, json.JSONDecodeError):
|
||||||
|
return {}
|
||||||
|
|
||||||
|
def write(self, filename, key, value):
|
||||||
|
"""
|
||||||
|
Ajoute ou met à jour une paire clé-valeur dans un fichier.
|
||||||
|
:param filename: Nom du fichier (sans extension).
|
||||||
|
:param key: Clé à ajouter ou mettre à jour.
|
||||||
|
:param value: Valeur associée.
|
||||||
|
"""
|
||||||
|
data = self.read(filename)
|
||||||
|
data[key] = value
|
||||||
|
file_path = self._get_file_path(filename)
|
||||||
|
with open(file_path, 'w', encoding='utf-8') as file:
|
||||||
|
json.dump(data, file, indent=4, ensure_ascii=False)
|
||||||
|
return data
|
||||||
|
|
||||||
|
def delete(self, filename, key):
|
||||||
|
"""
|
||||||
|
Supprime une clé d'un fichier si elle existe.
|
||||||
|
:param filename: Nom du fichier (sans extension).
|
||||||
|
:param key: Clé à supprimer.
|
||||||
|
"""
|
||||||
|
data = self.read(filename)
|
||||||
|
if key in data:
|
||||||
|
del data[key]
|
||||||
|
file_path = self._get_file_path(filename)
|
||||||
|
with open(file_path, 'w', encoding='utf-8') as file:
|
||||||
|
json.dump(data, file, indent=4, ensure_ascii=False)
|
||||||
|
return data
|
||||||
|
|
||||||
|
def list_keys(self, filename):
|
||||||
|
"""
|
||||||
|
Liste toutes les clés présentes dans un fichier.
|
||||||
|
:param filename: Nom du fichier (sans extension).
|
||||||
|
:return: Liste des clés.
|
||||||
|
"""
|
||||||
|
data = self.read(filename)
|
||||||
|
return list(data.keys())
|
||||||
|
|
||||||
|
def query_all(self):
|
||||||
|
"""
|
||||||
|
Interroge tous les fichiers dans le répertoire de stockage et retourne leurs contenus.
|
||||||
|
:return: Dictionnaire de tous les fichiers et leurs données.
|
||||||
|
"""
|
||||||
|
all_data = {}
|
||||||
|
for file in os.listdir(self.storage_dir):
|
||||||
|
if file.endswith(".json"):
|
||||||
|
filename = os.path.splitext(file)[0]
|
||||||
|
all_data[filename] = self.read(filename)
|
||||||
|
return all_data
|
||||||
|
|
||||||
|
|
||||||
|
# Exemple d'utilisation
|
||||||
|
if __name__ == "__main__":
|
||||||
|
# Initialisation de l'environnement
|
||||||
|
storage = PersistentStorage()
|
||||||
|
|
||||||
|
# Écriture de données
|
||||||
|
storage.write("session1", "key1", "Valeur 1")
|
||||||
|
storage.write("session1", "key2", "Valeur 2")
|
||||||
|
storage.write("session2", "keyA", "Autre valeur")
|
||||||
|
|
||||||
|
# Lecture des données
|
||||||
|
print("Contenu de session1 :", storage.read("session1"))
|
||||||
|
print("Contenu de session2 :", storage.read("session2"))
|
||||||
|
|
||||||
|
# Suppression d'une clé
|
||||||
|
#storage.delete("session1", "key1")
|
||||||
|
print("Après suppression de key1 :", storage.read("session1"))
|
||||||
|
|
||||||
|
# Liste des clés
|
||||||
|
print("Clés dans session1 :", storage.list_keys("session1"))
|
||||||
|
|
||||||
|
# Interrogation globale
|
||||||
|
print("Contenu global :", storage.query_all())
|
||||||
@@ -1,238 +0,0 @@
|
|||||||
import os
|
|
||||||
import signal
|
|
||||||
import sys
|
|
||||||
import argparse
|
|
||||||
import json
|
|
||||||
import time
|
|
||||||
import pprint
|
|
||||||
import random
|
|
||||||
import requests
|
|
||||||
import datetime
|
|
||||||
import glob
|
|
||||||
import threading
|
|
||||||
import traceback
|
|
||||||
# import keyboard
|
|
||||||
from pynput import keyboard
|
|
||||||
from threading import Thread, Semaphore
|
|
||||||
from streamlink import Streamlink
|
|
||||||
from fake_useragent import UserAgent
|
|
||||||
from rich.console import Console
|
|
||||||
from rich.live import Live
|
|
||||||
from rich.prompt import Prompt
|
|
||||||
from rich.spinner import Spinner
|
|
||||||
from rich.table import Table
|
|
||||||
from rich.text import Text
|
|
||||||
import subprocess
|
|
||||||
import pty
|
|
||||||
|
|
||||||
console = Console()
|
|
||||||
|
|
||||||
def hprint(color, texte):
|
|
||||||
timestamp = datetime.datetime.now().strftime("%Hh %Mm %Ss")
|
|
||||||
console.print("[bold "+color+"] ["+timestamp+"] "+texte+" [/bold "+color+"]")
|
|
||||||
|
|
||||||
def del_file(dossier, file):
|
|
||||||
motif = os.path.join(dossier, file)
|
|
||||||
for file in glob.glob(motif):
|
|
||||||
os.remove(file)
|
|
||||||
hprint("",f"file deleted : {file}")
|
|
||||||
|
|
||||||
def get_value_json(var_name, config):
|
|
||||||
return config.get(var_name)
|
|
||||||
|
|
||||||
def get_value_json_list(index, key, json_data):
|
|
||||||
try:
|
|
||||||
return json_data[index][key]
|
|
||||||
except (IndexError, KeyError, TypeError):
|
|
||||||
return None
|
|
||||||
|
|
||||||
# Fonction pour obtenir l'heure actuelle sous forme de chaîne
|
|
||||||
def get_current_time():
|
|
||||||
current_time = time.time()
|
|
||||||
return time.strftime('%H:%M:%S', time.localtime(current_time))
|
|
||||||
# now = datetime.now()
|
|
||||||
# return now.strftime("%H:%M")
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class RecordTwitch:
|
|
||||||
def __init__(self, channel_name, record_time):
|
|
||||||
self.channel_name = channel_name
|
|
||||||
self.request_count = 0
|
|
||||||
self.channel_url = "https://www.twitch.tv/" + self.channel_name
|
|
||||||
self.active_threads = 0
|
|
||||||
self.record_time = record_time
|
|
||||||
self.max_timerecordfile = 60
|
|
||||||
self.running = False
|
|
||||||
self.script_name = "twitch_record"
|
|
||||||
if (self.record_time == -1):
|
|
||||||
self.record_time = 9999
|
|
||||||
|
|
||||||
|
|
||||||
def hprint(self,color, texte):
|
|
||||||
timestamp = datetime.datetime.now().strftime("%Hh %Mm %Ss")
|
|
||||||
console.print("[bold "+color+"] ["+timestamp+"] ("+self.script_name+") "+texte+" [/bold "+color+"]")
|
|
||||||
|
|
||||||
def stop(self, signum, frame):
|
|
||||||
print("\STOPING...")
|
|
||||||
self.running = False
|
|
||||||
|
|
||||||
def del_mp3(self, dossier):
|
|
||||||
motif = os.path.join(dossier, '*.mp3')
|
|
||||||
for file in glob.glob(motif):
|
|
||||||
os.remove(file)
|
|
||||||
self.hprint("",f"file deleted : {file}")
|
|
||||||
|
|
||||||
def clear_diretory(self, dir_inrecord="in_record", dir_record="record"):
|
|
||||||
# self.hprint('green', 'clear_diretory start')
|
|
||||||
if os.path.exists(dir_inrecord) and os.path.exists(dir_record):
|
|
||||||
self.hprint('green', f"dir {dir_inrecord} and {dir_record} exist clearing")
|
|
||||||
self.del_mp3(dir_inrecord)
|
|
||||||
self.del_mp3(dir_record)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def create_session(self):
|
|
||||||
# Session creating for request
|
|
||||||
self.ua = UserAgent()
|
|
||||||
self.session = Streamlink()
|
|
||||||
self.session.set_option("http-headers", {
|
|
||||||
"Accept-Language": "en-US,en;q=0.5",
|
|
||||||
"Connection": "keep-alive",
|
|
||||||
"DNT": "1",
|
|
||||||
"Upgrade-Insecure-Requests": "1",
|
|
||||||
"User-Agent": self.ua.random,
|
|
||||||
"Client-ID": "your_client_id", # Replace with your actual Client-ID
|
|
||||||
"Referer": "https://www.google.com/"
|
|
||||||
})
|
|
||||||
|
|
||||||
def get_url(self):
|
|
||||||
hprint("green","try to get url")
|
|
||||||
url = ""
|
|
||||||
self.create_session()
|
|
||||||
try:
|
|
||||||
streams = self.session.streams(self.channel_url)
|
|
||||||
url = streams['audio_only'].url if 'audio_only' in streams else streams['worst'].url
|
|
||||||
hprint("cyan","url generate : " + url)
|
|
||||||
except Exception as e:
|
|
||||||
hprint("red","Error on get url : "+str(e))
|
|
||||||
# traceback.print_exc() # Affiche les détails de l'erreur
|
|
||||||
pass
|
|
||||||
return url
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def loop_run(self, intervalle):
|
|
||||||
|
|
||||||
try:
|
|
||||||
while True:
|
|
||||||
self.hprint("green","Start scan files...")
|
|
||||||
self.verif_record_move()
|
|
||||||
# self.hprint("yellow",f"wait {intervalle}s for next scan file completed.")
|
|
||||||
time.sleep(intervalle)
|
|
||||||
except KeyboardInterrupt:
|
|
||||||
self.hprint("red","STOP LOOP.")
|
|
||||||
|
|
||||||
|
|
||||||
def verif_record_move(self, dir_inrecord="in_record", dir_record="record"):
|
|
||||||
if not os.path.exists(dir_record):
|
|
||||||
os.makedirs(dir_record)
|
|
||||||
|
|
||||||
fichiers = [f for f in os.listdir(dir_inrecord) if os.path.isfile(os.path.join(dir_inrecord, f))]
|
|
||||||
if len(fichiers) > 1:
|
|
||||||
# sort file
|
|
||||||
sort_file = sorted(fichiers, key=lambda x: int(x.split('_')[-1].split('.')[0]))
|
|
||||||
fileto_move = sort_file[0]
|
|
||||||
|
|
||||||
chemin_source = os.path.join(dir_inrecord, fileto_move)
|
|
||||||
chemin_destination = os.path.join(dir_record, fileto_move)
|
|
||||||
|
|
||||||
# move file
|
|
||||||
shutil.move(chemin_source, chemin_destination)
|
|
||||||
self.hprint("green",f"File moved: {fileto_move}")
|
|
||||||
# else:
|
|
||||||
# self.hprint("yellow","Not enough files to compare.")
|
|
||||||
|
|
||||||
def compteur(self ):
|
|
||||||
seconds = 0
|
|
||||||
loop = 0
|
|
||||||
self.running = True
|
|
||||||
while True:
|
|
||||||
time.sleep(1) # Attend une seconde
|
|
||||||
# self.hprint("magenta", f"self.running = {self.running}")
|
|
||||||
if (seconds < 10):
|
|
||||||
print(f"\033[94mRecording time: 0{seconds}s | file : {loop}\033[0m", end='\r', flush=True) # Réinitialise la ligne à chaque fois
|
|
||||||
else:
|
|
||||||
print(f"\033[94mRecording time: {seconds}s | file : {loop}\033[0m", end='\r', flush=True) # Réinitialise la ligne à chaque fois
|
|
||||||
|
|
||||||
seconds += 1
|
|
||||||
if seconds == self.max_timerecordfile:
|
|
||||||
loop +=1
|
|
||||||
seconds = 0 # Réinitialise le compteur après 60 seconds
|
|
||||||
|
|
||||||
|
|
||||||
def record_audio(self):
|
|
||||||
output_directory = "record"
|
|
||||||
in_record_directory = "in_record"
|
|
||||||
os.makedirs(output_directory, exist_ok=True)
|
|
||||||
os.makedirs(in_record_directory, exist_ok=True)
|
|
||||||
|
|
||||||
stream_url = self.get_url()
|
|
||||||
if not stream_url:
|
|
||||||
console.print("[bold red]Impossible de récupérer l'URL du flux[/bold red]")
|
|
||||||
return
|
|
||||||
|
|
||||||
timestamp_complet = datetime.datetime.now().strftime("%Y%m%d-%H%M%S")
|
|
||||||
timestamp = datetime.datetime.now().strftime("%Y-%m-%d")
|
|
||||||
|
|
||||||
output_file_path = os.path.join(in_record_directory, f"{timestamp}_%03d.mp3")
|
|
||||||
|
|
||||||
self.hprint("green", f"start record")
|
|
||||||
thread_compteur = Thread(target=self.compteur, daemon=True)
|
|
||||||
thread_compteur.start()
|
|
||||||
|
|
||||||
command = ['ffmpeg','-i', stream_url,'-vn','-acodec','libmp3lame','-ar','44100','-ac','2','-map','0:a','-f','segment','-segment_time',str(self.max_timerecordfile),'-segment_format','mp3',output_file_path,'-loglevel', 'error']
|
|
||||||
# self.hprint('yellow',str(command))
|
|
||||||
process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
|
|
||||||
output, error = process.communicate()
|
|
||||||
|
|
||||||
# thread_compteur.do_run = False
|
|
||||||
thread_compteur.join()
|
|
||||||
|
|
||||||
|
|
||||||
def main(self):
|
|
||||||
self.running = True
|
|
||||||
self.clear_diretory()
|
|
||||||
record_thread = Thread(target=self.record_audio)
|
|
||||||
record_thread.start()
|
|
||||||
# record_thread.join() # Wait for the recording to finish
|
|
||||||
loop_run = Thread(target=self.loop_run, args=(10,), daemon=True)
|
|
||||||
loop_run.start()
|
|
||||||
loop_run.join() # Wait for the recording to finish
|
|
||||||
|
|
||||||
console.print("[bold magenta]Enregistrement terminé, le programme va se terminer.[/bold magenta]")
|
|
||||||
|
|
||||||
def start_recording(self):
|
|
||||||
"""Lance main_record_twitch dans un thread pour ne pas bloquer le code principal."""
|
|
||||||
self.thread = threading.Thread(target=self.main)
|
|
||||||
self.thread.start() # Démarre l'enregistrement dans un thread séparé
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
parser = argparse.ArgumentParser()
|
|
||||||
parser.add_argument('-recordtime', type=int, default=60, help='Time to record')
|
|
||||||
parser.add_argument('-twitchname', type=str, required=True, help='Twitch channel name')
|
|
||||||
args = parser.parse_args()
|
|
||||||
|
|
||||||
bot = RecordTwitch(channel_name=args.twitchname, record_time=args.recordtime)
|
|
||||||
try:
|
|
||||||
bot.main()
|
|
||||||
except KeyboardInterrupt:
|
|
||||||
console.print("[bold red]ERREUR RECORDING[/bold red]")
|
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
{
|
||||||
|
"key2": "Valeur 2",
|
||||||
|
"key1": "Valeur 1"
|
||||||
|
}
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
"keyA": "Autre valeur"
|
||||||
|
}
|
||||||
+163
-33
@@ -59,6 +59,121 @@ def get_current_time():
|
|||||||
# return now.strftime("%H:%M")
|
# return now.strftime("%H:%M")
|
||||||
|
|
||||||
|
|
||||||
|
def get_current_date():
|
||||||
|
current_time = time.time()
|
||||||
|
return time.strftime('%Yy%mm%dd', time.localtime(current_time))
|
||||||
|
|
||||||
|
|
||||||
|
def dict_to_json_string(data):
|
||||||
|
"""Convertit un dictionnaire Python en chaîne JSON.
|
||||||
|
:param data: Dictionnaire Python.
|
||||||
|
:return: Chaîne JSON.
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
return json.dumps(data, indent=4, ensure_ascii=False)
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Erreur lors de la conversion en JSON : {e}")
|
||||||
|
return None
|
||||||
|
|
||||||
|
def json_string_to_dict(json_string):
|
||||||
|
""" Convertit une chaîne JSON en dictionnaire Python.
|
||||||
|
:param json_string: Chaîne JSON.
|
||||||
|
:return: Dictionnaire Python.
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
return json.loads(json_string)
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Erreur lors de la conversion en dictionnaire : {e}")
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
class PersistentStorage:
|
||||||
|
def __init__(self, storage_dir="storage"):
|
||||||
|
"""
|
||||||
|
Initialise l'environnement de stockage avec un répertoire dédié.
|
||||||
|
:param storage_dir: Chemin du répertoire de stockage.
|
||||||
|
"""
|
||||||
|
self.storage_dir = storage_dir
|
||||||
|
|
||||||
|
def _get_file_path(self, filename):
|
||||||
|
"""Renvoie le chemin complet d'un fichier dans le répertoire de stockage."""
|
||||||
|
return os.path.join(self.storage_dir, filename + ".json")
|
||||||
|
|
||||||
|
def read(self, filename):
|
||||||
|
"""
|
||||||
|
Lit et retourne le contenu d'un fichier sous forme de dictionnaire.
|
||||||
|
:param filename: Nom du fichier (sans extension).
|
||||||
|
:return: Dictionnaire des données du fichier ou {} si le fichier est vide/inexistant.
|
||||||
|
"""
|
||||||
|
file_path = self._get_file_path(filename)
|
||||||
|
try:
|
||||||
|
with open(file_path, 'r', encoding='utf-8') as file:
|
||||||
|
return json.load(file)
|
||||||
|
except (FileNotFoundError, json.JSONDecodeError):
|
||||||
|
return {}
|
||||||
|
|
||||||
|
def write(self, filename, key, value):
|
||||||
|
"""
|
||||||
|
Ajoute ou met à jour une paire clé-valeur dans un fichier.
|
||||||
|
:param filename: Nom du fichier (sans extension).
|
||||||
|
:param key: Clé à ajouter ou mettre à jour.
|
||||||
|
:param value: Valeur associée.
|
||||||
|
"""
|
||||||
|
if not os.path.exists(self.storage_dir):
|
||||||
|
os.makedirs(self.storage_dir)
|
||||||
|
data = self.read(filename)
|
||||||
|
data[key] = value
|
||||||
|
file_path = self._get_file_path(filename)
|
||||||
|
with open(file_path, 'w', encoding='utf-8') as file:
|
||||||
|
json.dump(data, file, indent=4, ensure_ascii=False)
|
||||||
|
return data
|
||||||
|
|
||||||
|
def delete(self, filename, key):
|
||||||
|
"""
|
||||||
|
Supprime une clé d'un fichier si elle existe.
|
||||||
|
:param filename: Nom du fichier (sans extension).
|
||||||
|
:param key: Clé à supprimer.
|
||||||
|
"""
|
||||||
|
data = self.read(filename)
|
||||||
|
if key in data:
|
||||||
|
del data[key]
|
||||||
|
file_path = self._get_file_path(filename)
|
||||||
|
with open(file_path, 'w', encoding='utf-8') as file:
|
||||||
|
json.dump(data, file, indent=4, ensure_ascii=False)
|
||||||
|
return data
|
||||||
|
|
||||||
|
def list_keys(self, filename):
|
||||||
|
"""
|
||||||
|
Liste toutes les clés présentes dans un fichier.
|
||||||
|
:param filename: Nom du fichier (sans extension).
|
||||||
|
:return: Liste des clés.
|
||||||
|
"""
|
||||||
|
data = self.read(filename)
|
||||||
|
return list(data.keys())
|
||||||
|
|
||||||
|
def query_all(self):
|
||||||
|
"""
|
||||||
|
Interroge tous les fichiers dans le répertoire de stockage et retourne leurs contenus.
|
||||||
|
:return: Dictionnaire de tous les fichiers et leurs données.
|
||||||
|
"""
|
||||||
|
all_data = {}
|
||||||
|
for file in os.listdir(self.storage_dir):
|
||||||
|
if file.endswith(".json"):
|
||||||
|
filename = os.path.splitext(file)[0]
|
||||||
|
all_data[filename] = self.read(filename)
|
||||||
|
return all_data
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
storage = PersistentStorage()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
################### RecordTwitch ########################
|
################### RecordTwitch ########################
|
||||||
@@ -67,7 +182,7 @@ class RecordTwitch:
|
|||||||
self.channel_name = channel_name
|
self.channel_name = channel_name
|
||||||
self.channel_url = "https://www.twitch.tv/" + self.channel_name
|
self.channel_url = "https://www.twitch.tv/" + self.channel_name
|
||||||
self.record_time = record_time
|
self.record_time = record_time
|
||||||
self.max_timerecordfile = 60
|
self.max_timerecordfile = 30
|
||||||
self.running = True
|
self.running = True
|
||||||
self.script_name = "twitch_record"
|
self.script_name = "twitch_record"
|
||||||
if (self.record_time == -1):
|
if (self.record_time == -1):
|
||||||
@@ -249,6 +364,7 @@ class Subtitle_translation:
|
|||||||
self.pathjson = pathjson
|
self.pathjson = pathjson
|
||||||
self.reload_json()
|
self.reload_json()
|
||||||
self.dir_whisperX = "whisperX"
|
self.dir_whisperX = "whisperX"
|
||||||
|
self.filename_memory = "subtitle_" +get_current_date()
|
||||||
self.subtitle = {}
|
self.subtitle = {}
|
||||||
self.all_subtitle = ""
|
self.all_subtitle = ""
|
||||||
self.is_running = True
|
self.is_running = True
|
||||||
@@ -284,25 +400,14 @@ class Subtitle_translation:
|
|||||||
|
|
||||||
|
|
||||||
def remove_repetitions(self, message):
|
def remove_repetitions(self, message):
|
||||||
"""
|
|
||||||
Supprime les répétitions dans un message en conservant uniquement le premier
|
|
||||||
exemple d'une phrase répétée.
|
|
||||||
|
|
||||||
:param message: Le message sous forme de chaîne de caractères
|
|
||||||
:return: Le message sans répétitions
|
|
||||||
"""
|
|
||||||
sprint(self.script_name,"yellow", "remove_repetitions start for: \n" +message)
|
sprint(self.script_name,"yellow", "remove_repetitions start for: \n" +message)
|
||||||
|
|
||||||
words = message.split() # Découpe le texte en mots
|
words = message.split() # Découpe le texte en mots
|
||||||
seen = set() # Pour suivre les mots déjà rencontrés
|
seen = set() # Pour suivre les mots déjà rencontrés
|
||||||
result = [] # Stocke les mots sans répétition
|
result = [] # Stocke les mots sans répétition
|
||||||
|
|
||||||
|
|
||||||
for word in words:
|
for word in words:
|
||||||
if word not in seen:
|
if word not in seen:
|
||||||
result.append(word)
|
result.append(word)
|
||||||
seen.add(word)
|
seen.add(word)
|
||||||
|
|
||||||
sprint(self.script_name,"green", "remove_repetitions cleaned text : \n" +" ".join(result))
|
sprint(self.script_name,"green", "remove_repetitions cleaned text : \n" +" ".join(result))
|
||||||
return " ".join(result)## str this switch
|
return " ".join(result)## str this switch
|
||||||
|
|
||||||
@@ -324,7 +429,6 @@ class Subtitle_translation:
|
|||||||
return last_text
|
return last_text
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def auto_create_subtitle(self,file):
|
def auto_create_subtitle(self,file):
|
||||||
sprint(self.script_name,"green",f"start auto_create_subtitle")
|
sprint(self.script_name,"green",f"start auto_create_subtitle")
|
||||||
del_file("","*.txt")
|
del_file("","*.txt")
|
||||||
@@ -336,7 +440,7 @@ class Subtitle_translation:
|
|||||||
# subtitle_directory = "subtitle"
|
# subtitle_directory = "subtitle"
|
||||||
# os.makedirs(subtitle_directory, exist_ok=True)
|
# os.makedirs(subtitle_directory, exist_ok=True)
|
||||||
# os.chdir(subtitle_directory)
|
# os.chdir(subtitle_directory)
|
||||||
spead_find = ""
|
speak_found = ""
|
||||||
sprint(self.script_name,"green", "translation : "+file+" ")
|
sprint(self.script_name,"green", "translation : "+file+" ")
|
||||||
|
|
||||||
# whisperx --language fr --compute_type float32 ../record/final_output_audio.mp3
|
# whisperx --language fr --compute_type float32 ../record/final_output_audio.mp3
|
||||||
@@ -349,15 +453,17 @@ class Subtitle_translation:
|
|||||||
|
|
||||||
file_noext = file.rsplit('.', 1)[0]
|
file_noext = file.rsplit('.', 1)[0]
|
||||||
with open(file_noext+".txt", "r") as thisfile:
|
with open(file_noext+".txt", "r") as thisfile:
|
||||||
spead_find += thisfile.read().replace("'", "").replace('"', "").replace("\n", " ").replace(",", "")
|
speak_found += thisfile.read().replace("'", "").replace('"', "").replace("\n", " ").replace(",", "")
|
||||||
|
|
||||||
# parties = file_noext.split('_') # Sépare la base du nom et le numéro + extension
|
# parties = file_noext.split('_') # Sépare la base du nom et le numéro + extension
|
||||||
# num_ext = parties[-1] # Prend la dernière partie qui contient "007.mp3"
|
# num_ext = parties[-1] # Prend la dernière partie qui contient "007.mp3"
|
||||||
spead_find = self.remove_repetitions(spead_find)
|
speak_found = self.remove_repetitions(speak_found)
|
||||||
self.all_subtitle += spead_find+"\n"
|
self.all_subtitle += speak_found+"\n"
|
||||||
num_ext = get_current_time()
|
current_time = get_current_time()
|
||||||
self.subtitle[str(num_ext)] = spead_find
|
|
||||||
sprint(self.script_name,"yellow", "parole du streamer : \n" +spead_find)
|
self.subtitle[str(current_time)] = speak_found
|
||||||
|
storage.write(self.filename_memory, str(current_time), speak_found)
|
||||||
|
sprint(self.script_name,"yellow", "parole du streamer : \n" +speak_found)
|
||||||
|
|
||||||
# attention a No active speech found in audio
|
# attention a No active speech found in audio
|
||||||
# os.chdir("../")
|
# os.chdir("../")
|
||||||
@@ -420,6 +526,7 @@ class Subtitle_translation:
|
|||||||
class IA_generator:
|
class IA_generator:
|
||||||
def __init__(self,pathjson):
|
def __init__(self,pathjson):
|
||||||
self.script_name = "IA_generator"
|
self.script_name = "IA_generator"
|
||||||
|
self.filename_memory = "IA_generator_" +get_current_date()
|
||||||
self.pathjson = pathjson
|
self.pathjson = pathjson
|
||||||
self.reload_json()
|
self.reload_json()
|
||||||
self.subtitle = {}
|
self.subtitle = {}
|
||||||
@@ -511,6 +618,7 @@ class IA_generator:
|
|||||||
|
|
||||||
key = get_current_time()
|
key = get_current_time()
|
||||||
self.response_generation[str(key)] = textfinal
|
self.response_generation[str(key)] = textfinal
|
||||||
|
storage.write(self.filename_memory, str(key), textfinal) #ecrire dans la mémoire fichier
|
||||||
|
|
||||||
def setnew_streamer_word_text(self, streamer_word_text):
|
def setnew_streamer_word_text(self, streamer_word_text):
|
||||||
self.streamer_word = streamer_word_text
|
self.streamer_word = streamer_word_text
|
||||||
@@ -581,11 +689,12 @@ class IA_generator:
|
|||||||
################### sendmessageTwitch ########################
|
################### sendmessageTwitch ########################
|
||||||
|
|
||||||
class messageTwitch:
|
class messageTwitch:
|
||||||
def __init__(self, channel_name):
|
def __init__(self, config_user, channel_name):
|
||||||
|
self.ia_running = True
|
||||||
|
self.path_file_config_user = config_user
|
||||||
self.channel_name = channel_name
|
self.channel_name = channel_name
|
||||||
self.indexuser = 0
|
self.indexuser = 0
|
||||||
with open("../config/user.json", 'r') as file:
|
with open(self.path_file_config_user, 'r') as file:
|
||||||
self.userjson = json.load(file)
|
self.userjson = json.load(file)
|
||||||
self.totaluser = len(self.userjson)
|
self.totaluser = len(self.userjson)
|
||||||
|
|
||||||
@@ -593,6 +702,9 @@ class messageTwitch:
|
|||||||
self.tw_acc_token = get_value_json_list(self.indexuser, "tw_acc_token", self.userjson)
|
self.tw_acc_token = get_value_json_list(self.indexuser, "tw_acc_token", self.userjson)
|
||||||
self.charactere = get_value_json_list(self.indexuser, "charactere", self.userjson)
|
self.charactere = get_value_json_list(self.indexuser, "charactere", self.userjson)
|
||||||
|
|
||||||
|
self.respond_word = ""
|
||||||
|
self.last_respond_word = ""
|
||||||
|
|
||||||
|
|
||||||
def set_user(self,index_user):
|
def set_user(self,index_user):
|
||||||
self.indexuser = index_user
|
self.indexuser = index_user
|
||||||
@@ -634,24 +746,42 @@ class messageTwitch:
|
|||||||
self.send_message_user(user1,"Heyyy cool ? @"+pseudo1+"")
|
self.send_message_user(user1,"Heyyy cool ? @"+pseudo1+"")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def send_message_user(self,index_user, Message_text):
|
def send_message_user(self,index_user, Message_text):
|
||||||
hprint("green","start send_message_user")
|
hprint("cyan","start send_message_user")
|
||||||
self.set_user(index_user)
|
self.set_user(index_user)
|
||||||
command = '-pseudo "'+self.tw_acc_pseudo+'" -token "'+self.tw_acc_token+'" -twitchname "'+self.channel_name+'" -message " '+self.charactere+' '+Message_text+'"'
|
self.send_message(Message_text)
|
||||||
message_tosend = 'python send_message.py '+command
|
hprint("cyan",f"Finnish send send_message_user index :" + str(index_user))
|
||||||
hprint("yellow",f"send message = "+str(message_tosend))
|
|
||||||
subprocess.run(message_tosend, shell=True)
|
|
||||||
hprint("yellow",f"Finnish send send_message_user index :" + str(index_user))
|
|
||||||
|
|
||||||
|
|
||||||
def send_message(self, Message_text):
|
def send_message(self, Message_text):
|
||||||
hprint("green","start send_message")
|
hprint("cyan","start send_message")
|
||||||
|
|
||||||
command = '-pseudo "'+self.tw_acc_pseudo+'" -token "'+self.tw_acc_token+'" -twitchname "'+self.channel_name+'" -message " '+self.charactere+' '+Message_text+'"'
|
command = '-pseudo "'+self.tw_acc_pseudo+'" -token "'+self.tw_acc_token+'" -twitchname "'+self.channel_name+'" -message " '+self.charactere+' '+Message_text+'"'
|
||||||
message_tosend = 'python send_message.py '+command
|
message_tosend = 'python send_message.py '+ str(command)
|
||||||
hprint("yellow",f"send message = "+str(message_tosend))
|
hprint("cyan",f"send message = "+str(message_tosend))
|
||||||
subprocess.run(message_tosend, shell=True)
|
subprocess.run(message_tosend, shell=True)
|
||||||
hprint("yellow",f"Finnish send_message message")
|
self.last_respond_word = Message_text
|
||||||
|
hprint("cyan",f"Finnish send_message message")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# def main_loop_respond(self):
|
||||||
|
# time.sleep(20) #wait starting script
|
||||||
|
# sprint(self.script_name,"blue", "main_loop_ia imagine_response start")
|
||||||
|
# try:
|
||||||
|
# while self.ia_running:
|
||||||
|
# # time.sleep(self.loop_timer_ia)
|
||||||
|
# # sprint(self.script_name,"yellow",f"wait {self.loop_timer_ia}s main_loop_ia imagine_response.")
|
||||||
|
# #self.respond_word = getvalue_file()
|
||||||
|
# if(self.last_respond_word != self.respond_word):
|
||||||
|
# self.send_message(self.respond_word)
|
||||||
|
# else:
|
||||||
|
# sprint(self.script_name,"yellow",f"génération déja créer")
|
||||||
|
# except KeyboardInterrupt:
|
||||||
|
# print("Arrêt du script.")
|
||||||
|
# except Exception as e:
|
||||||
|
# sprint(self.script_name,"red", "STOP main_loop_respond Error : "+ str(e))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+9
-10
@@ -34,7 +34,7 @@ from fonction.first_class import messageTwitch
|
|||||||
from fonction.second_fonction import *
|
from fonction.second_fonction import *
|
||||||
|
|
||||||
|
|
||||||
# def r():
|
# def rh():
|
||||||
# os.system('killall python')
|
# os.system('killall python')
|
||||||
# sys.exit(0)
|
# sys.exit(0)
|
||||||
|
|
||||||
@@ -175,7 +175,7 @@ if __name__ == '__main__':
|
|||||||
ask_text = IA_generator("../config/config.json")
|
ask_text = IA_generator("../config/config.json")
|
||||||
ask_text.start_main_loop()
|
ask_text.start_main_loop()
|
||||||
|
|
||||||
#controluser = messageTwitch(args.twitchname)
|
controluser = messageTwitch("../config/user.json",args.twitchname)
|
||||||
|
|
||||||
print_help()
|
print_help()
|
||||||
listener_thread = threading.Thread(target=start_keyboard_listener)
|
listener_thread = threading.Thread(target=start_keyboard_listener)
|
||||||
@@ -189,15 +189,14 @@ if __name__ == '__main__':
|
|||||||
hprint("blue", "start main_loop main script / main_loop = "+str(main_loop))
|
hprint("blue", "start main_loop main script / main_loop = "+str(main_loop))
|
||||||
text_streamer = sb_translation.get_lasttext()
|
text_streamer = sb_translation.get_lasttext()
|
||||||
ask_text.setnew_streamer_word_text(text_streamer)
|
ask_text.setnew_streamer_word_text(text_streamer)
|
||||||
#new_genration = ask_text.getlast_generation()
|
# new_genration = ask_text.getlast_generation()
|
||||||
|
|
||||||
#if new_genration != "" and new_genration != last_generaton:
|
# if new_genration != "" and new_genration != last_generaton:
|
||||||
#hprint("blue", "Send message -> "+new_genration)
|
# hprint("blue", "Send message -> "+new_genration)
|
||||||
#controluser.send_message(new_genration)
|
# controluser.send_message(new_genration)
|
||||||
#controluser.change_user()
|
# controluser.change_user()
|
||||||
#last_generaton = new_genration
|
# last_generaton = new_genration
|
||||||
|
# time.sleep(10)
|
||||||
#time.sleep(10)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -1,80 +0,0 @@
|
|||||||
1
|
|
||||||
00:00:00,000 --> 00:00:01,460
|
|
||||||
Il est ok, il est pas très bien
|
|
||||||
|
|
||||||
2
|
|
||||||
00:00:01,460 --> 00:00:03,480
|
|
||||||
Mais j'ai l'impression qu'il y a beaucoup d'AP mag
|
|
||||||
|
|
||||||
3
|
|
||||||
00:00:03,480 --> 00:00:04,860
|
|
||||||
D'AP bot actuellement
|
|
||||||
|
|
||||||
4
|
|
||||||
00:00:04,860 --> 00:00:07,260
|
|
||||||
C'est super OP
|
|
||||||
|
|
||||||
5
|
|
||||||
00:00:07,260 --> 00:00:11,540
|
|
||||||
Le regen, on a les dégâts
|
|
||||||
|
|
||||||
6
|
|
||||||
00:00:11,540 --> 00:00:12,580
|
|
||||||
Non pas les dégâts
|
|
||||||
|
|
||||||
7
|
|
||||||
00:00:12,580 --> 00:00:15,840
|
|
||||||
Le flashing était useless
|
|
||||||
|
|
||||||
8
|
|
||||||
00:00:15,840 --> 00:00:19,280
|
|
||||||
Il peut temporiser un peu
|
|
||||||
|
|
||||||
9
|
|
||||||
00:00:19,280 --> 00:00:20,240
|
|
||||||
Il peut temporiser un peu
|
|
||||||
|
|
||||||
10
|
|
||||||
00:00:20,240 --> 00:00:29,080
|
|
||||||
Il monte son vrai niveau émeraude 1
|
|
||||||
|
|
||||||
11
|
|
||||||
00:00:29,080 --> 00:00:32,500
|
|
||||||
Chape l'émeraude 1, pas choqué
|
|
||||||
|
|
||||||
12
|
|
||||||
00:00:32,500 --> 00:00:36,620
|
|
||||||
J'arrive à prendre la tour au bot
|
|
||||||
|
|
||||||
13
|
|
||||||
00:00:36,620 --> 00:00:39,120
|
|
||||||
Je vais avoir que Waii en face de moi
|
|
||||||
|
|
||||||
14
|
|
||||||
00:00:39,120 --> 00:00:41,200
|
|
||||||
Swain aussi, mais bon, je pense pas qu'ils soient restés tous les deux
|
|
||||||
|
|
||||||
15
|
|
||||||
00:00:41,200 --> 00:00:43,660
|
|
||||||
En vrai j'ai mon ignite, j'ai plein de trucs
|
|
||||||
|
|
||||||
16
|
|
||||||
00:00:43,660 --> 00:00:44,980
|
|
||||||
Donc je peux délai Waii
|
|
||||||
|
|
||||||
17
|
|
||||||
00:00:44,980 --> 00:00:47,320
|
|
||||||
C'est peut-être ok
|
|
||||||
|
|
||||||
18
|
|
||||||
00:00:47,320 --> 00:00:54,540
|
|
||||||
Je vais prendre la tour là
|
|
||||||
|
|
||||||
19
|
|
||||||
00:00:54,540 --> 00:00:57,000
|
|
||||||
Il n'y a pas encore un up
|
|
||||||
|
|
||||||
20
|
|
||||||
00:00:57,000 --> 00:00:59,980
|
|
||||||
Il est bien
|
|
||||||
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
start end text
|
|
||||||
0 1460 Il est ok, il est pas très bien
|
|
||||||
1460 3480 Mais j'ai l'impression qu'il y a beaucoup d'AP mag
|
|
||||||
3480 4860 D'AP bot actuellement
|
|
||||||
4860 7260 C'est super OP
|
|
||||||
7260 11540 Le regen, on a les dégâts
|
|
||||||
11540 12580 Non pas les dégâts
|
|
||||||
12580 15840 Le flashing était useless
|
|
||||||
15840 19280 Il peut temporiser un peu
|
|
||||||
19280 20240 Il peut temporiser un peu
|
|
||||||
20240 29080 Il monte son vrai niveau émeraude 1
|
|
||||||
29080 32500 Chape l'émeraude 1, pas choqué
|
|
||||||
32500 36620 J'arrive à prendre la tour au bot
|
|
||||||
36620 39120 Je vais avoir que Waii en face de moi
|
|
||||||
39120 41200 Swain aussi, mais bon, je pense pas qu'ils soient restés tous les deux
|
|
||||||
41200 43660 En vrai j'ai mon ignite, j'ai plein de trucs
|
|
||||||
43660 44980 Donc je peux délai Waii
|
|
||||||
44980 47320 C'est peut-être ok
|
|
||||||
47320 54540 Je vais prendre la tour là
|
|
||||||
54540 57000 Il n'y a pas encore un up
|
|
||||||
57000 59980 Il est bien
|
|
||||||
|
@@ -1,20 +0,0 @@
|
|||||||
Il est ok, il est pas très bien
|
|
||||||
Mais j'ai l'impression qu'il y a beaucoup d'AP mag
|
|
||||||
D'AP bot actuellement
|
|
||||||
C'est super OP
|
|
||||||
Le regen, on a les dégâts
|
|
||||||
Non pas les dégâts
|
|
||||||
Le flashing était useless
|
|
||||||
Il peut temporiser un peu
|
|
||||||
Il peut temporiser un peu
|
|
||||||
Il monte son vrai niveau émeraude 1
|
|
||||||
Chape l'émeraude 1, pas choqué
|
|
||||||
J'arrive à prendre la tour au bot
|
|
||||||
Je vais avoir que Waii en face de moi
|
|
||||||
Swain aussi, mais bon, je pense pas qu'ils soient restés tous les deux
|
|
||||||
En vrai j'ai mon ignite, j'ai plein de trucs
|
|
||||||
Donc je peux délai Waii
|
|
||||||
C'est peut-être ok
|
|
||||||
Je vais prendre la tour là
|
|
||||||
Il n'y a pas encore un up
|
|
||||||
Il est bien
|
|
||||||
@@ -1,62 +0,0 @@
|
|||||||
WEBVTT
|
|
||||||
|
|
||||||
00:00.000 --> 00:01.460
|
|
||||||
Il est ok, il est pas très bien
|
|
||||||
|
|
||||||
00:01.460 --> 00:03.480
|
|
||||||
Mais j'ai l'impression qu'il y a beaucoup d'AP mag
|
|
||||||
|
|
||||||
00:03.480 --> 00:04.860
|
|
||||||
D'AP bot actuellement
|
|
||||||
|
|
||||||
00:04.860 --> 00:07.260
|
|
||||||
C'est super OP
|
|
||||||
|
|
||||||
00:07.260 --> 00:11.540
|
|
||||||
Le regen, on a les dégâts
|
|
||||||
|
|
||||||
00:11.540 --> 00:12.580
|
|
||||||
Non pas les dégâts
|
|
||||||
|
|
||||||
00:12.580 --> 00:15.840
|
|
||||||
Le flashing était useless
|
|
||||||
|
|
||||||
00:15.840 --> 00:19.280
|
|
||||||
Il peut temporiser un peu
|
|
||||||
|
|
||||||
00:19.280 --> 00:20.240
|
|
||||||
Il peut temporiser un peu
|
|
||||||
|
|
||||||
00:20.240 --> 00:29.080
|
|
||||||
Il monte son vrai niveau émeraude 1
|
|
||||||
|
|
||||||
00:29.080 --> 00:32.500
|
|
||||||
Chape l'émeraude 1, pas choqué
|
|
||||||
|
|
||||||
00:32.500 --> 00:36.620
|
|
||||||
J'arrive à prendre la tour au bot
|
|
||||||
|
|
||||||
00:36.620 --> 00:39.120
|
|
||||||
Je vais avoir que Waii en face de moi
|
|
||||||
|
|
||||||
00:39.120 --> 00:41.200
|
|
||||||
Swain aussi, mais bon, je pense pas qu'ils soient restés tous les deux
|
|
||||||
|
|
||||||
00:41.200 --> 00:43.660
|
|
||||||
En vrai j'ai mon ignite, j'ai plein de trucs
|
|
||||||
|
|
||||||
00:43.660 --> 00:44.980
|
|
||||||
Donc je peux délai Waii
|
|
||||||
|
|
||||||
00:44.980 --> 00:47.320
|
|
||||||
C'est peut-être ok
|
|
||||||
|
|
||||||
00:47.320 --> 00:54.540
|
|
||||||
Je vais prendre la tour là
|
|
||||||
|
|
||||||
00:54.540 --> 00:57.000
|
|
||||||
Il n'y a pas encore un up
|
|
||||||
|
|
||||||
00:57.000 --> 00:59.980
|
|
||||||
Il est bien
|
|
||||||
|
|
||||||
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
"23:13:11": "Joker et Harley Quinn, un duo déjanté ! Comme si on rêvait dêtre dans un film de super-héros..."
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"23:07:53": "Du coup parce quil va avoir la bascule ça du sens je vous divulgue chose. En gros non ! Je te fais sortir ? Non elle se calmer. il vire son avocat et défend lui-même.",
|
||||||
|
"23:08:34": "Et ça commence à être sympathique. tu te dis de là comme Harley Quinn vient en permanence le voir il va y avoir un moment où ils vont prendre otage tout bordel les mettre lamende cest parti part là. Ah ben non. En fait sa défense est reconnu coupable et voilà. super génial. lautre elle sen chouinant. Voilà.",
|
||||||
|
"23:09:17": "Lidile damour qui marche pas avec le norme ça pouvait marcher on y va. Alors cest comédie musicale. Et en plus ils font de Joker un mauvais coup aussi. Je peux te mettre ? Ouais daccord. Il lui met queue dure 10 secondes. Après bon une dollar. Ah secondes bon. ouais genre à la limite. Cest quoi. comment il sappelle Du La face au moins mourir rire. musicale et...",
|
||||||
|
"23:09:38": "les chansons en fait sont pas terribles vous êtes quasiment que sur des standards de la chanson américaine trucs là un peu vieillot bon du coup nêtes pop auriez pu tomber dessus à radio connaissez bien chiants même une belle mise scène il faut savoir cest bollywood ben ouais mais alors le problème film coûte 200 millions dollars",
|
||||||
|
"23:12:54": "Petite vie où il fume ses clopes est en prison regarde les films quand on était à lécole mais veut une normale. Et tout le monde Joker. Harley Quinn elle Nous spectateurs Les prisonniers ils veulent quils fassent des blagues."
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user