- 7 Tem 2013
- 8,188
- 637
If youve never worked with multithreaded programming in Python, you should read up on it! For your present purpose, you can think of thread as a loop that runs in the background of the main Python process (the one you interact with directly). Every twenty seconds, the loop checks a few things to see if the database needs to be updated, and if it does, appends a new record. Pretty cool.
The very last step is saving the database and restoring from saved states. Using the csv package, you can ensure your database resides in a highly portable format and remains usable even if you abandon your wonderful BandLeader class!
The __init__() method should be yet again altered, this time to accept a file path where youd like to save the database. Youd like to load this database if it is available, and youd like to save it periodically, whenever it is updated. The updates look like this:
# Finally, add a call to save_db() to your database maintenance method
Voilà! You can listen to music and keep a record of what you hear! Amazing.
Something interesting about the above is that using a namedtuple really begins to pay off. When converting to and from CSV format, you take advantage of the ordering of the rows in the CSV file to fill in the rows in the TrackRec objects. Likewise, you can create the header row of the CSV file by referencing the TrackRec._fields attribute. This is one of the reasons using a tuple ends up making sense for columnar data.
Whats Next and What Have You Learned?
You could do loads more! Here are a few quick ideas that would leverage the mild superpower that is Python + Selenium:
You could extend the BandLeader class to navigate to album pages and play the tracks you find there.
You might decide to create playlists based on your favorite or most frequently heard tracks.
Perhaps you want to add an autoplay feature.
Maybe youd like to query songs by date or title or artist and build playlists that way.
You have learned that Python can do everything that a web browser can do, and a bit more. You could easily write scripts to control virtual browser instances that run in the cloud. You could create bots that interact with real users or mindlessly fill out forms! Go forth and automate!
The very last step is saving the database and restoring from saved states. Using the csv package, you can ensure your database resides in a highly portable format and remains usable even if you abandon your wonderful BandLeader class!
The __init__() method should be yet again altered, this time to accept a file path where youd like to save the database. Youd like to load this database if it is available, and youd like to save it periodically, whenever it is updated. The updates look like this:
Kod:
[COLOR="Lime"]def __init__(self,csvpath=None):
self.database_path=csvpath
self.database = []
# Load database from disk if possible
if isfile(self.database_path):
with open(self.database_path, newline='') as dbfile:
dbreader = csv.reader(dbfile)
next(dbreader) # To ignore the header line
self.database = [TrackRec._make(rec) for rec in dbreader]
# .... The rest of the __init__ method is unchanged ....
# A new save_db() method
def save_db(self):
with open(self.database_path,'w',newline='') as dbfile:
dbwriter = csv.writer(dbfile)
dbwriter.writerow(list(TrackRec._fields))
for entry in self.database:
dbwriter.writerow(list(entry))[/COLOR]
# Finally, add a call to save_db() to your database maintenance method
Kod:
def _update_db(self):
try:
check = (self._current_track_record is not None
and self._current_track_record is not None
and (len(self.database) == 0
or self.database[-1] != self._current_track_record)
and self.is_playing())
if check:
self.database.append(self._current_track_record)
self.save_db()
except Exception as e:
print('error while updating the db: {}'.format(e)
Voilà! You can listen to music and keep a record of what you hear! Amazing.
Something interesting about the above is that using a namedtuple really begins to pay off. When converting to and from CSV format, you take advantage of the ordering of the rows in the CSV file to fill in the rows in the TrackRec objects. Likewise, you can create the header row of the CSV file by referencing the TrackRec._fields attribute. This is one of the reasons using a tuple ends up making sense for columnar data.
Whats Next and What Have You Learned?
You could do loads more! Here are a few quick ideas that would leverage the mild superpower that is Python + Selenium:
You could extend the BandLeader class to navigate to album pages and play the tracks you find there.
You might decide to create playlists based on your favorite or most frequently heard tracks.
Perhaps you want to add an autoplay feature.
Maybe youd like to query songs by date or title or artist and build playlists that way.
You have learned that Python can do everything that a web browser can do, and a bit more. You could easily write scripts to control virtual browser instances that run in the cloud. You could create bots that interact with real users or mindlessly fill out forms! Go forth and automate!