a
    &h<                     @   s<   d dl Z d dlZd dlZd dlZeeZG dd dZdS )    Nc                   @   s<   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdS )LLMProcessorc                 C   s   d| _ d| _d S )NZ'AIzaSyAW151ftnZW0ubHxRzRQ4IGzn7mZIcs58MzXhttps://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent)api_keyapi_url)self r   9/var/www/html/swiplay.fr/scambot/modules/llm_processor.py__init__	   s    zLLMProcessor.__init__c           	         s*  |sdS |   g d}|D ]}|   v r|   S qg d}|D ]b}t| }|rF|d   }g d|   }t|dkrFtfdd|D sF|  S qFd	 v rd
 v rdS d v sd v rdS d
 v rdS d v sd v rdS t fdddD rdS d v s"d v r&dS dS )uC   Extrait le nom du jeu ou une description générique du type de jeuu
   Jeu vidéo)ZrobloxZ	minecraftZfortniteZgta)zAle jeu (?:s\'appelle|se nomme|est) ([^\s!.]+(?:\s+[^\s!.]+){0,6})u7   jeu (?:intitulé|nommé) ([^\s!.]+(?:\s+[^\s!.]+){0,6})u*   découvrons ([^\s!.]+(?:\s+[^\s!.]+){0,6})u'   jouer à ([^\s!.]+(?:\s+[^\s!.]+){0,6})u(   présente ([^\s!.]+(?:\s+[^\s!.]+){0,6})z&titre : ([^\s!.]+(?:\s+[^\s!.]+){0,6})z\[([^\]]+)\]r   )ZjeuZtheZuneZdesZlesZdansZlequelZceZcetteZcesZestZsont   c                 3   s   | ]}| v V  qd S Nr   .0word)invalid_wordsr   r   	<genexpr>-       z1LLMProcessor.extract_game_name.<locals>.<genexpr>ZtrainZsurvieZzombieZhorreurZcourseZvoiturec                 3   s   | ]}| v V  qd S r
   r   r   )description_lowerr   r   r   9   r   )Zrpgroleu   rôlecoopu   coopératif)lowertitlerefindallstripsplitlenany)	r   descriptionZknown_platformsplatformZexplicit_name_patternspatternmatchesnamewordsr   )r   r   r   extract_game_name   s:    "
zLLMProcessor.extract_game_namec                 C   s   |  |d }|dd}|dd}|d  }|dd}t|dkrZ|d	d d
 }d|d  d|d  d| d| d| d}|S )uE   Génère le prompt pour le formulaire SCAM complet (toutes les pages)r   durationu   À REMPLIR MANUELLEMENTpublished_date   Non trouvéer       Nz...ui  Tu es un expert qui remplit des formulaires SCAM pour des vidéos de jeux vidéo.

Analyse d'abord le contenu de la vidéo et identifie :
1. Le type de contenu : Est-ce une découverte, une analyse, un test, un guide, une critique ?
2. Le nom du jeu : S'il n'est pas explicitement mentionné, utilise simplement "Jeu vidéo"
3. Le style de la vidéo : Est-ce informatif, critique, humoristique, éducatif ?
4. Les thématiques principales du contenu
5. Des mots-clés pertinents (4-10 mots maximum)

Génère un formulaire SCAM COMPLET avec ces règles :
1. Adapte le titre au type de contenu (ex: "Analyse :", "Guide :", "Test :")
2. Le résumé doit être professionnel et factuel, adapté pour une déclaration officielle SCAM des droits d'auteur. Évite tout langage familier, vulgaire ou trop décontracté. Concentre-toi sur le contenu éducatif, informatif ou de divertissement de la vidéo. Le résumé doit expliquer clairement ce que contient la vidéo dans un contexte de déclaration de droits d'auteur.
3. Utilise le vrai nom du jeu s'il est mentionné, sinon "Jeu vidéo"
4. Utilise un ton professionnel et neutre, adapté à un contexte administratif et légal
5. Pour les thématiques, choisis parmi : Animalier, Culture, Découverte, Education, Histoire, Information, Religion, Sciences, Société, Sport
6. Les mots-clés doivent être séparés par des virgules, pertinents au contenu, et NE DOIVENT PAS inclure le nom du jeu

Format à respecter (génère les 5 pages) :

**PAGE 1 | L'œuvre**
- **Titre de l'œuvre :** [type de contenu] : [nom du jeu]
- **Résumé :** [description naturelle et engageante]
- **Lien visionnage :** [URL]
- **Durée de l'œuvre :** [durée]
- **Genre de l'œuvre :** Reportage
- **Titre du reportage :** [type de contenu] : [nom du jeu]
- **Titre du magazine :** [plateforme]
- **Votre œuvre est-elle une adaptation ?** Non
- **Votre œuvre contient-elle des inserts ?** Non

**PAGE 2 | Les diffusions**
- **Type de diffusion :** Internet
- **Nom du site internet :** [plateforme]
- **URL (hors TV de rattrapage) :** [URL]
- **Date de mise en ligne :** [date de publication]
- **Durée de la diffusion :** [durée]

**PAGE 5 | Thématiques et mots-clés**
- **Thématiques choisies :** [1 à 3 thématiques parmi : Animalier, Culture, Découverte, Education, Histoire, Information, Religion, Sciences, Société, Sport]
- **Mots-clés :** [4 à 10 mots-clés pertinents séparés par des virgules, SANS inclure le nom du jeu]

**PAGE 6 | Auteurs et producteurs**
- **Auteur 1 :**
  - **Prénom et nom :** [À remplir par l'utilisateur]
  - **Fonction :** Auteur - Réalisateur (ou Autrice - Réalisatrice)
  - **Adresse postale :** [À remplir par l'utilisateur]
  - **Courriel :** [À remplir par l'utilisateur] (obligatoire si signature électronique)
  - **Tél. mobile :** [À remplir par l'utilisateur] (obligatoire si signature électronique)
  - **Part de droits :** 100%
- **⚠️ Cocher "Mon œuvre est en autoproduction"**
- **Producteur 1 :**
  - **Nom de la société :** AUTOPRODUCTION
  - **Année de production :** [Année de la date de publication]
  - **Pays de la société de production :** FRANCE

**PAGE 7 | Validation**
- **Je souhaite transmettre ma déclaration :** Par voie électronique
- **Type de document :** Contrat
- **⚠️ Cliquer sur "Ajouter des Documents" et joindre l'attestation sur l'honneur**

Voici les informations de la vidéo :
URL: urlz
Description: u	   
Durée: z
Date de publication: z
Plateforme: uq   

Remplace chaque [élément] en respectant strictement les règles ci-dessus et génère les 5 pages complètes.)r"   getupperr   )r   
video_data	game_namer#   r$   r   Zdescription_summarypromptr   r   r   generate_scam_promptA   s&    =>?@ADz!LLMProcessor.generate_scam_promptc              
   C   sH  zi }d|v r| d}|D ]`}| s0q |drzd|tdd  |d< d|d v rx|d  dd  |d< q |d	rd
|td	d  |d< d|d v r|d  dd  |d< q |drd|tdd  |d< d|d v r|d  dd  |d< q |dr`d|tdd  |d< d|d v r|d  dd  |d< q |dr d|tdd  |d< q n||d< d|d< d|d< d|vrd|d< d|vrd|d< d|vrd|d< d|vrd|d< d|vrd|d< |W S  tyB } z,td|  |d d!d"d#d$W  Y d}~S d}~0 0 dS )%u/   Parse le formulaire complet en pages séparéesu   **PAGE 1 | L'œuvre**z**PAGE u   1 | L'œuvre**u   **1 | L'œuvre**Npage1z**PAGE 2r   z2 | Les diffusions**z**2 | Les diffusions**page2z**PAGE 5u    5 | Thématiques et mots-clés**u"   **5 | Thématiques et mots-clés**page5z**PAGE 6z6 | Auteurs et producteurs**z**6 | Auteurs et producteurs**page6z**PAGE 7z7 | Validation**z**7 | Validation**page7u   **2 | Les diffusions**
- **Type de diffusion :** Internet
- **Nom du site internet :** À compléter
- **URL :** À compléter
- **Date de mise en ligne :** À compléter
- **Durée :** À compléteruf   **5 | Thématiques et mots-clés**
- **Thématiques :** À compléter
- **Mots-clés :** À compléteru(   **1 | L'œuvre**
Contenu à générer...u.   **2 | Les diffusions**
Contenu à générer...u:   **5 | Thématiques et mots-clés**
Contenu à générer...u6   **6 | Auteurs et producteurs**
Contenu à générer...u*   **7 | Validation**
Contenu à générer...u   ❌ Erreur parsing pages: z(**2 | Les diffusions**
Erreur de parsingu4   **5 | Thématiques et mots-clés**
Erreur de parsingz0**6 | Auteurs et producteurs**
Erreur de parsingz$**7 | Validation**
Erreur de parsingr/   r0   r1   r2   r3   )r   r   
startswithr   	Exceptionloggererror)r   full_form_datapagesZpage_sectionssectioner   r   r   parse_scam_pages   s^    










