diff --git a/requirements.txt b/requirements.txt
index 76484aa..1ad13e3 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -5,4 +5,5 @@ sqlalchemy==2.0.7
psycopg2-binary~=2.9.3
python-dotenv
pre-commit
-pycryptodome
\ No newline at end of file
+pycryptodome
+requests
\ No newline at end of file
diff --git a/src/api/songs.py b/src/api/songs.py
index 7116e62..7af9eae 100644
--- a/src/api/songs.py
+++ b/src/api/songs.py
@@ -2,6 +2,9 @@
from pydantic import BaseModel
import sqlalchemy
from src import database as db
+import json
+import requests
+import os
from src.api.models import SongPlayLink
@@ -124,6 +127,70 @@ def remove_song(song_id: int, authorization: SongAuthorization):
return "Song Removed"
+def play_ad_if_needed(conn, user_id) -> str | None:
+ result = conn.execute(sqlalchemy.text("""
+ SELECT COUNT(*) FROM song_history
+ WHERE user_id = :user_id
+ """),
+ [{
+ "user_id": user_id
+ }]).scalar_one()
+
+ if result < 5:
+ return None
+
+ result = conn.execute(sqlalchemy.text("""
+ SELECT song_name, artist
+ FROM song_history
+ JOIN songs ON song_history.song_id = songs.id
+ WHERE user_id = 23
+ ORDER BY song_history.created_at DESC
+ LIMIT 5
+ """)).all()
+
+ song_prompt = "Songs:\n"
+ for song in result:
+ song_prompt += song.song_name + " by " + song.artist + "\n"
+
+ payload = json.dumps({
+ "model": "llama2-uncensored",
+ "system": "Classify the user's mood based on the following song titles into only one of these emotions: Happy, Sad, Angry. Only include the classification as one word.",
+ "prompt": song_prompt,
+ "stream": False
+ })
+ headers = {
+ 'Content-Type': 'application/json'
+ }
+
+ print("Getting Sentiment from OLLAMA")
+
+ response = requests.request("POST", os.environ.get("OLLAMA_URI"), headers=headers, data=payload)
+ response = response.json()
+ print(response)
+
+ mood = ""
+ if "happy" in response["response"].lower():
+ mood = "HAPPY"
+ elif "sad" in response["response"].lower():
+ mood = "SAD"
+ elif "angry" in response["response"].lower():
+ mood = "ANGRY"
+
+ if mood == "":
+ return None
+
+ result = conn.execute(sqlalchemy.text("""
+ SELECT link FROM ad_campaigns
+ WHERE target_mood = :mood
+ ORDER BY RANDOM() """), [{
+ "mood": mood
+ }]).scalar_one_or_none()
+
+ if result is None:
+ return None
+
+ return result
+
@router.get("/{song_id}/play")
def play_song(song_id: int, user_id: str = Header(None)) -> SongPlayLink:
""" """
@@ -168,6 +235,10 @@ def play_song(song_id: int, user_id: str = Header(None)) -> SongPlayLink:
return "Song not available on user's platform"
+ ad_link = play_ad_if_needed(conn, user_id)
+ if ad_link is not None:
+ return ad_link
+
conn.execute(sqlalchemy.text("""
INSERT INTO song_history (user_id, song_id) VALUES (:user_id, :song_id)
"""),