Class: Post

Inherits:
Object
  • Object
show all
Defined in:
lib/Post.rb

Defined Under Namespace

Classes: PostInfo

Class Method Summary collapse

Class Method Details

.fetchPostParagraphs(postID) ⇒ Object



43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# File 'lib/Post.rb', line 43

def self.fetchPostParagraphs(postID)
  query = [
    {
      "operationName": "PostViewerEdgeContentQuery",
      "variables": {
        "postId": postID
      },
      "query": "query PostViewerEdgeContentQuery($postId: ID!, $postMeteringOptions: PostMeteringOptions) {\n  post(id: $postId) {\n    ... on Post {\n      id\n      viewerEdge {\n        id\n        fullContent(postMeteringOptions: $postMeteringOptions) {\n          isLockedPreviewOnly\n          validatedShareKey\n          bodyModel {\n            ...PostBody_bodyModel\n            __typename\n          }\n          __typename\n        }\n        __typename\n      }\n      __typename\n    }\n    __typename\n  }\n}\n\nfragment PostBody_bodyModel on RichText {\n  sections {\n    name\n    startIndex\n    textLayout\n    imageLayout\n    backgroundImage {\n      id\n      originalHeight\n      originalWidth\n      __typename\n    }\n    videoLayout\n    backgroundVideo {\n      videoId\n      originalHeight\n      originalWidth\n      previewImageId\n      __typename\n    }\n    __typename\n  }\n  paragraphs {\n    id\n    ...PostBodySection_paragraph\n    __typename\n  }\n  ...normalizedBodyModel_richText\n  __typename\n}\n\nfragment PostBodySection_paragraph on Paragraph {\n  name\n  ...PostBodyParagraph_paragraph\n  __typename\n  id\n}\n\nfragment PostBodyParagraph_paragraph on Paragraph {\n  name\n  type\n  ...ImageParagraph_paragraph\n  ...TextParagraph_paragraph\n  ...IframeParagraph_paragraph\n  ...MixtapeParagraph_paragraph\n  ...CodeBlockParagraph_paragraph\n  __typename\n  id\n}\n\nfragment ImageParagraph_paragraph on Paragraph {\n  href\n  layout\n  metadata {\n    id\n    originalHeight\n    originalWidth\n    focusPercentX\n    focusPercentY\n    alt\n    __typename\n  }\n  ...Markups_paragraph\n  ...ParagraphRefsMapContext_paragraph\n  ...PostAnnotationsMarker_paragraph\n  __typename\n  id\n}\n\nfragment Markups_paragraph on Paragraph {\n  name\n  text\n  hasDropCap\n  dropCapImage {\n    ...MarkupNode_data_dropCapImage\n    __typename\n    id\n  }\n  markups {\n    type\n    start\n    end\n    href\n    anchorType\n    userId\n    linkMetadata {\n      httpStatus\n      __typename\n    }\n    __typename\n  }\n  __typename\n  id\n}\n\nfragment MarkupNode_data_dropCapImage on ImageMetadata {\n  ...DropCap_image\n  __typename\n  id\n}\n\nfragment DropCap_image on ImageMetadata {\n  id\n  originalHeight\n  originalWidth\n  __typename\n}\n\nfragment ParagraphRefsMapContext_paragraph on Paragraph {\n  id\n  name\n  text\n  __typename\n}\n\nfragment PostAnnotationsMarker_paragraph on Paragraph {\n  ...PostViewNoteCard_paragraph\n  __typename\n  id\n}\n\nfragment PostViewNoteCard_paragraph on Paragraph {\n  name\n  __typename\n  id\n}\n\nfragment TextParagraph_paragraph on Paragraph {\n  type\n  hasDropCap\n  codeBlockMetadata {\n    mode\n    lang\n    __typename\n  }\n  ...Markups_paragraph\n  ...ParagraphRefsMapContext_paragraph\n  __typename\n  id\n}\n\nfragment IframeParagraph_paragraph on Paragraph {\n  iframe {\n    mediaResource {\n      id\n      iframeSrc\n      iframeHeight\n      iframeWidth\n      title\n      __typename\n    }\n    __typename\n  }\n  layout\n  ...getEmbedlyCardUrlParams_paragraph\n  ...Markups_paragraph\n  __typename\n  id\n}\n\nfragment getEmbedlyCardUrlParams_paragraph on Paragraph {\n  type\n  iframe {\n    mediaResource {\n      iframeSrc\n      __typename\n    }\n    __typename\n  }\n  __typename\n  id\n}\n\nfragment MixtapeParagraph_paragraph on Paragraph {\n  type\n  mixtapeMetadata {\n    href\n    mediaResource {\n      mediumCatalog {\n        id\n        __typename\n      }\n      __typename\n    }\n    __typename\n  }\n  ...GenericMixtapeParagraph_paragraph\n  __typename\n  id\n}\n\nfragment GenericMixtapeParagraph_paragraph on Paragraph {\n  text\n  mixtapeMetadata {\n    href\n    thumbnailImageId\n    __typename\n  }\n  markups {\n    start\n    end\n    type\n    href\n    __typename\n  }\n  __typename\n  id\n}\n\nfragment CodeBlockParagraph_paragraph on Paragraph {\n  codeBlockMetadata {\n    lang\n    mode\n    __typename\n  }\n  __typename\n  id\n}\n\nfragment normalizedBodyModel_richText on RichText {\n  paragraphs {\n    markups {\n      type\n      __typename\n    }\n    codeBlockMetadata {\n      lang\n      mode\n      __typename\n    }\n    ...getParagraphHighlights_paragraph\n    ...getParagraphPrivateNotes_paragraph\n    __typename\n  }\n  sections {\n    startIndex\n    ...getSectionEndIndex_section\n    __typename\n  }\n  ...getParagraphStyles_richText\n  ...getParagraphSpaces_richText\n  __typename\n}\n\nfragment getParagraphHighlights_paragraph on Paragraph {\n  name\n  __typename\n  id\n}\n\nfragment getParagraphPrivateNotes_paragraph on Paragraph {\n  name\n  __typename\n  id\n}\n\nfragment getSectionEndIndex_section on Section {\n  startIndex\n  __typename\n}\n\nfragment getParagraphStyles_richText on RichText {\n  paragraphs {\n    text\n    type\n    __typename\n  }\n  sections {\n    ...getSectionEndIndex_section\n    __typename\n  }\n  __typename\n}\n\nfragment getParagraphSpaces_richText on RichText {\n  paragraphs {\n    layout\n    metadata {\n      originalHeight\n      originalWidth\n      id\n      __typename\n    }\n    type\n    ...paragraphExtendsImageGrid_paragraph\n    __typename\n  }\n  ...getSeriesParagraphTopSpacings_richText\n  ...getPostParagraphTopSpacings_richText\n  __typename\n}\n\nfragment paragraphExtendsImageGrid_paragraph on Paragraph {\n  layout\n  type\n  __typename\n  id\n}\n\nfragment getSeriesParagraphTopSpacings_richText on RichText {\n  paragraphs {\n    id\n    __typename\n  }\n  sections {\n    startIndex\n    __typename\n  }\n  __typename\n}\n\nfragment getPostParagraphTopSpacings_richText on RichText {\n  paragraphs {\n    layout\n    text\n    codeBlockMetadata {\n      lang\n      mode\n      __typename\n    }\n    __typename\n  }\n  sections {\n    startIndex\n    __typename\n  }\n  __typename\n}\n"
    }
  ]

  host = ENV.fetch('MEDIUM_HOST', 'https://medium.com/_/graphql')
  body = Request.body(Request.URL(host, method = 'POST', data = query));
  if !body.nil?
    json = JSON.parse(body)
    json&.dig(0, "data", "post", "viewerEdge", "fullContent")
  else
    nil
  end
