-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathexport_rated_song_entries_as_csv.py
131 lines (104 loc) · 3.82 KB
/
export_rated_song_entries_as_csv.py
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
import argparse
from api.users import get_rated_songs
from utils.files import save_file
from utils.logger import get_logger
logger = get_logger("export_rated_song_entries_as_csv")
def list_to_string_or_zero(data: list[str]) -> str:
return LIST_DELIMITER.join(data) if data else "0"
def parse_args() -> argparse.Namespace:
parser = argparse.ArgumentParser()
parser.add_argument(
"user_id",
type=int,
help="VocaDB user id",
)
return parser.parse_args()
if __name__ == "__main__":
args = parse_args()
user_id = args.user_id
OUTPUT_FILE = f"output/rated-songs-{user_id}.csv"
COLUMN_DELIMITER = ";"
LIST_DELIMITER = ","
fields = [
"Albums",
"Artists",
"PVs",
"ReleaseEvent",
"Tags",
"WebLinks",
"CultureCodes",
]
params = {"fields": ", ".join(fields)}
rated_songs = get_rated_songs(user_id, params)
simple_columns = {
"Song id": "id",
"Name": "defaultName",
"Total score": "ratingScore",
"Times favorited": "favoritedTimes",
"Entry created": "createDate",
"Publish date": "publishDate",
"PV services": "pvServices",
"Song type": "songType",
"Entry status": "status",
}
headers = list(simple_columns.keys())
headers.extend(
[
"Rating date",
"Own score",
"Tag ids",
"Album ids",
"Producer ids",
"Vocalist ids",
"Other artist ids",
"Number of external links",
"Languages",
]
)
save_file(OUTPUT_FILE, COLUMN_DELIMITER.join(headers))
for song in rated_songs:
output_line: list[str] = []
entry = song["song"]
for value in simple_columns.values():
try:
output_line.append(str(entry[value]).replace(COLUMN_DELIMITER, " "))
except KeyError:
logger.info(f"{value} not found for {entry['id']}")
output_line.append("?")
output_line.append(song["date"]) # rating date
own_score = 3 if (song["rating"] == "Favorite") else 2
output_line.append(str(own_score))
tag_ids = []
if "tags" in entry:
tag_ids = [str(tag["tag"]["id"]) for tag in entry["tags"]]
output_line.append(list_to_string_or_zero(tag_ids))
album_ids = [str(album["id"]) for album in entry["albums"]]
output_line.append(list_to_string_or_zero(album_ids))
producer_ids = []
vocalist_ids = []
other_artist_ids = []
if "artists" in entry:
for artist in entry["artists"]:
if "categories" in artist:
if artist["categories"] == "Producer":
producer_ids.append(str(artist["id"]))
elif artist["categories"] == "Vocalist":
vocalist_ids.append(str(artist["id"]))
else:
other_artist_ids.append(str(artist["id"]))
output_line.append(list_to_string_or_zero(producer_ids))
output_line.append(list_to_string_or_zero(vocalist_ids))
output_line.append(list_to_string_or_zero(other_artist_ids))
if "webLinks" in entry:
output_line.append(str(len(entry["webLinks"])))
else:
output_line.append("0")
output_line.append(list_to_string_or_zero(entry["cultureCodes"]))
if len(output_line) != len(headers):
logger.info("The column length size is mismatching with headers")
logger.info(output_line)
logger.info(len(output_line))
logger.info(headers)
logger.info(len(headers))
_ = input("Press enter to continue")
save_file(OUTPUT_FILE, COLUMN_DELIMITER.join(output_line), append=True)