diff --git a/src/libs/medialib.liq b/src/libs/medialib.liq index f03e71cab9..06e1c8d0f3 100644 --- a/src/libs/medialib.liq +++ b/src/libs/medialib.liq @@ -1,17 +1,60 @@ -def medialib(directories=[]) +def medialib(~persistency=null(), directories=[]) db = ref([]) - def scan() - for d = list.iterator(directories) do - for f = list.iterator(file.ls(absolute=true, recursive=true, d)) do - log.debug("adding file: #{f}") + # Add a file to the database. + def add(f) + # If file doesn't exist remove it + if not (file.exists(f)) then + db := list.assoc.remove(f, db()) + else + # Not recent enough metadata + if not list.assoc.mem(f, db()) or (string.to_float(list.assoc("scan-time",list.assoc(f, db()))) > file.mtime(f)) then m = file.metadata(f) + m = metadata.cover.remove(m) m = ("filename",f) :: m - db := (f,m) :: db() + m = ("scan-time",string.float(time())) :: m + db := (f,m) :: list.assoc.remove(f, db()) + end + end + end + + # Update database by renewing metadata and removing removed files. + def update() + for fm = list.iterator(db()) do + let (f,_) = fm + add(f) + end + end + + # Make sure that new files from directories are registered. + def scan() + for d = list.iterator(directories) do + list.iter(add, file.ls(absolute=true, recursive=true, d)) + end + end + + # Load from the persistent file. + def load() + db := [] + if null.defined(persistency) then + f = null.get(persistency) + if file.exists(f) then + let json.parse ( parsed : [(string * [(string * string)])]? ) = file.contents(f) + if null.defined(parsed) then + db := null.get(parsed) + end end end end + # Store the file in a persistent file. + def store() + if null.defined(persistency) then + data = json.stringify(db()) + file.write(data=data, null.get(persistency)) + end + end + def find(~artist=null(), ~artist_contains=null()) def p(m) (null.defined(artist) ? m["artist"] == null.get(artist) : true) @@ -23,6 +66,9 @@ def medialib(directories=[]) l end + load() scan() + store() + {find = find} end