-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathseed_database.py
More file actions
167 lines (117 loc) · 5.54 KB
/
seed_database.py
File metadata and controls
167 lines (117 loc) · 5.54 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
"""Script to seed database."""
import os
import json
from random import choice, randint
from datetime import datetime
from genres_python import GENRES
from model import db, User, Search, Playlist, PlaylistTrack, PlaylistLike, Track, connect_to_db
import crud
import model
import server
def create_users():
# Create users from list of sample names
NAMES = ['Jonathan Gulgowski', 'Velda Bergstrom', 'Tyra Stehr', 'Karolann Zulauf',
'Augustus Bednar', 'Lenore Crooks', 'Cody Carter', 'Pedro Reilly', 'Gino Nikolaus',
'Van Boehm', 'Abraham Gaylord', 'Abagail Haag', 'Cleora Stracke', 'Earline Hansen',
'Clemens Emmerich', 'Karelle Green', 'Derick Cruickshank', 'Kaley Schaden', 'Vesta Taylor', 'Lisa Gordon',
'Pauline Little', 'Barrett Hamill', 'Jamaal Hilll', 'Lexi Waelchi', 'Chauncey Rosenbaum', 'Marshall Cole',
'Mabel Nicolas', 'Verdie Lueilwitz', 'Augustine Bosco', 'Sunny Okuneva', 'Kirstin Balistreri',
'Wade Franecki', 'Lucinda Klein', 'Vanessa Hoeger', 'Stephanie Smith', 'Oma Muller', 'Herta Towne',
'Retha Schowalter', 'Nikita Mraz', 'Antonina Wintheiser', 'Demarcus Schowalter', 'Christina Ruecker',
'Willis Flatley', 'Wyman Cartwright', 'Wade Fahey', 'Stacey Nikolaus', 'Chance Vandervort',
'Willis Predovic', 'Zoila Stokes', 'Hobart Herman', 'Pinkie Friesen', 'Wyatt Miller',
'Zackary Russel', 'Wallace Smith', 'Juwan Hirthe', 'Madonna Adams', 'Devon Schuppe', 'Veronica Mueller',
'Alia Hoeger', 'Andreane Block', 'Adrianna Torp', 'Ari Haley', 'Grady Stanton', 'Floyd Kuvalis',
'Leslie Streich', 'Breana Little', 'Geovany Kunde', 'Paolo Donnelly', 'Harley Fay', 'Kellie Block']
users_in_db = []
for i, name in enumerate(NAMES):
spotify_id = name.lower().replace(' ', f'{i}')
spotify_display_name = name
created_at = datetime.now()
access_token = None
refresh_token = None
user = crud.create_user(
spotify_id, spotify_display_name, created_at, access_token, refresh_token)
users_in_db.append(user)
return users_in_db
def create_tracks(genre, track_data):
# Create tracks from genre.json files
items = track_data['tracks']['items']
tracks_in_genre = []
for track in items:
uid, title, artist, album, release_date, playtime, preview, popularity, album_art = (
track['id'],
track['name'],
track['artists'][0]['name'],
track['album']['name'],
track['album']['release_date'],
track['duration_ms'],
track['preview_url'],
track['popularity'],
track['album']['images'][2]["url"])
db_track = crud.create_track(uid,
title,
artist,
album,
release_date,
playtime,
genre,
preview,
popularity,
album_art)
tracks_in_genre.append(db_track)
return tracks_in_genre
def create_search(genre, user):
# Create searches and assign to random users
created_at = datetime.now()
# Not sure how best to do this
query = f'genre:"{genre}"'
return crud.create_search(user.user_id, created_at, query)
def create_playlist(genre, search, user, tracks_in_genre):
"""Create playlists and assign to random user"""
created_at = datetime.now()
last_updated_at = datetime.now()
playlist_title = f'{genre} Playlist'
playlist = crud.create_playlist(user.user_id, search.search_id, created_at,
last_updated_at, playlist_title)
for track_order, track in enumerate(tracks_in_genre):
crud.create_playlist_track(
track.track_id, playlist.playlist_id, track_order)
return playlist
def create_playlist_like(user, playlist):
"""Create playlist like and assign to random user"""
created_at = datetime.now()
playlist_like = PlaylistLike(
user_id=user.user_id, playlist_id=playlist.playlist_id, created_at=created_at)
db.session.add(playlist_like)
db.session.commit()
return playlist_like
# def create_playlist_like(user, playlist):
# """Create playlist like and assign to random user"""
# created_at = datetime.now()
# return crud.create_playlist_like(user.user_id,
# playlist.playlist_id, created_at)
def seed():
os.system('dropdb trackspotter')
os.system('createdb trackspotter')
model.connect_to_db(server.app)
model.db.create_all()
users_in_db = create_users()
playlists_in_db = []
for genre in GENRES:
escaped_genre = genre.replace('/', '-')
filename = f'genres/{escaped_genre}.json'
if not os.path.exists(filename):
continue
with open(f'genres/{escaped_genre}.json') as f:
track_data = json.loads(f.read())
tracks_in_genre = create_tracks(genre, track_data)
user = choice(users_in_db) # Select a random user to assign search to
search = create_search(genre, user)
playlist = create_playlist(genre, search, user, tracks_in_genre)
playlists_in_db.append(playlist)
for _ in range(1000):
user = choice(users_in_db)
playlist = choice(playlists_in_db)
create_playlist_like(user, playlist)
seed()