use v6.d; use App::MediaControl::FS; use App::MediaControl::DB; class App::MediaControl::Model { has App::MediaControl::FS $.fs is required; has App::MediaControl::DB $.db is required; method get-children-of($id) { my @db-children = self.db.get-children-of($id); # [{id,path,name,is_dir,watched_time}] my $path; if (@db-children) { $path = @db-children[0]; # they all have the same path } elsif ($id.defined) { my $entry = self.db.get-entry($id); $path = "{$entry}{$entry}"; } else { $path = '/'; } my @fs-children = self.fs.get-children-of($path); # [{name,is_dir}] my ($db-idx, $fs-idx, $changed) = 0, 0, False; sub add-to-db() { self.db.add-entry( :$path, name => @fs-children[$fs-idx], is-dir => @fs-children[$fs-idx]., ); $changed=True; ++$fs-idx; } sub remove-from-db() { self.db.remove-entry(@db-children[$db-idx]); $changed=True; ++$db-idx; } while ($db-idx < @db-children && $fs-idx < @fs-children) { given @db-children[$db-idx] leg @fs-children[$fs-idx] { when Order::Same { ++$db-idx; ++$fs-idx; } when Order::Less { remove-from-db(); } when Order::More { add-to-db(); } } } while ($db-idx < @db-children) { remove-from-db(); } while ($fs-idx < @fs-children) { add-to-db(); } if $changed { @db-children = self.db.get-children-of($id); } return @db-children; } method get-parents-of(Int:D() $id) { return self.db.get-parents-of($id); } method get-entry(Int:D() $id) { return self.db.get-entry($id); } method mark-entry-watched(Int:D() $id) { return self.db.mark-entry-watched($id); } method get-recently-watched-folders(Int:D() $limit=20) { my @db-folders = self.db.get-recently-watched-folders($limit); my $changed = False; for @db-folders -> $f { next if self.fs.exists("{$f}{$f}"); self.db.remove-entry($f); $changed = True; } if $changed { @db-folders = self.db.get-recently-watched-folders($limit); } return @db-folders; } }