-
Notifications
You must be signed in to change notification settings - Fork 0
/
djmarkov.py
145 lines (126 loc) · 4.97 KB
/
djmarkov.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
132
133
134
135
136
137
138
139
140
141
142
143
#!/usr/bin/env python
from PyLyrics import *
from markov import TextMarkov
import musicbrainzngs
import sys
import argparse
import string
parser = argparse.ArgumentParser(description='Let DJMarkov spit fire in the'
+ ' style of your favorite artist.')
parser.add_argument('artist', metavar='artist', type=str,
help='artist whose style DJMarkov will attempt to imitate')
parser.add_argument('song_limit', metavar='song_limit', nargs='?', type=int,
default=None, help='how many songs to use.'
+ ' Defaults to all available songs.')
def main():
args = parser.parse_args()
musicbrainzngs.set_useragent("DJMarkov", 1.0)
artist = args.artist
limit = args.song_limit
artist_id = None
songs = []
print("Searching for artist...")
search_results = musicbrainzngs.search_artists(query=artist)['artist-list']
if search_results == []:
print("No results found.")
exit()
result_dict = {}
result_id_count = 0
for result in search_results:
if result['name'] == artist:
result_dict[result_id_count] = result['id']
message = ""
try:
message += str(result_id_count)
message += " ...found "
message += result['name']
message += result['disambiguation']
except Exception:
pass
print(message)
result_id_count += 1
if len(result_dict.keys()) == 0:
print("...no artist found with specified name.")
exit()
elif len(result_dict.keys()) == 1:
artist_id = result_dict[0]
else:
user_selection = None
while(user_selection not in list(result_dict.keys())):
user_selection = int(input("Please select a number: "))
artist_id = result_dict[user_selection]
print("Done.")
print("Searching for " + artist + " albums...")
release_titles = []
release_ids = []
for release in musicbrainzngs.browse_releases(
artist=artist_id,
release_type=['album'])['release-list']:
release_title = release['title'].strip("\'").strip("\"")
#try:
# release_title.encode('utf-8')
#except Exception:
# pass
#print(release_title + " !")
if release_title not in release_titles:
print('...found ' + release_title, flush=True)
release_titles.append(release_title)
release_ids.append(release['id'])
for release in musicbrainzngs.browse_releases(
artist=artist_id,
release_type=['mixtape/street'])['release-list']:
release_title = release['title'].strip("\'").strip("\"")
#try:
# release_title = release_title.encode('utf-8')
#except Exception:
# pass
if not release_title in release_titles:
print('...found ' + str(release_title), flush=True)
release_titles.append(release_title)
release_ids.append(release['id'])
print("Done.")
releases = zip(release_titles, release_ids)
scanned_songs = 0
stop_scan = False
for pair in releases:
release_title = pair[0]
release_id = pair[1]
print("Searching for tracks in " + release_title + "...")
recordings = musicbrainzngs.browse_recordings(
release=release_id)['recording-list']
for recording_dict in recordings:
recording_title = recording_dict['title']
print("...found " + recording_title, end=" ")
scanned_songs += 1
try:
songs.append(PyLyrics.getLyrics(artist, recording_title))
print("[found lyrics!]")
except ValueError:
print("[lyrics unavailable!]")
if(len(songs) == limit):
stop_scan = True
break
if stop_scan:
break
print(str(scanned_songs) + " songs analyzed.")
print(str(len(songs)) + " songs available.")
print("Done.")
if len(songs) == 0:
print("Artist does not have songs on file. Exiting.")
exit()
print("Parsing available songs...")
parsed_songs = []
for song in songs:
lines = song.split("\n")
parsed_songs.append(" ".join(lines).replace(".", "").replace(",", "")
.replace("!", "")
.replace("?", "")
.replace(":", ""))
print("Done.")
print("Building Markov Chain...")
markov_chain = TextMarkov(" ".join(parsed_songs))
print("Done.")
result = markov_chain.traverse(150)
print(" ".join(result))
if __name__ == "__main__":
main()