Introduce BlurHash,repair YouPlay,improve link previews feature,add debug mode,add lighttpd example config,bug fixes

This commit is contained in:
nipos 2019-06-06 19:13:53 +02:00
parent 9aa173a786
commit c9bc7ecb30
14 changed files with 295 additions and 77 deletions

View File

@ -27,6 +27,7 @@ We moved our instances list to our webpage: https://www.halcyon.social/instances
or read our new documentation pages to install it manually: https://www.halcyon.social/documentation.php?page=install or read our new documentation pages to install it manually: https://www.halcyon.social/documentation.php?page=install
## Blog ## Blog
- Release of Version 2.3.4 - Introduce BlurHash,repair YouPlay,improve link previews feature,add debug mode,add lighttpd example config,bug fixes
- Release of Version 2.3.3 - New media uploader,sort uploads,drag&drop and copy&paste uploads,fix automatic dark mode - Release of Version 2.3.3 - New media uploader,sort uploads,drag&drop and copy&paste uploads,fix automatic dark mode
- Release of Version 2.3.2 - Add block and mute management,add management for follow requests,add Catalan translation - Release of Version 2.3.2 - Add block and mute management,add management for follow requests,add Catalan translation
- Release of Version 2.3.1 - Fix duplicated thread,allow adding more toots as reply chain,add Dutch translation,more bugfixes,improved translations. - Release of Version 2.3.1 - Fix duplicated thread,allow adding more toots as reply chain,add Dutch translation,more bugfixes,improved translations.

View File

