aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexander Sulfrian <alexander@sulfrian.net>2010-10-14 17:37:25 +0200
committerAlexander Sulfrian <alexander@sulfrian.net>2010-10-14 17:37:25 +0200
commit05666998e1dce513f1df82353364c026f992cbb4 (patch)
treef1434e130d5e0b8df4a345f4e9675312c5af9674
parentab13a717fe4e443c233694c69573deb11dbdf453 (diff)
parent66fb7971606ff0833b6ae1836e4dc05d83ee0c82 (diff)
downloaderlang-05666998e1dce513f1df82353364c026f992cbb4.tar.gz
erlang-05666998e1dce513f1df82353364c026f992cbb4.tar.xz
erlang-05666998e1dce513f1df82353364c026f992cbb4.zip
Merge branch 'master' of ssh://git.animux.de/erlang
Diffstat (limited to '')
-rw-r--r--server/media.erl38
1 files changed, 21 insertions, 17 deletions
diff --git a/server/media.erl b/server/media.erl
index 165338b..5eea592 100644
--- a/server/media.erl
+++ b/server/media.erl
@@ -3,6 +3,10 @@
-define(TESTPATTERN, "../ac/*.mp3").
-define(TIMEOUT, 100000000).
+%This module is responsible for the management of the music database.
+%It keeps track of playlist items with their current voting and locked/unlocked status
+%and automatically selects the next song with the highest vote count to play back.
+
% Since we are not willing to calculate and deliver all the id3 tags everytime they are requested,
% we try to get something persistent with mnesia.
% Concerning the parsing of id3tags we use the library id3v2 by Brendon Hogger. For detailed information take a
@@ -13,9 +17,9 @@
-record(track, {title, artist, votes, locked, filepath }).
% Before this module becomes usable, we must initialize it with the following steps:
-% 1. Initialize the mnesiadatabase and create the table within it.
+% 1. Initialize the mnesia database and create the table within it.
% 2. Parse the mp3s in the working directory and add them to the database
-% 3. Get into a loop so the database can be actually queried and files can be played.
+% 3. Get into a loop so the database can be queried and files can be played.
init() ->
mnesia:create_schema([node()]),
@@ -40,14 +44,14 @@ read_files([FN|Rest],Total,Fail) ->
end;
read_files([],Total,Fail) -> io:format("Total: ~w, Failed: ~w~n", [Total, Fail]).
-% Our Runloop to play music all the time, play waits on exit_status
+% Our loop to play music all the time, play waits on exit_status
start_playing() ->
{Artist, Title} = search_best(media:all(), 0,0),
play(Artist, Title).
-% Basic insertion of entrys into the database. Some entries are left out because they are 0 or false.
+% Basic insertion of entries into the database. Some entries are left out because they are 0 or false.
insert(Artist, Title, Filepath) ->
F = fun() ->
@@ -70,7 +74,7 @@ search_best([Head|Rest], Max_Votes, Track) ->
search_best([], 0, 0) -> reset_all(all());
search_best([], _, Track) -> {Track#track.artist, Track#track.title}.
-% if nothing is playable anymore just reset them and start playing again...
+% if nothing is playable anymore (because all songs are locked) just reset all songs and start playing again...
reset_all([Head|Rest]) ->
unlock(Head#track.artist, Head#track.title),
@@ -86,7 +90,7 @@ ask(Artist, Title) ->
{atomic, Results} = mnesia:transaction(F),
Results.
-% Just in case the client is interested in everything we got.
+% Just in case the client is interested in everything we have.
all() ->
F = fun() ->
@@ -95,7 +99,7 @@ all() ->
{atomic, Results} = mnesia:transaction(F),
Results.
-% We want to play mp3s from our database. After we play them they will become locked.
+% We want to play mp3s from our database. After we play them they will be locked.
% In practice we are going to set their locked variable to true and spawn a process which will unlock them after a certain time.
% Well this could be considered abuse.
@@ -111,8 +115,13 @@ play(Artist, Title) ->
{Port, {exit_status, 0}} -> start_playing();
{Port, {exit_status, S}} -> throw({commandfailed, S})
end.
-%Increase the vote in the database so it will hopefully be played in the future
+
+% Of course we need a query to find out what the highest voted track is.
+% We accomplish this by requesting all the records from the database and then iterate over them, just taking a look at the vote
+% variable, so it is like a list of integers. In case no tracks were voted for we just take the first track we found and play it. Of course this song is locked afterwards so a different one will be chosen.
+
+%votes for a track, i.e. increases its vote count by one.
vote(Artist, Title) ->
F = fun() ->
[Head|_] = ask(Artist, Title),
@@ -122,8 +131,7 @@ vote(Artist, Title) ->
end,
mnesia:transaction(F).
-% decrease votes in database
-
+%votes against a track, i.e. decreases its vote count by one.
devote(Artist, Title) ->
F = fun() ->
[Head|_] = ask(Artist, Title),
@@ -133,8 +141,7 @@ devote(Artist, Title) ->
end,
mnesia:transaction(F).
-% Reset votes to zero in database
-
+%resets the vote count of selected track to 0 (this is called when the song is played).
reset_votes(Artist, Title) ->
F = fun() ->
[Head|_] = ask(Artist, Title),
@@ -143,8 +150,7 @@ reset_votes(Artist, Title) ->
end,
mnesia:transaction(F).
-% Lock a song
-
+%locks a song so it can't be played again or voted for for that time.
lock(Artist, Title) ->
F = fun() ->
[Head|_] = ask(Artist, Title),
@@ -153,8 +159,7 @@ lock(Artist, Title) ->
end,
mnesia:transaction(F).
-% Unlock a song...
-
+%unlocks a song so it can be played and voted for again.
unlock(Artist, Title) ->
F = fun() ->
[Head|_] = ask(Artist, Title),
@@ -165,7 +170,6 @@ unlock(Artist, Title) ->
% Lock a song if it was just played, after a Timeout it will be unlocked automaticly
% If all songs are locked, all will be unlocked.
-
lock_process(Artist, Title) ->
lock(Artist, Title),
receive