diff --git a/RDR_CMP/api.txt b/RDR_CMP/api.txt deleted file mode 100644 index 31c8e5f..0000000 --- a/RDR_CMP/api.txt +++ /dev/null @@ -1 +0,0 @@ -https://www.data.go.kr/tcs/dss/selectApiDataDetailView.do?publicDataPk=15056924 \ No newline at end of file diff --git a/RDR_CMP/rader.go b/RDR_CMP/rader.go index 32ce13a..c5cc260 100644 --- a/RDR_CMP/rader.go +++ b/RDR_CMP/rader.go @@ -7,7 +7,6 @@ import ( "net/http" "net/url" "strings" - "time" ) type Response struct { @@ -30,13 +29,7 @@ type Response struct { } `json:"response"` } -func Time() string { - currentTime := time.Now() - return currentTime.Format("20060102") -} - -// time : YYYYMMDD | 20241226 -func GetImages(apikey, time string) ([]string, error) { +func GetImagesURL(apikey, time string) ([]string, error) { URL := "http://apis.data.go.kr/1360000/RadarImgInfoService/getCmpImg" params := url.Values{} params.Add("serviceKey", apikey) diff --git a/krapo.go b/krapo.go index 04260e8..b18bbe9 100644 --- a/krapo.go +++ b/krapo.go @@ -1,3 +1,12 @@ package krapo -import _ "github.com/fluffy-melli/krapo/RDR_CMP" +import ( + "time" + + _ "github.com/fluffy-melli/krapo/RDR_CMP" // https://www.data.go.kr/tcs/dss/selectApiDataDetailView.do?publicDataPk=15056924 +) + +func Time() string { + currentTime := time.Now() + return currentTime.Format("20060102") +} diff --git a/render/fetch.go b/render/fetch.go new file mode 100644 index 0000000..af3dd4b --- /dev/null +++ b/render/fetch.go @@ -0,0 +1,38 @@ +package render + +import ( + "fmt" + "image" + _ "image/gif" + _ "image/jpeg" + _ "image/png" + "net/http" + "strings" + "sync" +) + +var FileCache = make(map[string]image.Image) +var mu sync.RWMutex + +func LoadImageFromURL(ImageURL string) (image.Image, error) { + ImageURL = strings.TrimSpace(ImageURL) + mu.RLock() + img, exists := FileCache[ImageURL] + mu.RUnlock() + if exists { + return img, nil + } + resp, err := http.Get(ImageURL) + if err != nil { + return nil, fmt.Errorf("failed to fetch image from URL %s: %v", ImageURL, err) + } + defer resp.Body.Close() + img, _, err = image.Decode(resp.Body) + if err != nil { + return nil, fmt.Errorf("failed to decode image from URL %s: %v", ImageURL, err) + } + mu.Lock() + FileCache[ImageURL] = img + mu.Unlock() + return img, nil +} diff --git a/render/file.go b/render/file.go new file mode 100644 index 0000000..3bbb6dd --- /dev/null +++ b/render/file.go @@ -0,0 +1,23 @@ +package render + +import ( + "bytes" + "fmt" + "os" +) + +func Write(filename string, buf *bytes.Buffer) error { + if buf == nil { + return fmt.Errorf("buffer cannot be nil") + } + file, err := os.Create(filename) + if err != nil { + return fmt.Errorf("failed to create file: %v", err) + } + defer file.Close() + _, err = file.Write(buf.Bytes()) + if err != nil { + return fmt.Errorf("failed to write data to file: %v", err) + } + return nil +} diff --git a/render/gifs.go b/render/gifs.go new file mode 100644 index 0000000..8723969 --- /dev/null +++ b/render/gifs.go @@ -0,0 +1,54 @@ +package render + +import ( + "bytes" + "image" + "image/color" + "image/gif" +) + +func GIF(urls []string, delay int) (*bytes.Buffer, error) { + var images []*image.Paletted + var delays []int + for _, url := range urls { + img, err := LoadImageFromURL(url) + if err != nil { + return nil, err + } + palette := Palette(img) + palettedImage := image.NewPaletted(img.Bounds(), palette) + for y := 0; y < palettedImage.Bounds().Dy(); y++ { + for x := 0; x < palettedImage.Bounds().Dx(); x++ { + palettedImage.Set(x, y, img.At(x, y)) + } + } + images = append(images, palettedImage) + delays = append(delays, delay) + } + var buf bytes.Buffer + err := gif.EncodeAll(&buf, &gif.GIF{ + Image: images, + Delay: delays, + }) + if err != nil { + return nil, err + } + return &buf, nil +} + +func Palette(frame image.Image) color.Palette { + colorSet := make(map[color.Color]struct{}) + for y := 0; y < frame.Bounds().Dy(); y++ { + for x := 0; x < frame.Bounds().Dx(); x++ { + colorSet[frame.At(x, y)] = struct{}{} + } + } + var colors []color.Color + for c := range colorSet { + colors = append(colors, c) + } + if len(colors) > 256 { + colors = colors[:256] + } + return colors +} diff --git a/test/module_test.go b/test/module_test.go new file mode 100644 index 0000000..527d6e1 --- /dev/null +++ b/test/module_test.go @@ -0,0 +1,25 @@ +package main + +import ( + "log" + "testing" + + "github.com/fluffy-melli/krapo" + "github.com/fluffy-melli/krapo/RDR_CMP" + "github.com/fluffy-melli/krapo/render" +) + +func Test(t *testing.T) { + urls, err := RDR_CMP.GetImagesURL("", krapo.Time()) + if err != nil { + log.Fatalln(err) + } + gif, err := render.GIF(urls, 5) + if err != nil { + log.Fatalln(err) + } + err = render.Write("./test.gif", gif) + if err != nil { + log.Fatalln(err) + } +} diff --git a/test/test.gif b/test/test.gif new file mode 100644 index 0000000..f5e4333 Binary files /dev/null and b/test/test.gif differ