Daniel@0: /* Part of DML (Digital Music Laboratory) Daniel@0: Copyright 2014-2015 Samer Abdallah, University of London Daniel@0: Daniel@0: This program is free software; you can redistribute it and/or Daniel@0: modify it under the terms of the GNU General Public License Daniel@0: as published by the Free Software Foundation; either version 2 Daniel@0: of the License, or (at your option) any later version. Daniel@0: Daniel@0: This program is distributed in the hope that it will be useful, Daniel@0: but WITHOUT ANY WARRANTY; without even the implied warranty of Daniel@0: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Daniel@0: GNU General Public License for more details. Daniel@0: Daniel@0: You should have received a copy of the GNU General Public Daniel@0: License along with this library; if not, write to the Free Software Daniel@0: Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Daniel@0: */ Daniel@0: Daniel@0: :- module(dml, Daniel@0: [ call_debugging/2 Daniel@0: , call_nodebug/1 Daniel@0: , view_computations/0 Daniel@0: , start_matlab/0 Daniel@0: , stop_matlab/0 Daniel@0: , start_r_server/0 Daniel@0: , update/1 ]). Daniel@0: Daniel@0: /** DML main loader Daniel@0: */ Daniel@0: Daniel@0: :- set_prolog_flag(double_quotes, string). Daniel@0: :- debug_message_context(+time('%FT%T')). Daniel@0: Daniel@0: user:file_search_path(memo, cp_application(memo_db)). Daniel@0: Daniel@0: :- use_module(cp_application('config-enabled/dml_permission')). Daniel@0: Daniel@0: :- use_module(library(rcutils)). Daniel@0: :- use_module(library(http/http_dispatch)). Daniel@0: :- use_module(skin(minimal)). Daniel@0: :- use_module(library(dml_data)). Daniel@0: :- use_module(applications(callgraph_ui)). Daniel@0: :- use_module(applications(audio_ui)). Daniel@0: :- use_module(applications(score_ui)). Daniel@0: :- use_module(applications(csv_ui)). Daniel@0: :- use_module(applications(memo_ui)). Daniel@0: :- use_module(applications(transcription_ui)). Daniel@0: :- use_module(applications(dml_overview)). Daniel@0: Daniel@0: :- use_module(library(code_cache)). Daniel@0: :- use_module(library(dml_crawler)). Daniel@0: :- use_module(library(dml_spotify)). Daniel@0: :- use_module(library(dml_musicbrainz)). Daniel@0: :- use_module(library(dml_swish)). Daniel@0: :- use_module(library(dml_misc)). Daniel@0: :- use_module(library(musiclab)). Daniel@0: :- use_module(library(rdfutils)). Daniel@0: :- use_module(library(dlogic)). Daniel@0: :- use_module(library(dataset)). Daniel@0: :- use_module(library(mlserver), except([start_matlab/0,start_matlab/1])). Daniel@0: :- use_module(library(real)). Daniel@0: :- use_module(library(backend_json)). Daniel@0: :- use_module(library(dovamp)). Daniel@0: :- use_module(api(matlab)). Daniel@0: :- use_module(api(r_plot)). Daniel@0: :- use_module(api(archive)). Daniel@0: :- use_module(api(dmlvis)). Daniel@0: :- use_module(api(perspectives)). Daniel@0: :- use_module(api(transcription)). Daniel@0: :- use_module(components(audio)). Daniel@0: :- use_module(cliopatria(hooks)). Daniel@0: Daniel@0: cliopatria_openid:insecure_host('mirg.city.ac.uk'). Daniel@0: Daniel@0: Daniel@0: % Hooks for audio related services Daniel@0: cp_audio:audio_file(URI,File,Fmt) :- beets_p2r:audio_file(URI,File,Fmt). Daniel@0: cp_audio:audio_file(URI,File,Fmt) :- charm_p2r:audio_file(URI,File,Fmt). Daniel@0: cp_audio:audio_file(URI,File,Fmt) :- bl_p2r:audio_file(URI,File,Fmt). Daniel@0: cp_audio:audio_file(URI,File,Fmt) :- mazurka_p2r:audio_file(URI,File,Fmt). Daniel@0: Daniel@0: cp_audio:audio_link(URI,Link,just(mp3)) :- bl_p2r:audio_link(URI,Link). Daniel@0: cp_audio:audio_link(URI,URL,just(Fmt)) :- Daniel@0: bl_p2r:audio_file(URI,File,just(Fmt)), Daniel@0: file_permission(File,public), Daniel@0: http_link_to_id(audio_get,[uri(URI),format(Fmt)],URL). Daniel@0: cp_audio:audio_link(URI,Link,just(mp3)) :- charm_p2r:audio_link(mp3,URI,Link). Daniel@0: cp_audio:audio_link(URI,URL,just(Fmt)) :- Daniel@0: Formats=[ogg,mp3], % in order of preference Daniel@0: ( beets_p2r:audio_file(URI,File,just(Orig)) Daniel@0: ; mazurka_p2r:audio_file(URI,File,just(Orig)) Daniel@0: ), Daniel@0: file_permission(File,public), Daniel@0: (member(Orig,Formats) -> member(Fmt,Formats); member(Fmt,[Orig|Formats])), Daniel@0: http_link_to_id(audio_get,[uri(URI),format(Fmt)],URL). Daniel@0: Daniel@0: %:- rdf_set_cache_options([enabled(true),global_directory(cache)]). Daniel@0: Daniel@0: % ------------------ string portrayal ------------- Daniel@0: % user:portray(String) :- Daniel@0: % string(String), !, Daniel@0: % truncate(50,String,Short), Daniel@0: % writeq(Short). Daniel@0: Daniel@0: % truncate(Max,S,S) :- string_length(S,L), L remove_periodical(Id) Daniel@0: ; true Daniel@0: ), Daniel@0: periodically(3600,clean_code_cache(3600)). Daniel@0: Daniel@0: :- dynamic log_stream/1. Daniel@0: open_log :- Daniel@0: (log_stream(S) -> close(S), retractall(log_stream(_)); true), Daniel@0: expand_file_name('~/var/log/dml.log',[LogFile]), Daniel@0: open(LogFile,append,LogStream,[buffer(line)]), nl(LogStream), Daniel@0: assert(log_stream(LogStream)), Daniel@0: debug(log), debug(log,'Started logging.',[]). Daniel@0: Daniel@0: Daniel@0: :- meta_predicate call_debugging(?,0), call_nodebug(0). Daniel@0: call_debugging(Topic,Goal) :- setup_call_cleanup(debug(Topic), Goal, nodebug(Topic)). Daniel@0: call_nodebug(Goal) :- Daniel@0: setup_call_cleanup( (setof(T,debugging(T),Topics),maplist(nodebug,Topics)), Goal, maplist(debug,Topics)). Daniel@0: Daniel@0: view_computations :- Daniel@0: call_debugging(computations(item),termutils:with_status_line(get_single_char(_))). Daniel@0: Daniel@0: logging(dmlvis(method)). Daniel@0: logging(dmlvis(perspective)). Daniel@0: logging(log). Daniel@0: Daniel@0: prolog:debug_print_hook(computations(item),Fmt,Args) :- Daniel@0: termutils:status(Fmt,Args). Daniel@0: Daniel@0: prolog:debug_print_hook(Topic,Fmt,Args) :- Daniel@0: logging(Topic), log_stream(S), Daniel@0: get_time(T), Daniel@0: format(S,'~@ ~w | ~@\n',[format_time(current_output,'%FT%T',T), Topic, format(Fmt,Args)]), Daniel@0: fail. Daniel@0: Daniel@0: update(dml) :- Daniel@0: debug(log,'Updating dml-cliopatria repository.',[]), Daniel@0: shell('cd cpack/dml && hg pull && hg update'), Daniel@0: make. Daniel@0: Daniel@0: start_matlab :- start_matlab([]). Daniel@0: start_matlab(Opts) :- mlserver:start_matlab([path([dml(matlab)])|Opts]). Daniel@0: start_r_server :- real:r_start_server. Daniel@0: Daniel@0: :- multifile sandbox:safe_primitive/1. Daniel@0: :- multifile sandbox:safe_directive/1. Daniel@0: sandbox:safe_primitive(dml_permissions:file_permission(_,_)). Daniel@0: sandbox:safe_primitive(cp_audio:audio_link(_,_,_)). Daniel@0: Daniel@0: initiate_bl_scraping(Status) :- Daniel@0: format('% Initiating BL audio link scraping...\n',[]), Daniel@0: async:async_memo(vis_cla, bl_p2r:scrape_all([],_), Status, [recompute(failed),status_var(time-progress(summary))]). Daniel@0: Daniel@0: after_load :- Daniel@0: warm_indices, Daniel@0: initiate_bl_scraping(_), Daniel@0: start_r_server, Daniel@0: start_matlab.