summaryrefslogtreecommitdiff
path: root/Sora/Data/Danbooru/DanbooruPost.swift
blob: c619fceea35b4e6d4e834c9c7487017a575f164d (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
import Foundation

struct DanbooruPost: Decodable {
  let id: Int
  let createdAt: Date
  let uploaderId: Int
  let score: Int
  let source: String
  let md5: String?
  let rating: String
  let imageWidth: Int
  let imageHeight: Int
  let tagString: String
  let parentId: Int?
  let mediaAsset: DanbooruMediaAsset?
  let fileURL: String?
  let largeFileURL: String?
  let previewFileURL: String?
  let isDeleted: Bool

  enum CodingKeys: String, CodingKey {
    case id = "id"
    case createdAt = "created_at"
    case uploaderId = "uploader_id"
    case score = "score"
    case source = "source"
    case md5 = "md5"
    case rating = "rating"
    case imageWidth = "image_width"
    case imageHeight = "image_height"
    case tagString = "tag_string"
    case parentId = "parent_id"
    case mediaAsset = "media_asset"
    case fileURL = "file_url"
    case largeFileURL = "large_file_url"
    case previewFileURL = "preview_file_url"
    case isDeleted = "is_deleted"
  }

  func toBooruPost() -> BooruPost? {
    guard let fileURLString = fileURL,
      let fileURL = URL(string: fileURLString)
    else {
      return nil
    }

    let sampleURLString = largeFileURL ?? fileURLString
    let previewURLString = previewFileURL ?? largeFileURL ?? fileURLString

    guard let sampleURL = URL(string: sampleURLString),
      let previewURL = URL(string: previewURLString)
    else {
      return nil
    }

    let previewVariant = mediaAsset?.variants.first { $0.type == "180x180" }
    let sampleVariant =
      mediaAsset?.variants.first { $0.type == "sample" }
      ?? mediaAsset?.variants.first { $0.type == "original" }

    return BooruPost(
      id: String(id),
      height: imageHeight,
      score: String(score),
      fileURL: fileURL,
      parentID: parentId.map(String.init) ?? "",
      sampleURL: sampleURL,
      sampleWidth: sampleVariant?.width ?? imageWidth,
      sampleHeight: sampleVariant?.height ?? imageHeight,
      previewURL: previewURL,
      rating: BooruRating(rating),
      tags: tagString.components(separatedBy: " ").filter { !$0.isEmpty },
      width: imageWidth,
      change: nil,
      md5: md5 ?? "",
      creatorID: String(uploaderId),
      authorID: nil,
      createdAt: createdAt,
      status: isDeleted ? "deleted" : "active",
      source: source,
      previewWidth: previewVariant?.width ?? 180,
      previewHeight: previewVariant?.height ?? 180
    )
  }
}