scan-vid/test.jl

170 lines
4.6 KiB
Julia

# То же самое, но на julia
using Logging
using Printf
using Dates
using CRC32c
using JSON
using Base.Threads
using MySQL
# using DBInterface
# debuglogger = ConsoleLogger(stderr, Logging.Debug)
# global_logger(debuglogger)
# правильный перевод!
function humanbytes(B)
"""Return the given bytes as a human friendly KB, MB, GB, or TB string."""
B = float(B)
KB = float(1024)
MB = float(KB ^ 2) # 1,048,576
GB = float(KB ^ 3) # 1,073,741,824
TB = float(KB ^ 4) # 1,099,511,627,776
if B < KB
return @sprintf("%.2f Bytes", B)
elseif KB <= B && B < MB
return @sprintf("%.2f KB", (B / KB))
elseif MB <= B && B < GB
return @sprintf("%.2f MB", (B / MB))
elseif GB <= B && B < TB
return @sprintf("%.2f GB", (B / GB))
elseif TB <= B
return @sprintf("%.2f TB", (B / KB))
end
end
function new_name(name)
matches = Dict(
"Сек" => r"(.+) Сек.*",
"Сцен" => r"(.+) Сцен.*",
"Голые" => r"(.+) Голые.*",
"Откро" => r"(.+) Откро.*",
"Посте" => r"(.+) Посте.*",
"Изнас" => r"(.+) Изнас.*",
"Инцес" => r"(.+) Инцес.*",
"Лесб" => r"(.+) Лесб.*",
"Эро" => r"(.+) Эро.*"
)
for (k, v) in matches
if contains(name, k)
base, ext = splitext(name)
new_name = replace(base, v => s"\1")
# @debug base, new_name
return string(new_name, ext)
end
end
return name
end
function valid_file(filename)
valids = [".mp4", ".webm", ".mpeg"]
_, ext = splitext(filename)
return ext in valids
end
# file_info function returns information from file
function file_info(filename)
_, ext = splitext(filename)
info = stat(filename)
crc = CRC32c.crc32c(open(filename, "r"))
m = Dict(
"filename" => filename,
"size" => info.size,
"hsize" => humanbytes(info.size),
"mtime" => info.mtime,
"ctime" => info.ctime,
"htime" => Dates.format(Dates.unix2datetime(info.ctime), "dd.mm.yyyy"),
"ext" => ext,
"crc"=> Int(crc),
)
return m
end
function file_meta(filename)
cmd = `ffprobe -v quiet -print_format json -show_format -show_streams "$filename"`
out = read(cmd, String)
data = JSON.parse(out)
# println(data["format"]["duration"])
res = Dict(
"duration" => data["format"]["duration"],
)
return res
end
function check_file(filename)
# println(filename)
v1 = file_info(filename)
v2 = file_meta(filename)
result = merge!(v1, v2)
# println(info)
return result
end
function parallel_execution()
nthreads = Threads.nthreads() # Получаем количество доступных потоков
println("Running parallel execution: $(nthreads)")
results = Vector{Int}(undef, nthreads) # Создаем массив для хранения результатов
# Создаем и запускаем потоки
v = 0
@sync begin
for i in 1:24
Threads.@spawn begin
# Код, который нужно выполнить параллельно
# return i * 2
v += 1
println("Hello from ", Threads.threadid())
end
end
end
println("loop finished: ", v)
# Получаем результаты из потоков
# for i in 1:nthreads
# # v = results[i]
# println("Результат из потока $i: $v")
# end
end
function main()
dir = "d:\\vids\\ero"
@info "Обработка каталога: $dir"
files = readdir(dir, join=true)
n = length(files)
println("всего: $n files")
@time begin
@sync begin
for file in filter(valid_file, files)
Threads.@spawn begin
meta = check_file(file)
println(meta)
end
end
end
end
println("обработано")
end
function openDB()
conn = DBInterface.connect(MySQL.Connection, "xigmanas", "itman", "X753951x", db="sea")
# conn.db = "sea"
# println("DB: ", conn)
limit = 2
ext = ".webp"
cmd = "select ext, newurl from filemeta where ext = '$ext' limit $limit"
result = DBInterface.execute(conn, cmd)
# println(typeof(result))
for s in result
println(s.ext,' ', s.newurl)
end
end
# -------- основная программа --------------
# parallel_execution()
# openDB()
main()