mirror of
https://github.com/n00mkrad/flowframes.git
synced 2025-12-16 16:37:48 +01:00
83 lines
2.5 KiB
C#
83 lines
2.5 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Drawing;
|
|
using System.Threading.Tasks;
|
|
using Flowframes.Data;
|
|
using Flowframes.IO;
|
|
|
|
namespace Flowframes.Media
|
|
{
|
|
class GetFrameCountCached
|
|
{
|
|
private static Dictionary<QueryInfo, int> cache = new Dictionary<QueryInfo, int>();
|
|
|
|
public static async Task<int> GetFrameCountAsync(string path, int retryCount = 3)
|
|
{
|
|
Logger.Log($"Getting frame count ({path})", true);
|
|
|
|
long filesize = IoUtils.GetFilesize(path);
|
|
QueryInfo hash = new QueryInfo(path, filesize);
|
|
|
|
if (filesize > 0 && CacheContains(hash))
|
|
{
|
|
Logger.Log($"Cache contains this hash, using cached value.", true);
|
|
return GetFromCache(hash);
|
|
}
|
|
else
|
|
{
|
|
Logger.Log($"Hash not cached, reading frame count.", true);
|
|
}
|
|
|
|
int frameCount;
|
|
|
|
if (IoUtils.IsPathDirectory(path))
|
|
frameCount = IoUtils.GetAmountOfFiles(path, false);
|
|
else
|
|
frameCount = await FfmpegCommands.GetFrameCountAsync(path);
|
|
|
|
if(frameCount > 0)
|
|
{
|
|
Logger.Log($"Adding hash with value {frameCount} to cache.", true);
|
|
cache.Add(hash, frameCount);
|
|
}
|
|
else
|
|
{
|
|
if (retryCount > 0)
|
|
{
|
|
Logger.Log($"Got {frameCount} frames, retrying ({retryCount} left)", true);
|
|
frameCount = await GetFrameCountAsync(path, retryCount - 1);
|
|
}
|
|
else
|
|
{
|
|
Logger.Log($"Failed to get frames and out of retries ({frameCount} frames for {path})", true);
|
|
}
|
|
}
|
|
|
|
return frameCount;
|
|
}
|
|
|
|
private static bool CacheContains(QueryInfo hash)
|
|
{
|
|
foreach (KeyValuePair<QueryInfo, int> entry in cache)
|
|
if (entry.Key.path == hash.path && entry.Key.filesize == hash.filesize)
|
|
return true;
|
|
|
|
return false;
|
|
}
|
|
|
|
private static int GetFromCache(QueryInfo hash)
|
|
{
|
|
foreach (KeyValuePair<QueryInfo, int> entry in cache)
|
|
if (entry.Key.path == hash.path && entry.Key.filesize == hash.filesize)
|
|
return entry.Value;
|
|
|
|
return 0;
|
|
}
|
|
|
|
public static void Clear ()
|
|
{
|
|
cache.Clear();
|
|
}
|
|
}
|
|
}
|