Skip to content

Instantly share code, notes, and snippets.

@san-kumar
Last active January 30, 2024 03:17
Show Gist options
  • Save san-kumar/b3604ca40905556b4135fee64ead58f2 to your computer and use it in GitHub Desktop.
Save san-kumar/b3604ca40905556b4135fee64ead58f2 to your computer and use it in GitHub Desktop.
tampermonkey script to show summaries on hacker news
// ==UserScript==
// @name hn summary (kagi)
// @namespace http://tampermonkey.net/
// @version 0.1
// @description try to take over the world!
// @author You
// @match https://news.ycombinator.com/*
// @icon https://www.google.com/s2/favicons?sz=64&domain=ycombinator.com
// @grant GM_xmlhttpRequest
// @require https://code.jquery.com/jquery-3.4.1.min.js
// ==/UserScript==
(async function () {
'use strict';
let getSummary = async function(url, e, type, fails = 0) {
let loading = $(`<img class="load_img" src="data:image/gif;base64,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" height="12" />`);
e.after(loading);
let result;
if(type == 'summary') {
if(!fails) {
let queue = await new Promise(r => GM_xmlhttpRequest ( {
method: "POST",
url: "https://labs.kagi.com/v1/summarization",
data: JSON.stringify({url}),
headers: { "accept": "application/json", "content-type": "application/json"},
onload: function (response) {
let obj = JSON.parse(response.responseText);
console.log(obj);
r();
}
}));
}
result = await new Promise(r => GM_xmlhttpRequest ( {
method: "GET",
url: "https://labs.kagi.com/v1/summary_status?url=" + encodeURIComponent(url),
onload: function (response) {
let obj = JSON.parse(response.responseText);
console.log(obj);
if (obj.summary) {
r(obj.summary);
} else if(fails < 3) {
console.log("retry: ", fails);
setTimeout(() => getSummary(url, e, true, fails+1), 10000);
}
}
}));
} else {
console.log({url});
result = await new Promise(r => GM_xmlhttpRequest ( {
method: "POST",
url: "https://labs.kagi.com/v1/takeaways",
data: JSON.stringify({url}),
headers: { "accept": "application/json", "content-type": "application/json"},
onload: function (response) {
let obj = JSON.parse(response.responseText);
console.log(obj);
r(obj.takeaways);
}
}));
}
let close = $(`<a href="#" onclick="return false;" style="position: absolute; top: 0; right: 5px;">✖</a>`);
let takeaway = $(`<tr><td colspan=2></td><td style="padding: 10px 0; color: #333;"><div style="border: 1px solid silver;max-width:min(90vw, 640px); padding: 10px;border-radius: 5px; position: relative;">${result}</div></td></tr>`);
e.closest('tr').after(takeaway);
takeaway.find('div').append(close);
takeaway.find('a').click(() => takeaway.remove());
$('.load_img').remove();
};
$('a:contains(flag)').each((i, e) => {
let flag = $(e);
let url = flag.closest('tr').prev().find('.title a[href]').first().attr('href');
let comments = flag.closest('tr').find('a:contains(comments)').first().get(0)?.href;
if(!url) {
url = location.href;
}
let summary = $(`<a href="https://labs.kagi.com/ai/sum?url=${url}&expand=1" onclick="return false">summary</a>`);
summary.click(() => getSummary(url, summary, 'summary'));
flag.before(summary);
flag.before(" | ");
let takeaways = $(`<a href="https://labs.kagi.com/ai/sum?url=${url}&expand=1" onclick="return false">takeaways</a>`);
takeaways.click(() => getSummary(url, summary, 'takeaways'));
flag.before(takeaways);
flag.before(" | ");
if(comments) {
let hn = $(`<a href="https://labs.kagi.com/ai/sum?url=${url}&expand=1" onclick="return false">hn</a>`);
hn.click(() => getSummary(comments, summary, 'takeaways'));
flag.before(hn);
flag.before(" | ");
}
let last;
flag.closest('tr').find('a:contains(flag)').remove();
flag.closest('tr').find('a:contains(hide)').remove();
flag.closest('tr').find('a:contains(hours ago)').remove();
flag.closest('.subline').contents().filter(function() {
let prev = last === true;
last = (this.nodeType === 3) && ($(this).text().trim() === '|');
return prev && last;
}).remove();
});
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment