File size: 3,722 Bytes
acc66a1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
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 = "<ol>"
    for (i, url) in enumerate(urls)
        url_list *= "<li><a href=\"$(url)\" target=\"_blank\">$(url)</a></li>"
    end
    url_list *= "</ol>"
    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, "<span style=\"color: $(color);\">$(textval)</span>")
    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 * "<br><br>" * 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