end

.getPostIDFromPostURLString(postURLString) ⇒ Object



18
19
20
21
22
23
# File 'lib/Post.rb', line 18

def self.getPostIDFromPostURLString(postURLString)
  uri = URI.parse(postURLString)
  postID = uri.path.split('/').last.split('-').last
  
  postID
end

.getPostPathFromPostURLString(postURLString) ⇒ Object



25
26
27
28
# File 'lib/Post.rb', line 25

def self.getPostPathFromPostURLString(postURLString)
  uri = URI.parse(postURLString)
  uri.path.split('/').last
end

.parsePostContentFromHTML(html) ⇒ Object



30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/Post.rb', line 30

def self.parsePostContentFromHTML(html)
  json = nil
  return "" unless html
  html.search('script').each do |script|
      match = script.to_s[/(<script>window\.__APOLLO_STATE__ \= ){1}(.*)(<\/script>){1}/,2]
      if !match.nil? && match != ""
          json = JSON.parse(match)
      end
  end

  json
end

.parsePostInfo(postID, pathPolicy) ⇒ Object



64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
# File 'lib/Post.rb', line 64

def self.parsePostInfo(postID, pathPolicy)
  query = [
    {
        "operationName": "PostPageQuery",
        "variables": {
            "postId": postID,
            "postMeteringOptions": {
                "referrer": "https://medium.com/me/stories"
            },
            "includeShouldFollowPost": false
        },
        "query": "query PostPageQuery($postId: ID!, $postMeteringOptions: PostMeteringOptions, $includeShouldFollowPost: Boolean!) {\n  postResult(id: $postId) {\n    __typename\n    ...PostResultError_postResult\n    ... on Post {\n      id\n      collection {\n        id\n        googleAnalyticsId\n        ...FloatingPublicationBio_collection\n        ...MoreFromAuthorAndMaybePub_collection\n        ...PostPublishersInfoSection_collection\n        ...PublicationNav_collection\n        __typename\n      }\n      content(postMeteringOptions: $postMeteringOptions) {\n        isLockedPreviewOnly\n        __typename\n      }\n      creator {\n        id\n        ...MastodonVerificationLink_user\n        ...SuspendedBannerLoader_user\n        ...MoreFromAuthorAndMaybePub_user\n        ...PostPublishersInfoSection_user\n        __typename\n      }\n      inResponseToEntityType\n      isLocked\n      ...Wall_post\n      ...InteractivePostBody_post\n      ...WithResponsesSidebar_post\n      ...PostCanonicalizer_post\n      ...PostFooterActionsBar_post\n      ...PostReadTracker_post\n      ...PostMetadata_post\n      ...SuspendedBannerLoader_post\n      ...PostFooterInfo_post\n      ...PostBodyInserts_post\n      ...PostNoteMissingToast_post\n      ...usePostTracking_post\n      ...InResponseToEntityPreview_post\n      ...PostPublishedDialog_prerequisite_post\n      ...PostResponses_post\n      ...PostPublishersInfoSection_post\n      ...UseSubscribeToAuthorOnScroll_post\n      __typename\n    }\n  }\n}\n\nfragment UnavailableForLegalReasonsScreen_unavailableForLegalReasons on UnavailableForLegalReasons {\n  lumenId\n  __typename\n}\n\nfragment WithheldInCountryScreen_withheldInCountry on WithheldInCountry {\n  lumenId\n  __typename\n}\n\nfragment collectionUrl_collection on Collection {\n  id\n  domain\n  slug\n  __typename\n}\n\nfragment CollectionAvatar_collection on Collection {\n  name\n  avatar {\n    id\n    __typename\n  }\n  ...collectionUrl_collection\n  __typename\n  id\n}\n\nfragment PublisherDescription_publisher on Publisher {\n  __typename\n  id\n  ... on Collection {\n    description\n    __typename\n    id\n  }\n  ... on User {\n    bio\n    __typename\n    id\n  }\n}\n\nfragment SignInOptions_collection on Collection {\n  id\n  name\n  __typename\n}\n\nfragment SignUpOptions_collection on Collection {\n  id\n  name\n  __typename\n}\n\nfragment SusiModal_collection on Collection {\n  name\n  ...SignInOptions_collection\n  ...SignUpOptions_collection\n  __typename\n  id\n}\n\nfragment PublicationFollowButton_collection on Collection {\n  id\n  slug\n  name\n  ...SusiModal_collection\n  __typename\n}\n\nfragment isUserVerifiedBookAuthor_user on User {\n  verifications {\n    isBookAuthor\n    __typename\n  }\n  __typename\n  id\n}\n\nfragment userUrl_user on User {\n  __typename\n  id\n  customDomainState {\n    live {\n      domain\n      __typename\n    }\n    __typename\n  }\n  hasSubdomain\n  username\n}\n\nfragment PublisherLink_user on User {\n  ...userUrl_user\n  __typename\n  id\n}\n\nfragment SignInOptions_user on User {\n  id\n  name\n  imageId\n  __typename\n}\n\nfragment SignUpOptions_user on User {\n  id\n  name\n  imageId\n  __typename\n}\n\nfragment SusiModal_user on User {\n  ...SignInOptions_user\n  ...SignUpOptions_user\n  __typename\n  id\n}\n\nfragment useNewsletterV3Subscription_newsletterV3 on NewsletterV3 {\n  id\n  type\n  slug\n  name\n  collection {\n    slug\n    __typename\n    id\n  }\n  user {\n    id\n    name\n    username\n    newsletterV3 {\n      id\n      __typename\n    }\n    __typename\n  }\n  __typename\n}\n\nfragment useNewsletterV3Subscription_user on User {\n  id\n  username\n  newsletterV3 {\n    ...useNewsletterV3Subscription_newsletterV3\n    __typename\n    id\n  }\n  __typename\n}\n\nfragment useAuthorFollowSubscribeButton_user on User {\n  id\n  name\n  ...useNewsletterV3Subscription_user\n  __typename\n}\n\nfragment useAuthorFollowSubscribeButton_newsletterV3 on NewsletterV3 {\n  id\n  name\n  ...useNewsletterV3Subscription_newsletterV3\n  __typename\n}\n\nfragment AuthorFollowSubscribeButton_user on User {\n  id\n  name\n  imageId\n  ...SusiModal_user\n  ...useAuthorFollowSubscribeButton_user\n  newsletterV3 {\n    id\n    ...useAuthorFollowSubscribeButton_newsletterV3\n    __typename\n  }\n  __typename\n}\n\nfragment PublisherLink_collection on Collection {\n  ...collectionUrl_collection\n  __typename\n  id\n}\n\nfragment PublisherName_publisher on Publisher {\n  id\n  name\n  __typename\n}\n\nfragment PublisherFollowersCount_publisher on Publisher {\n  id\n  __typename\n  id\n  ... on Collection {\n    slug\n    subscriberCount\n    ...collectionUrl_collection\n    __typename\n    id\n  }\n  ... on User {\n    socialStats {\n      followerCount\n      __typename\n    }\n    username\n    ...userUrl_user\n    __typename\n    id\n  }\n}\n\nfragment UserAvatar_user on User {\n  __typename\n  id\n  imageId\n  membership {\n    tier\n    __typename\n    id\n  }\n  name\n  username\n  ...userUrl_user\n}\n\nfragment PublisherAvatar_publisher on Publisher {\n  __typename\n  ... on Collection {\n    id\n    ...CollectionAvatar_collection\n    __typename\n  }\n  ... on User {\n    id\n    ...UserAvatar_user\n    __typename\n  }\n}\n\nfragment usePostUrl_post on Post {\n  id\n  creator {\n    ...userUrl_user\n    __typename\n    id\n  }\n  collection {\n    id\n    domain\n    slug\n    __typename\n  }\n  isSeries\n  mediumUrl\n  sequence {\n    slug\n    __typename\n  }\n  uniqueSlug\n  __typename\n}\n\nfragment CollectionLastPostDate_collection on Collection {\n  __typename\n  ... on Collection {\n    latestPostsConnection(paging: {limit: 1}) {\n      posts {\n        id\n        firstPublishedAt\n        ...usePostUrl_post\n        __typename\n      }\n      __typename\n    }\n    __typename\n    id\n  }\n  id\n}\n\nfragment PublisherFollowingCount_publisher on Publisher {\n  __typename\n  id\n  ... on User {\n    socialStats {\n      followingCount\n      collectionFollowingCount\n      __typename\n    }\n    username\n    __typename\n    id\n  }\n}\n\nfragment PublisherFollowingCountOrLastPostDate_publisher on Publisher {\n  __typename\n  ... on Collection {\n    ...CollectionLastPostDate_collection\n    __typename\n    id\n  }\n  ...PublisherFollowingCount_publisher\n}\n\nfragment PostPublisherInfo_publisher on Publisher {\n  __typename\n  id\n  name\n  ... on User {\n    ...isUserVerifiedBookAuthor_user\n    ...PublisherLink_user\n    ...AuthorFollowSubscribeButton_user\n    __typename\n    id\n  }\n  ... on Collection {\n    ...PublisherLink_collection\n    ...PublicationFollowButton_collection\n    __typename\n    id\n  }\n  ...PublisherName_publisher\n  ...PublisherFollowersCount_publisher\n  ...PublisherDescription_publisher\n  ...PublisherAvatar_publisher\n  ...PublisherFollowingCountOrLastPostDate_publisher\n}\n\nfragment PublicationNavMobileItems_collection on Collection {\n  id\n  ...PublicationFollowButton_collection\n  __typename\n}\n\nfragment SusiModal_post on Post {\n  id\n  creator {\n    id\n    __typename\n  }\n  __typename\n}\n\nfragment SusiClickable_post on Post {\n  id\n  mediumUrl\n  ...SusiModal_post\n  __typename\n}\n\nfragment RegWall_post on Post {\n  id\n  lockedSource\n  ...SusiClickable_post\n  __typename\n}\n\nfragment EntityPaywall_post on Post {\n  id\n  creator {\n    name\n    __typename\n    id\n  }\n  __typename\n}\n\nfragment AspirationalPaywall_post on Post {\n  ...EntityPaywall_post\n  __typename\n  id\n}\n\nfragment ProgrammingPaywall_post on Post {\n  ...EntityPaywall_post\n  __typename\n  id\n}\n\nfragment Paywall_post on Post {\n  id\n  creator {\n    id\n    name\n    imageId\n    __typename\n  }\n  primaryTopic {\n    slug\n    __typename\n    id\n  }\n  topics {\n    slug\n    __typename\n  }\n  ...AspirationalPaywall_post\n  ...ProgrammingPaywall_post\n  __typename\n}\n\nfragment DropCap_image on ImageMetadata {\n  id\n  originalHeight\n  originalWidth\n  __typename\n}\n\nfragment MarkupNode_data_dropCapImage on ImageMetadata {\n  ...DropCap_image\n  __typename\n  id\n}\n\nfragment Markups_markup on Markup {\n  type\n  start\n  end\n  href\n  anchorType\n  userId\n  linkMetadata {\n    httpStatus\n    __typename\n  }\n  __typename\n}\n\nfragment Markups_paragraph on Paragraph {\n  name\n  text\n  hasDropCap\n  dropCapImage {\n    ...MarkupNode_data_dropCapImage\n    __typename\n    id\n  }\n  markups {\n    ...Markups_markup\n    __typename\n  }\n  __typename\n  id\n}\n\nfragment ParagraphRefsMapContext_paragraph on Paragraph {\n  id\n  name\n  text\n  __typename\n}\n\nfragment PostViewNoteCard_paragraph on Paragraph {\n  name\n  __typename\n  id\n}\n\nfragment PostAnnotationsMarker_paragraph on Paragraph {\n  ...PostViewNoteCard_paragraph\n  __typename\n  id\n}\n\nfragment ImageParagraph_paragraph on Paragraph {\n  href\n  layout\n  metadata {\n    id\n    originalHeight\n    originalWidth\n    focusPercentX\n    focusPercentY\n    alt\n    __typename\n  }\n  ...Markups_paragraph\n  ...ParagraphRefsMapContext_paragraph\n  ...PostAnnotationsMarker_paragraph\n  __typename\n  id\n}\n\nfragment TextParagraph_paragraph on Paragraph {\n  type\n  hasDropCap\n  codeBlockMetadata {\n    mode\n    lang\n    __typename\n  }\n  ...Markups_paragraph\n  ...ParagraphRefsMapContext_paragraph\n  __typename\n  id\n}\n\nfragment IframeParagraph_paragraph on Paragraph {\n  type\n  iframe {\n    mediaResource {\n      id\n      iframeSrc\n      iframeHeight\n      iframeWidth\n      title\n      __typename\n    }\n    __typename\n  }\n  layout\n  ...Markups_paragraph\n  __typename\n  id\n}\n\nfragment GenericMixtapeParagraph_paragraph on Paragraph {\n  text\n  mixtapeMetadata {\n    href\n    thumbnailImageId\n    __typename\n  }\n  markups {\n    start\n    end\n    type\n    href\n    __typename\n  }\n  __typename\n  id\n}\n\nfragment MixtapeParagraph_paragraph on Paragraph {\n  type\n  mixtapeMetadata {\n    href\n    mediaResource {\n      mediumCatalog {\n        id\n        __typename\n      }\n      __typename\n    }\n    __typename\n  }\n  ...GenericMixtapeParagraph_paragraph\n  __typename\n  id\n}\n\nfragment CodeBlockParagraph_paragraph on Paragraph {\n  codeBlockMetadata {\n    lang\n    mode\n    __typename\n  }\n  __typename\n  id\n}\n\nfragment PostBodyParagraph_paragraph on Paragraph {\n  name\n  type\n  ...ImageParagraph_paragraph\n  ...TextParagraph_paragraph\n  ...IframeParagraph_paragraph\n  ...MixtapeParagraph_paragraph\n  ...CodeBlockParagraph_paragraph\n  __typename\n  id\n}\n\nfragment PostBodySection_paragraph on Paragraph {\n  name\n  ...PostBodyParagraph_paragraph\n  __typename\n  id\n}\n\nfragment normalizedBodyModel_richText_paragraphs_markups on Markup {\n  type\n  __typename\n}\n\nfragment getParagraphHighlights_paragraph on Paragraph {\n  name\n  __typename\n  id\n}\n\nfragment getParagraphPrivateNotes_paragraph on Paragraph {\n  name\n  __typename\n  id\n}\n\nfragment normalizedBodyModel_richText_paragraphs on Paragraph {\n  markups {\n    ...normalizedBodyModel_richText_paragraphs_markups\n    __typename\n  }\n  codeBlockMetadata {\n    lang\n    mode\n    __typename\n  }\n  ...getParagraphHighlights_paragraph\n  ...getParagraphPrivateNotes_paragraph\n  __typename\n  id\n}\n\nfragment getSectionEndIndex_section on Section {\n  startIndex\n  __typename\n}\n\nfragment getParagraphStyles_richText on RichText {\n  paragraphs {\n    text\n    type\n    __typename\n  }\n  sections {\n    ...getSectionEndIndex_section\n    __typename\n  }\n  __typename\n}\n\nfragment paragraphExtendsImageGrid_paragraph on Paragraph {\n  layout\n  type\n  __typename\n  id\n}\n\nfragment getSeriesParagraphTopSpacings_richText on RichText {\n  paragraphs {\n    id\n    __typename\n  }\n  sections {\n    ...getSectionEndIndex_section\n    __typename\n  }\n  __typename\n}\n\nfragment getPostParagraphTopSpacings_richText on RichText {\n  paragraphs {\n    type\n    layout\n    text\n    codeBlockMetadata {\n      lang\n      mode\n      __typename\n    }\n    __typename\n  }\n  sections {\n    ...getSectionEndIndex_section\n    __typename\n  }\n  __typename\n}\n\nfragment getParagraphSpaces_richText on RichText {\n  paragraphs {\n    layout\n    metadata {\n      originalHeight\n      originalWidth\n      id\n      __typename\n    }\n    type\n    ...paragraphExtendsImageGrid_paragraph\n    __typename\n  }\n  ...getSeriesParagraphTopSpacings_richText\n  ...getPostParagraphTopSpacings_richText\n  __typename\n}\n\nfragment normalizedBodyModel_richText on RichText {\n  paragraphs {\n    ...normalizedBodyModel_richText_paragraphs\n    __typename\n  }\n  sections {\n    startIndex\n    ...getSectionEndIndex_section\n    __typename\n  }\n  ...getParagraphStyles_richText\n  ...getParagraphSpaces_richText\n  __typename\n}\n\nfragment PostBody_bodyModel on RichText {\n  sections {\n    name\n    startIndex\n    textLayout\n    imageLayout\n    backgroundImage {\n      id\n      originalHeight\n      originalWidth\n      __typename\n    }\n    videoLayout\n    backgroundVideo {\n      videoId\n      originalHeight\n      originalWidth\n      previewImageId\n      __typename\n    }\n    __typename\n  }\n  paragraphs {\n    id\n    ...PostBodySection_paragraph\n    __typename\n  }\n  ...normalizedBodyModel_richText\n  __typename\n}\n\nfragment HighlighSegmentContext_paragraph on Paragraph {\n  ...ParagraphRefsMapContext_paragraph\n  __typename\n  id\n}\n\nfragment NormalizeHighlights_paragraph on Paragraph {\n  name\n  text\n  __typename\n  id\n}\n\nfragment HighlightMenuOption_post on Post {\n  id\n  latestPublishedVersion\n  __typename\n}\n\nfragment RespondMenuOption_post on Post {\n  id\n  latestPublishedVersion\n  __typename\n}\n\nfragment ShareMenuOption_post on Post {\n  id\n  latestPublishedVersion\n  creator {\n    name\n    __typename\n    id\n  }\n  __typename\n}\n\nfragment SelectionMenuPopover_post on Post {\n  isPublished\n  allowResponses\n  isLimitedState\n  responsesLocked\n  visibility\n  isLocked\n  creator {\n    allowNotes\n    __typename\n    id\n  }\n  ...HighlightMenuOption_post\n  ...RespondMenuOption_post\n  ...ShareMenuOption_post\n  __typename\n  id\n}\n\nfragment SelectionMenu_post on Post {\n  isPublished\n  creator {\n    allowNotes\n    __typename\n    id\n  }\n  ...SelectionMenuPopover_post\n  __typename\n  id\n}\n\nfragment PostNewNoteCard_post on Post {\n  id\n  latestPublishedVersion\n  __typename\n}\n\nfragment ActiveSelectionContext_post on Post {\n  id\n  ...SelectionMenu_post\n  ...PostNewNoteCard_post\n  __typename\n}\n\nfragment PostBodyParagraph_post on Post {\n  creator {\n    id\n    __typename\n  }\n  __typename\n  id\n}\n\nfragment SubscribeToAuthorParagraph_post on Post {\n  creator {\n    name\n    __typename\n    id\n  }\n  mediumUrl\n  __typename\n  id\n}\n\nfragment UpsellParagraph_post on Post {\n  id\n  creator {\n    id\n    __typename\n  }\n  ...SubscribeToAuthorParagraph_post\n  __typename\n}\n\nfragment UseIsElligibleForSubscribeToAuthor_post on Post {\n  id\n  isLocked\n  __typename\n}\n\nfragment useIsEligibleToBecomeMember_post on Post {\n  id\n  isLocked\n  creator {\n    id\n    membership {\n      id\n      __typename\n    }\n    __typename\n  }\n  __typename\n}\n\nfragment UpsellPostParagraphContext_post on Post {\n  ...PostBodyParagraph_post\n  ...UpsellParagraph_post\n  ...UseIsElligibleForSubscribeToAuthor_post\n  ...useIsEligibleToBecomeMember_post\n  __typename\n  id\n}\n\nfragment ReportUserMenuItem_post on Post {\n  __typename\n  id\n  creator {\n    id\n    __typename\n  }\n  ...SusiClickable_post\n}\n\nfragment useHideResponseParent_post on Post {\n  __typename\n  id\n  creator {\n    id\n    __typename\n  }\n  collection {\n    id\n    viewerEdge {\n      id\n      isEditor\n      __typename\n    }\n    __typename\n  }\n}\n\nfragment HideResponseMenuItemParent_post on Post {\n  id\n  ...useHideResponseParent_post\n  __typename\n}\n\nfragment BlockUserMenuItem_post on Post {\n  __typename\n  id\n  creator {\n    id\n    __typename\n  }\n}\n\nfragment UndoClapsMenuItem_post on Post {\n  id\n  clapCount\n  __typename\n}\n\nfragment DeleteResponseMenuItem_post on Post {\n  creator {\n    id\n    __typename\n  }\n  __typename\n  id\n}\n\nfragment useReportStory_post on Post {\n  id\n  creator {\n    id\n    __typename\n  }\n  __typename\n}\n\nfragment ReportResponseDialog_post on Post {\n  __typename\n  id\n  creator {\n    id\n    __typename\n  }\n  ...useHideResponseParent_post\n  ...useReportStory_post\n}\n\nfragment ResponsePopoverMenu_post on Post {\n  id\n  responseDistribution\n  ...ReportUserMenuItem_post\n  ...HideResponseMenuItemParent_post\n  ...BlockUserMenuItem_post\n  ...UndoClapsMenuItem_post\n  ...DeleteResponseMenuItem_post\n  ...ReportResponseDialog_post\n  __typename\n}\n\nfragment ResponseHeaderParentEntity_post on Post {\n  __typename\n  creator {\n    id\n    __typename\n  }\n  ...ResponsePopoverMenu_post\n  id\n}\n\nfragment SimpleResponseParentEntity_post on Post {\n  ...ResponseHeaderParentEntity_post\n  __typename\n  id\n}\n\nfragment ReadOrEditSimpleResponseParentEntity_post on Post {\n  __typename\n  id\n  ...SimpleResponseParentEntity_post\n}\n\nfragment StoryResponseParentEntity_post on Post {\n  id\n  ...ResponseHeaderParentEntity_post\n  __typename\n}\n\nfragment ThreadedReplyParentEntity_post on Post {\n  __typename\n  id\n  ...ReadOrEditSimpleResponseParentEntity_post\n  ...StoryResponseParentEntity_post\n}\n\nfragment ThreadedRepliesParentEntity_post on Post {\n  __typename\n  id\n  ...ThreadedReplyParentEntity_post\n}\n\nfragment ThreadedResponsesSidebarContent_post on Post {\n  id\n  latestPublishedVersion\n  postResponses {\n    count\n    __typename\n  }\n  collection {\n    id\n    viewerEdge {\n      id\n      isEditor\n      __typename\n    }\n    __typename\n  }\n  creator {\n    id\n    __typename\n  }\n  ...ThreadedRepliesParentEntity_post\n  __typename\n}\n\nfragment ThreadedResponsesSidebar_post on Post {\n  id\n  ...ThreadedResponsesSidebarContent_post\n  __typename\n}\n\nfragment SusiClickable_user on User {\n  ...SusiModal_user\n  __typename\n  id\n}\n\nfragment MultiVoteCount_post on Post {\n  id\n  __typename\n}\n\nfragment MultiVote_post on Post {\n  id\n  creator {\n    id\n    ...SusiClickable_user\n    __typename\n  }\n  isPublished\n  ...SusiClickable_post\n  collection {\n    id\n    slug\n    __typename\n  }\n  isLimitedState\n  ...MultiVoteCount_post\n  __typename\n}\n\nfragment useCopyFriendLink_post on Post {\n  ...usePostUrl_post\n  __typename\n  id\n}\n\nfragment UpsellClickable_post on Post {\n  id\n  collection {\n    id\n    __typename\n  }\n  sequence {\n    sequenceId\n    __typename\n  }\n  creator {\n    id\n    __typename\n  }\n  __typename\n}\n\nfragment FriendLink_post on Post {\n  id\n  ...SusiClickable_post\n  ...useCopyFriendLink_post\n  ...UpsellClickable_post\n  __typename\n}\n\nfragment PostSharePopover_post on Post {\n  id\n  mediumUrl\n  title\n  isPublished\n  isLocked\n  ...usePostUrl_post\n  ...FriendLink_post\n  __typename\n}\n\nfragment FollowMenuOptions_user on User {\n  id\n  ...AuthorFollowSubscribeButton_user\n  __typename\n}\n\nfragment FollowMenuOptions_collection on Collection {\n  id\n  ...PublicationFollowButton_collection\n  __typename\n}\n\nfragment ClapMutation_post on Post {\n  __typename\n  id\n  clapCount\n  ...MultiVoteCount_post\n}\n\nfragment OverflowMenuItemUndoClaps_post on Post {\n  id\n  clapCount\n  ...ClapMutation_post\n  __typename\n}\n\nfragment AddToCatalogBase_post on Post {\n  id\n  isPublished\n  ...SusiClickable_post\n  __typename\n}\n\nfragment NegativeSignalModal_publisher on Publisher {\n  __typename\n  id\n  name\n}\n\nfragment NegativeSignalModal_post on Post {\n  id\n  creator {\n    ...NegativeSignalModal_publisher\n    viewerEdge {\n      id\n      isMuting\n      __typename\n    }\n    __typename\n    id\n  }\n  collection {\n    ...NegativeSignalModal_publisher\n    viewerEdge {\n      id\n      isMuting\n      __typename\n    }\n    __typename\n    id\n  }\n  __typename\n}\n\nfragment ExplicitSignalMenuOptions_post on Post {\n  ...NegativeSignalModal_post\n  __typename\n  id\n}\n\nfragment OverflowMenu_post on Post {\n  id\n  creator {\n    id\n    ...FollowMenuOptions_user\n    __typename\n  }\n  collection {\n    id\n    ...FollowMenuOptions_collection\n    __typename\n  }\n  ...OverflowMenuItemUndoClaps_post\n  ...AddToCatalogBase_post\n  ...ExplicitSignalMenuOptions_post\n  __typename\n}\n\nfragment OverflowMenuButton_post on Post {\n  id\n  visibility\n  ...OverflowMenu_post\n  __typename\n}\n\nfragment AddToCatalogBookmarkButton_post on Post {\n  ...AddToCatalogBase_post\n  __typename\n  id\n}\n\nfragment BookmarkButton_post on Post {\n  visibility\n  ...SusiClickable_post\n  ...AddToCatalogBookmarkButton_post\n  __typename\n  id\n}\n\nfragment getPostContentAsString_post on Post {\n  content(postMeteringOptions: $postMeteringOptions) {\n    bodyModel {\n      paragraphs {\n        text\n        type\n        mixtapeMetadata {\n          href\n          __typename\n        }\n        __typename\n      }\n      __typename\n    }\n    __typename\n  }\n  __typename\n  id\n}\n\nfragment postMetaDescription_post on Post {\n  id\n  title\n  seoDescription\n  metaDescription\n  creator {\n    id\n    name\n    __typename\n  }\n  collection {\n    id\n    name\n    __typename\n  }\n  previewContent {\n    subtitle\n    __typename\n  }\n  ...getPostContentAsString_post\n  __typename\n}\n\nfragment shortformPostMetaDescription_post on Post {\n  id\n  metaDescription\n  seoDescription\n  shortformType\n  title\n  ...getPostContentAsString_post\n  __typename\n}\n\nfragment shouldIndexPost_post on Post {\n  id\n  firstPublishedAt\n  isShortform\n  shortformType\n  visibility\n  ...getPostContentAsString_post\n  viewerEdge {\n    shouldIndexPostForExternalSearch\n    __typename\n    id\n  }\n  __typename\n}\n\nfragment shouldFollowPost_post on Post {\n  viewerEdge {\n    id\n    shouldFollowPostForExternalSearch\n    __typename\n  }\n  __typename\n  id\n}\n\nfragment appendPostContext_post on Post {\n  id\n  sequence {\n    title\n    __typename\n  }\n  collection {\n    name\n    __typename\n    id\n  }\n  creator {\n    name\n    __typename\n    id\n  }\n  __typename\n}\n\nfragment maybeAppendProductName_collection on Collection {\n  id\n  domain\n  __typename\n}\n\nfragment shortformPostTitle_post on Post {\n  id\n  title\n  seoTitle\n  shortformType\n  ...getPostContentAsString_post\n  ...appendPostContext_post\n  collection {\n    ...maybeAppendProductName_collection\n    __typename\n    id\n  }\n  __typename\n}\n\nfragment GetTitleIndexMap_bodyModel on RichText {\n  paragraphs {\n    type\n    text\n    __typename\n  }\n  __typename\n}\n\nfragment getTitleDetails_post on Post {\n  id\n  content(postMeteringOptions: $postMeteringOptions) {\n    bodyModel {\n      ...GetTitleIndexMap_bodyModel\n      __typename\n    }\n    __typename\n  }\n  ...getPostContentAsString_post\n  __typename\n}\n\nfragment postTitle_post on Post {\n  id\n  title\n  seoTitle\n  firstPublishedAt\n  ...getPostContentAsString_post\n  ...appendPostContext_post\n  collection {\n    id\n    name\n    domain\n    ...maybeAppendProductName_collection\n    __typename\n  }\n  creator {\n    name\n    __typename\n    id\n  }\n  previewContent {\n    subtitle\n    __typename\n  }\n  __typename\n}\n\nfragment getTitleForPost_post on Post {\n  id\n  title\n  ...postTitle_post\n  ...getTitleDetails_post\n  __typename\n}\n\nfragment postHasImage_post on Post {\n  content(postMeteringOptions: $postMeteringOptions) {\n    bodyModel {\n      paragraphs {\n        type\n        __typename\n      }\n      __typename\n    }\n    __typename\n  }\n  __typename\n  id\n}\n\nfragment PostFooterTags_post on Post {\n  id\n  tags {\n    __typename\n    id\n    displayTitle\n    normalizedTagSlug\n  }\n  __typename\n}\n\nfragment OverlappingAvatars_user on User {\n  __typename\n  id\n  imageId\n  name\n  username\n  ...userUrl_user\n}\n\nfragment AuthorByline_user on User {\n  __typename\n  id\n  name\n  ...isUserVerifiedBookAuthor_user\n  ...userUrl_user\n  ...AuthorFollowSubscribeButton_user\n}\n\nfragment PostByline_user on User {\n  ...AuthorByline_user\n  __typename\n  id\n}\n\nfragment PostBodyInserts_paragraph on Paragraph {\n  name\n  text\n  type\n  __typename\n  id\n}\n\nfragment AuthorFollowSubscribeButton_post on Post {\n  id\n  ...SusiModal_post\n  __typename\n}\n\nfragment AuthorByline_post on Post {\n  ...AuthorFollowSubscribeButton_post\n  __typename\n  id\n}\n\nfragment shouldShowPublishedInStatus_post on Post {\n  statusForCollection\n  isPublished\n  __typename\n  id\n}\n\nfragment CollectionByline_post on Post {\n  ...shouldShowPublishedInStatus_post\n  __typename\n  id\n}\n\nfragment BoldCollectionName_collection on Collection {\n  id\n  name\n  __typename\n}\n\nfragment DraftStatus_post on Post {\n  id\n  pendingCollection {\n    id\n    creator {\n      id\n      __typename\n    }\n    ...BoldCollectionName_collection\n    __typename\n  }\n  statusForCollection\n  creator {\n    id\n    __typename\n  }\n  isPublished\n  __typename\n}\n\nfragment PostBylineDescription_post on Post {\n  id\n  isNewsletter\n  collection {\n    slug\n    __typename\n    id\n  }\n  ...CollectionByline_post\n  ...DraftStatus_post\n  __typename\n}\n\nfragment MaybeTextToSpeech_post on Post {\n  id\n  detectedLanguage\n  wordCount\n  isPublished\n  __typename\n}\n\nfragment PostByline_post on Post {\n  id\n  postResponses {\n    count\n    __typename\n  }\n  allowResponses\n  isLimitedState\n  isPublished\n  ...AuthorByline_post\n  ...PostBylineDescription_post\n  ...MultiVote_post\n  ...BookmarkButton_post\n  ...MaybeTextToSpeech_post\n  ...PostSharePopover_post\n  ...OverflowMenuButton_post\n  __typename\n}\n\nfragment useShouldShowPostPageMeter_post on Post {\n  id\n  creator {\n    id\n    __typename\n  }\n  isLocked\n  lockedSource\n  content(postMeteringOptions: $postMeteringOptions) {\n    isLockedPreviewOnly\n    validatedShareKey\n    __typename\n  }\n  __typename\n}\n\nfragment FriendLinkSharer_user on User {\n  id\n  name\n  ...userUrl_user\n  __typename\n}\n\nfragment FriendLinkMeter_postContent on PostContent {\n  validatedShareKey\n  shareKeyCreator {\n    ...FriendLinkSharer_user\n    __typename\n    id\n  }\n  __typename\n}\n\nfragment MeterClickable_post on Post {\n  id\n  ...UpsellClickable_post\n  __typename\n}\n\nfragment FriendLinkMeter_post on Post {\n  id\n  content(postMeteringOptions: $postMeteringOptions) {\n    ...FriendLinkMeter_postContent\n    __typename\n  }\n  creator {\n    ...FriendLinkSharer_user\n    __typename\n    id\n  }\n  ...MeterClickable_post\n  __typename\n}\n\nfragment PostPageMeter_post on Post {\n  id\n  content(postMeteringOptions: $postMeteringOptions) {\n    isLockedPreviewOnly\n    __typename\n  }\n  ...FriendLinkMeter_post\n  ...MeterClickable_post\n  __typename\n}\n\nfragment PostPageStar_post on Post {\n  id\n  creator {\n    id\n    __typename\n  }\n  isLocked\n  __typename\n}\n\nfragment FeaturedStoryPopover_post on Post {\n  id\n  collection {\n    id\n    name\n    slug\n    ...CollectionAvatar_collection\n    __typename\n  }\n  __typename\n}\n\nfragment FeaturedStoryLabel_post on Post {\n  isFeaturedInPublishedPublication\n  id\n  creator {\n    id\n    __typename\n  }\n  collection {\n    id\n    __typename\n  }\n  ...FeaturedStoryPopover_post\n  __typename\n}\n\nfragment StarAndFeaturedInsert_post on Post {\n  isLocked\n  ...PostPageStar_post\n  ...FeaturedStoryLabel_post\n  __typename\n  id\n}\n\nfragment usePostClientViewedReporter_post on Post {\n  id\n  isPublished\n  isLocked\n  collection {\n    id\n    slug\n    __typename\n  }\n  content(postMeteringOptions: $postMeteringOptions) {\n    validatedShareKey\n    isLockedPreviewOnly\n    __typename\n  }\n  __typename\n}\n\nfragment PostResponseParentEntity_post on Post {\n  ...ReadOrEditSimpleResponseParentEntity_post\n  ...StoryResponseParentEntity_post\n  __typename\n  id\n}\n\nfragment PostResponsesContent_post on Post {\n  responsesLocked\n  postResponses {\n    count\n    __typename\n  }\n  creator {\n    id\n    __typename\n  }\n  collection {\n    viewerEdge {\n      isEditor\n      __typename\n      id\n    }\n    __typename\n    id\n  }\n  ...PostResponseParentEntity_post\n  __typename\n  id\n}\n\nfragment PublicationFollowButton_post on Post {\n  id\n  ...SusiModal_post\n  __typename\n}\n\nfragment PostPublisherInfo_post on Post {\n  id\n  ...AuthorFollowSubscribeButton_post\n  ...PublicationFollowButton_post\n  __typename\n}\n\nfragment PostResultError_postResult on PostResult {\n  __typename\n  ... on Post {\n    id\n    __typename\n  }\n  ... on UnavailableForLegalReasons {\n    ...UnavailableForLegalReasonsScreen_unavailableForLegalReasons\n    __typename\n  }\n  ... on WithheldInCountry {\n    ...WithheldInCountryScreen_withheldInCountry\n    __typename\n  }\n}\n\nfragment FloatingPublicationBio_collection on Collection {\n  id\n  ...CollectionAvatar_collection\n  ...PublisherDescription_publisher\n  ...PublicationFollowButton_collection\n  __typename\n}\n\nfragment MoreFromAuthorAndMaybePub_collection on Collection {\n  id\n  name\n  ...collectionUrl_collection\n  __typename\n}\n\nfragment PostPublishersInfoSection_collection on Collection {\n  ...PostPublisherInfo_publisher\n  __typename\n  id\n}\n\nfragment PublicationNav_collection on Collection {\n  id\n  name\n  slug\n  compatV3 {\n    id\n    theme {\n      accentColor {\n        rgb\n        __typename\n      }\n      __typename\n    }\n    __typename\n  }\n  ...PublicationNavMobileItems_collection\n  __typename\n}\n\nfragment MastodonVerificationLink_user on User {\n  id\n  linkedAccounts {\n    mastodon {\n      domain\n      username\n      __typename\n      id\n    }\n    __typename\n    id\n  }\n  __typename\n}\n\nfragment SuspendedBannerLoader_user on User {\n  id\n  isSuspended\n  __typename\n}\n\nfragment MoreFromAuthorAndMaybePub_user on User {\n  __typename\n  id\n  name\n  imageId\n  ...userUrl_user\n}\n\nfragment PostPublishersInfoSection_user on User {\n  ...PostPublisherInfo_publisher\n  __typename\n  id\n}\n\nfragment Wall_post on Post {\n  content(postMeteringOptions: $postMeteringOptions) {\n    isLockedPreviewOnly\n    __typename\n  }\n  isLocked\n  isMarkedPaywallOnly\n  ...RegWall_post\n  ...Paywall_post\n  __typename\n  id\n}\n\nfragment InteractivePostBody_post on Post {\n  id\n  isLimitedState\n  isPublished\n  allowResponses\n  content(postMeteringOptions: $postMeteringOptions) {\n    isLockedPreviewOnly\n    bodyModel {\n      ...PostBody_bodyModel\n      paragraphs {\n        ...HighlighSegmentContext_paragraph\n        ...NormalizeHighlights_paragraph\n        __typename\n      }\n      __typename\n    }\n    __typename\n  }\n  creator {\n    id\n    allowNotes\n    __typename\n  }\n  ...ActiveSelectionContext_post\n  ...UpsellPostParagraphContext_post\n  __typename\n}\n\nfragment WithResponsesSidebar_post on Post {\n  id\n  ...ThreadedResponsesSidebar_post\n  __typename\n}\n\nfragment PostCanonicalizer_post on Post {\n  mediumUrl\n  __typename\n  id\n}\n\nfragment PostFooterActionsBar_post on Post {\n  id\n  visibility\n  allowResponses\n  postResponses {\n    count\n    __typename\n  }\n  isLimitedState\n  creator {\n    id\n    __typename\n  }\n  collection {\n    id\n    __typename\n  }\n  ...MultiVote_post\n  ...PostSharePopover_post\n  ...OverflowMenuButton_post\n  ...BookmarkButton_post\n  __typename\n}\n\nfragment PostReadTracker_post on Post {\n  id\n  collection {\n    slug\n    __typename\n    id\n  }\n  sequence {\n    sequenceId\n    __typename\n  }\n  content(postMeteringOptions: $postMeteringOptions) {\n    isLockedPreviewOnly\n    __typename\n  }\n  __typename\n}\n\nfragment PostMetadata_post on Post {\n  id\n  socialTitle\n  socialDek\n  canonicalUrl\n  mediumUrl\n  metaDescription\n  latestPublishedAt\n  visibility\n  isLimitedState\n  readingTime\n  creator {\n    name\n    twitterScreenName\n    ...userUrl_user\n    __typename\n    id\n  }\n  collection {\n    twitterUsername\n    facebookPageId\n    __typename\n    id\n  }\n  previewContent {\n    subtitle\n    __typename\n  }\n  previewImage {\n    id\n    alt\n    focusPercentX\n    focusPercentY\n    originalHeight\n    originalWidth\n    __typename\n  }\n  isShortform\n  seoMetaTags {\n    jsonLd\n    __typename\n  }\n  ...postMetaDescription_post\n  ...shortformPostMetaDescription_post\n  ...shouldIndexPost_post\n  ...shouldFollowPost_post @include(if: $includeShouldFollowPost)\n  ...shortformPostTitle_post\n  ...getTitleDetails_post\n  ...getTitleForPost_post\n  ...postHasImage_post\n  __typename\n}\n\nfragment SuspendedBannerLoader_post on Post {\n  id\n  isSuspended\n  __typename\n}\n\nfragment PostFooterInfo_post on Post {\n  id\n  license\n  visibility\n  ...PostFooterTags_post\n  __typename\n}\n\nfragment PostBodyInserts_post on Post {\n  creator {\n    ...OverlappingAvatars_user\n    ...PostByline_user\n    __typename\n    id\n  }\n  firstPublishedAt\n  isLocked\n  isShortform\n  readingTime\n  isFeaturedInPublishedPublication\n  content(postMeteringOptions: $postMeteringOptions) {\n    isLockedPreviewOnly\n    bodyModel {\n      paragraphs {\n        ...PostBodyInserts_paragraph\n        __typename\n      }\n      sections {\n        startIndex\n        __typename\n      }\n      __typename\n    }\n    __typename\n  }\n  ...PostByline_post\n  ...useShouldShowPostPageMeter_post\n  ...PostPageMeter_post\n  ...StarAndFeaturedInsert_post\n  __typename\n  id\n}\n\nfragment PostNoteMissingToast_post on Post {\n  id\n  __typename\n}\n\nfragment usePostTracking_post on Post {\n  ...usePostClientViewedReporter_post\n  __typename\n  id\n}\n\nfragment InResponseToEntityPreview_post on Post {\n  id\n  inResponseToEntityType\n  __typename\n}\n\nfragment PostPublishedDialog_prerequisite_post on Post {\n  id\n  creator {\n    id\n    __typename\n  }\n  collection {\n    id\n    name\n    __typename\n  }\n  __typename\n}\n\nfragment PostResponses_post on Post {\n  isPublished\n  allowResponses\n  isLimitedState\n  ...PostResponsesContent_post\n  __typename\n  id\n}\n\nfragment PostPublishersInfoSection_post on Post {\n  ...PostPublisherInfo_post\n  __typename\n  id\n}\n\nfragment UseSubscribeToAuthorOnScroll_post on Post {\n  id\n  mediumUrl\n  ...SusiModal_post\n  creator {\n    id\n    name\n    ...SusiModal_user\n    __typename\n  }\n  ...UseIsElligibleForSubscribeToAuthor_post\n  __typename\n}\n"
    }
  ]

  host = ENV.fetch('MEDIUM_HOST', 'https://medium.com/_/graphql')
  body = Request.body(Request.URL(host, method = 'POST', data = query));
  
  if !body.nil?
    json = JSON.parse(body)

     = PostInfo.new()
    .description = json&.dig(0, "data", "postResult", "previewContent", "subtitle")&.gsub(/[^[:print:]]/ , '')
    .title = json&.dig(0, "data", "postResult", "title")&.gsub(/[^[:print:]]/ , '')
    .tags = json&.dig(0, "data", "postResult", "tags").map{ |tag| tag["normalizedTagSlug"] }
    
    previewImageFIleName = json&.dig(0, "data", "postResult", "previewImage", "id")
    if !previewImageFIleName.nil?

      imagePathPolicy = PathPolicy.new(pathPolicy.getAbsolutePath(postID), pathPolicy.getRelativePath(postID))
      
      absolutePath = imagePathPolicy.getAbsolutePath(previewImageFIleName)

      miro_host = ENV.fetch('MIRO_MEDIUM_HOST', 'https://miro.medium.com')
      imageURL = "#{miro_host}/#{previewImageFIleName}"

      if  ImageDownloader.download(absolutePath, imageURL)
          relativePath = imagePathPolicy.getRelativePath(previewImageFIleName)
          .previewImage = relativePath
      end
    end

    creatorName = json&.dig(0, "data", "postResult", "creator", "name")
    if !creatorName.nil?
      .creator = creatorName
    end

    colletionRef = json&.dig(0, "data", "postResult", "collection", "name")
    if !colletionRef.nil?
      .collectionName = colletionRef
    end

  

    firstPublishedAt = json&.dig(0, "data", "postResult", "firstPublishedAt")
    if !firstPublishedAt.nil?
      .firstPublishedAt = Time.at(0, firstPublishedAt, :millisecond) 
    end

    latestPublishedAt = json&.dig(0, "data", "postResult", "latestPublishedAt")
    if !latestPublishedAt.nil?
      .latestPublishedAt = Time.at(0, latestPublishedAt, :millisecond)
    end

    
  else
    nil
  end

end