Track time along with file size for each cached file
authorSteve McIntyre <steve@einval.com>
Sat, 26 Jun 2010 14:08:40 +0000 (15:08 +0100)
committerSteve McIntyre <steve@einval.com>
Sat, 26 Jun 2010 14:08:40 +0000 (15:08 +0100)
Store mtime as well as the size for the output, using the mtime of the
source flac file. If the source is newer than the encoded/cached file,
re-generate. Gives us a cleaner way of invalidating the cache than
simply deleting it: touch the source files.

fuse-music.pl

index 3b8f333..dd985e4 100755 (executable)
@@ -55,6 +55,17 @@ sub file_size {
     return $size;
 }
 
+sub file_mtime {
+       my ($file) = shift;
+    my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
+        $atime,$mtime,$ctime,$blksize,$blocks)
+        = lstat($file);
+    if (! $dev) {
+        return -$!;
+    }
+    return $mtime;
+}
+
 sub encode_file {
     my ($file) = shift;
     my ($title, $artist, $album, $date, $track, $genre);
@@ -197,30 +208,42 @@ sub lame_qual {
 
 sub x_getsize {
     my ($file) = shift;
-    my $key = "$format_choice-$quality" . $file;
+    my $key_size = "SIZE-$format_choice-$quality" . $file;
+    my $key_time = "MTIME-$format_choice-$quality" . $file;
     my $size = 0;
+    my $mtime = file_mtime($file);
+    my $cached_mtime;
     # Do we have the file size in the DB?
-    $size = $size_array{"$key"};
+    $size = $size_array{"$key_size"};
+    $cached_mtime = $size_array{"$key_time"};
     if ($size) {
-        if ($debug) {
-            print "$file: returning cached size $size from hash db\n";
+        if ($cached_mtime && ($mtime <= $cached_mtime)) {
+            if ($debug) {
+                print "$file: returning valid cached size $size from hash db\n";
+            }
+            return $size;
+        } else {
+            if ($debug) {
+                print "$file: have a cached size $size from hash db, but it's out of date\n";
+            }
         }
-        return $size;
     } else {
         # Nope, we'll have to work it out
         if ($debug) {
-            print "$file: don't have a cached size for $key, encoding now\n";
-        }
-        my $ret = encode_file($file);
-        if ($ret != 0) {
-            return $ret;
+            print "$file: don't have a cached size for $key_size, encoding now\n";
         }
-        $size_array{"$key"} = $current_file_size;
-        if ($debug) {
-            print "$file: caching size $current_file_size for $key\n";
-        }
-        return $current_file_size;
     }
+
+    my $ret = encode_file($file);
+    if ($ret != 0) {
+        return $ret;
+    }
+    $size_array{"$key_size"} = $current_file_size;
+    $size_array{"$key_time"} = $mtime;
+    if ($debug) {
+        print "$file: caching size $current_file_size for $key_size, mtime $mtime\n";
+    }
+    return $current_file_size;
 }
 
 sub x_getattr {