Cache xattr values so that metadata works as expected at least for the current session even if xattr is not supported by the filesystem and thus metadata can't be persisted
This commit is contained in:
parent
dc22249794
commit
d70e82401e
|
@ -15,6 +15,10 @@ public interface Resource<R> {
|
||||||
return new TransformedResource<R, T>(this, function);
|
return new TransformedResource<R, T>(this, function);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static <T> Resource<T> lazy(Resource<T> resource) {
|
||||||
|
return resource.memoize();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class MemoizedResource<R> implements Resource<R> {
|
class MemoizedResource<R> implements Resource<R> {
|
||||||
|
|
|
@ -9,6 +9,7 @@ import java.util.Locale;
|
||||||
import net.filebot.Cache;
|
import net.filebot.Cache;
|
||||||
import net.filebot.Cache.Compute;
|
import net.filebot.Cache.Compute;
|
||||||
import net.filebot.CacheType;
|
import net.filebot.CacheType;
|
||||||
|
import net.filebot.Resource;
|
||||||
import net.filebot.WebServices;
|
import net.filebot.WebServices;
|
||||||
import net.filebot.web.Episode;
|
import net.filebot.web.Episode;
|
||||||
import net.filebot.web.Movie;
|
import net.filebot.web.Movie;
|
||||||
|
@ -53,17 +54,21 @@ public class XattrMetaInfo {
|
||||||
|
|
||||||
public synchronized Object getMetaInfo(File file) {
|
public synchronized Object getMetaInfo(File file) {
|
||||||
return getCachedValue(xattrMetaInfoCache, file, key -> {
|
return getCachedValue(xattrMetaInfoCache, file, key -> {
|
||||||
Object metadata = new MetaAttributes(file).getObject();
|
Object metadata = xattr(file).getObject();
|
||||||
return isMetaInfo(metadata) ? metadata : null;
|
return isMetaInfo(metadata) ? metadata : null;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public synchronized String getOriginalName(File file) {
|
public synchronized String getOriginalName(File file) {
|
||||||
return (String) getCachedValue(xattrOriginalNameCache, file, key -> {
|
return (String) getCachedValue(xattrOriginalNameCache, file, key -> {
|
||||||
return new MetaAttributes(file).getOriginalName();
|
return xattr(file).getOriginalName();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private MetaAttributes xattr(File file) throws Exception {
|
||||||
|
return new MetaAttributes(file);
|
||||||
|
}
|
||||||
|
|
||||||
private Object getCachedValue(Cache cache, File file, Compute<?> compute) {
|
private Object getCachedValue(Cache cache, File file, Compute<?> compute) {
|
||||||
// try in-memory cache of previously stored xattr metadata
|
// try in-memory cache of previously stored xattr metadata
|
||||||
try {
|
try {
|
||||||
|
@ -86,11 +91,13 @@ public class XattrMetaInfo {
|
||||||
}
|
}
|
||||||
|
|
||||||
// set creation date to episode / movie release date
|
// set creation date to episode / movie release date
|
||||||
|
Resource<MetaAttributes> xattr = Resource.lazy(() -> xattr(file));
|
||||||
|
|
||||||
if (useCreationDate) {
|
if (useCreationDate) {
|
||||||
try {
|
try {
|
||||||
long t = getTimeStamp(model);
|
long t = getTimeStamp(model);
|
||||||
if (t > 0) {
|
if (t > 0) {
|
||||||
new MetaAttributes(file).setCreationDate(t);
|
xattr.get().setCreationDate(t);
|
||||||
}
|
}
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
debug.warning("Failed to set creation date: " + e.getMessage());
|
debug.warning("Failed to set creation date: " + e.getMessage());
|
||||||
|
@ -98,20 +105,21 @@ public class XattrMetaInfo {
|
||||||
}
|
}
|
||||||
|
|
||||||
// store metadata object and original name as xattr
|
// store metadata object and original name as xattr
|
||||||
if (useExtendedFileAttributes) {
|
try {
|
||||||
try {
|
if (isMetaInfo(model)) {
|
||||||
MetaAttributes attr = new MetaAttributes(file);
|
xattrMetaInfoCache.put(file, model);
|
||||||
if (isMetaInfo(model)) {
|
if (useExtendedFileAttributes) {
|
||||||
xattrMetaInfoCache.put(file, model);
|
xattr.get().setObject(model);
|
||||||
attr.setObject(model);
|
|
||||||
}
|
}
|
||||||
if (original != null && original.length() > 0 && getOriginalName(file) == null) {
|
|
||||||
xattrOriginalNameCache.put(file, original);
|
|
||||||
attr.setOriginalName(original);
|
|
||||||
}
|
|
||||||
} catch (Throwable e) {
|
|
||||||
debug.warning("Failed to set xattr: " + e.getMessage());
|
|
||||||
}
|
}
|
||||||
|
if (original != null && original.length() > 0 && getOriginalName(file) == null) {
|
||||||
|
xattrOriginalNameCache.put(file, original);
|
||||||
|
if (useExtendedFileAttributes) {
|
||||||
|
xattr.get().setOriginalName(original);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (Throwable e) {
|
||||||
|
debug.warning("Failed to set xattr: " + e.getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -122,7 +130,7 @@ public class XattrMetaInfo {
|
||||||
|
|
||||||
if (useExtendedFileAttributes) {
|
if (useExtendedFileAttributes) {
|
||||||
try {
|
try {
|
||||||
new MetaAttributes(file).clear();
|
xattr(file).clear();
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
debug.warning("Failed to clear xattr: " + e.getMessage());
|
debug.warning("Failed to clear xattr: " + e.getMessage());
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue