File size: 10,482 Bytes
aa34b1f
 
0f87374
aa34b1f
 
 
 
 
 
 
dff1837
 
 
aa34b1f
 
 
e73bcbd
 
aa34b1f
 
 
 
4091161
733aa95
4091161
 
 
 
 
aa34b1f
 
e73bcbd
 
9452f95
4091161
 
 
60d3d26
4091161
 
 
aa34b1f
 
4091161
 
 
 
aa34b1f
 
 
5b507dc
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
aa34b1f
e73bcbd
aa34b1f
 
4091161
aa34b1f
1a5b0c0
e73bcbd
aa34b1f
1a5b0c0
4091161
aa34b1f
 
 
 
 
1a5b0c0
 
 
aa34b1f
 
 
 
 
 
 
 
 
 
 
 
e73bcbd
 
 
 
 
aa34b1f
 
 
 
 
5b507dc
e73bcbd
 
 
 
aa34b1f
 
 
 
 
 
 
 
e73bcbd
1a5b0c0
 
 
aa34b1f
 
 
 
 
 
 
 
 
 
1a5b0c0
aa34b1f
 
 
 
 
 
4091161
aa34b1f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1a5b0c0
 
3267828
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
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
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
import re
import os
import time
import base64
import requests
import dotenv
import mistune

dotenv.load_dotenv()
access_key = os.getenv('ACCESS_KEY')
client_id = os.getenv('CLIENT_ID')
client_secret = os.getenv('CLIENT_SECRET')
refresh_token = os.getenv('REFRESH_TOKEN')
blog_id = os.getenv('BLOG_ID')

def extract_summary(text):
    text = text.replace("#", "").strip().lower()
    match = re.search(r"summary(.*?)highlights", text.replace("#", ""), re.DOTALL)
    if match:
        return match.group(1).replace("#", "").replace("\n", "").strip()
    return None

def upload_image(image, api_key):
    url = f'https://api.imgbb.com/1/upload?key={api_key}'
    response = requests.post(url, data = {'image': image})
    image_url = response.json()['data']['image']['url']
    status_code = response.json()['status']
    return image_url, status_code

def generate_image(title, summary, category):
    extracted_summary = extract_summary(summary)
    if extracted_summary is None:
        extracted_summary = title
    url = f"https://image.pollinations.ai/prompt/{title}%20%3A%20{extracted_summary}?width=1280&height=720&seed=623862700&nologo=true&model=turbo"
    data = requests.get(url).content
    encoded_image = base64.b64encode(data)
    image =  encoded_image.decode('utf-8')
    image_url, status_code = upload_image(image, os.getenv('IMGBB_API_KEY'))
    if status_code != 200:
        return f"data:image/png;base64,{image}"
    return image_url

def generate_post_html(title, summary, mindmap, category, citation):
    title = title.replace("{", r"{{").replace("}", r"}}")
    summary = summary.replace("{", r"{{").replace("}", r"}}")
    mindmap = mindmap.replace("{", r"{{").replace("}", r"}}")
    citation = citation.replace("{", r"{{").replace("}", r"}}")
    image = generate_image(title, summary, category)
    html_summary = mistune.html(summary)
    post = f"""
<div>
<script src="https://cdn.jsdelivr.net/npm/markmap-autoloader@latest"></script>
<style>
.markmap {{
position: relative;
}}
.markmap > svg {{
width: 100%;
border: 2px solid #000;
height: 80dvh;
}}
</style>
<img style='display:block; width:100%;height:100%;' id='paper_image' src='{image}' />
<br>
<p id="paper_summary" data="{summary.replace("&amp;", "&")}">{html_summary.replace("&amp;", "&")}</p>
<br>
<br>
<h2>Mindmap</h2>
<div class="markmap"  id="paper_mindmap" data="# {title} \n {mindmap.replace("&amp;", "&")}">
<script type="text/template">
{mindmap.replace("&amp;", "&")}
</script>
</div>
<br>
<h2>Citation</h2>
<p id="paper_citation" data="{citation.replace("&amp;", "&")}">
{mistune.html(citation.replace("&amp;", "&"))}
</p>
</div>
    """
    return post, image

def create_post(title, category, summary, mindmap, citation):
    post_title = title
    post_category = f"{category}"
    post_body, post_image = generate_post_html(title, summary, mindmap, category, citation)
    return post_title, post_category, post_body, post_image

def post_post(title, category, body, image):
    data = None
    try:
        data = requests.post(
                url='https://oauth2.googleapis.com/token',
                data={
                    'grant_type': 'refresh_token',
                    'client_secret': client_secret,
                    'refresh_token': refresh_token,
                    'client_id': client_id,
                },
            ).json()
        url = f"https://blogger.googleapis.com/v3/blogs/{blog_id}/posts"
        headers = {
            'Authorization': f"Bearer {data['access_token']}",
            "content-type": "application/json"
        }
        post_data = {
            "kind": "blogger#post",
            "blog": {
                "id": blog_id
            },
            "images": [
                {
                "url": image
                }
            ],
            "title": title,
            "content": body,
            "labels": [category, "recent"]
        }
        data = requests.post(url, headers=headers, json=post_data).json()
        print(data)
        if data['status'] == 'LIVE':
            return True
        else:
            return False
    except Exception as e:
        print('An error occurred:', str(e))
        return False
    
def post_blog(title, category, summary, mindmap, citation, uaccess_key):
    if uaccess_key != access_key:
        return False
    try:
        post_title, post_category, post_body, post_image = create_post(title, category, summary, mindmap, citation)
        status = post_post(post_title, post_category, post_body, post_image)
        print(f"Waiting for {3*60} seconds...")
        time.sleep(3*60)
        if status:
            print('Post created successfully')
            return True
        else:
            print('Failed to create post')
            return False
    except Exception as e:
        print('An error occurred:', str(e))
        return False
    
def test(access_key):
    data = {
            "status": "success",
            "Astrophysics": {
                "2412.16344": {
                    "id": "2412.16344",
                    "doi": "https://doi.org/10.48550/arXiv.2412.16344",
                    "title": "On the Interplay of Constraints from $B_s$, $D$, and $K$ Meson Mixing in $Z^\prime$ Models with Implications for $b\to s ν\barν$ Transitions",
                    "category": "Astrophysics",
                    "citation": "Grant, C. E., Bautz, M. W., Miller, E. D., Foster, R. F., LaMarr, B., Malonis, A., Prigozhin, G., Schneider, B., Leitz, C., &amp; Falcone, A. D. (2024). Focal Plane of the Arcus Probe X-Ray Spectrograph. ArXiv. https://doi.org/10.48550/ARXIV.2412.16344",
                    "summary": "## Summary\nThe Arcus Probe mission concept provides high-resolution soft X-ray and UV spectroscopy to study the universe. The X-ray Spectrograph (XRS) uses two CCD focal planes to detect and record X-ray photons. Laboratory performance results meet observatory requirements.\n\n## Highlights\n- The Arcus Probe mission concept explores the formation and evolution of clusters, galaxies, and stars.\n- The XRS instrument includes four parallel optical channels and two detector focal plane arrays.\n- The CCDs are designed and manufactured by MIT Lincoln Laboratory (MIT/LL).\n- The XRS focal plane utilizes high heritage MIT/LL CCDs with proven technologies.\n- Laboratory testing confirms CCID-94 performance meets required spectral resolution and readout noise.\n- The Arcus mission includes two co-aligned instruments working simultaneously.\n- The XRS Instrument Control Unit (XICU) controls the activities of the XRS.\n\n## Key Insights\n- The Arcus Probe mission concept provides a significant improvement in sensitivity and resolution over previous missions, enabling breakthrough science in understanding the universe.\n- The XRS instrument's design, including the use of two CCD focal planes and four parallel optical channels, allows for high-resolution spectroscopy and efficient detection of X-ray photons.\n- The CCDs used in the XRS instrument are designed and manufactured by MIT Lincoln Laboratory (MIT/LL), which has a proven track record of producing high-quality CCDs for space missions.\n- The laboratory performance results of the CCID-94 device demonstrate that it meets the required spectral resolution and readout noise for the Arcus mission, indicating that the instrument is capable of achieving its scientific goals.\n- The XRS Instrument Control Unit (XICU) plays a crucial role in controlling the activities of the XRS, including gathering and storing data, and processing event recognition.\n- The Arcus mission's use of two co-aligned instruments working simultaneously allows for a wide range of scientific investigations, including the study of time-domain science and the physics of time-dependent phenomena.\n- The high heritage MIT/LL CCDs used in the XRS focal plane provide a reliable and efficient means of detecting X-ray photons, enabling the instrument to achieve its scientific goals.",
                    "mindmap": "## Arcus Probe Mission Concept\n- Explores formation and evolution of clusters, galaxies, stars\n- High-resolution soft X-ray and UV spectroscopy\n- Agile response capability for time-domain science\n\n## X-Ray Spectrograph (XRS) Instrument\n- Two nearly identical CCD focal planes\n- Detects and records X-ray photons from dispersed spectra\n- Zero-order of critical angle transmission gratings\n\n## XRS Focal Plane Characteristics\n- Frametransfer X-ray CCDs\n- 8-CCD array per Detector Assembly\n- FWHM < 70 eV @ 0.5 keV\n- System read noise ≤ 4 e- RMS @ 625 kpixels/sec\n\n## Detector Assembly\n- Eight CCDs in a linear array\n- Tilted to match curved focal surface\n- Gaps minimized between CCDs\n- Alignment optimized with XRS optics\n\n## Detector Electronics\n- Programmable analog clock waveforms and biases\n- Low-noise analog signal processing and digitization\n- 1 second frame time for negligible pileup\n\n## XRS Instrument Control Unit (XICU)\n- Controls XRS activities and data transfer\n- Event Recognition Processor (ERP) extracts X-ray events\n- Reduces data rate by many orders of magnitude\n\n## CCD X-Ray Performance\n- Measured readout noise 2-3 e- RMS\n- Spectral resolution meets Arcus requirements\n- FWHM < 70 eV at 0.5 keV\n\n## CCID-94 Characteristics\n- Back-illuminated frame-transfer CCDs\n- 2048 × 1024 pixel imaging array\n- 24 × 24 µm image area pixel size\n- 50 µm detector thickness\n\n## Contamination Blocking Filter (CBF)\n- Protects detectors from molecular contamination\n- 45 nm polyimide + 30 nm Al\n- Maintained above +20°C by heater control\n\n## Optical Blocking Filter (OBF)\n- Attenuates visible/IR stray light\n- 40 nm Al on-chip filter\n- Works in conjunction with CBF"
                }
            }
        }
    if data['status'] != 'success':
        print('Failed to fetch data')
    else:
        for category, catdata in data.items():
            if category != 'status':
                for paper_id, paperdata in catdata.items():
                    title = paperdata['title']
                    category = paperdata['category']
                    summary = paperdata['summary']
                    mindmap = paperdata['mindmap']
                    citation = paperdata['citation']
                    access_key = access_key
                    status = post_blog(title, category, summary, mindmap, citation, access_key)
                    print(status)
                    return status