1package piece
2
3import (
4 "errors"
5 "fmt"
6 "generate/config"
7 "generate/utils"
8 "log"
9 "os"
10 "os/exec"
11 "path/filepath"
12 "slices"
13 "time"
14)
15
16type Piece struct {
17 ID string
18 URL string
19 DateCreated time.Time
20 PositionAbsolute bool
21 RelativeID string
22 InfoCardTitle string
23 InfoCardPosition int
24 Position utils.Coords
25 AddWidth bool
26 AddHeight bool
27 Size int
28 Resolution utils.Coords
29 Video bool
30}
31
32const (
33 Half = iota
34 Full
35)
36
37const (
38 BRightSTop = iota
39 BRightSBottom
40 BLeftSTop
41 BLeftSBottom
42 BTopSLeft
43 BTopSRight
44 BBottomSLeft
45 BBottomSRight
46)
47
48func ComputeDimensions(piece Piece) utils.Coords {
49 height := 0.0
50
51 if piece.Size == Full {
52 height = config.GalleryHeight - config.GalleryPadding*2
53 } else {
54 height = (config.GalleryHeight-config.VerticalPadding)/2 - config.GalleryPadding
55 }
56 if slices.Contains([]int{BTopSLeft, BTopSRight, BBottomSLeft, BBottomSRight}, piece.InfoCardPosition) {
57 height -= config.VerticalPadding + config.InfoCardHeight
58 }
59 height -= config.PiecePadding * 2
60 width := height * piece.Resolution.X / piece.Resolution.Y
61 return utils.Coords{X: width + config.PiecePadding*2, Y: height + config.PiecePadding*2}
62}
63
64func ComputePosition(offset utils.Coords, piece Piece, pieces []Piece) utils.Coords {
65 offset.X += piece.Position.X
66 offset.Y += piece.Position.Y
67 if piece.PositionAbsolute {
68 if slices.Contains([]int{BLeftSTop, BLeftSBottom}, piece.InfoCardPosition) {
69 offset.X += config.InfoCardWidth + config.HorizontalPadding
70 }
71 return utils.Coords{X: offset.X, Y: offset.Y}
72 } else {
73 foundPiece := Piece{}
74 isPieceFound := false
75 for _, iPiece := range pieces {
76 if iPiece.ID == piece.RelativeID {
77 isPieceFound = true
78 foundPiece = iPiece
79 }
80 }
81 if !isPieceFound {
82 log.Fatal("Invalid reference to piece ID: ", piece.RelativeID)
83 }
84 if piece.AddWidth {
85 offset.X += ComputeDimensions(foundPiece).X + config.HorizontalPadding
86 if slices.Contains([]int{BLeftSTop, BLeftSBottom, BRightSTop, BRightSBottom}, foundPiece.InfoCardPosition) {
87 offset.X += config.InfoCardWidth + config.HorizontalPadding
88 }
89 }
90 if piece.AddHeight {
91 offset.Y += ComputeDimensions(foundPiece).Y + config.VerticalPadding
92 if slices.Contains([]int{BTopSLeft, BTopSRight, BBottomSLeft, BBottomSRight}, foundPiece.InfoCardPosition) {
93 offset.Y += config.InfoCardHeight + config.VerticalPadding
94 }
95 }
96 return ComputePosition(offset, foundPiece, pieces)
97 }
98}
99
100func GeneratePieceHTML(piece Piece, pieces []Piece) (string, float64) {
101 pieceDimensions := ComputeDimensions(piece)
102 piecePosition := ComputePosition(utils.Coords{}, piece, pieces)
103
104 maxX := pieceDimensions.X + piecePosition.X
105 if slices.Contains([]int{BRightSTop, BRightSBottom}, piece.InfoCardPosition) {
106 maxX += config.HorizontalPadding + config.InfoCardWidth
107 }
108 piecePositionX := piecePosition.X
109 piecePositionY := piecePosition.Y + config.GalleryPadding
110 infoCardPositionX := piecePositionX
111 infoCardPositionY := piecePositionY
112 if slices.Contains([]int{BTopSLeft, BTopSRight}, piece.InfoCardPosition) {
113 piecePositionY += config.VerticalPadding + config.InfoCardHeight
114 }
115 switch piece.InfoCardPosition {
116 case BRightSTop:
117 infoCardPositionX += pieceDimensions.X + config.HorizontalPadding
118 case BRightSBottom:
119 infoCardPositionX += pieceDimensions.X + config.HorizontalPadding
120 infoCardPositionY += pieceDimensions.Y - config.InfoCardHeight
121 case BLeftSTop:
122 infoCardPositionX -= config.InfoCardWidth + config.HorizontalPadding
123 case BLeftSBottom:
124 infoCardPositionX -= config.InfoCardWidth + config.HorizontalPadding
125 infoCardPositionY += pieceDimensions.Y - config.InfoCardHeight
126 case BTopSLeft:
127 //
128 case BTopSRight:
129 infoCardPositionX += pieceDimensions.X - config.InfoCardWidth
130 case BBottomSLeft:
131 infoCardPositionY += pieceDimensions.Y + config.VerticalPadding
132 case BBottomSRight:
133 infoCardPositionX += pieceDimensions.X - config.InfoCardWidth
134 infoCardPositionY += pieceDimensions.Y + config.VerticalPadding
135 }
136 contentHTML := ""
137
138 abs_input_path, err := filepath.Abs("../" + config.AssetsRootURL + piece.URL)
139 if err != nil {
140 log.Fatal(err)
141 }
142 abs_output_path, err := filepath.Abs("../" + config.AssetsCompressedRootURL + piece.ID)
143 if err != nil {
144 log.Fatal(err)
145 }
146 assetsImageCompressionArgs := make([]string, len(config.AssetsImageCompressionArgs)+4)
147 for i := 0; i < len(config.AssetsImageCompressionArgs); i++ {
148 assetsImageCompressionArgs[i+3] = config.AssetsImageCompressionArgs[i]
149 }
150 assetsImageCompressionArgs[0] = "-y"
151 assetsImageCompressionArgs[1] = "-i"
152 assetsImageCompressionArgs[2] = abs_input_path
153 assetsImageCompressionArgs[len(assetsImageCompressionArgs)-1] = abs_output_path + ".webp"
154
155 assetsVideoCompressionArgs := make([]string, len(config.AssetsVideoCompressionArgs)+4)
156 for i := 0; i < len(config.AssetsVideoCompressionArgs); i++ {
157 assetsVideoCompressionArgs[i+3] = config.AssetsVideoCompressionArgs[i]
158 }
159 assetsVideoCompressionArgs[0] = "-y"
160 assetsVideoCompressionArgs[1] = "-i"
161 assetsVideoCompressionArgs[2] = abs_input_path
162 assetsVideoCompressionArgs[len(assetsVideoCompressionArgs)-1] = abs_output_path + ".webm"
163
164 cmd := exec.Command("ffmpeg", assetsImageCompressionArgs...)
165 if piece.Video {
166 cmd = exec.Command("ffmpeg", assetsVideoCompressionArgs...)
167 }
168 if errors.Is(cmd.Err, exec.ErrDot) {
169 cmd.Err = nil
170 }
171 if config.RecomputeCompression {
172 cmd.Stdout, cmd.Stderr = os.Stdout, os.Stderr
173 err = cmd.Run()
174 if err != nil {
175 fmt.Println(cmd.String())
176 log.Fatal(err)
177 }
178 } else {
179 fmt.Println(cmd.String())
180 }
181 if piece.Video {
182 contentHTML = fmt.Sprintf(`<video width="%f" height="%f" autoplay muted playsinline loop><source src="%s" type="video/mp4" /></video>`, pieceDimensions.X-config.PiecePadding*2, pieceDimensions.Y-config.PiecePadding*2, config.AssetsCompressedRootURL+piece.ID+".webm")
183 } else {
184 contentHTML = fmt.Sprintf(`<img src="%s" style="width:%fpx;height:%fpx;"></img>`, config.AssetsCompressedRootURL+piece.ID+".webp", pieceDimensions.X-config.PiecePadding*2, pieceDimensions.Y-config.PiecePadding*2)
185 }
186 return fmt.Sprintf(`
187 <div class="piece-container" style="left:%fpx;top:%fpx;width:%fpx;height:%fpx;">%s</div>
188 <div class="info-card" style="left:%fpx;top:%fpx;"><div class="info-card-title">%s</div><div class="info-card-date">%s</div></div>
189 `, piecePositionX, piecePositionY, pieceDimensions.X-config.PiecePadding*2, pieceDimensions.Y-config.PiecePadding*2, contentHTML, infoCardPositionX, infoCardPositionY, piece.InfoCardTitle, piece.DateCreated.Format("Mon 02 Jan 2006 15:04 MST")), maxX
190}
191
192var GalleryPieces = []Piece{
193
194 {
195 ID: "jpkr30",
196 URL: "jpandkorea2025/P1239080.jpg",
197 DateCreated: time.Date(2025, 8, 12, 15, 35, 29, 0, time.FixedZone("KST", 9)),
198 PositionAbsolute: true,
199 RelativeID: "",
200 InfoCardTitle: "봉은사 3",
201 InfoCardPosition: BRightSBottom,
202 Position: utils.Coords{X: 1000, Y: 0},
203 AddWidth: true,
204 AddHeight: false,
205 Size: Full,
206 Resolution: utils.Coords{X: 5192, Y: 3896},
207 Video: false,
208 }, {
209 ID: "jpkr29",
210 URL: "jpandkorea2025/P1238955.jpg",
211 DateCreated: time.Date(2025, 8, 12, 15, 29, 20, 0, time.FixedZone("KST", 9)),
212 PositionAbsolute: false,
213 RelativeID: "jpkr30",
214 InfoCardTitle: "봉은사 2",
215 InfoCardPosition: BRightSBottom,
216 Position: utils.Coords{X: 0, Y: 0},
217 AddWidth: true,
218 AddHeight: false,
219 Size: Full,
220 Resolution: utils.Coords{X: 5192, Y: 3896},
221 Video: false,
222 }, {
223 ID: "jpkr28",
224 URL: "jpandkorea2025/P1238716.jpg",
225 DateCreated: time.Date(2025, 8, 12, 15, 23, 46, 0, time.FixedZone("KST", 9)),
226 PositionAbsolute: false,
227 RelativeID: "jpkr29",
228 InfoCardTitle: "봉은사 1",
229 InfoCardPosition: BRightSBottom,
230 Position: utils.Coords{X: 0, Y: 0},
231 AddWidth: true,
232 AddHeight: false,
233 Size: Full,
234 Resolution: utils.Coords{X: 5192, Y: 3896},
235 Video: false,
236 }, {
237 ID: "jpkr27",
238 URL: "jpandkorea2025/P1228444.jpg",
239 DateCreated: time.Date(2025, 8, 11, 19, 21, 14, 0, time.FixedZone("KST", 9)),
240 PositionAbsolute: false,
241 RelativeID: "jpkr28",
242 InfoCardTitle: "서울의 일몰",
243 InfoCardPosition: BRightSBottom,
244 Position: utils.Coords{X: 0, Y: 0},
245 AddWidth: true,
246 AddHeight: false,
247 Size: Full,
248 Resolution: utils.Coords{X: 5192, Y: 3896},
249 Video: false,
250 }, {
251 ID: "jpkr26",
252 URL: "jpandkorea2025/P1228260.jpg",
253 DateCreated: time.Date(2025, 8, 11, 18, 51, 53, 0, time.FixedZone("KST", 9)),
254 PositionAbsolute: false,
255 RelativeID: "jpkr27",
256 InfoCardTitle: "N서울타워",
257 InfoCardPosition: BRightSBottom,
258 Position: utils.Coords{X: 0, Y: 0},
259 AddWidth: true,
260 AddHeight: false,
261 Size: Full,
262 Resolution: utils.Coords{X: 3896, Y: 5192},
263 Video: false,
264 }, {
265 ID: "jpkr25",
266 URL: "jpandkorea2025/P1228193.jpg",
267 DateCreated: time.Date(2025, 8, 11, 18, 33, 59, 0, time.FixedZone("KST", 9)),
268 PositionAbsolute: false,
269 RelativeID: "jpkr26",
270 InfoCardTitle: "서울의 맑고 푸른 하늘",
271 InfoCardPosition: BRightSBottom,
272 Position: utils.Coords{X: 0, Y: 0},
273 AddWidth: true,
274 AddHeight: false,
275 Size: Full,
276 Resolution: utils.Coords{X: 3896, Y: 5192},
277 Video: false,
278 }, {
279 ID: "jpkr24",
280 URL: "jpandkorea2025/P1228117.jpg",
281 DateCreated: time.Date(2025, 8, 10, 16, 39, 04, 0, time.FixedZone("JST", 9)),
282 PositionAbsolute: false,
283 RelativeID: "jpkr25",
284 InfoCardTitle: "海の中道海浜公園",
285 InfoCardPosition: BRightSBottom,
286 Position: utils.Coords{X: 0, Y: 0},
287 AddWidth: true,
288 AddHeight: false,
289 Size: Full,
290 Resolution: utils.Coords{X: 5192, Y: 3896},
291 Video: false,
292 }, {
293 ID: "jpkr23",
294 URL: "jpandkorea2025/P1228022.jpg",
295 DateCreated: time.Date(2025, 8, 9, 16, 29, 13, 0, time.FixedZone("JST", 9)),
296 PositionAbsolute: false,
297 RelativeID: "jpkr24",
298 InfoCardTitle: "黒川温泉",
299 InfoCardPosition: BRightSBottom,
300 Position: utils.Coords{X: 0, Y: 0},
301 AddWidth: true,
302 AddHeight: false,
303 Size: Full,
304 Resolution: utils.Coords{X: 5192, Y: 3896},
305 Video: false,
306 }, {
307 ID: "jpkr22",
308 URL: "jpandkorea2025/P1227878.jpg",
309 DateCreated: time.Date(2025, 8, 8, 19, 47, 45, 0, time.FixedZone("JST", 9)),
310 PositionAbsolute: false,
311 RelativeID: "jpkr23",
312 InfoCardTitle: "NHK Nagasaki 5",
313 InfoCardPosition: BRightSBottom,
314 Position: utils.Coords{X: 0, Y: 0},
315 AddWidth: true,
316 AddHeight: false,
317 Size: Full,
318 Resolution: utils.Coords{X: 5192, Y: 3896},
319 Video: false,
320 }, {
321 ID: "jpkr21",
322 URL: "jpandkorea2025/P1217663.jpg",
323 DateCreated: time.Date(2025, 8, 8, 19, 34, 42, 0, time.FixedZone("JST", 9)),
324 PositionAbsolute: false,
325 RelativeID: "jpkr22",
326 InfoCardTitle: "NHK Nagasaki 4",
327 InfoCardPosition: BRightSBottom,
328 Position: utils.Coords{X: 0, Y: 0},
329 AddWidth: true,
330 AddHeight: false,
331 Size: Full,
332 Resolution: utils.Coords{X: 3896, Y: 5192},
333 Video: false,
334 }, {
335 ID: "jpkr20",
336 URL: "jpandkorea2025/P1217623.jpg",
337 DateCreated: time.Date(2025, 8, 8, 19, 33, 25, 0, time.FixedZone("JST", 9)),
338 PositionAbsolute: false,
339 RelativeID: "jpkr21",
340 InfoCardTitle: "NHK Nagasaki 3",
341 InfoCardPosition: BRightSBottom,
342 Position: utils.Coords{X: 0, Y: 0},
343 AddWidth: true,
344 AddHeight: false,
345 Size: Full,
346 Resolution: utils.Coords{X: 3896, Y: 5192},
347 Video: false,
348 }, {
349 ID: "jpkr19",
350 URL: "jpandkorea2025/P1217579.jpg",
351 DateCreated: time.Date(2025, 8, 8, 19, 32, 52, 0, time.FixedZone("JST", 9)),
352 PositionAbsolute: false,
353 RelativeID: "jpkr20",
354 InfoCardTitle: "NHK Nagasaki 2",
355 InfoCardPosition: BRightSBottom,
356 Position: utils.Coords{X: 0, Y: 0},
357 AddWidth: true,
358 AddHeight: false,
359 Size: Full,
360 Resolution: utils.Coords{X: 3896, Y: 5192},
361 Video: false,
362 }, {
363 ID: "jpkr18",
364 URL: "jpandkorea2025/P1217510.jpg",
365 DateCreated: time.Date(2025, 8, 8, 19, 30, 24, 0, time.FixedZone("JST", 9)),
366 PositionAbsolute: false,
367 RelativeID: "jpkr19",
368 InfoCardTitle: "NHK Nagasaki 1",
369 InfoCardPosition: BRightSBottom,
370 Position: utils.Coords{X: 0, Y: 0},
371 AddWidth: true,
372 AddHeight: false,
373 Size: Full,
374 Resolution: utils.Coords{X: 3896, Y: 5192},
375 Video: false,
376 }, {
377 ID: "jpkr17",
378 URL: "jpandkorea2025/P1217332.jpg",
379 DateCreated: time.Date(2025, 8, 8, 16, 3, 43, 0, time.FixedZone("JST", 9)),
380 PositionAbsolute: false,
381 RelativeID: "jpkr18",
382 InfoCardTitle: "長崎の猫",
383 InfoCardPosition: BRightSBottom,
384 Position: utils.Coords{X: 0, Y: 0},
385 AddWidth: true,
386 AddHeight: false,
387 Size: Full,
388 Resolution: utils.Coords{X: 5192, Y: 3896},
389 Video: false,
390 }, {
391 ID: "jpkr17-insert",
392 URL: "jpandkorea2025/P1217035.jpg",
393 DateCreated: time.Date(2025, 8, 8, 10, 43, 47, 0, time.FixedZone("JST", 9)),
394 PositionAbsolute: false,
395 RelativeID: "jpkr17",
396 InfoCardTitle: "長崎平和公園の折り鶴",
397 InfoCardPosition: BRightSBottom,
398 Position: utils.Coords{X: 0, Y: 0},
399 AddWidth: true,
400 AddHeight: false,
401 Size: Full,
402 Resolution: utils.Coords{X: 3896, Y: 5192},
403 Video: false,
404 }, {
405 ID: "jpkr16",
406 URL: "jpandkorea2025/P1216748.jpg",
407 DateCreated: time.Date(2025, 8, 7, 16, 16, 36, 0, time.FixedZone("JST", 9)),
408 PositionAbsolute: false,
409 RelativeID: "jpkr17-insert",
410 InfoCardTitle: "鷲尾愛宕神社",
411 InfoCardPosition: BRightSBottom,
412 Position: utils.Coords{X: 0, Y: 0},
413 AddWidth: true,
414 AddHeight: false,
415 Size: Full,
416 Resolution: utils.Coords{X: 3896, Y: 5192},
417 Video: false,
418 }, {
419 ID: "jpkr15",
420 URL: "jpandkorea2025/P1216424.jpg",
421 DateCreated: time.Date(2025, 8, 7, 11, 55, 10, 0, time.FixedZone("JST", 9)),
422 PositionAbsolute: false,
423 RelativeID: "jpkr16",
424 InfoCardTitle: "teamLab Forest",
425 InfoCardPosition: BRightSBottom,
426 Position: utils.Coords{X: 0, Y: 0},
427 AddWidth: true,
428 AddHeight: false,
429 Size: Full,
430 Resolution: utils.Coords{X: 5192, Y: 3896},
431 Video: false,
432 }, {
433 ID: "jpkr14",
434 URL: "jpandkorea2025/P1215876.jpg",
435 DateCreated: time.Date(2025, 8, 6, 16, 28, 52, 0, time.FixedZone("JST", 9)),
436 PositionAbsolute: false,
437 RelativeID: "jpkr15",
438 InfoCardTitle: "桜井二見ヶ浦 2",
439 InfoCardPosition: BRightSBottom,
440 Position: utils.Coords{X: 0, Y: 0},
441 AddWidth: true,
442 AddHeight: false,
443 Size: Full,
444 Resolution: utils.Coords{X: 5192, Y: 3896},
445 Video: false,
446 }, {
447 ID: "jpkr13",
448 URL: "jpandkorea2025/P1205679.jpg",
449 DateCreated: time.Date(2025, 8, 6, 16, 16, 30, 0, time.FixedZone("JST", 9)),
450 PositionAbsolute: false,
451 RelativeID: "jpkr14",
452 InfoCardTitle: "桜井二見ヶ浦 1",
453 InfoCardPosition: BRightSBottom,
454 Position: utils.Coords{X: 0, Y: 0},
455 AddWidth: true,
456 AddHeight: false,
457 Size: Full,
458 Resolution: utils.Coords{X: 5192, Y: 3896},
459 Video: false,
460 }, {
461 ID: "jpkr12",
462 URL: "jpandkorea2025/P1205415.jpg",
463 DateCreated: time.Date(2025, 8, 5, 20, 13, 37, 0, time.FixedZone("KST", 9)),
464 PositionAbsolute: false,
465 RelativeID: "jpkr13",
466 InfoCardTitle: "반포대교 달빛무지개분수",
467 InfoCardPosition: BRightSBottom,
468 Position: utils.Coords{X: 0, Y: 0},
469 AddWidth: true,
470 AddHeight: false,
471 Size: Full,
472 Resolution: utils.Coords{X: 3896, Y: 5192},
473 Video: false,
474 }, {
475 ID: "jpkr11",
476 URL: "jpandkorea2025/P1204894.jpg",
477 DateCreated: time.Date(2025, 8, 5, 13, 02, 21, 0, time.FixedZone("KST", 9)),
478 PositionAbsolute: false,
479 RelativeID: "jpkr12",
480 InfoCardTitle: "전쟁기념관",
481 InfoCardPosition: BRightSBottom,
482 Position: utils.Coords{X: 0, Y: 0},
483 AddWidth: true,
484 AddHeight: false,
485 Size: Half,
486 Resolution: utils.Coords{X: 5192, Y: 3896},
487 Video: false,
488 }, {
489 ID: "jpkr10",
490 URL: "jpandkorea2025/P1194724.jpg",
491 DateCreated: time.Date(2025, 8, 5, 10, 57, 43, 0, time.FixedZone("KST", 9)),
492 PositionAbsolute: false,
493 RelativeID: "jpkr11",
494 InfoCardTitle: "창덕궁 후원",
495 InfoCardPosition: BRightSBottom,
496 Position: utils.Coords{X: 0, Y: 0},
497 AddWidth: false,
498 AddHeight: true,
499 Size: Half,
500 Resolution: utils.Coords{X: 5192, Y: 3896},
501 Video: false,
502 }, {
503 ID: "jpkr9",
504 URL: "jpandkorea2025/P1194433.jpg",
505 DateCreated: time.Date(2025, 8, 4, 19, 49, 56, 0, time.FixedZone("KST", 9)),
506 PositionAbsolute: false,
507 RelativeID: "jpkr11",
508 InfoCardTitle: "낙산 성곽길",
509 InfoCardPosition: BRightSBottom,
510 Position: utils.Coords{X: 0, Y: 0},
511 AddWidth: true,
512 AddHeight: false,
513 Size: Full,
514 Resolution: utils.Coords{X: 5192, Y: 3896},
515 Video: false,
516 }, {
517 ID: "jpkr8",
518 URL: "jpandkorea2025/P1194095.jpg",
519 DateCreated: time.Date(2025, 8, 4, 16, 26, 06, 0, time.FixedZone("KST", 9)),
520 PositionAbsolute: false,
521 RelativeID: "jpkr9",
522 InfoCardTitle: "동대문디자인플라자 2",
523 InfoCardPosition: BRightSBottom,
524 Position: utils.Coords{X: 0, Y: 0},
525 AddWidth: true,
526 AddHeight: false,
527 Size: Full,
528 Resolution: utils.Coords{X: 3896, Y: 5192},
529 Video: false,
530 }, {
531 ID: "jpkr7",
532 URL: "jpandkorea2025/P1194112.jpg",
533 DateCreated: time.Date(2025, 8, 4, 16, 27, 51, 0, time.FixedZone("KST", 9)),
534 PositionAbsolute: false,
535 RelativeID: "jpkr8",
536 InfoCardTitle: "동대문디자인플라자 1",
537 InfoCardPosition: BRightSBottom,
538 Position: utils.Coords{X: 0, Y: 0},
539 AddWidth: true,
540 AddHeight: false,
541 Size: Full,
542 Resolution: utils.Coords{X: 3896, Y: 5192},
543 Video: false,
544 }, {
545 ID: "jpkr6",
546 URL: "jpandkorea2025/P1193834.jpg",
547 DateCreated: time.Date(2025, 8, 4, 10, 58, 27, 0, time.FixedZone("KST", 9)),
548 PositionAbsolute: false,
549 RelativeID: "jpkr7",
550 InfoCardTitle: "북촌한옥마을",
551 InfoCardPosition: BRightSBottom,
552 Position: utils.Coords{X: 0, Y: 0},
553 AddWidth: true,
554 AddHeight: false,
555 Size: Full,
556 Resolution: utils.Coords{X: 5192, Y: 3896},
557 Video: false,
558 }, {
559 ID: "jpkr5",
560 URL: "jpandkorea2025/P1193765.jpg",
561 DateCreated: time.Date(2025, 8, 4, 10, 05, 39, 0, time.FixedZone("KST", 9)),
562 PositionAbsolute: false,
563 RelativeID: "jpkr6",
564 InfoCardTitle: "Praying Mantis",
565 InfoCardPosition: BRightSBottom,
566 Position: utils.Coords{X: 0, Y: 0},
567 AddWidth: true,
568 AddHeight: false,
569 Size: Full,
570 Resolution: utils.Coords{X: 5192, Y: 3896},
571 Video: false,
572 }, {
573 ID: "jpkr4",
574 URL: "jpandkorea2025/P1183346.jpg",
575 DateCreated: time.Date(2025, 8, 4, 9, 23, 46, 0, time.FixedZone("KST", 9)),
576 PositionAbsolute: false,
577 RelativeID: "jpkr5",
578 InfoCardTitle: "경복궁 2",
579 InfoCardPosition: BRightSBottom,
580 Position: utils.Coords{X: 0, Y: 0},
581 AddWidth: true,
582 AddHeight: false,
583 Size: Half,
584 Resolution: utils.Coords{X: 5192, Y: 3896},
585 Video: false,
586 }, {
587 ID: "jpkr3",
588 URL: "jpandkorea2025/P1183651.jpg",
589 DateCreated: time.Date(2025, 8, 4, 9, 49, 46, 0, time.FixedZone("KST", 9)),
590 PositionAbsolute: false,
591 RelativeID: "jpkr4",
592 InfoCardTitle: "경복궁 1",
593 InfoCardPosition: BRightSBottom,
594 Position: utils.Coords{X: 0, Y: 0},
595 AddWidth: false,
596 AddHeight: true,
597 Size: Half,
598 Resolution: utils.Coords{X: 5192, Y: 3896},
599 Video: false,
600 }, {
601 ID: "jpkr2",
602 URL: "jpandkorea2025/P1182876.jpg",
603 DateCreated: time.Date(2025, 8, 3, 19, 06, 55, 0, time.FixedZone("KST", 9)),
604 PositionAbsolute: false,
605 RelativeID: "jpkr4",
606 InfoCardTitle: "시청",
607 InfoCardPosition: BRightSBottom,
608 Position: utils.Coords{X: 0, Y: 0},
609 AddWidth: true,
610 AddHeight: false,
611 Size: Full,
612 Resolution: utils.Coords{X: 3896, Y: 5192},
613 Video: false,
614 }, {
615 ID: "jpkr1",
616 URL: "jpandkorea2025/P1182840.jpg",
617 DateCreated: time.Date(2025, 8, 3, 18, 51, 4, 0, time.FixedZone("KST", 9)),
618 PositionAbsolute: false,
619 RelativeID: "jpkr2",
620 InfoCardTitle: "명동",
621 InfoCardPosition: BRightSBottom,
622 Position: utils.Coords{X: 0, Y: 0},
623 AddWidth: true,
624 AddHeight: false,
625 Size: Full,
626 Resolution: utils.Coords{X: 3896, Y: 5192},
627 Video: false,
628 }, {
629 ID: "jp35",
630 URL: "japan2024/P1171844.jpg",
631 DateCreated: time.Date(2024, 7, 31, 19, 36, 0, 0, time.FixedZone("JST", 9)),
632 PositionAbsolute: false,
633 RelativeID: "jpkr1",
634 InfoCardTitle: "上空から見た夜の大阪",
635 InfoCardPosition: BRightSBottom,
636 Position: utils.Coords{X: 0, Y: 0},
637 AddWidth: true,
638 AddHeight: false,
639 Size: Full,
640 Resolution: utils.Coords{X: 5192, Y: 3896},
641 Video: false,
642 }, {
643 ID: "jp34",
644 URL: "japan2024/P1161321.jpg",
645 DateCreated: time.Date(2024, 7, 31, 18, 21, 0, 0, time.FixedZone("JST", 9)),
646 PositionAbsolute: false,
647 RelativeID: "jp35",
648 InfoCardTitle: "空中庭園展望台",
649 InfoCardPosition: BRightSTop,
650 Position: utils.Coords{X: 0, Y: 0},
651 AddWidth: true,
652 AddHeight: false,
653 Size: Full,
654 Resolution: utils.Coords{X: 3896, Y: 5192},
655 Video: false,
656 }, {
657 ID: "jp33",
658 URL: "japan2024/P1161208.jpg",
659 DateCreated: time.Date(2024, 7, 31, 13, 53, 0, 0, time.FixedZone("JST", 9)),
660 PositionAbsolute: false,
661 RelativeID: "jp34",
662 InfoCardTitle: "クラゲ",
663 InfoCardPosition: BBottomSLeft,
664 Position: utils.Coords{X: 0, Y: 0},
665 AddWidth: true,
666 AddHeight: false,
667 Size: Full,
668 Resolution: utils.Coords{X: 5192, Y: 3896},
669 Video: false,
670 }, {
671 ID: "jp32",
672 URL: "japan2024/P1160349.jpg",
673 DateCreated: time.Date(2024, 7, 31, 8, 59, 0, 0, time.FixedZone("JST", 9)),
674 PositionAbsolute: false,
675 RelativeID: "jp33",
676 InfoCardTitle: "住𠮷大社",
677 InfoCardPosition: BRightSTop,
678 Position: utils.Coords{X: 0, Y: 0},
679 AddWidth: true,
680 AddHeight: false,
681 Size: Full,
682 Resolution: utils.Coords{X: 5192, Y: 3896},
683 Video: false,
684 }, {
685 ID: "jp31",
686 URL: "japan2024/P1160147.jpg",
687 DateCreated: time.Date(2024, 7, 30, 21, 29, 0, 0, time.FixedZone("JST", 9)),
688 PositionAbsolute: false,
689 RelativeID: "jp32",
690 InfoCardTitle: "道頓堀",
691 InfoCardPosition: BRightSBottom,
692 Position: utils.Coords{X: 0, Y: 0},
693 AddWidth: true,
694 AddHeight: false,
695 Size: Half,
696 Resolution: utils.Coords{X: 5192, Y: 3896},
697 Video: false,
698 }, {
699 ID: "jp30",
700 URL: "japan2024/P1159767.jpg",
701 DateCreated: time.Date(2024, 7, 29, 16, 12, 0, 0, time.FixedZone("JST", 9)),
702 PositionAbsolute: false,
703 RelativeID: "jp32",
704 InfoCardTitle: "清水寺",
705 InfoCardPosition: BRightSBottom,
706 Position: utils.Coords{X: 0, Y: 0},
707 AddWidth: true,
708 AddHeight: false,
709 Size: Full,
710 Resolution: utils.Coords{X: 5192, Y: 3896},
711 Video: false,
712 }, {
713 ID: "jp29",
714 URL: "japan2024/P1149102.jpg",
715 DateCreated: time.Date(2024, 7, 29, 10, 23, 0, 0, time.FixedZone("JST", 9)),
716 PositionAbsolute: false,
717 RelativeID: "jp30",
718 InfoCardTitle: "依水園",
719 InfoCardPosition: BRightSBottom,
720 Position: utils.Coords{X: 0, Y: 0},
721 AddWidth: true,
722 AddHeight: false,
723 Size: Full,
724 Resolution: utils.Coords{X: 5192, Y: 3896},
725 Video: false,
726 }, {
727 ID: "jp28",
728 URL: "japan2024/P1148810.jpg",
729 DateCreated: time.Date(2024, 7, 28, 7, 48, 0, 0, time.FixedZone("JST", 9)),
730 PositionAbsolute: false,
731 RelativeID: "jp29",
732 InfoCardTitle: "嵐山竹林",
733 InfoCardPosition: BLeftSTop,
734 Position: utils.Coords{X: 0, Y: 0},
735 AddWidth: true,
736 AddHeight: false,
737 Size: Full,
738 Resolution: utils.Coords{X: 5192, Y: 3896},
739 Video: false,
740 }, {
741 ID: "jp27",
742 URL: "japan2024/P1148643.jpg",
743 DateCreated: time.Date(2024, 7, 27, 18, 56, 0, 0, time.FixedZone("JST", 9)),
744 PositionAbsolute: false,
745 RelativeID: "jp28",
746 InfoCardTitle: "伏見稲荷大社 4",
747 InfoCardPosition: BRightSBottom,
748 Position: utils.Coords{X: 0, Y: 0},
749 AddWidth: true,
750 AddHeight: false,
751 Size: Full,
752 Resolution: utils.Coords{X: 3896, Y: 5192},
753 Video: false,
754 }, {
755 ID: "jp26",
756 URL: "japan2024/P1138611.jpg",
757 DateCreated: time.Date(2024, 7, 27, 18, 56, 0, 0, time.FixedZone("JST", 9)),
758 PositionAbsolute: false,
759 RelativeID: "jp27",
760 InfoCardTitle: "伏見稲荷大社 3",
761 InfoCardPosition: BRightSTop,
762 Position: utils.Coords{X: 0, Y: 0},
763 AddWidth: true,
764 AddHeight: false,
765 Size: Full,
766 Resolution: utils.Coords{X: 3896, Y: 5192},
767 Video: false,
768 }, {
769 ID: "jp25",
770 URL: "japan2024/P1138499.jpg",
771 DateCreated: time.Date(2024, 7, 27, 18, 44, 0, 0, time.FixedZone("JST", 9)),
772 PositionAbsolute: false,
773 RelativeID: "jp26",
774 InfoCardTitle: "伏見稲荷大社 2",
775 InfoCardPosition: BRightSBottom,
776 Position: utils.Coords{X: 0, Y: 0},
777 AddWidth: true,
778 AddHeight: false,
779 Size: Full,
780 Resolution: utils.Coords{X: 5192, Y: 3896},
781 Video: false,
782 }, {
783 ID: "jp24",
784 URL: "japan2024/P1138361.jpg",
785 DateCreated: time.Date(2024, 7, 27, 18, 28, 0, 0, time.FixedZone("JST", 9)),
786 PositionAbsolute: false,
787 RelativeID: "jp25",
788 InfoCardTitle: "伏見稲荷大社 1",
789 InfoCardPosition: BRightSBottom,
790 Position: utils.Coords{X: 0, Y: 0},
791 AddWidth: true,
792 AddHeight: false,
793 Size: Full,
794 Resolution: utils.Coords{X: 3896, Y: 5192},
795 Video: false,
796 }, {
797 ID: "jp23",
798 URL: "japan2024/P1138031.jpg",
799 DateCreated: time.Date(2024, 7, 26, 9, 57, 0, 0, time.FixedZone("JST", 9)),
800 PositionAbsolute: false,
801 RelativeID: "jp24",
802 InfoCardTitle: "teamLab Planets 3",
803 InfoCardPosition: BRightSBottom,
804 Position: utils.Coords{X: 0, Y: 0},
805 AddWidth: true,
806 AddHeight: false,
807 Size: Half,
808 Resolution: utils.Coords{X: 5192, Y: 3896},
809 Video: false,
810 }, {
811 ID: "jp22",
812 URL: "japan2024/P1137830.jpg",
813 DateCreated: time.Date(2024, 7, 26, 9, 41, 0, 0, time.FixedZone("JST", 9)),
814 PositionAbsolute: false,
815 RelativeID: "jp23",
816 InfoCardTitle: "teamLab Planets 2",
817 InfoCardPosition: BRightSTop,
818 Position: utils.Coords{X: 0, Y: 0},
819 AddWidth: false,
820 AddHeight: true,
821 Size: Half,
822 Resolution: utils.Coords{X: 5192, Y: 3896},
823 Video: false,
824 }, {
825 ID: "jp21",
826 URL: "japan2024/P1137645.jpg",
827 DateCreated: time.Date(2024, 7, 26, 9, 24, 0, 0, time.FixedZone("JST", 9)),
828 PositionAbsolute: false,
829 RelativeID: "jp23",
830 InfoCardTitle: "teamLab Planets 1",
831 InfoCardPosition: BRightSBottom,
832 Position: utils.Coords{X: 0, Y: 0},
833 AddWidth: true,
834 AddHeight: false,
835 Size: Full,
836 Resolution: utils.Coords{X: 3896, Y: 5192},
837 Video: false,
838 }, {
839 ID: "jp20",
840 URL: "japan2024/P1127586.jpg",
841 DateCreated: time.Date(2024, 7, 26, 9, 4, 0, 0, time.FixedZone("JST", 9)),
842 PositionAbsolute: false,
843 RelativeID: "jp21",
844 InfoCardTitle: "テプコ豊洲ビル",
845 InfoCardPosition: BRightSBottom,
846 Position: utils.Coords{X: 0, Y: 0},
847 AddWidth: true,
848 AddHeight: false,
849 Size: Half,
850 Resolution: utils.Coords{X: 5192, Y: 3896},
851 Video: false,
852 }, {
853 ID: "jp19",
854 URL: "japan2024/P1127217.jpg",
855 DateCreated: time.Date(2024, 7, 25, 16, 24, 0, 0, time.FixedZone("JST", 9)),
856 PositionAbsolute: false,
857 RelativeID: "jp20",
858 InfoCardTitle: "忠霊塔",
859 InfoCardPosition: BRightSTop,
860 Position: utils.Coords{X: 0, Y: 0},
861 AddWidth: false,
862 AddHeight: true,
863 Size: Half,
864 Resolution: utils.Coords{X: 5192, Y: 3896},
865 Video: false,
866 }, {
867 ID: "jp18",
868 URL: "japan2024/P1127011.jpg",
869 DateCreated: time.Date(2024, 7, 25, 10, 49, 0, 0, time.FixedZone("JST", 9)),
870 PositionAbsolute: false,
871 RelativeID: "jp20",
872 InfoCardTitle: "新宿御苑 2",
873 InfoCardPosition: BRightSTop,
874 Position: utils.Coords{X: 0, Y: 0},
875 AddWidth: true,
876 AddHeight: false,
877 Size: Half,
878 Resolution: utils.Coords{X: 5192, Y: 3896},
879 Video: false,
880 }, {
881 ID: "jp17",
882 URL: "japan2024/P1126948.jpg",
883 DateCreated: time.Date(2024, 7, 25, 10, 41, 0, 0, time.FixedZone("JST", 9)),
884 PositionAbsolute: false,
885 RelativeID: "jp18",
886 InfoCardTitle: "新宿御苑 1",
887 InfoCardPosition: BRightSBottom,
888 Position: utils.Coords{X: 0, Y: 0},
889 AddWidth: false,
890 AddHeight: true,
891 Size: Half,
892 Resolution: utils.Coords{X: 5192, Y: 3896},
893 Video: false,
894 }, {
895 ID: "jp16",
896 URL: "japan2024/P1126843.jpg",
897 DateCreated: time.Date(2024, 7, 24, 22, 32, 0, 0, time.FixedZone("JST", 9)),
898 PositionAbsolute: false,
899 RelativeID: "jp18",
900 InfoCardTitle: "東京湾",
901 InfoCardPosition: BRightSTop,
902 Position: utils.Coords{X: 0, Y: 0},
903 AddWidth: true,
904 AddHeight: false,
905 Size: Full,
906 Resolution: utils.Coords{X: 5192, Y: 3896},
907 Video: false,
908 }, {
909 ID: "jp15",
910 URL: "japan2024/P1126726.jpg",
911 DateCreated: time.Date(2024, 7, 24, 21, 59, 0, 0, time.FixedZone("JST", 9)),
912 PositionAbsolute: false,
913 RelativeID: "jp16",
914 InfoCardTitle: "テレポートブリッジ",
915 InfoCardPosition: BRightSBottom,
916 Position: utils.Coords{X: 0, Y: 0},
917 AddWidth: true,
918 AddHeight: false,
919 Size: Half,
920 Resolution: utils.Coords{X: 5192, Y: 3896},
921 Video: false,
922 }, {
923 ID: "jp14",
924 URL: "japan2024/P1126568.jpg",
925 DateCreated: time.Date(2024, 7, 24, 10, 28, 0, 0, time.FixedZone("JST", 9)),
926 PositionAbsolute: false,
927 RelativeID: "jp15",
928 InfoCardTitle: "明治神宮の飾り樽",
929 InfoCardPosition: BRightSTop,
930 Position: utils.Coords{X: 0, Y: 0},
931 AddWidth: false,
932 AddHeight: true,
933 Size: Half,
934 Resolution: utils.Coords{X: 5192, Y: 3896},
935 Video: false,
936 }, {
937 ID: "jp13",
938 URL: "japan2024/P1126479.jpg",
939 DateCreated: time.Date(2024, 7, 23, 19, 47, 0, 0, time.FixedZone("JST", 9)),
940 PositionAbsolute: false,
941 RelativeID: "jp15",
942 InfoCardTitle: "第58回葛飾納涼花火大会",
943 InfoCardPosition: BRightSTop,
944 Position: utils.Coords{X: 0, Y: 0},
945 AddWidth: true,
946 AddHeight: false,
947 Size: Full,
948 Resolution: utils.Coords{X: 3896, Y: 5192},
949 Video: false,
950 }, {
951 ID: "jp12",
952 URL: "japan2024/P1115597.jpg",
953 DateCreated: time.Date(2024, 7, 22, 21, 40, 0, 0, time.FixedZone("JST", 9)),
954 PositionAbsolute: false,
955 RelativeID: "jp13",
956 InfoCardTitle: "雨夜の新宿 2",
957 InfoCardPosition: BRightSBottom,
958 Position: utils.Coords{X: 0, Y: 0},
959 AddWidth: true,
960 AddHeight: false,
961 Size: Full,
962 Resolution: utils.Coords{X: 3896, Y: 5192},
963 Video: false,
964 }, {
965 ID: "jp11",
966 URL: "japan2024/P1115331.jpg",
967 DateCreated: time.Date(2024, 7, 22, 21, 9, 0, 0, time.FixedZone("JST", 9)),
968 PositionAbsolute: false,
969 RelativeID: "jp12",
970 InfoCardTitle: "雨夜の新宿 1",
971 InfoCardPosition: BRightSTop,
972 Position: utils.Coords{X: 0, Y: 0},
973 AddWidth: true,
974 AddHeight: false,
975 Size: Full,
976 Resolution: utils.Coords{X: 3896, Y: 5192},
977 Video: false,
978 }, {
979 ID: "jp10",
980 URL: "japan2024/P1115113.jpg",
981 DateCreated: time.Date(2024, 7, 22, 16, 0, 0, 0, time.FixedZone("JST", 9)),
982 PositionAbsolute: false,
983 RelativeID: "jp11",
984 InfoCardTitle: "絵馬 2",
985 InfoCardPosition: BRightSBottom,
986 Position: utils.Coords{X: 0, Y: 0},
987 AddWidth: true,
988 AddHeight: false,
989 Size: Full,
990 Resolution: utils.Coords{X: 3896, Y: 5192},
991 Video: false,
992 }, {
993 ID: "jp09",
994 URL: "japan2024/P1115083.jpg",
995 DateCreated: time.Date(2024, 7, 22, 15, 55, 0, 0, time.FixedZone("JST", 9)),
996 PositionAbsolute: false,
997 RelativeID: "jp10",
998 InfoCardTitle: "箱根神社",
999 InfoCardPosition: BRightSBottom,
1000 Position: utils.Coords{X: 0, Y: 0},
1001 AddWidth: true,
1002 AddHeight: false,
1003 Size: Full,
1004 Resolution: utils.Coords{X: 3896, Y: 5192},
1005 Video: false,
1006 }, {
1007 ID: "jp08",
1008 URL: "japan2024/P1104829.jpg",
1009 DateCreated: time.Date(2024, 7, 22, 14, 32, 0, 0, time.FixedZone("JST", 9)),
1010 PositionAbsolute: false,
1011 RelativeID: "jp09",
1012 InfoCardTitle: "箱根元宮 2",
1013 InfoCardPosition: BRightSBottom,
1014 Position: utils.Coords{X: 0, Y: 0},
1015 AddWidth: true,
1016 AddHeight: false,
1017 Size: Half,
1018 Resolution: utils.Coords{X: 5192, Y: 3896},
1019 Video: false,
1020 }, {
1021 ID: "jp07",
1022 URL: "japan2024/P1114971.jpg",
1023 DateCreated: time.Date(2024, 7, 22, 14, 50, 0, 0, time.FixedZone("JST", 9)),
1024 PositionAbsolute: false,
1025 RelativeID: "jp08",
1026 InfoCardTitle: "箱根元宮 1",
1027 InfoCardPosition: BRightSBottom,
1028 Position: utils.Coords{X: 0, Y: 0},
1029 AddWidth: false,
1030 AddHeight: true,
1031 Size: Half,
1032 Resolution: utils.Coords{X: 3896, Y: 5192},
1033 Video: false,
1034 }, {
1035 ID: "jp06",
1036 URL: "japan2024/P1104535-cropped.webp",
1037 DateCreated: time.Date(2024, 7, 22, 10, 41, 0, 0, time.FixedZone("JST", 9)),
1038 PositionAbsolute: false,
1039 RelativeID: "jp08",
1040 InfoCardTitle: "彫刻の森美術館",
1041 InfoCardPosition: BRightSBottom,
1042 Position: utils.Coords{X: 0, Y: 0},
1043 AddWidth: true,
1044 AddHeight: false,
1045 Size: Full,
1046 Resolution: utils.Coords{X: 2996, Y: 2248},
1047 Video: false,
1048 }, {
1049 ID: "jp05",
1050 URL: "japan2024/P1093894.jpg",
1051 DateCreated: time.Date(2024, 7, 21, 9, 29, 0, 0, time.FixedZone("JST", 9)),
1052 PositionAbsolute: false,
1053 RelativeID: "jp06",
1054 InfoCardTitle: "浜離宮恩賜庭園",
1055 InfoCardPosition: BRightSTop,
1056 Position: utils.Coords{X: 0, Y: 0},
1057 AddWidth: true,
1058 AddHeight: false,
1059 Size: Full,
1060 Resolution: utils.Coords{X: 3896, Y: 5192},
1061 Video: false,
1062 }, {
1063 ID: "jp04",
1064 URL: "japan2024/P1093765.jpg",
1065 DateCreated: time.Date(2024, 7, 21, 9, 7, 0, 0, time.FixedZone("JST", 9)),
1066 PositionAbsolute: false,
1067 RelativeID: "jp05",
1068 InfoCardTitle: "汐留シティセンター",
1069 InfoCardPosition: BRightSBottom,
1070 Position: utils.Coords{X: 0, Y: 0},
1071 AddWidth: true,
1072 AddHeight: false,
1073 Size: Half,
1074 Resolution: utils.Coords{X: 3896, Y: 5192},
1075 Video: false,
1076 }, {
1077 ID: "jp03",
1078 URL: "japan2024/P1093541.jpg",
1079 DateCreated: time.Date(2024, 7, 20, 10, 06, 0, 0, time.FixedZone("JST", 9)),
1080 PositionAbsolute: false,
1081 RelativeID: "jp04",
1082 InfoCardTitle: "東京スカイツリー",
1083 InfoCardPosition: BRightSTop,
1084 Position: utils.Coords{X: 0, Y: 0},
1085 AddWidth: false,
1086 AddHeight: true,
1087 Size: Half,
1088 Resolution: utils.Coords{X: 3896, Y: 5192},
1089 Video: false,
1090 }, {
1091 ID: "jp02",
1092 URL: "japan2024/P1093431.jpg",
1093 DateCreated: time.Date(2024, 7, 20, 9, 14, 0, 0, time.FixedZone("JST", 9)),
1094 PositionAbsolute: false,
1095 RelativeID: "jp04",
1096 InfoCardTitle: "絵馬 1",
1097 InfoCardPosition: BRightSTop,
1098 Position: utils.Coords{X: 0, Y: 0},
1099 AddWidth: true,
1100 AddHeight: false,
1101 Size: Full,
1102 Resolution: utils.Coords{X: 5192, Y: 3896},
1103 Video: false,
1104 }, {
1105 ID: "jp01",
1106 URL: "japan2024/P1093354.jpg",
1107 DateCreated: time.Date(2024, 7, 19, 20, 24, 0, 0, time.FixedZone("JST", 9)),
1108 PositionAbsolute: false,
1109 RelativeID: "jp02",
1110 InfoCardTitle: "夜の横浜 2",
1111 InfoCardPosition: BBottomSRight,
1112 Position: utils.Coords{X: 0, Y: 0},
1113 AddWidth: true,
1114 AddHeight: false,
1115 Size: Full,
1116 Resolution: utils.Coords{X: 3896, Y: 5192},
1117 Video: false,
1118 },
1119 {
1120 ID: "jp00",
1121 URL: "japan2024/P1093211.jpg",
1122 DateCreated: time.Date(2024, 7, 19, 20, 6, 0, 0, time.FixedZone("JST", 9)),
1123 PositionAbsolute: false,
1124 RelativeID: "jp01",
1125 InfoCardTitle: "夜の横浜 1",
1126 InfoCardPosition: BBottomSRight,
1127 Position: utils.Coords{X: 0, Y: 0},
1128 AddWidth: true,
1129 AddHeight: false,
1130 Size: Full,
1131 Resolution: utils.Coords{X: 5192, Y: 3896},
1132 Video: false,
1133 },
1134 {
1135 ID: "d0",
1136 URL: "starjump.webp",
1137 DateCreated: time.Date(2024, 6, 26, 20, 44, 0, 0, time.FixedZone("CEST", 2)),
1138 PositionAbsolute: false,
1139 RelativeID: "jp00",
1140 InfoCardTitle: "Starjump",
1141 InfoCardPosition: BRightSBottom,
1142 Position: utils.Coords{X: 0, Y: 0},
1143 AddWidth: true,
1144 AddHeight: false,
1145 Size: Full,
1146 Resolution: utils.Coords{X: 5120, Y: 1440},
1147 Video: false,
1148 }, {
1149 ID: "c0",
1150 URL: "tsutsuji.jpg",
1151 DateCreated: time.Date(2024, 5, 14, 19, 33, 14, 0, time.FixedZone("CEST", 2)),
1152 PositionAbsolute: false,
1153 RelativeID: "d0",
1154 InfoCardTitle: "つつじ",
1155 InfoCardPosition: BBottomSLeft,
1156 Position: utils.Coords{X: 0, Y: 0},
1157 AddWidth: true,
1158 AddHeight: false,
1159 Size: Full,
1160 Resolution: utils.Coords{X: 5192, Y: 3896},
1161 Video: false,
1162 }, {
1163 ID: "b0",
1164 URL: "java.webp",
1165 DateCreated: time.Date(2024, 4, 18, 14, 44, 52, 0, time.FixedZone("CEST", 2)),
1166 PositionAbsolute: false,
1167 RelativeID: "c0",
1168 InfoCardTitle: "Java",
1169 InfoCardPosition: BBottomSRight,
1170 Position: utils.Coords{X: 0, Y: 0},
1171 AddWidth: true,
1172 AddHeight: false,
1173 Size: Full,
1174 Resolution: utils.Coords{X: 5192, Y: 3896},
1175 Video: false,
1176 }, {
1177 ID: "a0",
1178 URL: "march2024-sakura-P1082294.webp",
1179 DateCreated: time.Date(2024, 3, 2, 21, 18, 20, 0, time.FixedZone("CET", 1)),
1180 PositionAbsolute: false,
1181 RelativeID: "b0",
1182 InfoCardTitle: "夜桜 1",
1183 InfoCardPosition: BBottomSRight,
1184 Position: utils.Coords{X: 0, Y: 0},
1185 AddWidth: true,
1186 AddHeight: false,
1187 Size: Full,
1188 Resolution: utils.Coords{X: 5192, Y: 3896},
1189 Video: false,
1190 },
1191 {
1192 ID: "a1",
1193 URL: "march2024-sakura-P1082290.webp",
1194 DateCreated: time.Date(2024, 3, 2, 21, 15, 49, 0, time.FixedZone("CET", 1)),
1195 PositionAbsolute: false,
1196 RelativeID: "a0",
1197 InfoCardTitle: "夜桜 2",
1198 InfoCardPosition: BBottomSRight,
1199 Position: utils.Coords{X: 0, Y: 0},
1200 AddWidth: true,
1201 AddHeight: false,
1202 Size: Half,
1203 Resolution: utils.Coords{X: 5192, Y: 3896},
1204 Video: false,
1205 },
1206 {
1207 ID: "a2",
1208 URL: "march2024-sakura-P1082305.webp",
1209 DateCreated: time.Date(2024, 3, 2, 21, 25, 54, 0, time.FixedZone("CET", 1)),
1210 PositionAbsolute: false,
1211 RelativeID: "a1",
1212 InfoCardTitle: "夜桜 3",
1213 InfoCardPosition: BBottomSRight,
1214 Position: utils.Coords{X: 0, Y: 0},
1215 AddWidth: false,
1216 AddHeight: true,
1217 Size: Half,
1218 Resolution: utils.Coords{X: 5192, Y: 3896},
1219 Video: false,
1220 },
1221
1222 {
1223 ID: "a3",
1224 URL: "march2024-sakura-P1082293.webp",
1225 DateCreated: time.Date(2024, 3, 2, 21, 17, 33, 0, time.FixedZone("CET", 1)),
1226 PositionAbsolute: false,
1227 RelativeID: "a1",
1228 InfoCardTitle: "夜桜 4",
1229 InfoCardPosition: BBottomSRight,
1230 Position: utils.Coords{X: 0, Y: 0},
1231 AddWidth: true,
1232 AddHeight: false,
1233 Size: Full,
1234 Resolution: utils.Coords{X: 5192, Y: 3896},
1235 Video: false,
1236 },
1237 {
1238 ID: "0",
1239 URL: "tokyowatercolor.webp",
1240 DateCreated: time.Date(2024, 2, 21, 13, 07, 00, 0, time.FixedZone("CET", 1)),
1241 PositionAbsolute: false,
1242 RelativeID: "a3",
1243 InfoCardTitle: "東京・水彩画風",
1244 InfoCardPosition: BBottomSRight,
1245 Position: utils.Coords{X: 0, Y: 0},
1246 AddWidth: true,
1247 AddHeight: false,
1248 Size: Full,
1249 Resolution: utils.Coords{X: 2560, Y: 1440},
1250 Video: false,
1251 },
1252 {
1253 ID: "1",
1254 URL: "5yencoins.webp",
1255 DateCreated: time.Date(2024, 02, 17, 14, 59, 00, 0, time.FixedZone("CET", 1)),
1256 PositionAbsolute: false,
1257 RelativeID: "0",
1258 InfoCardTitle: "For good luck.",
1259 InfoCardPosition: BRightSBottom,
1260 Position: utils.Coords{X: 0, Y: 0},
1261 AddWidth: true,
1262 AddHeight: false,
1263 Size: Half,
1264 Resolution: utils.Coords{X: 3360, Y: 1440},
1265 Video: false,
1266 },
1267 {
1268 ID: "2",
1269 URL: "watercolordesign.mp4",
1270 DateCreated: time.Date(2024, 02, 10, 20, 9, 00, 0, time.FixedZone("CET", 1)),
1271 PositionAbsolute: false,
1272 RelativeID: "1",
1273 InfoCardTitle: "Watercolor Design",
1274 InfoCardPosition: BRightSBottom,
1275 Position: utils.Coords{X: 0, Y: 0},
1276 AddWidth: false,
1277 AddHeight: true,
1278 Size: Half,
1279 Resolution: utils.Coords{X: 1440, Y: 1440},
1280 Video: true,
1281 },
1282 {
1283 ID: "3",
1284 URL: "GPTrainV8-yuv420p-compressed.mp4",
1285 DateCreated: time.Date(2024, 01, 5, 16, 19, 00, 0, time.FixedZone("CET", 1)),
1286 PositionAbsolute: false,
1287 RelativeID: "1",
1288 InfoCardTitle: "Neon Subway",
1289 InfoCardPosition: BBottomSRight,
1290 Position: utils.Coords{X: 0, Y: 0},
1291 AddWidth: true,
1292 AddHeight: false,
1293 Size: Full,
1294 Resolution: utils.Coords{X: 1920, Y: 1440},
1295 Video: true,
1296 },
1297 {
1298 ID: "4",
1299 URL: "dreaming.jpg",
1300 DateCreated: time.Date(2023, 12, 25, 18, 49, 00, 0, time.FixedZone("CET", 1)),
1301 PositionAbsolute: false,
1302 RelativeID: "3",
1303 InfoCardTitle: "Dreaming",
1304 InfoCardPosition: BRightSBottom,
1305 Position: utils.Coords{X: 0, Y: 0},
1306 AddWidth: true,
1307 AddHeight: false,
1308 Size: Half,
1309 Resolution: utils.Coords{X: 4096, Y: 2160},
1310 Video: false,
1311 },
1312 {
1313 ID: "5",
1314 URL: "krakowfoliage1.jpg",
1315 DateCreated: time.Date(2023, 10, 28, 14, 38, 00, 0, time.FixedZone("CET", 1)),
1316 PositionAbsolute: false,
1317 RelativeID: "4",
1318 InfoCardTitle: "Foliage 1",
1319 InfoCardPosition: BRightSBottom,
1320 Position: utils.Coords{X: 0, Y: 0},
1321 AddWidth: false,
1322 AddHeight: true,
1323 Size: Half,
1324 Resolution: utils.Coords{X: 4940, Y: 3272},
1325 Video: false,
1326 },
1327 {
1328 ID: "6",
1329 URL: "krakowfoliage2.jpg",
1330 DateCreated: time.Date(2023, 10, 28, 13, 53, 00, 0, time.FixedZone("CET", 1)),
1331 PositionAbsolute: false,
1332 RelativeID: "4",
1333 InfoCardTitle: "Foliage 2",
1334 InfoCardPosition: BBottomSRight,
1335 Position: utils.Coords{X: 0, Y: 0},
1336 AddWidth: true,
1337 AddHeight: false,
1338 Size: Full,
1339 Resolution: utils.Coords{X: 3272, Y: 4940},
1340 Video: false,
1341 },
1342 {
1343 ID: "7",
1344 URL: "saltmine1.jpg",
1345 DateCreated: time.Date(2023, 10, 28, 9, 19, 00, 0, time.FixedZone("CET", 1)),
1346 PositionAbsolute: false,
1347 RelativeID: "6",
1348 InfoCardTitle: "Salt Mine 1",
1349 InfoCardPosition: BBottomSRight,
1350 Position: utils.Coords{X: 0, Y: 0},
1351 AddWidth: true,
1352 AddHeight: false,
1353 Size: Full,
1354 Resolution: utils.Coords{X: 3272, Y: 4940},
1355 Video: false,
1356 },
1357 {
1358 ID: "8",
1359 URL: "saltmine2.jpg",
1360 DateCreated: time.Date(2023, 10, 28, 9, 11, 00, 0, time.FixedZone("CET", 1)),
1361 PositionAbsolute: false,
1362 RelativeID: "7",
1363 InfoCardTitle: "Salt Mine 2",
1364 InfoCardPosition: BRightSBottom,
1365 Position: utils.Coords{X: 0, Y: 0},
1366 AddWidth: true,
1367 AddHeight: false,
1368 Size: Half,
1369 Resolution: utils.Coords{X: 3272, Y: 4940},
1370 Video: false,
1371 },
1372 {
1373 ID: "9",
1374 URL: "saltmine3.jpg",
1375 DateCreated: time.Date(2023, 10, 28, 9, 42, 00, 0, time.FixedZone("CET", 1)),
1376 PositionAbsolute: false,
1377 RelativeID: "8",
1378 InfoCardTitle: "Salt Mine 3",
1379 InfoCardPosition: BRightSBottom,
1380 Position: utils.Coords{X: 0, Y: 0},
1381 AddWidth: false,
1382 AddHeight: true,
1383 Size: Half,
1384 Resolution: utils.Coords{X: 3272, Y: 4940},
1385 Video: false,
1386 },
1387 {
1388 ID: "10",
1389 URL: "saltmine4.jpg",
1390 DateCreated: time.Date(2023, 10, 28, 8, 15, 00, 0, time.FixedZone("CET", 1)),
1391 PositionAbsolute: false,
1392 RelativeID: "8",
1393 InfoCardTitle: "Salt Mine 4",
1394 InfoCardPosition: BRightSTop,
1395 Position: utils.Coords{X: 0, Y: 0},
1396 AddWidth: true,
1397 AddHeight: false,
1398 Size: Half,
1399 Resolution: utils.Coords{X: 4940, Y: 3272},
1400 Video: false,
1401 },
1402 {
1403 ID: "11",
1404 URL: "ravens.jpg",
1405 DateCreated: time.Date(2023, 10, 26, 17, 58, 00, 0, time.FixedZone("CET", 1)),
1406 PositionAbsolute: false,
1407 RelativeID: "10",
1408 InfoCardTitle: "Ravens",
1409 InfoCardPosition: BRightSTop,
1410 Position: utils.Coords{X: 0, Y: 0},
1411 AddWidth: false,
1412 AddHeight: true,
1413 Size: Half,
1414 Resolution: utils.Coords{X: 4940, Y: 3272},
1415 Video: false,
1416 },
1417 {
1418 ID: "auschwitz",
1419 URL: "auschwitz.jpg",
1420 DateCreated: time.Date(2023, 10, 27, 12, 13, 33, 0, time.FixedZone("CET", 1)),
1421 PositionAbsolute: false,
1422 RelativeID: "10",
1423 InfoCardTitle: "Auschwitz",
1424 InfoCardPosition: BRightSTop,
1425 Position: utils.Coords{X: 0, Y: 0},
1426 AddWidth: true,
1427 AddHeight: false,
1428 Size: Full,
1429 Resolution: utils.Coords{X: 4940, Y: 3272},
1430 Video: false,
1431 },
1432 {
1433 ID: "12",
1434 URL: "lilypads.jpg",
1435 DateCreated: time.Date(2023, 8, 8, 10, 44, 00, 0, time.FixedZone("ICT", 7)),
1436 PositionAbsolute: false,
1437 RelativeID: "auschwitz",
1438 InfoCardTitle: "Lilypads",
1439 InfoCardPosition: BBottomSLeft,
1440 Position: utils.Coords{X: 0, Y: 0},
1441 AddWidth: true,
1442 AddHeight: false,
1443 Size: Full,
1444 Resolution: utils.Coords{X: 4940, Y: 3272},
1445 Video: false,
1446 },
1447 {
1448 ID: "13",
1449 URL: "powerlines.jpg",
1450 DateCreated: time.Date(2023, 7, 31, 17, 01, 00, 0, time.FixedZone("ICT", 7)),
1451 PositionAbsolute: false,
1452 RelativeID: "12",
1453 InfoCardTitle: "Powerlines",
1454 InfoCardPosition: BBottomSRight,
1455 Position: utils.Coords{X: 0, Y: 0},
1456 AddWidth: true,
1457 AddHeight: false,
1458 Size: Full,
1459 Resolution: utils.Coords{X: 4940, Y: 3272},
1460 Video: false,
1461 },
1462
1463 {
1464 ID: "14",
1465 URL: "telecom.jpg",
1466 DateCreated: time.Date(2023, 8, 5, 22, 16, 00, 0, time.FixedZone("ICT", 7)),
1467 PositionAbsolute: false,
1468 RelativeID: "13",
1469 InfoCardTitle: "Telecom",
1470 InfoCardPosition: BRightSTop,
1471 Position: utils.Coords{X: 0, Y: 0},
1472 AddWidth: true,
1473 AddHeight: false,
1474 Size: Half,
1475 Resolution: utils.Coords{X: 4940, Y: 3272},
1476 Video: false,
1477 },
1478 {
1479 ID: "15",
1480 URL: "tsunamiwarning.jpg",
1481 DateCreated: time.Date(2023, 8, 5, 22, 14, 00, 0, time.FixedZone("ICT", 7)),
1482 PositionAbsolute: false,
1483 RelativeID: "14",
1484 InfoCardTitle: "Tsunami Warning",
1485 InfoCardPosition: BRightSTop,
1486 Position: utils.Coords{X: 0, Y: 0},
1487 AddWidth: false,
1488 AddHeight: true,
1489 Size: Half,
1490 Resolution: utils.Coords{X: 4940, Y: 3272},
1491 Video: false,
1492 },
1493 {
1494 ID: "16",
1495 URL: "khlong.jpg",
1496 DateCreated: time.Date(2023, 8, 2, 10, 40, 00, 0, time.FixedZone("ICT", 7)),
1497 PositionAbsolute: false,
1498 RelativeID: "14",
1499 InfoCardTitle: "Khlong 1",
1500 InfoCardPosition: BBottomSRight,
1501 Position: utils.Coords{X: 0, Y: 0},
1502 AddWidth: true,
1503 AddHeight: false,
1504 Size: Full,
1505 Resolution: utils.Coords{X: 3272, Y: 4940},
1506 Video: false,
1507 },
1508 {
1509 ID: "khlong2",
1510 URL: "khlong2.jpg",
1511 DateCreated: time.Date(2023, 8, 2, 10, 50, 13, 0, time.FixedZone("ICT", 7)),
1512 PositionAbsolute: false,
1513 RelativeID: "16",
1514 InfoCardTitle: "Khlong 2",
1515 InfoCardPosition: BBottomSLeft,
1516 Position: utils.Coords{X: 0, Y: 0},
1517 AddWidth: true,
1518 AddHeight: false,
1519 Size: Full,
1520 Resolution: utils.Coords{X: 3272, Y: 4940},
1521 Video: false,
1522 },
1523 {
1524 ID: "lotus1",
1525 URL: "lotus1.jpg",
1526 DateCreated: time.Date(2023, 8, 2, 13, 16, 43, 0, time.FixedZone("ICT", 7)),
1527 PositionAbsolute: false,
1528 RelativeID: "khlong2",
1529 InfoCardTitle: "Lotus 1",
1530 InfoCardPosition: BRightSBottom,
1531 Position: utils.Coords{X: 0, Y: 0},
1532 AddWidth: true,
1533 AddHeight: false,
1534 Size: Half,
1535 Resolution: utils.Coords{X: 4940, Y: 3272},
1536 Video: false,
1537 },
1538 {
1539 ID: "lotus2",
1540 URL: "lotus2.jpg",
1541 DateCreated: time.Date(2023, 8, 2, 13, 17, 00, 0, time.FixedZone("ICT", 7)),
1542 PositionAbsolute: false,
1543 RelativeID: "lotus1",
1544 InfoCardTitle: "Lotus 2",
1545 InfoCardPosition: BRightSBottom,
1546 Position: utils.Coords{X: 0, Y: 0},
1547 AddWidth: false,
1548 AddHeight: true,
1549 Size: Half,
1550 Resolution: utils.Coords{X: 4940, Y: 3272},
1551 Video: false,
1552 },
1553 {
1554 ID: "17",
1555 URL: "orchids.jpg",
1556 DateCreated: time.Date(2023, 7, 31, 16, 29, 00, 0, time.FixedZone("ICT", 7)),
1557 PositionAbsolute: false,
1558 RelativeID: "lotus1",
1559 InfoCardTitle: "Orchids",
1560 InfoCardPosition: BTopSRight,
1561 Position: utils.Coords{X: 0, Y: 0},
1562 AddWidth: true,
1563 AddHeight: false,
1564 Size: Full,
1565 Resolution: utils.Coords{X: 3272, Y: 4940},
1566 Video: false,
1567 },
1568 {
1569 ID: "kanzansakura",
1570 URL: "kanzansakura.webP",
1571 DateCreated: time.Date(2023, 4, 1, 12, 27, 9, 0, time.FixedZone("CEST", 2)),
1572 PositionAbsolute: false,
1573 RelativeID: "17",
1574 InfoCardTitle: "Kanzan Sakura",
1575 InfoCardPosition: BBottomSRight,
1576 Position: utils.Coords{X: 0, Y: 0},
1577 AddWidth: true,
1578 AddHeight: false,
1579 Size: Full,
1580 Resolution: utils.Coords{X: 3888, Y: 5184},
1581 Video: false,
1582 },
1583 {
1584 ID: "maple",
1585 URL: "maple.jpg",
1586 DateCreated: time.Date(2023, 5, 29, 12, 24, 34, 0, time.FixedZone("CEST", 2)),
1587 PositionAbsolute: false,
1588 RelativeID: "kanzansakura",
1589 InfoCardTitle: "Maple",
1590 InfoCardPosition: BBottomSRight,
1591 Position: utils.Coords{X: 0, Y: 0},
1592 AddWidth: true,
1593 AddHeight: false,
1594 Size: Full,
1595 Resolution: utils.Coords{X: 3888, Y: 5184},
1596 Video: false,
1597 },
1598 {
1599 ID: "junethunderstorm",
1600 URL: "junethunderstorm.jpg",
1601 DateCreated: time.Date(2023, 6, 11, 20, 37, 50, 0, time.FixedZone("CEST", 2)),
1602 PositionAbsolute: false,
1603 RelativeID: "maple",
1604 InfoCardTitle: "Thunderstorm",
1605 InfoCardPosition: BTopSRight,
1606 Position: utils.Coords{X: 0, Y: 0},
1607 AddWidth: true,
1608 AddHeight: false,
1609 Size: Full,
1610 Resolution: utils.Coords{X: 3888, Y: 5184},
1611 Video: false,
1612 },
1613 {
1614 ID: "18",
1615 URL: "theblaze.png",
1616 DateCreated: time.Date(2023, 5, 1, 15, 18, 00, 0, time.FixedZone("CEST", 2)),
1617 PositionAbsolute: false,
1618 RelativeID: "junethunderstorm",
1619 InfoCardTitle: "The Blaze",
1620 InfoCardPosition: BBottomSLeft,
1621 Position: utils.Coords{X: 0, Y: 0},
1622 AddWidth: true,
1623 AddHeight: false,
1624 Size: Half,
1625 Resolution: utils.Coords{X: 3334, Y: 1755},
1626 Video: false,
1627 },
1628 {
1629 ID: "19",
1630 URL: "GreekArchitecture-HQ-Cam6-Signed.png",
1631 DateCreated: time.Date(2023, 7, 10, 22, 02, 00, 0, time.FixedZone("CEST", 2)),
1632 PositionAbsolute: false,
1633 RelativeID: "18",
1634 InfoCardTitle: "Greek Temple 1",
1635 InfoCardPosition: BBottomSRight,
1636 Position: utils.Coords{X: 0, Y: 0},
1637 AddWidth: false,
1638 AddHeight: true,
1639 Size: Half,
1640 Resolution: utils.Coords{X: 3840, Y: 2160},
1641 Video: false,
1642 },
1643
1644 {
1645 ID: "19",
1646 URL: "GreekArchitecture-HQ-Cam2-Signed.png",
1647 DateCreated: time.Date(2023, 7, 10, 22, 02, 00, 0, time.FixedZone("CEST", 2)),
1648 PositionAbsolute: false,
1649 RelativeID: "18",
1650 InfoCardTitle: "Greek Temple 2",
1651 InfoCardPosition: BBottomSRight,
1652 Position: utils.Coords{X: 0, Y: 0},
1653 AddWidth: true,
1654 AddHeight: false,
1655 Size: Half,
1656 Resolution: utils.Coords{X: 3840, Y: 2160},
1657 Video: false,
1658 },
1659 {
1660 ID: "20",
1661 URL: "moebius-filter.png",
1662 DateCreated: time.Date(2023, 8, 4, 2, 39, 00, 0, time.FixedZone("CEST", 2)),
1663 PositionAbsolute: false,
1664 RelativeID: "19",
1665 InfoCardTitle: "Moebius Style",
1666 InfoCardPosition: BRightSBottom,
1667 Position: utils.Coords{X: 0, Y: 0},
1668 AddWidth: false,
1669 AddHeight: true,
1670 Size: Half,
1671 Resolution: utils.Coords{X: 3888, Y: 5184},
1672 Video: false,
1673 },
1674 {
1675 ID: "21",
1676 URL: "cyanotype.jpg",
1677 DateCreated: time.Date(2023, 1, 18, 12, 40, 00, 0, time.FixedZone("CET", 1)),
1678 PositionAbsolute: false,
1679 RelativeID: "19",
1680 InfoCardTitle: "Cyanotype",
1681 InfoCardPosition: BRightSBottom,
1682 Position: utils.Coords{X: 0, Y: 0},
1683 AddWidth: true,
1684 AddHeight: false,
1685 Size: Half,
1686 Resolution: utils.Coords{X: 1259, Y: 1259},
1687 Video: false,
1688 },
1689 {
1690 ID: "22",
1691 URL: "apocalypticbuildings.png",
1692 DateCreated: time.Date(2022, 11, 25, 23, 43, 00, 0, time.FixedZone("CET", 1)),
1693 PositionAbsolute: false,
1694 RelativeID: "21",
1695 InfoCardTitle: "Apocalyptic City",
1696 InfoCardPosition: BRightSBottom,
1697 Position: utils.Coords{X: 0, Y: 0},
1698 AddWidth: false,
1699 AddHeight: true,
1700 Size: Half,
1701 Resolution: utils.Coords{X: 810, Y: 1080},
1702 Video: false,
1703 },
1704 {
1705 ID: "23",
1706 URL: "railroad.webp",
1707 DateCreated: time.Date(2022, 12, 19, 23, 54, 00, 0, time.FixedZone("CET", 1)),
1708 PositionAbsolute: false,
1709 RelativeID: "21",
1710 InfoCardTitle: "Railroad",
1711 InfoCardPosition: BRightSTop,
1712 Position: utils.Coords{X: 0, Y: 0},
1713 AddWidth: true,
1714 AddHeight: false,
1715 Size: Half,
1716 Resolution: utils.Coords{X: 2880, Y: 3600},
1717 Video: false,
1718 },
1719 {
1720 ID: "24",
1721 URL: "wakes.jpg",
1722 DateCreated: time.Date(2022, 11, 2, 17, 12, 00, 0, time.FixedZone("EET", 2)),
1723 PositionAbsolute: false,
1724 RelativeID: "22",
1725 InfoCardTitle: "Wakes",
1726 InfoCardPosition: BRightSBottom,
1727 Position: utils.Coords{X: 0, Y: 0},
1728 AddWidth: true,
1729 AddHeight: false,
1730 Size: Half,
1731 Resolution: utils.Coords{X: 5184, Y: 3888},
1732 Video: false,
1733 },
1734 {
1735 ID: "25",
1736 URL: "olivetree.jpg",
1737 DateCreated: time.Date(2022, 11, 2, 17, 15, 00, 0, time.FixedZone("EET", 2)),
1738 PositionAbsolute: false,
1739 RelativeID: "23",
1740 InfoCardTitle: "Olive",
1741 InfoCardPosition: BBottomSRight,
1742 Position: utils.Coords{X: 0, Y: 0},
1743 AddWidth: true,
1744 AddHeight: false,
1745 Size: Full,
1746 Resolution: utils.Coords{X: 3888, Y: 5184},
1747 Video: false,
1748 },
1749 {
1750 ID: "26",
1751 URL: "chuuhai.mp4",
1752 DateCreated: time.Date(2022, 11, 6, 16, 25, 00, 0, time.FixedZone("CET", 1)),
1753 PositionAbsolute: false,
1754 RelativeID: "25",
1755 InfoCardTitle: "酎ハイ",
1756 InfoCardPosition: BRightSTop,
1757 Position: utils.Coords{X: 0, Y: 0},
1758 AddWidth: true,
1759 AddHeight: false,
1760 Size: Half,
1761 Resolution: utils.Coords{X: 836, Y: 1080},
1762 Video: true,
1763 },
1764 {
1765 ID: "27",
1766 URL: "greeksunset.jpg",
1767 DateCreated: time.Date(2022, 11, 1, 17, 44, 00, 0, time.FixedZone("EET", 2)),
1768 PositionAbsolute: false,
1769 RelativeID: "26",
1770 InfoCardTitle: "Greek Sunset",
1771 InfoCardPosition: BRightSTop,
1772 Position: utils.Coords{X: 0, Y: 0},
1773 AddWidth: false,
1774 AddHeight: true,
1775 Size: Half,
1776 Resolution: utils.Coords{X: 5184, Y: 3888},
1777 Video: false,
1778 },
1779 {
1780 ID: "28",
1781 URL: "oceanlightbulb.webp",
1782 DateCreated: time.Date(2022, 10, 22, 19, 27, 00, 0, time.FixedZone("CET", 1)),
1783 PositionAbsolute: false,
1784 RelativeID: "26",
1785 InfoCardTitle: "Lightbulb Benchy",
1786 InfoCardPosition: BRightSTop,
1787 Position: utils.Coords{X: 0, Y: 0},
1788 AddWidth: true,
1789 AddHeight: false,
1790 Size: Half,
1791 Resolution: utils.Coords{X: 2160, Y: 2160},
1792 Video: false,
1793 },
1794 {
1795 ID: "29",
1796 URL: "wheatfield.jpg",
1797 DateCreated: time.Date(2022, 10, 16, 21, 01, 00, 0, time.FixedZone("CET", 1)),
1798 PositionAbsolute: false,
1799 RelativeID: "27",
1800 InfoCardTitle: "小麦畑",
1801 InfoCardPosition: BBottomSLeft,
1802 Position: utils.Coords{X: 0, Y: 0},
1803 AddWidth: true,
1804 AddHeight: false,
1805 Size: Half,
1806 Resolution: utils.Coords{X: 5120, Y: 1440},
1807 Video: false,
1808 },
1809 {
1810 ID: "30",
1811 URL: "hummingbird.jpg",
1812 DateCreated: time.Date(2022, 8, 2, 11, 28, 00, 0, time.FixedZone("AST", -4)),
1813 PositionAbsolute: false,
1814 RelativeID: "28",
1815 InfoCardTitle: "Hummingbird",
1816 InfoCardPosition: BRightSBottom,
1817 Position: utils.Coords{X: 0, Y: 0},
1818 AddWidth: true,
1819 AddHeight: false,
1820 Size: Half,
1821 Resolution: utils.Coords{X: 5184, Y: 3888},
1822 Video: false,
1823 }, {
1824 ID: "31",
1825 URL: "longexposure.jpg",
1826 DateCreated: time.Date(2022, 3, 19, 22, 16, 00, 0, time.FixedZone("CET", 1)),
1827 PositionAbsolute: false,
1828 RelativeID: "30",
1829 InfoCardTitle: "Godspeed",
1830 InfoCardPosition: BBottomSLeft,
1831 Position: utils.Coords{X: 0, Y: 0},
1832 AddWidth: true,
1833 AddHeight: false,
1834 Size: Half,
1835 Resolution: utils.Coords{X: 5184, Y: 3888},
1836 Video: false,
1837 }, {
1838 ID: "32",
1839 URL: "90sanimesubway.webp",
1840 DateCreated: time.Date(2022, 7, 13, 22, 40, 00, 0, time.FixedZone("CEST", 2)),
1841 PositionAbsolute: false,
1842 RelativeID: "31",
1843 InfoCardTitle: "Retro Subway",
1844 InfoCardPosition: BBottomSLeft,
1845 Position: utils.Coords{X: 0, Y: 0},
1846 AddWidth: false,
1847 AddHeight: true,
1848 Size: Half,
1849 Resolution: utils.Coords{X: 3840, Y: 2880},
1850 Video: false,
1851 }, {
1852 ID: "plantsnearoldtraintracks",
1853 URL: "plantsnearoldtraintracks.jpg",
1854 DateCreated: time.Date(2021, 11, 24, 16, 35, 31, 0, time.FixedZone("CET", 1)),
1855 PositionAbsolute: false,
1856 RelativeID: "31",
1857 InfoCardTitle: "Old Train Tracks",
1858 InfoCardPosition: BRightSBottom,
1859 Position: utils.Coords{X: 0, Y: 0},
1860 AddWidth: true,
1861 AddHeight: false,
1862 Size: Half,
1863 Resolution: utils.Coords{X: 3888, Y: 5184},
1864 Video: false,
1865 }, {
1866 ID: "oldtrainsignal",
1867 URL: "oldtrainsignal.jpg",
1868 DateCreated: time.Date(2021, 11, 24, 16, 25, 22, 0, time.FixedZone("CET", 1)),
1869 PositionAbsolute: false,
1870 RelativeID: "plantsnearoldtraintracks",
1871 InfoCardTitle: "Old Train Signal",
1872 InfoCardPosition: BRightSTop,
1873 Position: utils.Coords{X: 0, Y: 0},
1874 AddWidth: false,
1875 AddHeight: true,
1876 Size: Half,
1877 Resolution: utils.Coords{X: 3888, Y: 5184},
1878 Video: false,
1879 }, {
1880 ID: "moonxpowerline",
1881 URL: "moonxpowerline.webP",
1882 DateCreated: time.Date(2021, 10, 31, 6, 18, 21, 0, time.FixedZone("MUT", 4)),
1883 PositionAbsolute: false,
1884 RelativeID: "plantsnearoldtraintracks",
1885 InfoCardTitle: "Moon & Powerlines",
1886 InfoCardPosition: BBottomSRight,
1887 Position: utils.Coords{X: 0, Y: 0},
1888 AddWidth: true,
1889 AddHeight: false,
1890 Size: Full,
1891 Resolution: utils.Coords{X: 3888, Y: 5184},
1892 Video: false,
1893 }, {
1894 ID: "33",
1895 URL: "birds.webp",
1896 DateCreated: time.Date(2021, 9, 6, 20, 11, 00, 0, time.FixedZone("CEST", 2)),
1897 PositionAbsolute: false,
1898 RelativeID: "moonxpowerline",
1899 InfoCardTitle: "Twilight & Birds",
1900 InfoCardPosition: BRightSTop,
1901 Position: utils.Coords{X: 0, Y: 0},
1902 AddWidth: true,
1903 AddHeight: false,
1904 Size: Half,
1905 Resolution: utils.Coords{X: 5184, Y: 3888},
1906 Video: false,
1907 }, {
1908 ID: "34",
1909 URL: "lightbulb.webp",
1910 DateCreated: time.Date(2021, 11, 14, 12, 11, 00, 0, time.FixedZone("CET", 1)),
1911 PositionAbsolute: false,
1912 RelativeID: "33",
1913 InfoCardTitle: "Light Bulb",
1914 InfoCardPosition: BRightSTop,
1915 Position: utils.Coords{X: 0, Y: 0},
1916 AddWidth: false,
1917 AddHeight: true,
1918 Size: Half,
1919 Resolution: utils.Coords{X: 1920, Y: 1920},
1920 Video: false,
1921 }, {
1922 ID: "35",
1923 URL: "apocalypticneon.jpg",
1924 DateCreated: time.Date(2021, 5, 22, 15, 47, 00, 0, time.FixedZone("CEST", 2)),
1925 PositionAbsolute: false,
1926 RelativeID: "33",
1927 InfoCardTitle: "Apocalyptic Neon",
1928 InfoCardPosition: BRightSTop,
1929 Position: utils.Coords{X: 0, Y: 0},
1930 AddWidth: true,
1931 AddHeight: false,
1932 Size: Half,
1933 Resolution: utils.Coords{X: 3840, Y: 2160},
1934 Video: false,
1935 }, {
1936 ID: "36",
1937 URL: "blackhole.mp4",
1938 DateCreated: time.Date(2021, 9, 26, 19, 35, 00, 0, time.FixedZone("CEST", 2)),
1939 PositionAbsolute: false,
1940 RelativeID: "34",
1941 InfoCardTitle: "Black Hole",
1942 InfoCardPosition: BRightSTop,
1943 Position: utils.Coords{X: 0, Y: 0},
1944 AddWidth: true,
1945 AddHeight: false,
1946 Size: Half,
1947 Resolution: utils.Coords{X: 1080, Y: 1080},
1948 Video: true,
1949 },
1950}