109 lines
2.0 KiB
Elixir
109 lines
2.0 KiB
Elixir
defmodule Bright.Cache do
|
|
@moduledoc """
|
|
A simple caching module that saves files to the `/tmp` directory.
|
|
"""
|
|
|
|
alias Bright.Streams.Vod
|
|
|
|
|
|
@cache_dir Path.join(System.user_home!(), ".cache/futureporn")
|
|
|
|
require Logger
|
|
|
|
def cache_dir do
|
|
@cache_dir
|
|
end
|
|
|
|
def generate_basename(input) do
|
|
prefix = :crypto.strong_rand_bytes(6) |> Base.encode64(padding: false) |> String.replace(~r/[^a-zA-Z0-9]/, "")
|
|
base = Path.basename(input)
|
|
"#{prefix}-#{base}"
|
|
end
|
|
|
|
def generate_basename(input, ext) do
|
|
input
|
|
|> generate_basename
|
|
|> Path.rootname
|
|
|> Kernel.<>(".#{ext}")
|
|
end
|
|
|
|
def generate_filename(input) do
|
|
Path.join(@cache_dir, generate_basename(input))
|
|
end
|
|
|
|
def generate_filename(input, ext) do
|
|
Path.join(@cache_dir, generate_basename(input, ext))
|
|
end
|
|
|
|
def get_cache_dir do
|
|
@cache_dir
|
|
end
|
|
|
|
# Ensure the cache directory exists
|
|
def ensure_cache_dir! do
|
|
unless File.exists?(@cache_dir) do
|
|
File.mkdir_p!(@cache_dir)
|
|
end
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
@doc """
|
|
Delete a cached item by its key.
|
|
|
|
## Examples
|
|
|
|
iex> Bright.Cache.delete("example_key")
|
|
:ok
|
|
|
|
iex> Bright.Cache.delete("nonexistent_key")
|
|
:ok
|
|
"""
|
|
def delete(key) do
|
|
ensure_cache_dir!()
|
|
|
|
file_path = generate_filename(key)
|
|
|
|
case File.rm(file_path) do
|
|
:ok ->
|
|
Logger.debug("[Cache] Deleted key #{key} from #{file_path}")
|
|
:ok
|
|
|
|
{:error, :enoent} ->
|
|
Logger.debug("[Cache] Key #{key} not found for deletion")
|
|
:ok
|
|
|
|
{:error, reason} ->
|
|
Logger.error("[Cache] Failed to delete key #{key}: #{reason}")
|
|
{:error, reason}
|
|
end
|
|
end
|
|
|
|
@doc """
|
|
Clear all cached data.
|
|
|
|
## Examples
|
|
|
|
iex> Bright.Cache.clear()
|
|
:ok
|
|
"""
|
|
def clear do
|
|
ensure_cache_dir!()
|
|
|
|
case File.rm_rf(@cache_dir) do
|
|
{:ok, _} ->
|
|
Logger.debug("[Cache] Cleared all cached data")
|
|
ensure_cache_dir!()
|
|
:ok
|
|
|
|
{:error, reason} ->
|
|
Logger.error("[Cache] Failed to clear cache: #{reason}")
|
|
{:error, reason}
|
|
end
|
|
end
|
|
|
|
|
|
end
|