zLLMProcessor.parse_scam_pagesc              
   C   s   z^d| j d}dd|igigddddd	}tj| j||d
d}|jdkrZtd|j |W S  tjjy } ztd| W Y d}~n:d}~0  ty } ztd| W Y d}~n
d}~0 0 dS )u/   Appelle l'API Gemini pour générer la réponsezapplication/json)zContent-TypezX-goog-api-keypartstextg?g?i  )ZtemperatureZtopPZmaxOutputTokens)contentsZgenerationConfig   )headersjsontimeoutr'   zErreur API Gemini: u   Erreur de connexion à Gemini: NzErreur inattendue: )r   requestspostr   status_coder6   
exceptionsRequestException)r   r-   rB   payloadresponser<   r   r   r   call_gemini   s4    
"zLLMProcessor.call_geminic                 C   sl  zt d|d   | |}| |}| }d|v r|d d d d d d }| |}dd	lm} | }| |d
 |d |	dd|d d}	|
|	}
d|d< d||| |d
 |d dW S tdW n tyf } zvt d|  dt|dt| dt| dt| dt| dt| dt| ddW  Y d}~S d}~0 0 dS )uC   Traite une vidéo et génère le formulaire SCAM complet avec pagesu*   🤖 Génération du formulaire SCAM pour r   
candidatesr   contentr>   r?      )ContractGeneratorr   r$   r%   r(   )r   r   r$   r(   u	  **7 | Validation**

📋 **Je souhaite transmettre ma déclaration**
✅ Par voie électronique

📎 **Documents à joindre**
✅ Contrat PDF (généré automatiquement lors de l'affichage de cette page)

� **Génération automatique de PDF :**
🔄 **Pour utilisateurs non inscrits :** Contrat générique avec champs à compléter
📄 **Pour utilisateurs inscrits :** Contrat personnalisé avec vos données (via `/register`)

✅ **Génération automatique de PDF :** Disponible pour les utilisateurs enregistrés.r3   T)successr9   r:   r,   r   u&   Format de réponse inattendu de Geminiu   ❌ Erreur lors du traitement: Fu.   Erreur lors de la génération du formulaire: zErreur: r4   )rQ   r8   r9   r:   N)r7   infor.   rL   rC   r=   contract_generatorrP   r"   r)   Zgenerate_generic_contractr6   r8   str)r   r+   r-   rK   resultZresponse_textr:   rP   Zcontract_genZcontract_infoZcontract_contentr<   r   r   r   process_video   sH    




zLLMProcessor.process_videoN)	__name__
__module____qualname__r   r"   r.   r=   rL   rV   r   r   r   r   r      s   4RE&r   )rE   rC   r   logging	getLoggerrW   r7   r   r   r   r   r   <module>   s
   
