diff --git a/python_apps/pypo/liquidsoap_scripts/ls_lib.liq b/python_apps/pypo/liquidsoap_scripts/ls_lib.liq index 9ac4a2eee..a3b3fc319 100644 --- a/python_apps/pypo/liquidsoap_scripts/ls_lib.liq +++ b/python_apps/pypo/liquidsoap_scripts/ls_lib.liq @@ -420,6 +420,54 @@ def create_dynamic_source(uri) = "Done!" end + +# A function to destroy a dynamic source +def destroy_dynamic_source_all(uri) = + # We need to find the source in the list, + # remove it and destroy it. Currently, the language + # lacks some nice operators for that so we do it + # the functional way + + # This function is executed on every item in the list + # of dynamic sources + def parse_list(ret, current_element) = + # ret is of the form: (matching_sources, remaining_sources) + # We extract those two: + matching_sources = fst(ret) + remaining_sources = snd(ret) + + # current_element is of the form: ("uri", source) so + # we check the first element + current_uri = fst(current_element) + # in this case, we add the source to the list of + # matched sources + (list.append( [snd(current_element)], + matching_sources), + remaining_sources) + end + + # now we execute the function: + result = list.fold(parse_list, ([], []), !dyn_sources) + matching_sources = fst(result) + remaining_sources = snd(result) + + # we store the remaining sources in dyn_sources + dyn_sources := remaining_sources + + # if no source matched, we return an error + if list.length(matching_sources) == 0 then + "error: no matching sources!" + else + # we stop all sources + list.iter(source.shutdown, matching_sources) + # And return + "Done!" + end +end + + + + # A function to destroy a dynamic source def destroy_dynamic_source(uri) = # We need to find the source in the list, @@ -438,19 +486,19 @@ def destroy_dynamic_source(uri) = # current_element is of the form: ("uri", source) so # we check the first element current_uri = fst(current_element) - #if current_uri == uri then + if current_uri == uri then # In this case, we add the source to the list of # matched sources (list.append( [snd(current_element)], matching_sources), remaining_sources) - #else - # In this case, we put the element in the list of remaining - # sources - #(matching_sources, - # list.append([current_element], - # remaining_sources)) - #end + else + # In this case, we put the element in the list of remaining + # sources + (matching_sources, + list.append([current_element], + remaining_sources)) + end end # Now we execute the function: diff --git a/python_apps/pypo/liquidsoap_scripts/ls_script.liq b/python_apps/pypo/liquidsoap_scripts/ls_script.liq index 0cb5c8bc1..b7a6d41d7 100644 --- a/python_apps/pypo/liquidsoap_scripts/ls_script.liq +++ b/python_apps/pypo/liquidsoap_scripts/ls_script.liq @@ -103,7 +103,7 @@ server.register(namespace="dynamic_source", description="Stop a dynamic source.", usage="stop ", "read_stop_all", - fun (s) -> begin log("dynamic_source.read_stop") destroy_dynamic_source(s) end) + fun (s) -> begin log("dynamic_source.read_stop") destroy_dynamic_source_all(s) end) default = amplify(id="silence_src", 0.00001, noise()) default = rewrite_metadata([("artist","Airtime"), ("title", "offline")], default) diff --git a/python_apps/pypo/pypopush.py b/python_apps/pypo/pypopush.py index d54313beb..d11b52a50 100644 --- a/python_apps/pypo/pypopush.py +++ b/python_apps/pypo/pypopush.py @@ -88,23 +88,6 @@ class PypoPush(Thread): except ValueError, e: self.logger.error(str(e)) - if len(liquidsoap_queue_approx) == 0 and not self.current_stream_info: - #Nothing is currently being playing by Liquidsoap - if current_event_chain[0]['type'] == 'file': - #Something is scheduled but Liquidsoap is not playing anything! - #Need to schedule it immediately..this might happen if Liquidsoap crashed. - self.modify_cue_point(current_event_chain[0]) - next_media_item_chain = current_event_chain - time_until_next_play = 0 - #sleep for 0.2 seconds to give pypo-file time to copy. - time.sleep(0.2) - continue - if current_event_chain[0]['type'] == 'stream': - #a stream is schedule but Liquidsoap is not playing it. Need to start it. - next_media_item_chain = current_event_chain - time_until_next_play = 0 - continue - #At this point we know that Liquidsoap is playing something, and that something #is scheduled. We need to verify whether the schedule we just received matches #what Liquidsoap is playing, and if not, correct it.