Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- SuperStrict
- Framework BaH.libcurl
- Import BaH.RegEx
- Import BRL.StandardIO
- Import BRL.FileSystem
- Import BRL.Map
- Import "TFile.bmx"
- Import "md5.c"
- Extern
- Function MD5_Init(State:Byte Ptr) = "md5_init"
- Function MD5_Append(State:Byte Ptr, Buffer:Byte Ptr, Size:Int) = "md5_append"
- Function MD5_Finish(State:Byte Ptr, Digest:Byte Ptr) = "md5_finish"
- EndExtern
- If Not FileType("Images") Then CreateDir("Images")
- InitializeImageEntries("Images")
- DownloadThreadList("oat", "Images")
- Function InitializeImageEntries(Folder:String)
- Local Dir:TFile = TFile.Open(Folder)
- Dir.StripParent()
- Dir.Filter(FILETYPE_FILE)
- For Local File:TFile = EachIn Dir
- TImageEntry.Create(File.Path())
- Next
- End Function
- Function DownloadThreadList(Board:String, TargetPath:String)
- Local Request:TCurlEasy = TCurlEasy.Create()
- Request.SetOptInt (CURLOPT_FOLLOWLOCATION, 1)
- Request.SetOptString (CURLOPT_URL, "ponychan.net/chan/" + Board + "/catalog.html")
- Request.SetWriteString()
- Local Result:Int = Request.Perform()
- If Result Then Print "LibCurl error: " + CurlError(Result); Return
- Local Regex:TRegEx = TRegEx.Create("\/chan\/" + Board + "\/res\/([0-9]+)\.html")
- Local Match:TRegExMatch = Regex.Find(Request.ToString())
- While Match
- Print "Downloading thread with id " + Match.SubExp(1)
- DownloadThread("ponychan.net" + Match.SubExp(0), Board, TargetPath)
- Match = Regex.Find()
- Wend
- End Function
- Function DownloadThread(URL:String, Board:String, TargetPath:String)
- TargetPath = StripSlash(TargetPath) + "\"
- Local Request:TCurlEasy = TCurlEasy.Create()
- Request.SetOptInt (CURLOPT_FOLLOWLOCATION, 1)
- Request.SetOptString (CURLOPT_URL, URL)
- Request.SetWriteString()
- Local Result:Int = Request.Perform()
- If Result Then Print "LibCurl error: " + CurlError(Result); Return
- Local Regex:TRegEx = TRegEx.Create("expandimg\(\'[0-9]+\'\, \'http\:\/\/www\.(ponychan\.net\/chan\/" + Board + "\/src\/([0-9]+\.(jpg|png|gif)))") 'I AM THE REGEX GOD
- Local Match:TRegExMatch = Regex.Find(Request.ToString())
- While Match
- Print "Downloading " + Match.SubExp(1)
- Local Path:String = TargetPath + Match.SubExp(2)
- If Not FileType(Path) Then
- Local Stream:TStream = WriteFile(Path)
- Request.SetOptString(CURLOPT_URL, Match.SubExp(1))
- Request.SetWriteCallback(CustomWrite, Stream)
- Request.Perform()
- Stream.Close()
- TImageEntry.Create(Path)
- EndIf
- Match = Regex.Find()
- Wend
- Request.Cleanup()
- End Function
- Function CustomWrite:Int(Buffer:Byte Ptr, Size:Int, Data:Object)
- Local FileStream:TStream = TStream(Data)
- Return FileStream.WriteBytes(Buffer, Size)
- End Function
- Type TImageEntry
- Global HashMap:TMap = New TMap
- Global SizeMap:TMap = New TMap
- Global HashBuffer:Byte[10*1024]
- Global HashStateBuffer:Byte[88]
- Field Path:String
- Field Size:Int
- Field HasHash:Int
- Field MD5Hash:Int[4]
- Function Create:TImageEntry(Path:String)
- If Not FileType(Path) Then Return Null
- Local Entry:TImageEntry = New TImageEntry
- Entry.Path = Path
- Entry.Size = FileSize(Path)
- If Entry.IsDuplicate() Then
- Print "Duplicate detected at " + Path + ". Deleting..."
- DeleteFile(Path)
- Return Null
- EndIf
- SizeMap.Insert(TBoxedInteger.Create(Entry.Size), Entry)
- Return Entry
- End Function
- Method IsDuplicate:Int()
- Local Entry:TImageEntry = TImageEntry(SizeMap.ValueForKey(TBoxedInteger.Create(Size)))
- If Entry Then
- If Not Entry.HasHash Then Entry.GenerateHashAndInsert()
- If Not HasHash Then GenerateHash()
- If HashMap.ValueForKey(Self) Then Return True
- HashMap.Insert(Self, Self)
- EndIf
- Return False
- End Method
- Method GenerateHashAndInsert()
- GenerateHash()
- If HashMap.ValueForKey(Self) Then RuntimeError("TImageEntry::GenerateHashAndInsert: This should never happen")
- HashMap.Insert(Self, Self)
- End Method
- Method GenerateHash()
- Local TempSize:Int = Size
- Local Stream:TStream = ReadFile(Path)
- MD5_Init(Varptr HashStateBuffer[0])
- While TempSize > 0
- Stream.ReadBytes(Varptr HashBuffer[0], Min(HashBuffer.Length, TempSize))
- MD5_Append(Varptr HashStateBuffer[0], Varptr HashBuffer[0], Min(HashBuffer.Length, TempSize))
- TempSize :- HashBuffer.Length
- Wend
- MD5_Finish(Varptr HashStateBuffer[0], Varptr MD5Hash[0])
- HasHash = True
- End Method
- Method Compare:Int(B:Object)
- Local Other:TImageEntry = TImageEntry(B)
- If MD5Hash[0] - Other.MD5Hash[0] Then Return MD5Hash[0] - Other.MD5Hash[0]
- If MD5Hash[1] - Other.MD5Hash[1] Then Return MD5Hash[1] - Other.MD5Hash[1]
- If MD5Hash[2] - Other.MD5Hash[2] Then Return MD5Hash[2] - Other.MD5Hash[2]
- If MD5Hash[3] - Other.MD5Hash[3] Then Return MD5Hash[3] - Other.MD5Hash[3]
- Return 0
- End Method
- End Type
- Type TBoxedInteger
- Field Value:Int
- Method Compare:Int(B:Object)
- Return Value - TBoxedInteger(B).Value
- End Method
- Function Create:TBoxedInteger(Value:Int)
- Local Integer:TBoxedInteger = New TBoxedInteger
- Integer.Value = Value
- Return Integer
- End Function
- End Type
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement