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(mazurka_p2r, []). Daniel@0: Daniel@0: /** Access to beets database Daniel@0: */ Daniel@0: Daniel@0: Daniel@0: % :- use_module(library(odbc)). Daniel@0: :- use_module(library(csv)). Daniel@0: :- use_module(library(musicbrainz)). Daniel@0: :- use_module(library(semweb/rdf_db)). Daniel@0: :- use_module(library(termutils)). Daniel@0: :- use_module(library(rdfutils)). Daniel@0: :- use_module(library(stringutils)). Daniel@0: :- use_module(library(dcg/basics)). Daniel@0: :- use_module(entailment(p2r)). Daniel@0: :- use_module(library(memo)). Daniel@0: Daniel@0: :- set_prolog_flag(double_quotes,string). Daniel@0: Daniel@0: :- rdf_register_prefix(mazurka,'http://dml.org/mazurka/'). Daniel@0: Daniel@0: :- setting(csv_database,string,"~/lib/mazurka/mazurka-discography.txt","Location of Mazurka tab-separated-values"). Daniel@0: :- setting(audio_root,ground,nothing,"Location of Mazurka audio files"). Daniel@0: Daniel@0: % :- rdf_meta convert(+,+,o). Daniel@0: % convert(string,X,literal(X)). Daniel@0: % convert(atom,X,literal(Y)) :- atom_string(Y,X). Daniel@0: % convert(number,X,literal(Y)) :- number_string(Y,X). Daniel@0: % convert(date(E),X,literal(Date)) :- string_to_date(E,X,Date). Daniel@0: Daniel@0: rdf(mazurka:title, rdfs:subPropertyOf, dc:title) <== true. Daniel@0: rdf(mazurka:enc(Id), Prop, Obj) <== Daniel@0: setting(csv_database,Pattern), Daniel@0: expand_file_name(Pattern,[DBFile]), Daniel@0: csv_to_rdf(DBFile,Id,Prop,Obj). Daniel@0: Daniel@0: csv_to_rdf(DBFile,Id,Prop,Obj) :- Daniel@0: once(csv_read_file_row(DBFile,Header,[convert(false),separator(0'\t), line(1)])), Daniel@0: functor(Header,row,NumCols), Daniel@0: functor(Row,row,NumCols), Daniel@0: row_field(Header-Row,pid,Id), Daniel@0: csv_read_file_row(DBFile,Row,[convert(false),separator(0'\t), line(L)]), L>1, Daniel@0: status("Importing mazurka: ~w",[Id]), Daniel@0: row_triple(Header-Row,Prop,Obj). Daniel@0: % rdf_global_object(Obj1,Obj). Daniel@0: Daniel@0: :- rdf_meta row_triple(+,r,o). Daniel@0: row_triple(_,mazurka:composer,literal('Chopin')). Daniel@0: row_triple(HR,mazurka:pid,literal(PID)) :- row_field(HR,pid,PID). Daniel@0: row_triple(HR,Prop,Val) :- Daniel@0: row_field(HR,opus,OpusNum), Daniel@0: row_field(HR,key,Key), Daniel@0: atomic_list_concat([Opus,Number],'.',OpusNum), Daniel@0: work_triple(Key,Opus,Number,Prop,Val). Daniel@0: Daniel@0: row_triple(HR,mazurka:performer,literal(Perf)) :- row_field(HR,performer,Perf). Daniel@0: row_triple(HR,mazurka:recording_date,literal(type(T,Year))) :- row_field(HR,year,Year), rdf_global_id(xsd:gYear,T). Daniel@0: row_triple(HR,mazurka:duration,literal(type(T,X))) :- row_field(HR,seconds,A), atom_number(A,X), rdf_global_id(xsd:int,T). Daniel@0: row_triple(HR,mazurka:label,literal(Label)) :- row_field(HR,label,Label). Daniel@0: Daniel@0: :- rdf_meta work_triple(+,+,+,r,o). Daniel@0: work_triple(K,O,N,mazurka:title,literal(T)) :- format(atom(T),"Mazurka in ~w, op.~w, no.~w",[K,O,N]). Daniel@0: work_triple(K,_,_,mazurka:key,literal(K)). Daniel@0: work_triple(_,O,_,mazurka:opus,literal(O)). Daniel@0: work_triple(_,_,N,mazurka:number,literal(N)). Daniel@0: work_triple(_,O,N,mazurka:score,Score) :- Daniel@0: format(atom(Score),"kern:/classical/chopin/mazurka/mazurka~|~`0t~w~2+-~w.krn",[O,N]). Daniel@0: Daniel@0: Daniel@0: row_field(Header-Row,Name,Value) :- arg(N,Header,Name), arg(N,Row,Value). Daniel@0: % null_value("-"). Daniel@0: Daniel@0: :- public import/0. Daniel@0: import :- assert_all(mazurka_p2r). Daniel@0: Daniel@0: :- public audio_file/3. Daniel@0: audio_file(URI,Path,just(Fmt)) :- Daniel@0: rdf(URI,mazurka:pid,literal(PID)), Daniel@0: rdf(URI,mazurka:opus,literal(Opus)), Daniel@0: rdf(URI,mazurka:number,literal(Number)), Daniel@0: setting(audio_root,just(RootPatt)), Daniel@0: expand_file_name(RootPatt,[Root]), Daniel@0: member(Fmt-Ext,[aac-mp4,wav-wav]), Daniel@0: format(atom(Path),"~w/mazurka~|~`0t~w~2+-~w/pid~w.~w",[Root,Opus,Number,PID,Ext]), Daniel@0: exists_file(Path). Daniel@0: Daniel@0: % audio_link(Type,URI,URL) :- Daniel@0: % member(Type,[mp3,flac]), Daniel@0: % rdf(URI,charm:file_name,literal(Filename)), Daniel@0: % ( sub_atom(Filename,_,_,_,'£') Daniel@0: % -> atom_codes(Filename,C1), Daniel@0: % fix_url(C1,C2), Daniel@0: % atom_codes(Filename2,C2) Daniel@0: % ; Filename2=Filename Daniel@0: % ), Daniel@0: % format(atom(URL),'http://charm.cchcdn.net/audio/~w/~w.~w',[Type,Filename2,Type]). Daniel@0: