From bdb6d48e8d21d7ff77be3326de69c4bc0e767324 Mon Sep 17 00:00:00 2001
From: Nikanorova Darya <darya.nikanorova@corp.mail.ru>
Date: Wed, 18 Sep 2024 17:52:03 +0300
Subject: [PATCH] Init week 1 seminar

---
 botify/botify/recommenders/sticky_artist.py | 13 ++++++++++
 botify/botify/server.py                     |  5 ++--
 botify/botify/track.py                      | 28 +++------------------
 3 files changed, 19 insertions(+), 27 deletions(-)
 create mode 100644 botify/botify/recommenders/sticky_artist.py

diff --git a/botify/botify/recommenders/sticky_artist.py b/botify/botify/recommenders/sticky_artist.py
new file mode 100644
index 0000000..473ecf9
--- /dev/null
+++ b/botify/botify/recommenders/sticky_artist.py
@@ -0,0 +1,13 @@
+import random
+
+from .random import Random
+from .recommender import Recommender
+
+
+class StickyArtist(Recommender):
+    def __init__(self, tracks_redis, artists_redis, catalog):
+        self.fallback = Random(tracks_redis)
+
+    def recommend_next(self, user: int, prev_track: int, prev_track_time: float) -> int:
+        # TODO Seminar 1 step 4: implement the recommender
+        return self.fallback.recommend_next(user, prev_track, prev_track_time)
diff --git a/botify/botify/server.py b/botify/botify/server.py
index c526036..d5be4db 100644
--- a/botify/botify/server.py
+++ b/botify/botify/server.py
@@ -22,13 +22,13 @@ app.config.from_file("config.json", load=json.load)
 api = Api(app)
 
 tracks_redis = Redis(app, config_prefix="REDIS_TRACKS")
-artists_redis = Redis(app, config_prefix="REDIS_ARTIST")
+# TODO Seminar 1 step 1: create a redis db for artists' tracks
 
 data_logger = DataLogger(app)
 
 catalog = Catalog(app).load(app.config["TRACKS_CATALOG"])
 catalog.upload_tracks(tracks_redis.connection)
-catalog.upload_artists(artists_redis.connection)
+# TODO Seminar 1 step 3: upload artists' tracks to redis
 
 parser = reqparse.RequestParser()
 parser.add_argument("track", type=int, location="json", required=True)
@@ -57,6 +57,7 @@ class NextTrack(Resource):
         start = time.time()
 
         args = parser.parse_args()
+        # TODO Seminar 1 step 5: create and run the A/B experiment
 
         treatment = Experiments.AA.assign(user)
 
diff --git a/botify/botify/track.py b/botify/botify/track.py
index 1602e48..ffea146 100644
--- a/botify/botify/track.py
+++ b/botify/botify/track.py
@@ -47,31 +47,9 @@ class Catalog:
 
     def upload_artists(self, redis):
         self.app.logger.info(f"Uploading artists to redis")
-        sorted_tracks = sorted(self.tracks, key=lambda track: track.artist)
-        for j, (artist, artist_catalog) in enumerate(
-            itertools.groupby(sorted_tracks, key=lambda track: track.artist)
-        ):
-            artist_tracks = [t.track for t in artist_catalog]
-            redis.set(artist, self.to_bytes(artist_tracks))
-
-        self.app.logger.info(f"Uploaded {j + 1} artists")
-
-    def upload_recommendations(self, redis, redis_config_key, key_object='user', key_recommendations='tracks'):
-        recommendations_file_path = self.app.config[redis_config_key]
-        self.app.logger.info(
-            f"Uploading recommendations from {recommendations_file_path} to redis"
-        )
-        j = 0
-        with open(recommendations_file_path) as rf:
-            for line in rf:
-                recommendations = json.loads(line)
-                redis.set(
-                    recommendations[key_object], self.to_bytes(recommendations[key_recommendations])
-                )
-                j += 1
-        self.app.logger.info(
-            f"Uploaded recommendations from {recommendations_file_path} for {j} {key_object}"
-        )
+        # TODO Seminar 1 step 2: implement method to upload artists tracks to redis
+        uploaded = 0
+        self.app.logger.info(f"Uploaded {uploaded} artists")
 
     def to_bytes(self, instance):
         return pickle.dumps(instance)
-- 
GitLab