unifiedcard.nim 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. import std/[options, tables, strutils, strformat, sugar]
  2. import jsony
  3. import ../types/unifiedcard
  4. from ../../types import Card, CardKind, Video
  5. from ../../utils import twimg, https
  6. proc getImageUrl(entity: MediaEntity): string =
  7. entity.mediaUrlHttps.dup(removePrefix(twimg), removePrefix(https))
  8. proc parseDestination(id: string; card: UnifiedCard; result: var Card) =
  9. let destination = card.destinationObjects[id].data
  10. result.dest = destination.urlData.vanity
  11. result.url = destination.urlData.url
  12. proc parseDetails(data: ComponentData; card: UnifiedCard; result: var Card) =
  13. data.destination.parseDestination(card, result)
  14. result.text = data.title
  15. if result.text.len == 0:
  16. result.text = data.name
  17. proc parseMediaDetails(data: ComponentData; card: UnifiedCard; result: var Card) =
  18. data.destination.parseDestination(card, result)
  19. result.kind = summary
  20. result.image = card.mediaEntities[data.mediaId].getImageUrl
  21. result.text = data.topicDetail.title
  22. result.dest = "Topic"
  23. proc parseAppDetails(data: ComponentData; card: UnifiedCard; result: var Card) =
  24. let app = card.appStoreData[data.appId][0]
  25. case app.kind
  26. of androidApp:
  27. result.url = "http://play.google.com/store/apps/details?id=" & app.id
  28. of iPhoneApp, iPadApp:
  29. result.url = "https://itunes.apple.com/app/id" & app.id
  30. result.text = app.title
  31. result.dest = app.category
  32. proc parseListDetails(data: ComponentData; result: var Card) =
  33. result.dest = &"List · {data.memberCount} Members"
  34. proc parseCommunityDetails(data: ComponentData; result: var Card) =
  35. result.dest = &"Community · {data.memberCount} Members"
  36. proc parseMedia(component: Component; card: UnifiedCard; result: var Card) =
  37. let mediaId =
  38. if component.kind == swipeableMedia:
  39. component.data.mediaList[0].id
  40. else:
  41. component.data.id
  42. let rMedia = card.mediaEntities[mediaId]
  43. case rMedia.kind:
  44. of photo:
  45. result.kind = summaryLarge
  46. result.image = rMedia.getImageUrl
  47. of video:
  48. let videoInfo = rMedia.videoInfo.get
  49. result.kind = promoVideo
  50. result.video = some Video(
  51. available: true,
  52. thumb: rMedia.getImageUrl,
  53. durationMs: videoInfo.durationMillis,
  54. variants: videoInfo.variants
  55. )
  56. proc parseUnifiedCard*(json: string): Card =
  57. let card = json.fromJson(UnifiedCard)
  58. for component in card.componentObjects.values:
  59. case component.kind
  60. of details, communityDetails, twitterListDetails:
  61. component.data.parseDetails(card, result)
  62. of appStoreDetails:
  63. component.data.parseAppDetails(card, result)
  64. of mediaWithDetailsHorizontal:
  65. component.data.parseMediaDetails(card, result)
  66. of media, swipeableMedia:
  67. component.parseMedia(card, result)
  68. of buttonGroup:
  69. discard
  70. case component.kind
  71. of twitterListDetails:
  72. component.data.parseListDetails(result)
  73. of communityDetails:
  74. component.data.parseCommunityDetails(result)
  75. else: discard