diff options
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | server/dispatcher.erl | 2 | ||||
-rw-r--r-- | server/media.erl | 25 |
3 files changed, 20 insertions, 8 deletions
@@ -1,2 +1,3 @@ *.beam folien.pdf +server/Mnesia.* diff --git a/server/dispatcher.erl b/server/dispatcher.erl index 4f1f58b..9b4c61b 100644 --- a/server/dispatcher.erl +++ b/server/dispatcher.erl @@ -5,6 +5,8 @@ start() -> code:purge(server), code:load_abs("../common/server"), + spawn(media, init, []), + case server:start(dis, dispatcher) of true -> io:format("Server started... ~n"), diff --git a/server/media.erl b/server/media.erl index cbd9328..ddbed78 100644 --- a/server/media.erl +++ b/server/media.erl @@ -56,13 +56,14 @@ insert(Artist, Title, Filepath) -> % search the track with the highest votes and return {Artist, Title} -search_best(_,_,_) -> {"Allison Crowe", "Northern Lights"}. -%search_best([Head|Rest], Max_Votes, Track) -> -% if (Max_Votes < Head#track.votes) and (Head#track.locked == 0) -> -% search_best(Rest, Head#track.votes, Head); -% true -> search_best(Rest, Max_Votes, Track) -% end; -%search_best([], _, Track) -> {Track#track.Artist, Track#track.Title}. +%search_best(_,_,_) -> {"Allison Crowe", "Northern Lights"}. +search_best([Head|Rest], Max_Votes, Track) -> + if + ((Max_Votes =< Head#track.votes) and (Head#track.locked == false)) -> + search_best(Rest, Head#track.votes, Head); + true -> search_best(Rest, Max_Votes, Track) + end; +search_best([], _, Track) -> {Track#track.artist, Track#track.title}. % We want to query in order to simplify the next calls. @@ -90,7 +91,15 @@ play(Artist, Title, Callback) -> [Head|_] = ask(Artist, Title), {_, Title, Artist, _, _, Fp} = Head, Port = erlang:open_port({spawn_executable, "/usr/bin/mplayer"}, [{args, [Fp]}, exit_status]), - io:format("playing: ~w, Artist: ~w~n", [Title, Artist]), + + % lock the song + F = fun() -> + New = Head#track{locked = 1}, + mnesia:write(New) + end, + mnesia:transaction(F), + + io:format("playing: ~s, Artist: ~s~n", [Title, Artist]), receive {Port, {exit_status, 0}} -> start_playing(); {Port, {exit_status, S}} -> throw({commandfailed, S}) |