open System.Net
open System
open System.IO
let _start = "register_resp("
let _end = "); </script>"
let __start = "\"file_url\":\""
let __end = "\""
module Log =
let printStr line (str : string) =
match line with
| true -> Console.WriteLine str
| _ -> Console.Write str
let print line = printStr line << String.concat " "
let printColor line color (args : string list) =
System.Console.ForegroundColor <- color
print line args
let Error = printColor false ConsoleColor.Red
let Log = printColor false ConsoleColor.White
let Info = printColor false ConsoleColor.DarkGray
let ErrorLn = printColor true ConsoleColor.Red
let LogLn = printColor true ConsoleColor.White
let InfoLn = printColor true ConsoleColor.DarkGray
let Time _ = "[" + DateTime.Now.ToString() + "]"
let YanderDownloader downloadPath start num logPath databasePath =
seq{ start .. start + num - 1 }
|> Seq.iter (fun i ->
try
Log.LogLn [Log.Time(); "Start"; i.ToString(); " ... "]
use wc = new WebClient()
let json =
wc.DownloadString("https://yande.re/post/show/" + i.ToString())
|> (fun x ->
x.Substring(x.IndexOf(_start) + _start.Length)
|> (fun y -> y.Substring(0, y.IndexOf(_end))))
Log.InfoLn [json]
let fileUrl =
json.Substring(json.IndexOf(__start)+__start.Length)
|> (fun x -> x.Substring(0,x.IndexOf(__end)))
Log.InfoLn [fileUrl]
let _decoded = WebUtility.UrlDecode << Path.GetFileName <| fileUrl
let _path = Path.Combine(downloadPath, _decoded)
match File.Exists _path with
| false ->
if String.IsNullOrWhiteSpace databasePath |> not then
Log.Log [Log.Time(); "Write to database ... "]
use sw = new StreamWriter(databasePath, true)
sw.WriteLine json
Log.LogLn ["[done]"]
Log.Log [Log.Time(); "Downloading File ... "]
let _temp = Path.Combine(Environment.CurrentDirectory, _decoded)
wc.DownloadFile(fileUrl, _temp)
wc.Dispose()
File.Move(_temp, _path)
Log.LogLn ["[done]"]
| _ ->()
with
| e ->
if String.IsNullOrWhiteSpace logPath |> not then
use sw = new StreamWriter(logPath, true)
sw.WriteLine(i.ToString() + " " + e.Message)
Log.ErrorLn [Log.Time(); e.Message])
[<EntryPoint>]
let main argv =
match argv.Length with
| 3 -> YanderDownloader (argv.[0]) (Convert.ToInt32(argv.[1])) (Convert.ToInt32(argv.[2])) "" ""
| 4 -> YanderDownloader (argv.[0]) (Convert.ToInt32(argv.[1])) (Convert.ToInt32(argv.[2])) (argv.[3]) ""
| 5 -> YanderDownloader (argv.[0]) (Convert.ToInt32(argv.[1])) (Convert.ToInt32(argv.[2])) (argv.[3]) (argv.[4])
| _ -> Console.WriteLine "DownloadPath Start Num [LogPath] [DatabasePath]"
0