@ -577,6 +577,9 @@ border-top: 1px solid #E1E8ED;
.single_reply_status .status_preview .toot_entry .toot_footer,.report_stauts .status_preview .toot_entry .toot_footer { .single_reply_status .status_preview .toot_entry .toot_footer,.report_stauts .status_preview .toot_entry .toot_footer {
display: none!important; display: none!important;
} }
.single_reply_status .status_preview .toot_entry .link_preview,.report_stauts .status_preview .toot_entry .link_preview {
display: none!important;
}
.single_reply_status .status_form .status_bottom,.report_status .status_form .status_bottom { .single_reply_status .status_form .status_bottom,.report_status .status_form .status_bottom {
width: 100%; width: 100%;
margin-left: 0; margin-left: 0;
@ -993,6 +996,9 @@ position: absolute;
width: 100%; width: 100%;
height: 100%; height: 100%;
background-color: #000; background-color: #000;
background-size:cover;
background-position:center;
text-shadow: -1px 0 black, 0 1px black, 1px 0 black, 0 -1px black;
} }
.media_views.sensitive .sensitive_alart .text1 { .media_views.sensitive .sensitive_alart .text1 {
font-size: 26px; font-size: 26px;

View File

@ -64,6 +64,7 @@ getDropDown().removeClass('showDropDown').addClass('hideDropDown');
if(resultname) { if(resultname) {
if(resultname == "acct") { if(resultname == "acct") {
if(ele.display_name == "") ele.display_name = ele.username; if(ele.display_name == "") ele.display_name = ele.username;
ele.display_name = htmlEscape(ele.display_name);
for(var i=0;i<ele.emojis.length;i++) { for(var i=0;i<ele.emojis.length;i++) {
ele.display_name = ele.display_name.replace(new RegExp(":"+ele.emojis[i].shortcode+":","g"),"<img src='"+ele.emojis[i].url+"' class='emoji'>"); ele.display_name = ele.display_name.replace(new RegExp(":"+ele.emojis[i].shortcode+":","g"),"<img src='"+ele.emojis[i].url+"' class='emoji'>");
} }

129
assets/js/blurhash.js Normal file
View File

@ -0,0 +1,129 @@
(function($) {
var digitCharacters = [
"0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
"A", "B", "C", "D", "E", "F", "G", "H", "I", "J",
"K", "L", "M", "N", "O", "P", "Q", "R", "S", "T",
"U", "V", "W", "X", "Y", "Z", "a", "b", "c", "d",
"e", "f", "g", "h", "i", "j", "k", "l", "m", "n",
"o", "p", "q", "r", "s", "t", "u", "v", "w", "x",
"y", "z", "#", "$", "%", "*", "+", ",", "-", ".",
":", ";", "=", "?", "@", "[", "]", "^", "_", "{",
"|", "}", "~",
];
function decode83(str) {
var value = 0;
for (var i = 0; i < str.length; i++) {
var c = str[i];
var digit = digitCharacters.indexOf(c);
value = value * 83 + digit;
}
return value;
}
function sRGBToLinear(value) {
var v = value / 255;
if (v <= 0.04045) {
return v / 12.92;
}
else {
return Math.pow((v + 0.055) / 1.055, 2.4);
}
}
function linearTosRGB(value) {
var v = Math.max(0, Math.min(1, value));
if (v <= 0.0031308) {
return Math.round(v * 12.92 * 255 + 0.5);
}
else {
return Math.round((1.055 * Math.pow(v, 1 / 2.4) - 0.055) * 255 + 0.5);
}
}
function sign(n) {
return (n < 0 ? -1 : 1);
}
function signPow(val, exp) {
return sign(val) * Math.pow(Math.abs(val), exp);
}
function decodeDC(value) {
var intR = value >> 16;
var intG = (value >> 8) & 255;
var intB = value & 255;
return [sRGBToLinear(intR), sRGBToLinear(intG), sRGBToLinear(intB)];
}
function decodeAC(value, maximumValue) {
var quantR = Math.floor(value / (19 * 19));
var quantG = Math.floor(value / 19) % 19;
var quantB = value % 19;
var rgb = [
signPow((quantR - 9) / 9, 2.0) * maximumValue,
signPow((quantG - 9) / 9, 2.0) * maximumValue,
signPow((quantB - 9) / 9, 2.0) * maximumValue,
];
return rgb;
}
$.decode = function(blurhash,width,height,punch) {
punch = punch | 1;
if (blurhash.length < 6) {
console.error('too short blurhash');
return null;
}
var sizeFlag = decode83(blurhash[0]);
var numY = Math.floor(sizeFlag / 9) + 1;
var numX = (sizeFlag % 9) + 1;
var quantisedMaximumValue = decode83(blurhash[1]);
var maximumValue = (quantisedMaximumValue + 1) / 166;
if (blurhash.length !== 4 + 2 * numX * numY) {
console.error('blurhash length mismatch', blurhash.length, 4 + 2 * numX * numY);
return null;
}
var colors = new Array(numX * numY);
for (var i = 0; i < colors.length; i++) {
if (i === 0) {
var value = decode83(blurhash.substring(2, 6));
colors[i] = decodeDC(value);
}
else {
var value = decode83(blurhash.substring(4 + i * 2, 6 + i * 2));
colors[i] = decodeAC(value, maximumValue * punch);
}
}
var bytesPerRow = width * 4;
var pixels = new Uint8ClampedArray(bytesPerRow * height);
for (var y = 0; y < height; y++) {
for (var x = 0; x < width; x++) {
var r = 0;
var g = 0;
var b = 0;
for (var j = 0; j < numY; j++) {
for (var i = 0; i < numX; i++) {
var basis = Math.cos(Math.PI * x * i / width) * Math.cos(Math.PI * y * j / height);
var color = colors[i + j * numX];
r += color[0] * basis;
g += color[1] * basis;
b += color[2] * basis;
}
}
var intR = linearTosRGB(r);
var intG = linearTosRGB(g);
var intB = linearTosRGB(b);
pixels[4 * x + 0 + y * bytesPerRow] = intR;
pixels[4 * x + 1 + y * bytesPerRow] = intG;
pixels[4 * x + 2 + y * bytesPerRow] = intB;
pixels[4 * x + 3 + y * bytesPerRow] = 255;
}
}
return pixels;
}
})(jQuery);
function getBlurImage(hash) {
const pixels = $.decode(hash,32,32);
if(pixels) {
const canvas = document.createElement("canvas");
canvas.height = 32;
canvas.width = 32;
const ctx = canvas.getContext('2d');
const imagedata = new ImageData(pixels,32,32);
ctx.putImageData(imagedata,0,0);
return canvas.toDataURL();
}
else return false;
}

View File

@ -119,71 +119,6 @@ else if(ytbe) embedMedia("youtube",$(this).closest(".toot_article"),ytbe[2]);
else if(htbe) embedMedia("youtube",$(this).closest(".toot_article"),htbe[2]); else if(htbe) embedMedia("youtube",$(this).closest(".toot_article"),htbe[2]);
else if(vimeo) embedMedia("vimeo",$(this).closest(".toot_article"),vimeo[2]); else if(vimeo) embedMedia("vimeo",$(this).closest(".toot_article"),vimeo[2]);
else if(peertube) embedMedia("peertube",$(this).closest(".toot_article"),peertube[0].replace("/watch/","/embed/")); else if(peertube) embedMedia("peertube",$(this).closest(".toot_article"),peertube[0].replace("/watch/","/embed/"));
else if(localStorage.setting_link_previews == "true") {
if(!window.cards) {
cards = new Array();
}
if(!$(this).attr("class") && $(this).parent().parent().parent().parent().parent().attr("sid") != undefined) {
if(!cards[$(this).parent().parent().parent().parent().parent().attr("sid")]) {
var this_id = $(this).parent().parent().parent().parent().parent().attr("sid");
api.get("statuses/"+$(this).parent().parent().parent().parent().parent().attr("sid")+"/card",function(data) {
cards[this_id] = data;
if($(".toot_entry[sid="+this_id+"]").children().children("section").children("article").children(".link_preview").length == 0 && data.url) {
$(".toot_entry[sid="+this_id+"]").children().children("section").children("article").append(
$("<div>").addClass("media_views").addClass("link_preview").attr("sid",this_id).attr("media_length",1).css("height","unset").data("url",data.url).append(
$("<img>").attr("src",data.image).width(data.width).css("max-width","200px").css("float","left").css("margin-right","5px")).append(
$("<strong>").text(data.title)).append($("<br>")).append(
$("<span>").text(data.description)).append($("<br>")).append(
$("<span>").css("color","#777777").text(data.url)).click(function(e) {
e.stopPropagation();
window.open($(this).data("url"),"_blank");
})
);
}
if($(".main_status[sid="+this_id+"]").children().children("section").children("article").children(".link_preview").length == 0 && data.url) {
$(".main_status[sid="+this_id+"]").children().children("section").children("article").append(
$("<div>").addClass("media_views").addClass("link_preview").attr("sid",this_id).attr("media_length",1).css("height","unset").data("url",data.url).append(
$("<img>").attr("src",data.image).width(data.width).css("max-width","200px").css("float","left").css("margin-right","5px")).append(
$("<strong>").text(data.title)).append($("<br>")).append(
$("<span>").text(data.description)).append($("<br>")).append(
$("<span>").css("color","#777777").text(data.url)).click(function(e) {
e.stopPropagation();
window.open($(this).data("url"),"_blank");
})
);
}
});
}
else {
var this_id = $(this).parent().parent().parent().parent().parent().attr("sid");
data = cards[this_id];
if($(".toot_entry[sid="+this_id+"]").children().children("section").children("article").children(".link_preview").length == 0 && data.url) {
$(".toot_entry[sid="+this_id+"]").children().children("section").children("article").append(
$("<div>").addClass("media_views").addClass("link_preview").attr("sid",this_id).attr("media_length",1).css("height","unset").data("url",data.url).append(
$("<img>").attr("src",data.image).width(data.width).css("max-width","200px").css("float","left").css("margin-right","5px")).append(
$("<strong>").text(data.title)).append($("<br>")).append(
$("<span>").text(data.description)).append($("<br>")).append(
$("<span>").css("color","#777777").text(data.url)).click(function(e) {
e.stopPropagation();
window.open($(this).data("url"),"_blank");
})
);
}
if($(".main_status[sid="+this_id+"]").children().children("section").children("article").children(".link_preview").length == 0 && data.url) {
$(".main_status[sid="+this_id+"]").children().children("section").children("article").append(
$("<div>").addClass("media_views").addClass("link_preview").attr("sid",this_id).attr("media_length",1).css("height","unset").data("url",data.url).append(
$("<img>").attr("src",data.image).width(data.width).css("max-width","200px").css("float","left").css("margin-right","5px")).append(
$("<strong>").text(data.title)).append($("<br>")).append(
$("<span>").text(data.description)).append($("<br>")).append(
$("<span>").css("color","#777777").text(data.url)).click(function(e) {
e.stopPropagation();
window.open($(this).data("url"),"_blank");
})
);
}
}
}
}
}); });
} }
function getConversionedDate(key, value) { function getConversionedDate(key, value) {

View File

@ -2,6 +2,7 @@ function mediaattachments_template(status) {
let media_views = ""; let media_views = "";
var border = ""; var border = "";
var mvfullheight = ""; var mvfullheight = "";
var blurbackground = "";
var dsplength = status.media_attachments.length; var dsplength = status.media_attachments.length;
if(status.media_attachments[0].remote_url != null) { if(status.media_attachments[0].remote_url != null) {
status.media_attachments[0].url = status.media_attachments[0].remote_url; status.media_attachments[0].url = status.media_attachments[0].remote_url;
@ -18,8 +19,9 @@ else if(!status.sensitive || localStorage.setting_show_nsfw == "true") {
media_views = `<div class='media_views${mvfullheight}' sid="${status.id}" media_length='${dsplength}'${border}>`; media_views = `<div class='media_views${mvfullheight}' sid="${status.id}" media_length='${dsplength}'${border}>`;
} }
else { else {
if(status.media_attachments[0].blurhash) blurbackground = 'style="background-image:url('+getBlurImage(status.media_attachments[0].blurhash)+')"';
media_views = `<div class='media_views sensitive${mvfullheight}' media_length='${dsplength}'${border}> media_views = `<div class='media_views sensitive${mvfullheight}' media_length='${dsplength}'${border}>
<div class='sensitive_alart'> <div class='sensitive_alart'${blurbackground}>
<span class="text1">${__('Sensitive content')}</span> <span class="text1">${__('Sensitive content')}</span>
<span class="text2">${__('Click to view')}</span> <span class="text2">${__('Click to view')}</span>
</div>`; </div>`;
@ -82,6 +84,27 @@ media_views += "</div>";
} }
return media_views; return media_views;
} }
function link_preview_template(card) {
if(localStorage.setting_link_previews == "true") {
const ytcom = card.url.match(/https?:\/\/(www\.)?youtube\.com\/watch\?v=([a-zA-Z\d_-]+)/);
const htcom = card.url.match(/https?:\/\/(www\.)?hooktube\.com\/watch\?v=([a-zA-Z\d_-]+)/);
const ivcom = card.url.match(/https?:\/\/(www\.)?invidio\.us\/watch\?v=([a-zA-Z\d_-]+)/);
const ytbe = card.url.match(/https?:\/\/(www\.)?youtu\.be\/([a-zA-Z\d_-]+)/);
const htbe = card.url.match(/https?:\/\/(www\.)?hooktube\.com\/([a-zA-Z\d_-]+)/);
const vimeo = card.url.match(/https?:\/\/(www\.)?vimeo\.com\/([\d]+)/);
const peertube = card.url.match(/https?:\/\/.+..+\/videos\/watch\/([\da-z]{8}-[\da-z]{4}-[\da-z]{4}-[\da-z]{4}-[\da-z]{12})\/?$/);
if(((!ytcom && !htcom && !ivcom && !ytbe && !htbe) || (localStorage.setting_play_youplay == "false" && localStorage.setting_play_invidious == "false")) && (!vimeo || localStorage.setting_play_vimeo) && (!peertube || localStorage.setting_play_peertube)) {
let preview_html = (`<div class="media_views link_preview" media_length="1" style="height:unset" data-url="${card.url}">
<img src="${card.image}" style="width:${card.width};max-width:200px;float:left;margin-right:5px">
<strong>${card.title}</strong><br/>
<span>${card.description}</span><br/>
<span style="color:#777777">${card.url}</span>`);
return preview_html;
}
else return "";
}
else return "";
}
function poll_template(poll) { function poll_template(poll) {
let poll_html = ""; let poll_html = "";
var expires_at = new Date(new Date(poll.expires_at).getTime()-Date.now()); var expires_at = new Date(new Date(poll.expires_at).getTime()-Date.now());
@ -159,6 +182,7 @@ toot_reblogs_count= "",
toot_favourites_count = "", toot_favourites_count = "",
media_views = "", media_views = "",
poll_object = ""; poll_object = "";
preview_object = "";
if(status.spoiler_text && localStorage.setting_show_content_warning == "false") { if(status.spoiler_text && localStorage.setting_show_content_warning == "false") {
alart_text = "<span>"+status.spoiler_text+"</span><button class='cw_button'>"+__('SHOW MORE')+"</button>", alart_text = "<span>"+status.spoiler_text+"</span><button class='cw_button'>"+__('SHOW MORE')+"</button>",
article_option = "content_warning"; article_option = "content_warning";
@ -181,6 +205,9 @@ media_views = mediaattachments_template(status);
if(status.poll) { if(status.poll) {
poll_object = poll_template(status.poll); poll_object = poll_template(status.poll);
} }
if(status.card) {
preview_object = link_preview_template(status.card);
}
if(status.account.display_name.length == 0) { if(status.account.display_name.length == 0) {
status.account.display_name = status.account.username; status.account.display_name = status.account.username;
} }
@ -263,6 +290,7 @@ ${alart_text}
<span class="status_content emoji_poss"> <span class="status_content emoji_poss">
${status.content} ${status.content}
</span> </span>
${preview_object}
</article> </article>
<footer class="toot_footer"${toot_footer_width}> <footer class="toot_footer"${toot_footer_width}>
<div class="toot_reaction"> <div class="toot_reaction">
@ -326,6 +354,7 @@ toot_reblogs_count= "",
toot_favourites_count = "", toot_favourites_count = "",
media_views = "", media_views = "",
poll_object = ""; poll_object = "";
preview_object = "";
if(status.reblog.spoiler_text && localStorage.setting_show_content_warning == "false") { if(status.reblog.spoiler_text && localStorage.setting_show_content_warning == "false") {
alart_text = "<span>"+status.reblog.spoiler_text+"</span><button class='cw_button'>"+__('SHOW MORE')+"</button>", alart_text = "<span>"+status.reblog.spoiler_text+"</span><button class='cw_button'>"+__('SHOW MORE')+"</button>",
article_option = "content_warning"; article_option = "content_warning";
@ -348,6 +377,9 @@ media_views = mediaattachments_template(status.reblog);
if(status.reblog.poll) { if(status.reblog.poll) {
poll_object = poll_template(status.reblog.poll); poll_object = poll_template(status.reblog.poll);
} }
if(status.reblog.card) {
preview_object = link_preview_template(status.reblog.card);
}
if(status.account.display_name.length == 0) { if(status.account.display_name.length == 0) {
status.account.display_name = status.account.username; status.account.display_name = status.account.username;
} }
@ -423,6 +455,7 @@ ${alart_text}
<span class="status_content emoji_poss"> <span class="status_content emoji_poss">
${status.reblog.content} ${status.reblog.content}
</span> </span>
${preview_object}
</article> </article>
<footer class="toot_footer" style="width:320px"> <footer class="toot_footer" style="width:320px">
<div class="toot_reaction"> <div class="toot_reaction">
@ -487,6 +520,7 @@ toot_reblogs_count= "",
toot_favourites_count = "", toot_favourites_count = "",
media_views = "", media_views = "",
poll_object = ""; poll_object = "";
preview_object = "";
if(status.spoiler_text && localStorage.setting_show_content_warning == "false") { if(status.spoiler_text && localStorage.setting_show_content_warning == "false") {
alart_text = "<span>"+status.spoiler_text+"</span><button class='cw_button'>"+__('SHOW MORE')+"</button>", alart_text = "<span>"+status.spoiler_text+"</span><button class='cw_button'>"+__('SHOW MORE')+"</button>",
article_option = "content_warning"; article_option = "content_warning";
@ -509,6 +543,9 @@ media_views = mediaattachments_template(status);
if(status.poll) { if(status.poll) {
poll_object = poll_template(status.poll); poll_object = poll_template(status.poll);
} }
if(status.card) {
preview_object = link_preview_template(status.card);
}
if(status.account.display_name.length == 0) { if(status.account.display_name.length == 0) {
status.account.display_name = status.account.username; status.account.display_name = status.account.username;
} }
@ -574,6 +611,7 @@ ${alart_text}
<span class="status_content emoji_poss"> <span class="status_content emoji_poss">
${status.content} ${status.content}
</span> </span>
${preview_object}
</article> </article>
<footer class="toot_footer" style="width:320px"> <footer class="toot_footer" style="width:320px">
<div class="toot_reaction"> <div class="toot_reaction">
@ -739,6 +777,7 @@ toot_reblogs_count= "",
toot_favourites_count = "", toot_favourites_count = "",
media_views = "", media_views = "",
poll_object = ""; poll_object = "";
preview_object = "";
for(i=0;i<NotificationObj.status.emojis.length;i++) { for(i=0;i<NotificationObj.status.emojis.length;i++) {
NotificationObj.status.content = NotificationObj.status.content.replace(new RegExp(":"+NotificationObj.status.emojis[i].shortcode+":","g"),"<img src='"+NotificationObj.status.emojis[i].url+"' class='emoji'>"); NotificationObj.status.content = NotificationObj.status.content.replace(new RegExp(":"+NotificationObj.status.emojis[i].shortcode+":","g"),"<img src='"+NotificationObj.status.emojis[i].url+"' class='emoji'>");
} }
@ -778,6 +817,9 @@ media_views = mediaattachments_template(NotificationObj.status);
if(NotificationObj.status.poll) { if(NotificationObj.status.poll) {
poll_object = poll_template(NotificationObj.status.poll); poll_object = poll_template(NotificationObj.status.poll);
} }
if(NotificationObj.status.card) {
preview_object = link_preview_template(NotificationObj.status.card);
}
if(NotificationObj.status.account.display_name.length == 0) { if(NotificationObj.status.account.display_name.length == 0) {
NotificationObj.status.account.display_name = NotificationObj.status.account.username; NotificationObj.status.account.display_name = NotificationObj.status.account.username;
} }
@ -860,6 +902,7 @@ ${alart_text}
<span class="status_content emoji_poss"> <span class="status_content emoji_poss">
${NotificationObj.status.content} ${NotificationObj.status.content}
</span> </span>
${preview_object}
</article> </article>
<footer class="toot_footer"${toot_footer_width}> <footer class="toot_footer"${toot_footer_width}>
<div class="toot_reaction"> <div class="toot_reaction">
@ -900,6 +943,7 @@ toot_reblogs_count= "",
toot_favourites_count = "", toot_favourites_count = "",
media_views = "", media_views = "",
poll_object = ""; poll_object = "";
preview_object = "";
for(i=0;i<NotificationObj.status.emojis.length;i++) { for(i=0;i<NotificationObj.status.emojis.length;i++) {
NotificationObj.status.content = NotificationObj.status.content.replace(new RegExp(":"+NotificationObj.status.emojis[i].shortcode+":","g"),"<img src='"+NotificationObj.status.emojis[i].url+"' class='emoji'>"); NotificationObj.status.content = NotificationObj.status.content.replace(new RegExp(":"+NotificationObj.status.emojis[i].shortcode+":","g"),"<img src='"+NotificationObj.status.emojis[i].url+"' class='emoji'>");
} }
@ -939,6 +983,9 @@ media_views = mediaattachments_template(NotificationObj.status);
if(NotificationObj.status.poll) { if(NotificationObj.status.poll) {
poll_object = poll_template(NotificationObj.status.poll); poll_object = poll_template(NotificationObj.status.poll);
} }
if(NotificationObj.status.card) {
preview_object = link_preview_template(NotificationObj.status.card);
}
if(NotificationObj.status.account.display_name.length == 0) { if(NotificationObj.status.account.display_name.length == 0) {
NotificationObj.status.account.display_name = NotificationObj.status.account.username; NotificationObj.status.account.display_name = NotificationObj.status.account.username;
} }
@ -1027,6 +1074,7 @@ ${alart_text}
<span class="status_content emoji_poss"> <span class="status_content emoji_poss">
${NotificationObj.status.content} ${NotificationObj.status.content}
</span> </span>
${preview_object}
</article> </article>
<footer class="toot_footer"${toot_footer_width}> <footer class="toot_footer"${toot_footer_width}>
<div class="toot_reaction"> <div class="toot_reaction">
@ -1131,6 +1179,7 @@ toot_reblogs_count= "",
toot_favourites_count = "", toot_favourites_count = "",
media_views = "", media_views = "",
poll_object = ""; poll_object = "";
preview_object = "";
for(i=0;i<status.emojis.length;i++) { for(i=0;i<status.emojis.length;i++) {
status.content = status.content.replace(new RegExp(":"+status.emojis[i].shortcode+":","g"),"<img src='"+status.emojis[i].url+"' class='emoji'>"); status.content = status.content.replace(new RegExp(":"+status.emojis[i].shortcode+":","g"),"<img src='"+status.emojis[i].url+"' class='emoji'>");
} }
@ -1170,6 +1219,9 @@ media_views = mediaattachments_template(status);
if(status.poll) { if(status.poll) {
poll_object = poll_template(status.poll); poll_object = poll_template(status.poll);
} }
if(status.card) {
preview_object = link_preview_template(status.card);
}
if(status.account.display_name.length == 0) { if(status.account.display_name.length == 0) {
status.account.display_name = status.account.username; status.account.display_name = status.account.username;
} }
@ -1251,6 +1303,7 @@ ${alart_text}
<span class="status_content emoji_poss"> <span class="status_content emoji_poss">
${status.content} ${status.content}
</span> </span>
${preview_object}
</article> </article>
<time datetime="${status_attr_datetime}">${status_datetime}</time> <time datetime="${status_attr_datetime}">${status_datetime}</time>
</section> </section>
@ -1390,6 +1443,7 @@ toot_reblogs_count= "",
toot_favourites_count = "", toot_favourites_count = "",
media_views = "", media_views = "",
poll_object = ""; poll_object = "";
preview_object = "";
for(i=0;i<status.reblog.emojis.length;i++) { for(i=0;i<status.reblog.emojis.length;i++) {
status.reblog.content = status.reblog.content.replace(new RegExp(":"+status.reblog.emojis[i].shortcode+":","g"),"<img src='"+status.reblog.emojis[i].url+"' class='emoji'>"); status.reblog.content = status.reblog.content.replace(new RegExp(":"+status.reblog.emojis[i].shortcode+":","g"),"<img src='"+status.reblog.emojis[i].url+"' class='emoji'>");
} }
@ -1433,6 +1487,9 @@ media_views = mediaattachments_template(status.reblog);
if(status.reblog.poll) { if(status.reblog.poll) {
poll_object = poll_template(status.reblog.poll); poll_object = poll_template(status.reblog.poll);
} }
if(status.reblog.card) {
preview_object = link_preview_template(status.reblog.card);
}
if(status.account.display_name.length == 0) { if(status.account.display_name.length == 0) {
status.account.display_name = status.account.username; status.account.display_name = status.account.username;
} }
@ -1500,6 +1557,7 @@ ${alart_text}
<span class="status_content emoji_poss"> <span class="status_content emoji_poss">
${status.reblog.content} ${status.reblog.content}
</span> </span>
${preview_object}
</article> </article>
<time datetime="${status_attr_datetime}">${status_datetime}</time> <time datetime="${status_attr_datetime}">${status_datetime}</time>
</section> </section>

View File

@ -1007,12 +1007,22 @@ replace_emoji();
} }
function setRecentImages(mid) { function setRecentImages(mid) {
api.get("accounts/"+mid+"/statuses", [{name:'only_media',data:'true'},{name:'limit',data:'6'}], function(statuses) { api.get("accounts/"+mid+"/statuses", [{name:'only_media',data:'true'},{name:'limit',data:'6'}], function(statuses) {
if ( statuses.length ) { if (statuses.length) {
$('#js_profile_recent_images span').text(`${statuses[0].account.statuses_count} ${__('Photos and toots')}`); $('#js_profile_recent_images span').text(`${statuses[0].account.statuses_count} ${__('Photos and toots')}`);
$('#js_profile_recent_images a').attr('href', $("#media_link").attr('href')); $('#js_profile_recent_images a').attr('href', $("#media_link").attr('href'));
for ( i in statuses ) { for (i in statuses) {
$(`<div class="profile_recent_images_item media_attachment" otype="image" sid="${statuses[i].id}" url="${statuses[i].media_attachments[0].preview_url}"> if(statuses[i].sensitive) {
<img src="${statuses[i].media_attachments[0].preview_url}" /> if(statuses[i].media_attachments[0].blurhash) var imgurl = getBlurImage(statuses[i].media_attachments[0].blurhash);
else var imgurl = "https://"+current_instance+"/avatars/original/missing.png";
}
else {
if(statuses[i].media_attachments[0].remote_url != null) statuses[i].media_attachments[0].url = statuses[i].media_attachments[0].remote_url;
if(statuses[i].media_attachments[0].type == "image") var imgurl = statuses[i].media_attachments[0].url;
else if(statuses[i].media_attachments[0].type == "video" || statuses[i].media_attachments[0].type == "gifv") var imgurl = statuses[i].media_attachments[0].preview_url;
else var imgurl = "https://"+current_instance+"/avatars/original/missing.png";
}
$(`<div class="profile_recent_images_item media_attachment" otype="image" sid="${statuses[i].id}" oid="${statuses[i].media_attachments[0].id}" url="${imgurl}" mediacount="0">
<img src="${imgurl}">
</div>`).appendTo('#js_profile_recent_images_box'); </div>`).appendTo('#js_profile_recent_images_box');
}; };
} }
@ -2009,6 +2019,10 @@ $(".poll_"+poll_id).remove();
} }
return false; return false;
}); });
$(document).on('click','.link_preview',function(e) {
e.stopPropagation();
window.open($(this).data("url"),"_blank");
});
$(document).on('focus','.status_textarea textarea,.status_top .status_spoiler',function(e) { $(document).on('focus','.status_textarea textarea,.status_top .status_spoiler',function(e) {
global_focus_textfield = $(this).data("random"); global_focus_textfield = $(this).data("random");
$(".status_textarea textarea").change(); $(".status_textarea textarea").change();

View File

@ -4,6 +4,7 @@ api_client_name = Your application name
api_client_website = https://example.com/ api_client_website = https://example.com/
who_to_follow_provider = https://vinayaka.distsn.org/cgi-bin/vinayaka-user-match-osa-api.cgi?{{host}}+{{user}} who_to_follow_provider = https://vinayaka.distsn.org/cgi-bin/vinayaka-user-match-osa-api.cgi?{{host}}+{{user}}
default_language = en_US default_language = en_US
debug_mode = false
; Media embed settings ; Media embed settings
; YouPlay resolves YouTube MP4s on your server and sends this link to the user for privacy-friendly watching ; YouPlay resolves YouTube MP4s on your server and sends this link to the user for privacy-friendly watching

View File

@ -1,6 +1,4 @@
<?php <?php
ini_set('display_errors', 1);
error_reporting(E_ALL);
include("language.php"); include("language.php");
?> ?>
<!DOCTYPE HTML> <!DOCTYPE HTML>
@ -33,6 +31,7 @@ document.write('<link rel="stylesheet" href="/assets/css/dark.css" media="all">'
<script src="/assets/js/autocomplete/textarea.js"></script> <script src="/assets/js/autocomplete/textarea.js"></script>
<script src="/assets/js/shortcut.js"></script> <script src="/assets/js/shortcut.js"></script>
<script src="/assets/js/replace_emoji.js"></script> <script src="/assets/js/replace_emoji.js"></script>
<script src="/assets/js/blurhash.js"></script>
<script src="/assets/js/emojipicker/emojidata.js"></script> <script src="/assets/js/emojipicker/emojidata.js"></script>
<script src="/assets/js/emojipicker/emojipicker.js"></script> <script src="/assets/js/emojipicker/emojipicker.js"></script>
<script src="/assets/js/halcyon/halcyonTemplates.js"></script> <script src="/assets/js/halcyon/halcyonTemplates.js"></script>

View File

@ -1,5 +1,9 @@
<?php <?php
$config = parse_ini_file(__DIR__.'/config/config.ini',true); $config = parse_ini_file(__DIR__.'/config/config.ini',true);
if($config["App"]["debug_mode"]) {
ini_set('display_errors',1);
error_reporting(E_ALL);
}
$locale = ''; $locale = '';
if(isset($_COOKIE['language'])) $locale = $_COOKIE['language']; if(isset($_COOKIE['language'])) $locale = $_COOKIE['language'];
else if(isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) { else if(isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {

70
lighttpd.conf Normal file
View File

@ -0,0 +1,70 @@
server.port = 443
server.username = "http"
server.groupname = "http"
server.document-root = "/srv/http"
server.errorlog = "/var/log/lighttpd/error.log"
server.modules = ( "mod_fastcgi", "mod_compress", "mod_rewrite", "mod_openssl" )
dir-listing.activate = "disable"
ssl.engine = "enable"
ssl.pemfile = "/etc/lighttpd/halcyon.pem"
index-file.names = ( "index.html", "index.php" )
mimetype.assign = (
".txt" => "text/plain",
".html" => "text/html",
".htm" => "text/html",
".css" => "text/css",
".js" => "application/x-javascript",
".jpg" => "image/jpeg",
".jpeg" => "image/jpeg",
".gif" => "image/gif",
".png" => "image/png",
".svg" => "image/svg+xml",
"" => "application/octet-stream"
)
fastcgi.server = ( ".php" => ((
"bin-path" => "/usr/bin/php-cgi",
"socket" => "/tmp/php.socket"
)))
compress.allowed-encodings = ("bzip2", "gzip", "deflate")
compress.filetype = ("application/x-javascript", "application/javascript", "text/javascript", "text/x-js", "text/css", "text/html", "text/plain")
$HTTP["host"] == "halcyon.example.com" {
server.document-root = "/srv/http/halcyon"
url.rewrite = (
"^/home/?$" => "/",
"^/login/?$" => "/login/login.php",
"^/auth\/?(\?.*)/?$" => "/login/auth.php$1",
"^/logout/?$" => "/login/logout.php",
"^/terms/?$" => "/login/terms.php",
"^/privacy/?$" => "/login/privacy.php",
"^/imprint/?$" => "/login/imprint.php",
"^/local/?$" => "/local.php",
"^/federated/?$" => "/federated.php",
"^/notifications/?$" => "/notifications.php",
"^/whotofollow/?$" => "/who_to_follow.php",
"^/direct/?$" => "/direct.php",
"^/instance/?$" => "/instance.php",
"^/lists/?$" => "/lists.php",
"^/lists/(\d+)/?$" => "/lists_view.php?id=$1",
"^/lists/(\d+)/add/?$" => "/lists_add.php?id=$1",
"^/search\/?(\?.*)/?$" => "/search_hash_tag.php$1",
"^/search/users\/?(\?.*)/?$" => "/search_user.php$1",
"^/settings/?$" => "/settings_general.php",
"^/settings/profile/?$" => "/settings_profile.php",
"^/settings/appearance/?$" => "/settings_appearance.php",
"^/settings/filters/?$" => "/settings_filters.php",
"^/settings/media/?$" => "/settings_media.php",
"^/settings/followers/?$" => "/settings_accounts.php",
"^/settings/mutes/?$" => "/settings_accounts.php",
"^/settings/blocks/?$" => "/settings_accounts.php",
"^/@(.+)@(.+)\.([a-z]+)/status/(.+?)\/?\??(.*)/?$" => "/user.php?user=@$1@$2\.$3&status=$4&$5",
"^/@(.+)@(.+)\.([a-z]+)/media\/?\??(.*)/?$" => "/user_only_media.php?user=@$1@$2\.$3&$4",
"^/@(.+)@(.+)\.([a-z]+)/with_replies\/?\??(.*)/?$" => "/user_include_replies.php?user=@$1@$2\.$3&$4",
"^/@(.+)@(.+)\.([a-z]+)/followers\/?\??(.*)/?$" => "/user_followers.php?user=@$1@$2\.$3&$4",
"^/@(.+)@(.+)\.([a-z]+)/following\/?\??(.*)/?$" => "/user_following.php?user=@$1@$2\.$3&$4",
"^/@(.+)@(.+)\.([a-z]+)/favourites\/?\??(.*)/?$" => "/user_favorite.php?user=@$1@$2\.$3&$4",
"^/@(.+)@(.+)\.([a-z]+)\/?\??(.*)/?$" => "/user.php?user=@$1@$2\.$3&$4",
"^/avatars/original/missing.png$" => "/assets/images/missing.png",
"^/headers/original/missing.png$" => "/assets/images/missing_header.png",
"^/404/?$" => "/404.php"
)
}

View File

@ -1,4 +1,5 @@
<?php <?php
include("../language.php");
require_once('../authorize/mastodon.php'); require_once('../authorize/mastodon.php');
use HalcyonSuite\HalcyonForMastodon\Mastodon; use HalcyonSuite\HalcyonForMastodon\Mastodon;
if (isset($_POST['acct'])) { if (isset($_POST['acct'])) {
@ -20,7 +21,6 @@ die();
} }
} }
} }
include("../language.php");
?> ?>
<!DOCTYPE HTML> <!DOCTYPE HTML>
<html lang="en"> <html lang="en">

View File

@ -106,7 +106,7 @@ $query = http_build_query(array(
'authuser' => '1', 'authuser' => '1',
'video_id' => $videoID, 'video_id' => $videoID,
)); ));
if($this->is_Ok($videoData = $this->curlGet("http://www.youtube.com/get_video_info?{$query}"))) { if($this->is_Ok($videoData = $this->curlGet("https://www.youtube.com/get_video_info?{$query}"))) {
parse_str($videoData, $videoData); parse_str($videoData, $videoData);
break; break;
} }
@ -128,7 +128,7 @@ $thumbdata = explode("#",$thumbparts[$thumbnum]);
$vInfo['Title'] = $videoData['title']; $vInfo['Title'] = $videoData['title'];
$vInfo['ChannelName'] = $videoData['author']; $vInfo['ChannelName'] = $videoData['author'];
$vInfo['ChannelId'] = $videoData['ucid']; $vInfo['ChannelId'] = $videoData['ucid'];
$vInfo['Thumbnail'] = str_replace('default', 'maxresdefault', $videoData['thumbnail_url']); $vInfo['Thumbnail'] = $playerData->videoDetails->thumbnail->thumbnails[count($playerData->videoDetails->thumbnail->thumbnails)-1]->url;
$vInfo['Duration'] = $videoData['length_seconds']; $vInfo['Duration'] = $videoData['length_seconds'];
$vInfo['Rating'] = $playerData->videoDetails->averageRating; $vInfo['Rating'] = $playerData->videoDetails->averageRating;
$vInfo['Captions'] = $captions; $vInfo['Captions'] = $captions;
@ -183,7 +183,7 @@ protected function curlGet($url) {
if(in_array('curl', get_loaded_extensions())){ if(in_array('curl', get_loaded_extensions())){
$appSettings = parse_ini_file('../config/config.ini',true); $appSettings = parse_ini_file('../config/config.ini',true);
$ch = curl_init($url); $ch = curl_init($url);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (X11; Linux x86_64; rv:62.0) Gecko/20100101 Firefox/62.0'); curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (X11; Linux x86_64; rv:66.0) Gecko/20100101 Firefox/66.0');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_HEADER, 0);
//curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4); //curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);

View File

@ -1 +1 @@
2.3.3 2.3.4