module MyController
using Genie
using Genie.Renderer.Html
using Colors
using OrderedCollections
using HTTP, JSON, Statistics
## HOW THIS WORKS:
## 1. Call the API to get the fact-checks for each chunk of text
## 2. Generate a gradient text based on the scores from the API
## 3. Return the gradient text
## Call API to process chunks of text
"""
## Function to call this endpoint: https://stefanjwojcik-misinfo-detection-app.hf.space/fastfactsearch?claim=climate%20change%20is%20a%20hoax&model=factchecks&top_k=5
Example:
oc_api_call("climate change is a hoax")
"""
function oc_api_call(text::String)
text = HTTP.escapeuri(text)
url = "https://stefanjwojcik-misinfo-detection-app.hf.space/fastfactsearch?claim=$(text)&model=factchecks&top_k=5"
response = HTTP.get(url)
return JSON.parse(String(response.body))
end
# This function will call the API, and generate scores for each chunk in the transcript
## Inaug link: WVOvmHUu8Vw
function generate_factchecks(transcript::Vector{String})
# Create a dictionary with the text and fact-check URLs
factchecks = Dict[]
for line in transcript
api_output = oc_api_call(line)
newdict = Dict("text" => line, "score" => api_output[1]["score"], "claimUrl" => api_output[1]["claimUrl"])
push!(factchecks, newdict)
end
return factchecks
end
function generate_url_list(factchecks::Vector{Dict}, threshold=0.5)
urls = [factcheck["claimUrl"] for factcheck in factchecks if factcheck["score"] > threshold]
url_list = "
"
for (i, url) in enumerate(urls)
url_list *= "- $(url)
"
end
url_list *= "
"
return url_list
end
function scores_to_colors(scores::Vector{T}, midpoint_threshold=.5) where T <: Real
# Create a color gradient from red to blue
c1 = colorant"blue" #true color
c2 = colorant"red" #false color
midpoint = mean(extrema(scores))
if midpoint < midpoint_threshold # rough heuristic of true/false distro
padded_colors = hex.(range(c1, stop=c2, length=length(scores)*2)) # expands the range
colors = padded_colors[1:length(scores)] #take only the first half of the range
else
colors = hex.(range(c1, stop=c2, length=length(unique(scores))))
end
colors = ["#" * color for color in colors]
# Map scores to colors
return Dict(zip(unique(sort(scores)), colors))
end
function gradient_text(factchecks::Vector{Dict}, threshold::Float64=0.6)
# Create colordict from scores
allscores = [factcheck["score"] for factcheck in factchecks]
colordict = scores_to_colors(allscores)
# Create span elements for each character with gradient colors
spans = []
n_refs = 0
for factcheck in factchecks
# Get the score for the current character
score = factcheck["score"]
color = colordict[score]
textval = factcheck["text"]
if score > threshold
n_refs += 1
textval = textval * " ($n_refs)"
end
# Create span with specific color
push!(spans, "$(textval)")
end
# Join all spans
gradient_text = join(spans, " ")
# Generate URL list
url_list = generate_url_list(factchecks, threshold)
# Append URL list to gradient text
return gradient_text * "
" * url_list
end
function youtubeUrlToId(url::String)
if occursin("youtube.com", url)
video_id = match(r"(?<=v=)[\w-]+", url).match
elseif occursin("youtu.be", url)
video_id = match(r"(?<=be/)[\w-]+", url).match
else
video_id = url
end
return string(video_id)
end
end # end module