SensationSnagger.psm1

function Get-Sensation {
    param (
        [string]$UserUrl = $(Read-Host -Prompt "Please enter the URL")
    )

    $apiUrl = "https://api-gib.dontdmca.me/api/json"
    $requestBody = @{
        aFormat = "mp3"
        filenamePattern = "classic"
        dubLang = "false"
        vQuality = 1080
        twitterGif = "true"
        url = $UserUrl
    } | ConvertTo-Json

    $startTime = Get-Date

    # Send the POST request
    $response = Invoke-RestMethod -Uri $apiUrl -Body $requestBody -Method Post -ContentType "application/json" -Headers @{ Accept = "application/json" }

    # Check for errors
    if ($response.text -and $response.text -ne "OK") {
        Write-Output "Error: $($response.text)"
        return
    }

    $downloadUrl = $response.url
    $filenameFromResponse = $response.filename

    if (-not $downloadUrl) {
        Write-Output "Error: No download URL found in the response."
        return
    }

    # Extract file name and extension from the URL's path
    $uri = [System.Uri]::new($downloadUrl)
    $absolutePath = $uri.AbsolutePath
    $fileName = [System.IO.Path]::GetFileNameWithoutExtension($absolutePath)
    $fileExtension = [System.IO.Path]::GetExtension($absolutePath)

    if (-not $fileName) {
        $fileName = "unknown"
    }

    # Set file name and extension based on provider
    $provider = "Unknown"
    switch -Regex ($UserUrl) {
        "instagram\.com" { 
            $provider = "Instagram"
            if ($filenameFromResponse -and $filenameFromResponse -match "\.[\w\d]+$") {
                $fileName = [System.IO.Path]::GetFileNameWithoutExtension($filenameFromResponse)
                $fileExtension = [System.IO.Path]::GetExtension($filenameFromResponse)
            }
        }
        "facebook\.com" { 
            $provider = "Facebook"
            if ($filenameFromResponse -and $filenameFromResponse -match "\.[\w\d]+$") {
                $fileName = [System.IO.Path]::GetFileNameWithoutExtension($filenameFromResponse)
                $fileExtension = [System.IO.Path]::GetExtension($filenameFromResponse)
            }
        }
        "tiktok\.com" { 
            $provider = "TikTok"
            if ($filenameFromResponse -and $filenameFromResponse -match "\.[\w\d]+$") {
                $fileName = [System.IO.Path]::GetFileNameWithoutExtension($filenameFromResponse)
                $fileExtension = [System.IO.Path]::GetExtension($filenameFromResponse)
            }
        }
        "youtube\.com|youtu\.be" {
            $provider = "YouTube"
            $fileName = if ($UserUrl -match "(?<=v=|\/)([a-zA-Z0-9_-]{11})") {
                $matches[0]
            } else {
                $fileName
            }
            $fileExtension = ".mp4"
        }
        "twitter\.com|x\.com" { 
            $provider = "Twitter/X"
            if ($filenameFromResponse -and $filenameFromResponse -match "\.[\w\d]+$") {
                $fileName = [System.IO.Path]::GetFileNameWithoutExtension($filenameFromResponse)
                $fileExtension = [System.IO.Path]::GetExtension($filenameFromResponse)
            }
        }
    }

    # Finalize the file name
    $fileName += $fileExtension

    Add-Type -AssemblyName PresentationFramework
    $saveFileDialog = New-Object -TypeName Microsoft.Win32.SaveFileDialog
    $saveFileDialog.FileName = $fileName
    $saveFileDialog.Filter = "$fileExtension files (*$fileExtension)|*$fileExtension|All Files (*.*)|*.*"
    $filePath = $null
    $dialogResult = $saveFileDialog.ShowDialog()

    if ($dialogResult -ne $true) {
        Write-Output "Download canceled."
        return
    }

    $filePath = $saveFileDialog.FileName
    $webClient = New-Object System.Net.WebClient

    $downloadHandler = Register-ObjectEvent -InputObject $webClient -EventName DownloadProgressChanged -Action {
        Write-Progress -Activity "Downloading" -Status "$($EventArgs.ProgressPercentage)% Complete" -PercentComplete $EventArgs.ProgressPercentage
    }

    $webClient.DownloadFileAsync($uri, $filePath)
    while ($webClient.IsBusy) {
        Start-Sleep -Milliseconds 100
    }
    Unregister-Event -SourceIdentifier $downloadHandler.Name
    Remove-Job -Name $downloadHandler.Name

    Write-Output "File saved to $filePath"

    $endTime = Get-Date
    $runTime = $endTime - $startTime

    Write-Output "Download completed from $provider."
    Write-Output "Script run time: $runTime."
}