Added new media players with support for audio and third party services

This commit is contained in:
nipos 2019-01-13 19:02:16 +01:00
parent d9648da624
commit 19379369a3
31 changed files with 1873 additions and 65 deletions

View File

@ -57,6 +57,7 @@ RewriteRule ^settings/?$ settings_general\.php [NC,L]
RewriteRule ^settings/profile/?$ settings_profile\.php [NC,L]
RewriteRule ^settings/appearance/?$ settings_appearance\.php [NC,L]
RewriteRule ^settings/filters/?$ settings_filters\.php [NC,L]
RewriteRule ^settings/media/?$ settings_media\.php [NC,L]
# User
RewriteBase /

View File

@ -125,6 +125,10 @@ halcyon.domain.tld {
r ^/settings/filters/?$
to /settings_filters.php
}
rewrite {
r ^/settings/media/?$
to /settings_media.php
}
# End settings
# Begin user

View File

@ -18,13 +18,15 @@ We moved our instances list to a wiki page: https://notabug.org/halcyon-suite/ha
- Twitter like UI, familiar interface.
- Able to use on all instances.
- No tracking, No ads.
- Supports multiple languages
- Supports multiple languages.
- Privacy-friendly video embeds.
## Install
[![Install Halcyon with YunoHost](https://install-app.yunohost.org/install-with-yunohost.png)](https://install-app.yunohost.org/?app=halcyon)
or read our new wiki pages to install it manually: https://notabug.org/halcyon-suite/halcyon/wiki
## Blog
- Release of Version 2.2.0 - Blog article coming soon
- Release of Version 2.1.6 - Added search suggestions,fixed autocomplete bug,added instance info page,fixed small bug in profile settings,search for posts now supported
- Release of Version 2.1.5 - Added support for filter,added possibility to filter all bots,it's now easier to detect bots
- Release of Version 2.1.4 - Added custom profile fields,verified links,custom profile link settings and improved regular expressions for links
@ -63,3 +65,5 @@ or read our new wiki pages to install it manually: https://notabug.org/halcyon-s
- [LascauxSRL/lsx-emojipicker](https://github.com/LascauxSRL/lsx-emojipicker)
- [osapon/Pomo](https://github.com/osapon/Pomo)
- [Summer-Dong/auto-complete-for-text-input-box](https://github.com/Summer-Dong/auto-complete-for-text-input-box)
- [youplay/yp-player](https://notabug.org/youplay/yp-player)
- [speranskydanil/Simple-Audio-Player](https://github.com/speranskydanil/Simple-Audio-Player)

View File

@ -612,3 +612,22 @@ color:#FFF !important;
.instance_field {
border:1px solid #000000;
}
.player {
border: 1px solid #000000;
color: #FFF;
}
.player .progress {
background: rgb(101, 119, 134);
}
.player .loaded {
background: #76BFEC;
}
.player .progress .pointer {
background: #189EFC;
}
.player .volume {
background: rgb(101, 119, 134);
}
.player .volume .pointer {
background: #189EFC;
}

View File

@ -2684,3 +2684,92 @@ border-radius:5px;
padding-top:34px;
padding-bottom:35px;
}
.player,
.player * {
overflow: visible;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.player {
width: 100%;
height: 33px;
margin: 0px 0px 10px 0px;
padding: 5px 15px;
border: 1px solid #DCDFE1;
font-size: 14px;
line-height: 21px;
color: #333;
-webkit-border-radius: 5px;
-moz-border-radius: 5px;
border-radius: 5px;
}
.player > div {
float: left;
margin-right: 10px;
}
.player .play {
width: 21px;
height: 21px;
font-size: 1.5em;
}
.player .time-left {
width: 50px;
height: 21px;
text-align: center;
}
.player .time-right {
width: 50px;
height: 21px;
text-align: center;
}
.player .progress {
width: calc(100% - 252px);
height: 9px;
margin-top: 6px;
background: #AAB8C2;
border-radius:9px;
}
.player .loaded {
width: 0px;
height: 9px;
border-radius:9px;
background: rgb(101, 119, 134);
}
.player .progress .pointer {
width: 15px;
height: 15px;
margin: -12px 0px 0px -3px;
background: #189EFC;
-webkit-border-radius: 50%;
-moz-border-radius: 50%;
border-radius: 50%;
}
.player .mute {
width: 21px;
height: 21px;
font-size: 1.5em;
}
.player .volume {
width: 60px;
height: 9px;
margin-top:6px;
margin-right: 0px;
background: #AAB8C2;
border-radius:9px;
}
.player .volume .pointer {
width: 15px;
height: 15px;
margin: -3px 0px 0px 27px;
background: #189EFC;
-webkit-border-radius: 50%;
-moz-border-radius: 50%;
border-radius: 50%;
}

View File

@ -39,39 +39,39 @@ $(".h-card > a").each(function(i) {
$(this).attr('href',getRelativeURL($(this).attr('href')));
});
$(".toot_article a,.profile_bio a,.follows_profile_bio a").each(function(i) {
const pltags = $(this).attr('href').match(/https:\/\/.+..+\/tag\/([a-zA-Z\d_%]+)\/?$/);
if(pltags) {
$(this).attr('target','_self').attr('href','/search?q='+pltags[1]);
}
const mstags = $(this).attr('href').match(/https:\/\/.+..+\/tags\/([a-zA-Z\d_%]+)\/?$/);
if(mstags) {
$(this).attr('target','_self').attr('href','/search?q='+mstags[1]);
}
const plusers = $(this).attr('href').match(/https:\/\/.+..+\/users\/([a-zA-Z\d_]+)(\/statuses\/\d+)\/?$/);
if(plusers) {
$(this).attr('target','_self').attr('href','/@'+plusers[1]+'@'+$(this).attr('href').split("/")[2]);
}
const msusers = $(this).attr('href').match(/https:\/\/.+..+\/@([a-zA-Z\d_]+)\/?$/);
if(msusers) {
$(this).attr('target','_self').attr('href','/@'+msusers[1]+'@'+$(this).attr('href').split("/")[2]);
}
const msstatus = $(this).attr('href').match(/https:\/\/.+..+\/@([a-zA-Z\d_]+)(\/\d+)\/?$/);
if(msstatus) {
$(this).attr('target','_self').attr('href',"javascript:openStatus('"+msstatus[0]+"');void(0)");
}
const msstatus2 = $(this).attr('href').match(/https:\/\/.+..+\/users\/([a-zA-Z\d_]+)\/?$/);
if(msstatus2) {
$(this).attr('target','_self').attr('href',"javascript:openStatus('"+msstatus2[0]+"');void(0)");
}
const gsstatus = $(this).attr('href').match(/https:\/\/.+..+\/notice\/(\d+)\/?$/);
if(gsstatus) {
$(this).attr('target','_self').attr('href',"javascript:openStatus('"+gsstatus[0]+"');void(0)");
}
const plstatus = $(this).attr('href').match(/https:\/\/.+..+\/objects\/([\da-z]{8}-[\da-z]{4}-[\da-z]{4}-[\da-z]{4}-[\da-z]{12})\/?$/);
if(plstatus) {
$(this).attr('target','_self').attr('href',"javascript:openStatus('"+plstatus[0]+"');void(0)");
}
if(localStorage.setting_link_previews == "true") {
const pltags = $(this).attr('href').match(/https?:\/\/.+..+\/tag\/([a-zA-Z\d_%]+)\/?$/);
if(pltags) $(this).attr('target','_self').attr('href','/search?q='+pltags[1]);
const mstags = $(this).attr('href').match(/https?:\/\/.+..+\/tags\/([a-zA-Z\d_%]+)\/?$/);
if(mstags) $(this).attr('target','_self').attr('href','/search?q='+mstags[1]);
const plusers = $(this).attr('href').match(/https?:\/\/.+..+\/users\/([a-zA-Z\d_]+)(\/statuses\/\d+)\/?$/);
if(plusers) $(this).attr('target','_self').attr('href','/@'+plusers[1]+'@'+$(this).attr('href').split("/")[2]);
const msusers = $(this).attr('href').match(/https?:\/\/.+..+\/@([a-zA-Z\d_]+)\/?$/);
if(msusers) $(this).attr('target','_self').attr('href','/@'+msusers[1]+'@'+$(this).attr('href').split("/")[2]);
const msstatus = $(this).attr('href').match(/https?:\/\/.+..+\/@([a-zA-Z\d_]+)(\/\d+)\/?$/);
if(msstatus) $(this).attr('target','_self').attr('href',"javascript:openStatus('"+msstatus[0]+"');void(0)");
const msstatus2 = $(this).attr('href').match(/https?:\/\/.+..+\/users\/([a-zA-Z\d_]+)\/?$/);
if(msstatus2) $(this).attr('target','_self').attr('href',"javascript:openStatus('"+msstatus2[0]+"');void(0)");
const gsstatus = $(this).attr('href').match(/https?:\/\/.+..+\/notice\/(\d+)\/?$/);
if(gsstatus) $(this).attr('target','_self').attr('href',"javascript:openStatus('"+gsstatus[0]+"');void(0)");
const plstatus = $(this).attr('href').match(/https?:\/\/.+..+\/objects\/([\da-z]{8}-[\da-z]{4}-[\da-z]{4}-[\da-z]{4}-[\da-z]{12})\/?$/);
if(plstatus) $(this).attr('target','_self').attr('href',"javascript:openStatus('"+plstatus[0]+"');void(0)");
});
$(".toot_article a").each(function(i) {
const ytcom = $(this).attr('href').match(/https?:\/\/(www\.)?youtube\.com\/watch\?v=([a-zA-Z\d_-]+)/);
const htcom = $(this).attr('href').match(/https?:\/\/(www\.)?hooktube\.com\/watch\?v=([a-zA-Z\d_-]+)/);
const ivcom = $(this).attr('href').match(/https?:\/\/(www\.)?invidio\.us\/watch\?v=([a-zA-Z\d_-]+)/);
const ytbe = $(this).attr('href').match(/https?:\/\/(www\.)?youtu\.be\/([a-zA-Z\d_-]+)/);
const htbe = $(this).attr('href').match(/https?:\/\/(www\.)?hooktube\.com\/([a-zA-Z\d_-]+)/);
const vimeo = $(this).attr('href').match(/https?:\/\/(www\.)?vimeo\.com\/([\d]+)/);
const peertube = $(this).attr('href').match(/https?:\/\/.+..+\/videos\/watch\/([\da-z]{8}-[\da-z]{4}-[\da-z]{4}-[\da-z]{4}-[\da-z]{12})\/?$/);
if(ytcom) embedMedia("youtube",$(this).closest(".toot_article"),ytcom[2]);
else if(htcom) embedMedia("youtube",$(this).closest(".toot_article"),htcom[2]);
else if(ivcom) embedMedia("youtube",$(this).closest(".toot_article"),ivcom[2]);
else if(ytbe) embedMedia("youtube",$(this).closest(".toot_article"),ytbe[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(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();
}
@ -476,3 +476,34 @@ window.location.href = "/404";
}
});
}
function embedMedia(source,element,watchid) {
if(element.children(".media_views").length == 0) {
let media_views = `<div class='media_views' sid="${element.parent().parent().parent().attr("sid")}" media_length='1' style="border:0;border-radius:0">`;
if(source == "youtube" && server_setting_youplay == true && localStorage.setting_play_youplay == "true") {
media_views += (`
<div class="media_attachment" otype="video/gifv" mediacount="0">
<iframe src="/media/youplay.php?id=${watchid}" frameborder="0" allowfullscreen></iframe>
</div>`);
}
else if( source == "youtube" && localStorage.setting_play_invidious == "true") {
media_views += (`
<div class="media_attachment" otype="video/gifv" mediacount="0">
<iframe src="https://www.invidio.us/embed/${watchid}" frameborder="0" allowfullscreen></iframe>
</div>`);
}
else if(source == "vimeo" && server_setting_vimeo == true && localStorage.setting_play_vimeo == "true") {
media_views += (`
<div class="media_attachment" otype="video/gifv" mediacount="0">
<iframe src="/media/vimeo.php?id=${watchid}" frameborder="0" allowfullscreen></iframe>
</div>`);
}
else if(source == "peertube" && localStorage.setting_play_peertube == "true") {
media_views += (`
<div class="media_attachment" otype="video/gifv" mediacount="0">
<iframe src="${watchid}" frameborder="0" allowfullscreen></iframe>
</div>`);
}
media_views += "</div>";
if($(media_views).children().length != 0) element.append(media_views);
}
}

View File

@ -365,6 +365,102 @@ $(document).ready(function() {
loadfilters();
});
}
else if(window.location.pathname == "/settings/media") {
$('#js-settings_nav_media').toggleClass('view');
$(function() {
if(localStorage.setting_play_gif == "true") {
$("#setting_play_gif")[0].checked = true;
}
if(localStorage.setting_play_video == "true") {
$("#setting_play_video")[0].checked = true;
}
if(localStorage.setting_play_audio == "true") {
$("#setting_play_audio")[0].checked = true;
}
if(localStorage.setting_play_peertube == "true") {
$("#setting_play_peertube")[0].checked = true;
}
if(localStorage.setting_play_youplay == "true" && $("#settings_play_youplay").length == 1) {
$("#setting_play_youplay")[0].checked = true;
}
if(localStorage.setting_play_invidious == "true" && $("#settings_play_invidious").length == 1) {
$("#setting_play_invidious")[0].checked = true;
}
if(localStorage.setting_play_vimeo == "true" && $("#settings_play_vimeo").length == 1) {
$("#setting_play_vimeo")[0].checked = true;
}
});
$("#setting_play_gif").change(function() {
if(this.checked) {
localStorage.setItem("setting_play_gif","true");
putMessage(__("Gif animations enabled"));
}
else {
localStorage.setItem("setting_play_gif","false");
putMessage(__("Gif animations disabled"));
}
});
$("#setting_play_video").change(function() {
if(this.checked) {
localStorage.setItem("setting_play_video","true");
putMessage(__("Video player enabled"));
}
else {
localStorage.setItem("setting_play_video","false");
putMessage(__("Video player disabled"));
}
});
$("#setting_play_audio").change(function() {
if(this.checked) {
localStorage.setItem("setting_play_audio","true");
putMessage(__("Audio player enabled"));
}
else {
localStorage.setItem("setting_play_audio","false");
putMessage(__("Audio player disabled"));
}
});
$("#setting_play_peertube").change(function() {
if(this.checked) {
localStorage.setItem("setting_play_peertube","true");
putMessage(__("PeerTube embeds enabled"));
}
else {
localStorage.setItem("setting_play_peertube","false");
putMessage(__("PeerTube embeds disabled"));
}
});
$("#setting_play_youplay").change(function() {
if(this.checked) {
localStorage.setItem("setting_play_youplay","true");
putMessage(__("YouPlay embeds enabled"));
}
else {
localStorage.setItem("setting_play_youplay","false");
putMessage(__("YouPlay embeds disabled"));
}
});
$("#setting_play_invidious").change(function() {
if(this.checked) {
localStorage.setItem("setting_play_invidious","true");
putMessage(__("Invidio.us embeds enabled"));
}
else {
localStorage.setItem("setting_play_invidious","false");
putMessage(__("Invidio.us embeds disabled"));
}
});
$("#setting_play_vimeo").change(function() {
if(this.checked) {
localStorage.setItem("setting_play_vimeo","true");
putMessage(__("Vimeo embeds enabled"));
}
else {
localStorage.setItem("setting_play_vimeo","false");
putMessage(__("Vimeo embeds disabled"));
}
});
}
function selectbox($this) {
var $this = $($this);
var numberOfOptions = $this.children('option').length;

View File

@ -1,26 +1,46 @@
function mediaattachments_template(status) {
let media_views = "";
var border = "";
if(status.media_attachments[0].remote_url != null) {
status.media_attachments[0].url = status.media_attachments[0].remote_url;
}
if(status.media_attachments[0].type === "video" && localStorage.setting_play_video != "false") border = ' style="border:0;border-radius:0"';
if(status.media_attachments[0].url === "/files/original/missing.png") {
return "";
}
else if(!status.sensitive || localStorage.setting_show_nsfw == "true") {
media_views = `<div class='media_views' sid="${status.id}" media_length='${status.media_attachments.length}'>`;
media_views = `<div class='media_views' sid="${status.id}" media_length='${status.media_attachments.length}'${border}>`;
}
else {
media_views = `<div class='media_views sensitive' media_length='${status.media_attachments.length}'>
media_views = `<div class='media_views sensitive' media_length='${status.media_attachments.length}'${border}>
<div class='sensitive_alart'>
<span class="text1">${__('Sensitive content')}</span>
<span class="text2">${__('Click to view')}</span>
</div>`;
}
if ( status.media_attachments[0].type === "video" | status.media_attachments[0].type === "gifv" ) {
if((status.media_attachments[0].type === "video" && localStorage.setting_play_video == "false") || (status.media_attachments[0].type === "gifv" && localStorage.setting_play_gif == "false")) {
media_views += (`
<div class="media_attachment" otype="image" sid="${status.id}" oid="${status.media_attachments[0].id}" url="${status.media_attachments[0].preview_url}" mediacount="0">
<img src="${status.media_attachments[0].preview_url}" window_view="enable" />
</div>`);
} else if(status.media_attachments[0].type === "video") {
media_views += (`
<div class="media_attachment" otype="video/gifv" mediacount="0">
<video src="${status.media_attachments[0].url}" frameborder="0" allowfullscreen autoplay loop muted></video>
<iframe src="/media/video.php?url=${encodeURIComponent(status.media_attachments[0].url)}&preview=${encodeURIComponent(status.media_attachments[0].preview_url)}" frameborder="0" allowfullscreen></iframe>
</div>`);
} else if(status.media_attachments[0].type === "gifv") {
media_views += (`
<div class="media_attachment" otype="video/gifv" mediacount="0">
<video frameborder="0" autoplay loop muted>
<source src="${status.media_attachments[0].url}">
<img src="${status.media_attachments[0].preview_url}">
</video>
</div>`);
} else if(status.media_attachments[0].type === "audio" || (status.media_attachments[0].type === "unknown" && status.media_attachments[0].url.substring(status.media_attachments[0].url.length-4) == ".mp3")) {
if(localStorage.setting_play_audio != "false") {
media_views = $("<div>").addClass("player");
media_views.player(status.media_attachments[0].url);
}
} else {
if ( status.media_attachments.length <= 2 ) {
for ( let i in status.media_attachments ) {
@ -136,7 +156,7 @@ var own_toot_buttons = (`<li><a class="mute_button" mid="${status.account.id}" s
var account_state_icons = "";
if(status.account.locked == true) account_state_icons += " <i class='fa fa-lock'></i>";
if(status.account.bot == true) account_state_icons += " <img src='/assets/images/robot.svg' class='emoji'>";
const html=(`
const html=$(`
<li sid="${status.id}" class="toot_entry">
<div class="toot_entry_body">
<a href="${status_account_link}">
@ -177,7 +197,6 @@ ${alart_text}
<span class="status_content emoji_poss">
${status.content}
</span>
${media_views}
</article>
<footer class="toot_footer"${toot_footer_width}>
<div class="toot_reaction">
@ -202,7 +221,8 @@ ${toot_reblog_button}
</section>
</div>
</li>`);
return $(html)
html.find(".toot_article").append(media_views);
return html
} else {
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'>");
@ -275,7 +295,7 @@ var own_toot_buttons = (`<li><a class="mute_button" mid="${status.reblog.account
var account_state_icons = "";
if(status.reblog.account.locked == true) account_state_icons += " <i class='fa fa-lock'></i>";
if(status.reblog.account.bot == true) account_state_icons += " <img src='/assets/images/robot.svg' class='emoji'>";
const html = (`
const html = $(`
<li sid="${status.id}" class="toot_entry">
<div class="boost_author_box">
<a href="${status_account_link}">
@ -321,7 +341,6 @@ ${alart_text}
<span class="status_content emoji_poss">
${status.reblog.content}
</span>
${media_views}
</article>
<footer class="toot_footer" style="width:320px">
<div class="toot_reaction">
@ -351,7 +370,8 @@ ${media_views}
</section>
</div>
</li>`);
return $(html)
html.find(".toot_article").append(media_views);
return html
}
}
function timeline_pinned_template(status) {
@ -413,7 +433,7 @@ var own_toot_buttons = (`<li><a class="mute_button" mid="${status.account.id}" s
var account_state_icons = "";
if(status.account.locked == true) account_state_icons += " <i class='fa fa-lock'></i>";
if(status.account.bot == true) account_state_icons += " <img src='/assets/images/robot.svg' class='emoji'>";
const html = (`
const html = $(`
<li sid="${status.id}" class="toot_entry">
<div class="pinned_notice_box">
<i class="fa fa-fw fa-thumb-tack"></i>${__('Pinned Toot')}</span>
@ -457,7 +477,6 @@ ${alart_text}
<span class="status_content emoji_poss">
${status.content}
</span>
${media_views}
</article>
<footer class="toot_footer" style="width:320px">
<div class="toot_reaction">
@ -487,7 +506,8 @@ ${media_views}
</section>
</div>
</li>`);
return $(html)
html.find(".toot_article").append(media_views);
return html
}
function notifications_template(NotificationObj) {
const notice_author_link = getRelativeURL(NotificationObj.account.url, NotificationObj.account.id);
@ -675,7 +695,7 @@ var own_toot_buttons = (`<li><a class="mute_button" mid="${NotificationObj.statu
var account_state_icons = "";
if(NotificationObj.status.account.locked == true) account_state_icons += " <i class='fa fa-lock'></i>";
if(NotificationObj.status.account.bot == true) account_state_icons += " <img src='/assets/images/robot.svg' class='emoji'>";
const html=(`
const html=$(`
<li sid="${NotificationObj.status.id}" class="toot_entry">
<div class="toot_entry_body">
<a href="${toot_author_link}">
@ -716,7 +736,6 @@ ${alart_text}
<span class="status_content emoji_poss">
${NotificationObj.status.content}
</span>
${media_views}
</article>
<footer class="toot_footer"${toot_footer_width}>
<div class="toot_reaction">
@ -741,7 +760,8 @@ ${toot_reblog_button}
</section>
</div>
</li>`);
return $(html);
html.find(".toot_article").append(media_views);
return html
} else {
const html=(`
<li sid="${NotificationObj.id}" class="notice_entry fol">
@ -887,7 +907,7 @@ var own_toot_buttons = (`<li><a class="mute_button" mid="${status.account.id}" s
var account_state_icons = "";
if(status.account.locked == true) account_state_icons += " <i class='fa fa-lock'></i>";
if(status.account.bot == true) account_state_icons += " <img src='/assets/images/robot.svg' class='emoji'>";
const html=(`
const html=$(`
<div sid="${status.id}" class="toot_detail ${class_options}">
<div class="toot_detail_body">
<header class="toot_header">
@ -923,7 +943,6 @@ ${alart_text}
<span class="status_content emoji_poss">
${status.content}
</span>
${media_views}
</article>
<time datetime="${status_attr_datetime}">${status_datetime}</time>
</section>
@ -1024,7 +1043,8 @@ ${current_instance_charlimit}
</div>
</form>`);
history.pushState(null, null, getRelativeURL(status.account.url, status.account.id, '/status/'+status.id));
return $(html)
html.find(".toot_article").append(media_views);
return html
} else {
const status_datetime= getConversionedDate(null, status.reblog.created_at),
status_attr_datetime = getConversionedDate(null, status.reblog.created_at),
@ -1099,7 +1119,7 @@ var own_toot_buttons = (`<li><a class="mute_button" mid="${status.reblog.account
var account_state_icons = "";
if(status.reblog.account.locked == true) account_state_icons += " <i class='fa fa-lock'></i>";
if(status.reblog.account.bot == true) account_state_icons += " <img src='/assets/images/robot.svg' class='emoji'>";
const html=(`
const html=$(`
<div sid="${status.reblog.id}" class="toot_detail ${class_options}">
<div class="toot_detail_body">
<header class="toot_header">
@ -1135,7 +1155,6 @@ ${alart_text}
<span class="status_content emoji_poss">
${status.reblog.content}
</span>
${media_views}
</article>
<time datetime="${status_attr_datetime}">${status_datetime}</time>
</section>
@ -1242,7 +1261,8 @@ ${current_instance_charlimit}
</form>
`);
history.pushState(null, null, getRelativeURL(status.reblog.account.url, status.reblog.id, '/status/'+status.reblog.id));
return $(html)
html.find(".toot_article").append(media_views);
return html
}
}
function media_template(status, mediaURL) {
@ -1348,7 +1368,7 @@ var own_toot_buttons = (`<li><a class="mute_button" mid="${status.account.id}" s
var account_state_icons = "";
if(status.account.locked == true) account_state_icons += " <i class='fa fa-lock'></i>";
if(status.account.bot == true) account_state_icons += " <img src='/assets/images/robot.svg' class='emoji'>";
const html=(`
const html=$(`
<div sid="${status.id}" class="toot_entry ${class_options}">
<div class="toot_entry_body">
<div class="icon_box">
@ -1385,7 +1405,6 @@ ${alart_text}
<span class="status_content emoji_poss">
${status.content}
</span>
${media_views}
</article>
<footer class="toot_footer"${toot_footer_width}>
<div class="toot_reaction">
@ -1410,7 +1429,8 @@ ${toot_reblog_button}
</section>
</div>
</div>`);
return $(html)
html.find(".toot_article").append(media_views);
return html
} else {
const status_datetime= getRelativeDatetime(Date.now(), getConversionedDate(null, status.reblog.created_at)),
status_attr_datetime = getConversionedDate(null, status.reblog.created_at),
@ -1483,7 +1503,7 @@ var own_toot_buttons = (`<li><a class="mute_button" mid="${status.reblog.account
var account_state_icons = "";
if(status.reblog.account.locked == true) account_state_icons += " <i class='fa fa-lock'></i>";
if(status.reblog.account.bot == true) account_state_icons += " <img src='/assets/images/robot.svg' class='emoji'>";
const html=(`
const html=$(`
<div sid="${status.id}" class="toot_entry ${class_options}">
<div class="boost_author_box">
<a href="${status_account_link}">
@ -1525,7 +1545,6 @@ ${alart_text}
<span class="status_content emoji_poss">
${status.reblog.content}
</span>
${media_views}
</article>
<footer class="toot_footer" style="width:320px">
<div class="toot_reaction">
@ -1555,6 +1574,7 @@ ${media_views}
</section>
</div>
</div>`);
return $(html)
html.find(".toot_article").append(media_views);
return html
}
}

View File

@ -1133,6 +1133,9 @@ $(function() {
$(document).on('click','.toot_entry.ancestors_status, .toot_entry.descendants_status', function(e) {
$("#js-overlay_content .temporary_object").empty();
});
$(document).on('click','.player',function(e) {
e.stopPropagation();
});
$(document).on('click','.toot_entry', function(e) {
setOverlayStatus($(this).attr('sid'));
});

View File

@ -0,0 +1,22 @@
LICENSE
The MIT License
Copyright (c) 2012-2015 Speransky Danil
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

View File

@ -0,0 +1,29 @@
Software License Agreement (BSD License)
Copyright (c) 2007, Scott Schiller (schillmania.com)
All rights reserved.
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice, this
list of conditions and the following disclaimer in the documentation and/or
other materials provided with the distribution.
* Neither the name of schillmania.com nor the names of its contributors may be
used to endorse or promote products derived from this software without
specific prior written permission from schillmania.com.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

View File

@ -0,0 +1,15 @@
ISC License
Copyright (c) 2017, Hola
Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.

120
assets/js/player/audio.js Normal file
View File

@ -0,0 +1,120 @@
(function ($, sm) {
sm.setup({
preferFlash:false,
debugMode:false,
onready: function () {
sm.loaded = true;
$(window).trigger('sound_manager.loaded');
}
});
var Player = function (obj, url) {
Player.currentId += 1;
this.initSound('sound-' + Player.currentId, url);
this.buildDom(obj);
this.bindEvents();
};
Player.currentId = 0;
Player.prototype = {
initSound: function (id, url) {
var self = this;
var createSound = function () {
self.sound = sm.createSound({
id: id,
url: url,
volume: 50,
autoload: false,
whileloading: function () { self.whileLoading(); },
whileplaying: function () { self.whilePlaying(); },
onfinish: function () { self.onFinish(); }
});
};
if (sm.loaded) createSound();
else $(window).bind('sound_manager.loaded', createSound);
},
buildDom: function (obj) {
this.dom = {};
this.dom.play = $('<div class="play fa fa-play"></div>').appendTo(obj);
this.dom.timeLeft = $('<div class="time-left">00 : 00</div>').appendTo(obj);
this.dom.progress = $('<div class="progress"></div>').appendTo(obj);
this.dom.loaded = $('<div class="loaded"></div>').appendTo(this.dom.progress);
this.dom.progressPointer = $('<div class="pointer"></div>').appendTo(this.dom.progress);
this.dom.timeRight = $('<div class="time-right">00 : 00</div>').appendTo(obj);
this.dom.mute = $('<div class="mute fa fa-volume-up"></div>').appendTo(obj);
this.dom.volume = $('<div class="volume"></div>').appendTo(obj);
this.dom.volumePointer = $('<div class="pointer"></div>').appendTo(this.dom.volume);
},
bindEvents: function () {
var self = this;
this.dom.play.click(function () {
$(this).toggleClass('fa-play fa-pause');
self.sound.togglePause();
});
this.dom.mute.click(function () {
$(this).toggleClass('fa-volume-up fa-volume-off');
self.sound.toggleMute();
});
this.dom.progress.click(function (event) {
var offsetLeft = event.pageX - $(this).offset().left;
var ratio = offsetLeft / $(this).width();
var position = ratio * self.sound.durationEstimate;
self.sound.setPosition(position);
self.setProgressPointer();
});
this.dom.volume.click(function (event) {
var offsetLeft = event.pageX - $(this).offset().left;
var ratio = offsetLeft / $(this).width();
var volume = ratio * 100;
self.sound.setVolume(volume);
self.setVolumePointer();
});
},
whileLoading: function () {
var ratio = this.sound.bytesLoaded / this.sound.bytesTotal;
var offset = ratio * this.dom.progress.width();
this.dom.loaded.width(offset);
},
whilePlaying: function () {
this.setProgressPointer();
this.setVolumePointer();
this.setTimes();
},
onFinish: function () {
this.dom.play.removeClass('fa-pause').addClass('fa-play');
this.sound.setPosition(0);
this.setProgressPointer();
this.setTimes();
},
setProgressPointer: function () {
var ratio = this.sound.position / this.sound.durationEstimate;
var offset = ratio * this.dom.progress.width();
var radius = this.dom.progressPointer.width() / 2;
var margin = offset - radius;
this.dom.progressPointer.css('margin-left', margin);
},
setVolumePointer: function () {
var ratio = this.sound.volume / 100;
var offset = ratio * this.dom.volume.width();
var radius = this.dom.volumePointer.width() / 2;
var margin = offset - radius;
this.dom.volumePointer.css('margin-left', margin);
},
setTimes: function () {
var addZeros = function (n, w) {
w -= n.toString().length;
if (w > 0) return new Array(w + 1).join('0') + n;
return n + '';
};
var timeLeft = this.sound.position;
var sec = Math.floor(timeLeft / 1000) % 60;
var min = Math.floor(timeLeft / 1000 / 60);
this.dom.timeLeft.text(addZeros(min, 2) + ' : ' + addZeros(sec, 2));
var timeRight = this.sound.durationEstimate - this.sound.position;
var sec = Math.floor(timeRight / 1000) % 60;
var min = Math.floor(timeRight / 1000 / 60);
this.dom.timeRight.text(addZeros(min, 2) + ' : ' + addZeros(sec, 2));
}
};
$.fn.player = function (url) {
new Player(this, url);
};
})(jQuery, soundManager);

View File

@ -0,0 +1,114 @@
/** @license
SoundManager 2: JavaScript Sound for the Web
----------------------------------------------
http://schillmania.com/projects/soundmanager2/
Copyright (c) 2007, Scott Schiller. All rights reserved.
Code provided under the BSD License:
http://schillmania.com/projects/soundmanager2/license.txt
V2.97a.20170601
*/
(function(h,g){function J(sb,J){function ha(b){return c.preferFlash&&G&&!c.ignoreFlash&&c.flash[b]!==g&&c.flash[b]}function r(b){return function(d){var e=this._s;e&&e._a?d=b.call(this,d):(e&&e.id?c._wD(e.id+": Ignoring "+d.type):c._wD("HTML5::Ignoring "+d.type),d=null);return d}}this.setupOptions={url:sb||null,flashVersion:8,debugMode:!0,debugFlash:!1,useConsole:!0,consoleOnly:!0,waitForWindowLoad:!1,bgColor:"#ffffff",useHighPerformance:!1,flashPollingInterval:null,html5PollingInterval:null,flashLoadTimeout:1E3,
wmode:null,allowScriptAccess:"always",useFlashBlock:!1,useHTML5Audio:!0,forceUseGlobalHTML5Audio:!1,ignoreMobileRestrictions:!1,html5Test:/^(probably|maybe)$/i,preferFlash:!1,noSWFCache:!1,idPrefix:"sound"};this.defaultOptions={autoLoad:!1,autoPlay:!1,from:null,loops:1,onid3:null,onerror:null,onload:null,whileloading:null,onplay:null,onpause:null,onresume:null,whileplaying:null,onposition:null,onstop:null,onfinish:null,multiShot:!0,multiShotEvents:!1,position:null,pan:0,playbackRate:1,stream:!0,to:null,
type:null,usePolicyFile:!1,volume:100};this.flash9Options={onfailure:null,isMovieStar:null,usePeakData:!1,useWaveformData:!1,useEQData:!1,onbufferchange:null,ondataerror:null};this.movieStarOptions={bufferTime:3,serverURL:null,onconnect:null,duration:null};this.audioFormats={mp3:{type:['audio/mpeg; codecs="mp3"',"audio/mpeg","audio/mp3","audio/MPA","audio/mpa-robust"],required:!0},mp4:{related:["aac","m4a","m4b"],type:['audio/mp4; codecs="mp4a.40.2"',"audio/aac","audio/x-m4a","audio/MP4A-LATM","audio/mpeg4-generic"],
required:!1},ogg:{type:["audio/ogg; codecs=vorbis"],required:!1},opus:{type:["audio/ogg; codecs=opus","audio/opus"],required:!1},wav:{type:['audio/wav; codecs="1"',"audio/wav","audio/wave","audio/x-wav"],required:!1},flac:{type:["audio/flac"],required:!1}};this.movieID="sm2-container";this.id=J||"sm2movie";this.debugID="soundmanager-debug";this.debugURLParam=/([#?&])debug=1/i;this.versionNumber="V2.97a.20170601";this.altURL=this.movieURL=this.version=null;this.enabled=this.swfLoaded=!1;this.oMC=null;
this.sounds={};this.soundIDs=[];this.didFlashBlock=this.muted=!1;this.filePattern=null;this.filePatterns={flash8:/\.mp3(\?.*)?$/i,flash9:/\.mp3(\?.*)?$/i};this.features={buffering:!1,peakData:!1,waveformData:!1,eqData:!1,movieStar:!1};this.sandbox={type:null,types:{remote:"remote (domain-based) rules",localWithFile:"local with file access (no internet access)",localWithNetwork:"local with network (internet access only, no local access)",localTrusted:"local, trusted (local+internet access)"},description:null,
noRemote:null,noLocal:null};this.html5={usingFlash:null};this.flash={};this.ignoreFlash=this.html5Only=!1;var V,c=this,Ya=null,l=null,E,v=navigator.userAgent,ia=h.location.href.toString(),m=document,xa,Za,ya,n,H=[],za=!0,C,W=!1,X=!1,q=!1,y=!1,ja=!1,p,tb=0,Y,A,Aa,Q,Ba,O,R,S,$a,Ca,Da,ka,z,la,P,Ea,Z,ma,na,T,ab,Fa,bb=["log","info","warn","error"],Ga,Ha,cb,aa=null,Ia=null,t,Ja,U,db,oa,pa,K,w,ba=!1,Ka=!1,eb,fb,gb,qa=0,ca=null,ra,L=[],da,u=null,hb,sa,ea,ib,M,ta,La,jb,x,kb=Array.prototype.slice,B=!1,Ma,G,
Na,lb,I,mb,Oa,fa,nb=0,Pa,Qa=v.match(/(ipad|iphone|ipod)/i),Ra=v.match(/android/i),N=v.match(/msie|trident/i),ub=v.match(/webkit/i),ua=v.match(/safari/i)&&!v.match(/chrome/i),Sa=v.match(/opera/i),va=v.match(/(mobile|pre\/|xoom)/i)||Qa||Ra,Ta=!ia.match(/usehtml5audio/i)&&!ia.match(/sm2-ignorebadua/i)&&ua&&!v.match(/silk/i)&&v.match(/OS\sX\s10_6_([3-7])/i),Ua=h.console!==g&&console.log!==g,Va=m.hasFocus!==g?m.hasFocus():null,wa=ua&&(m.hasFocus===g||!m.hasFocus()),ob=!wa,pb=/(mp3|mp4|mpa|m4a|m4b)/i,ga=
m.location?m.location.protocol.match(/http/i):null,vb=ga?"":"//",qb=/^\s*audio\/(?:x-)?(?:mpeg4|aac|flv|mov|mp4|m4v|m4a|m4b|mp4v|3gp|3g2)\s*(?:$|;)/i,rb="mpeg4 aac flv mov mp4 m4v f4v m4a m4b mp4v 3gp 3g2".split(" "),wb=new RegExp("\\.("+rb.join("|")+")(\\?.*)?$","i");this.mimePattern=/^\s*audio\/(?:x-)?(?:mp(?:eg|3))\s*(?:$|;)/i;this.useAltURL=!ga;ib=[null,"MEDIA_ERR_ABORTED","MEDIA_ERR_NETWORK","MEDIA_ERR_DECODE","MEDIA_ERR_SRC_NOT_SUPPORTED"];var Wa;try{Wa=Audio!==g&&(Sa&&opera!==g&&10>opera.version()?
new Audio(null):new Audio).canPlayType!==g}catch(xb){Wa=!1}this.hasHTML5=Wa;this.setup=function(b){var d=!c.url;b!==g&&q&&u&&c.ok()&&(b.flashVersion!==g||b.url!==g||b.html5Test!==g)&&K(t("setupLate"));Aa(b);if(!B)if(va){if(!c.setupOptions.ignoreMobileRestrictions||c.setupOptions.forceUseGlobalHTML5Audio)L.push(z.globalHTML5),B=!0}else c.setupOptions.forceUseGlobalHTML5Audio&&(L.push(z.globalHTML5),B=!0);if(!Pa&&va)if(c.setupOptions.ignoreMobileRestrictions)L.push(z.ignoreMobile);else if(c.setupOptions.useHTML5Audio&&
!c.setupOptions.preferFlash||c._wD(z.mobileUA),c.setupOptions.useHTML5Audio=!0,c.setupOptions.preferFlash=!1,Qa)c.ignoreFlash=!0;else if(Ra&&!v.match(/android\s2\.3/i)||!Ra)c._wD(z.globalHTML5),B=!0;b&&(d&&Z&&b.url!==g&&c.beginDelayedInit(),Z||b.url===g||"complete"!==m.readyState||setTimeout(P,1));Pa=!0;return c};this.supported=this.ok=function(){return u?q&&!y:c.useHTML5Audio&&c.hasHTML5};this.getMovie=function(c){return E(c)||m[c]||h[c]};this.createSound=function(b,d){function e(){f=oa(f);c.sounds[f.id]=
new V(f);c.soundIDs.push(f.id);return c.sounds[f.id]}var a,f;a=null;a="soundManager.createSound(): "+t(q?"notOK":"notReady");if(!q||!c.ok())return K(a),!1;d!==g&&(b={id:b,url:d});f=A(b);f.url=ra(f.url);f.id===g&&(f.id=c.setupOptions.idPrefix+nb++);f.id.toString().charAt(0).match(/^[0-9]$/)&&c._wD("soundManager.createSound(): "+t("badID",f.id),2);c._wD("soundManager.createSound(): "+f.id+(f.url?" ("+f.url+")":""),1);if(w(f.id,!0))return c._wD("soundManager.createSound(): "+f.id+" exists",1),c.sounds[f.id];
if(sa(f))a=e(),c.html5Only||c._wD(f.id+": Using HTML5"),a._setup_html5(f);else{if(c.html5Only)return c._wD(f.id+": No HTML5 support for this sound, and no Flash. Exiting."),e();if(c.html5.usingFlash&&f.url&&f.url.match(/data:/i))return c._wD(f.id+": data: URIs not supported via Flash. Exiting."),e();8<n&&(null===f.isMovieStar&&(f.isMovieStar=!!(f.serverURL||f.type&&f.type.match(qb)||f.url&&f.url.match(wb))),f.isMovieStar&&(c._wD("soundManager.createSound(): using MovieStar handling"),1<f.loops&&p("noNSLoop")));
f=pa(f,"soundManager.createSound(): ");a=e();8===n?l._createSound(f.id,f.loops||1,f.usePolicyFile):(l._createSound(f.id,f.url,f.usePeakData,f.useWaveformData,f.useEQData,f.isMovieStar,f.isMovieStar?f.bufferTime:!1,f.loops||1,f.serverURL,f.duration||null,f.autoPlay,!0,f.autoLoad,f.usePolicyFile),f.serverURL||(a.connected=!0,f.onconnect&&f.onconnect.apply(a)));f.serverURL||!f.autoLoad&&!f.autoPlay||a.load(f)}!f.serverURL&&f.autoPlay&&a.play();return a};this.destroySound=function(b,d){if(!w(b))return!1;
var e=c.sounds[b],a;e.stop();e._iO={};e.unload();for(a=0;a<c.soundIDs.length;a++)if(c.soundIDs[a]===b){c.soundIDs.splice(a,1);break}d||e.destruct(!0);delete c.sounds[b];return!0};this.load=function(b,d){return w(b)?c.sounds[b].load(d):!1};this.unload=function(b){return w(b)?c.sounds[b].unload():!1};this.onposition=this.onPosition=function(b,d,e,a){return w(b)?c.sounds[b].onposition(d,e,a):!1};this.clearOnPosition=function(b,d,e){return w(b)?c.sounds[b].clearOnPosition(d,e):!1};this.start=this.play=
function(b,d){var e=null,a=d&&!(d instanceof Object);if(!q||!c.ok())return K("soundManager.play(): "+t(q?"notOK":"notReady")),!1;if(w(b,a))a&&(d={url:d});else{if(!a)return!1;a&&(d={url:d});d&&d.url&&(c._wD('soundManager.play(): Attempting to create "'+b+'"',1),d.id=b,e=c.createSound(d).play())}null===e&&(e=c.sounds[b].play(d));return e};this.setPlaybackRate=function(b,d,e){return w(b)?c.sounds[b].setPlaybackRate(d,e):!1};this.setPosition=function(b,d){return w(b)?c.sounds[b].setPosition(d):!1};this.stop=
function(b){if(!w(b))return!1;c._wD("soundManager.stop("+b+")",1);return c.sounds[b].stop()};this.stopAll=function(){var b;c._wD("soundManager.stopAll()",1);for(b in c.sounds)c.sounds.hasOwnProperty(b)&&c.sounds[b].stop()};this.pause=function(b){return w(b)?c.sounds[b].pause():!1};this.pauseAll=function(){var b;for(b=c.soundIDs.length-1;0<=b;b--)c.sounds[c.soundIDs[b]].pause()};this.resume=function(b){return w(b)?c.sounds[b].resume():!1};this.resumeAll=function(){var b;for(b=c.soundIDs.length-1;0<=
b;b--)c.sounds[c.soundIDs[b]].resume()};this.togglePause=function(b){return w(b)?c.sounds[b].togglePause():!1};this.setPan=function(b,d){return w(b)?c.sounds[b].setPan(d):!1};this.setVolume=function(b,d){var e,a;if(b!==g&&!isNaN(b)&&d===g){e=0;for(a=c.soundIDs.length;e<a;e++)c.sounds[c.soundIDs[e]].setVolume(b);return!1}return w(b)?c.sounds[b].setVolume(d):!1};this.mute=function(b){var d=0;b instanceof String&&(b=null);if(b){if(!w(b))return!1;c._wD('soundManager.mute(): Muting "'+b+'"');return c.sounds[b].mute()}c._wD("soundManager.mute(): Muting all sounds");
for(d=c.soundIDs.length-1;0<=d;d--)c.sounds[c.soundIDs[d]].mute();return c.muted=!0};this.muteAll=function(){c.mute()};this.unmute=function(b){b instanceof String&&(b=null);if(b){if(!w(b))return!1;c._wD('soundManager.unmute(): Unmuting "'+b+'"');return c.sounds[b].unmute()}c._wD("soundManager.unmute(): Unmuting all sounds");for(b=c.soundIDs.length-1;0<=b;b--)c.sounds[c.soundIDs[b]].unmute();c.muted=!1;return!0};this.unmuteAll=function(){c.unmute()};this.toggleMute=function(b){return w(b)?c.sounds[b].toggleMute():
!1};this.getMemoryUse=function(){var c=0;l&&8!==n&&(c=parseInt(l._getMemoryUse(),10));return c};this.disable=function(b){var d;b===g&&(b=!1);if(y)return!1;y=!0;p("shutdown",1);for(d=c.soundIDs.length-1;0<=d;d--)Ga(c.sounds[c.soundIDs[d]]);Ga(c);Y(b);x.remove(h,"load",R);return!0};this.canPlayMIME=function(b){var d;c.hasHTML5&&(d=ea({type:b}));!d&&u&&(d=b&&c.ok()?!!(8<n&&b.match(qb)||b.match(c.mimePattern)):null);return d};this.canPlayURL=function(b){var d;c.hasHTML5&&(d=ea({url:b}));!d&&u&&(d=b&&
c.ok()?!!b.match(c.filePattern):null);return d};this.canPlayLink=function(b){return b.type!==g&&b.type&&c.canPlayMIME(b.type)?!0:c.canPlayURL(b.href)};this.getSoundById=function(b,d){if(!b)return null;var e=c.sounds[b];e||d||c._wD('soundManager.getSoundById(): Sound "'+b+'" not found.',2);return e};this.onready=function(b,d){if("function"===typeof b)q&&c._wD(t("queue","onready")),d||(d=h),Ba("onready",b,d),O();else throw t("needFunction","onready");return!0};this.ontimeout=function(b,d){if("function"===
typeof b)q&&c._wD(t("queue","ontimeout")),d||(d=h),Ba("ontimeout",b,d),O({type:"ontimeout"});else throw t("needFunction","ontimeout");return!0};this._writeDebug=function(b,d){var e,a;if(!c.setupOptions.debugMode)return!1;if(Ua&&c.useConsole){if(d&&"object"===typeof d)console.log(b,d);else if(bb[d]!==g)console[bb[d]](b);else console.log(b);if(c.consoleOnly)return!0}e=E("soundmanager-debug");if(!e)return!1;a=m.createElement("div");0===++tb%2&&(a.className="sm2-alt");d=d===g?0:parseInt(d,10);a.appendChild(m.createTextNode(b));
d&&(2<=d&&(a.style.fontWeight="bold"),3===d&&(a.style.color="#ff3333"));e.insertBefore(a,e.firstChild);return!0};-1!==ia.indexOf("sm2-debug=alert")&&(this._writeDebug=function(c){h.alert(c)});this._wD=this._writeDebug;this._debug=function(){var b,d;p("currentObj",1);b=0;for(d=c.soundIDs.length;b<d;b++)c.sounds[c.soundIDs[b]]._debug()};this.reboot=function(b,d){c.soundIDs.length&&c._wD("Destroying "+c.soundIDs.length+" SMSound object"+(1!==c.soundIDs.length?"s":"")+"...");var e,a,f;for(e=c.soundIDs.length-
1;0<=e;e--)c.sounds[c.soundIDs[e]].destruct();if(l)try{N&&(Ia=l.innerHTML),aa=l.parentNode.removeChild(l)}catch(g){p("badRemove",2)}Ia=aa=u=l=null;c.enabled=Z=q=ba=Ka=W=X=y=B=c.swfLoaded=!1;c.soundIDs=[];c.sounds={};nb=0;Pa=!1;if(b)H=[];else for(e in H)if(H.hasOwnProperty(e))for(a=0,f=H[e].length;a<f;a++)H[e][a].fired=!1;d||c._wD("soundManager: Rebooting...");c.html5={usingFlash:null};c.flash={};c.html5Only=!1;c.ignoreFlash=!1;h.setTimeout(function(){d||c.beginDelayedInit()},20);return c};this.reset=
function(){p("reset");return c.reboot(!0,!0)};this.getMoviePercent=function(){return l&&"PercentLoaded"in l?l.PercentLoaded():null};this.beginDelayedInit=function(){ja=!0;P();setTimeout(function(){if(Ka)return!1;na();la();return Ka=!0},20);S()};this.destruct=function(){c._wD("soundManager.destruct()");c.disable(!0)};V=function(b){var d,e,a=this,f,h,k,F,m,q,r=!1,D=[],v=0,Xa,y,u=null,z;e=d=null;this.sID=this.id=b.id;this.url=b.url;this._iO=this.instanceOptions=this.options=A(b);this.pan=this.options.pan;
this.volume=this.options.volume;this.isHTML5=!1;this._a=null;z=!this.url;this.id3={};this._debug=function(){c._wD(a.id+": Merged options:",a.options)};this.load=function(b){var d=null,e;b!==g?a._iO=A(b,a.options):(b=a.options,a._iO=b,u&&u!==a.url&&(p("manURL"),a._iO.url=a.url,a.url=null));a._iO.url||(a._iO.url=a.url);a._iO.url=ra(a._iO.url);e=a.instanceOptions=a._iO;c._wD(a.id+": load ("+e.url+")");if(!e.url&&!a.url)return c._wD(a.id+": load(): url is unassigned. Exiting.",2),a;a.isHTML5||8!==n||
a.url||e.autoPlay||c._wD(a.id+": Flash 8 load() limitation: Wait for onload() before calling play().",1);if(e.url===a.url&&0!==a.readyState&&2!==a.readyState)return p("onURL",1),3===a.readyState&&e.onload&&fa(a,function(){e.onload.apply(a,[!!a.duration])}),a;a.loaded=!1;a.readyState=1;a.playState=0;a.id3={};if(sa(e))d=a._setup_html5(e),d._called_load?c._wD(a.id+": Ignoring request to load again"):(a._html5_canplay=!1,a.url!==e.url&&(c._wD(p("manURL")+": "+e.url),a._a.src=e.url,a.setPosition(0)),a._a.autobuffer=
"auto",a._a.preload="auto",a._a._called_load=!0);else{if(c.html5Only)return c._wD(a.id+": No flash support. Exiting."),a;if(a._iO.url&&a._iO.url.match(/data:/i))return c._wD(a.id+": data: URIs not supported via Flash. Exiting."),a;try{a.isHTML5=!1,a._iO=pa(oa(e)),a._iO.autoPlay&&(a._iO.position||a._iO.from)&&(c._wD(a.id+": Disabling autoPlay because of non-zero offset case"),a._iO.autoPlay=!1),e=a._iO,8===n?l._load(a.id,e.url,e.stream,e.autoPlay,e.usePolicyFile):l._load(a.id,e.url,!!e.stream,!!e.autoPlay,
e.loops||1,!!e.autoLoad,e.usePolicyFile)}catch(f){p("smError",2),C("onload",!1),T({type:"SMSOUND_LOAD_JS_EXCEPTION",fatal:!0})}}a.url=e.url;return a};this.unload=function(){0!==a.readyState&&(c._wD(a.id+": unload()"),a.isHTML5?(F(),a._a&&(a._a.pause(),u=ta(a._a))):8===n?l._unload(a.id,"about:blank"):l._unload(a.id),f());return a};this.destruct=function(b){c._wD(a.id+": Destruct");a.isHTML5?(F(),a._a&&(a._a.pause(),ta(a._a),B||k(),a._a._s=null,a._a=null)):(a._iO.onfailure=null,l._destroySound(a.id));
b||c.destroySound(a.id,!0)};this.start=this.play=function(b,d){var e,f,k,F,h;f=!0;e=a.id+": play(): ";d=d===g?!0:d;b||(b={});a.url&&(a._iO.url=a.url);a._iO=A(a._iO,a.options);a._iO=A(b,a._iO);a._iO.url=ra(a._iO.url);a.instanceOptions=a._iO;if(!a.isHTML5&&a._iO.serverURL&&!a.connected)return a.getAutoPlay()||(c._wD(e+" Netstream not connected yet - setting autoPlay"),a.setAutoPlay(!0)),a;sa(a._iO)&&(a._setup_html5(a._iO),m());if(1===a.playState&&!a.paused){f=a._iO.multiShot;if(!f)return c._wD(e+"Already playing (one-shot)",
1),a.isHTML5&&a.setPosition(a._iO.position),a;c._wD(e+"Already playing (multi-shot)",1)}b.url&&b.url!==a.url&&(a.readyState||a.isHTML5||8!==n||!z?a.load(a._iO):z=!1);if(a.loaded)c._wD(e.substr(0,e.lastIndexOf(":")));else if(0===a.readyState){c._wD(e+"Attempting to load");if(a.isHTML5||c.html5Only)if(a.isHTML5)a.load(a._iO);else return c._wD(e+"Unsupported type. Exiting."),a;else a._iO.autoPlay=!0,a.load(a._iO);a.instanceOptions=a._iO}else{if(2===a.readyState)return c._wD(e+"Could not load - exiting",
2),a;c._wD(e+"Loading - attempting to play...")}!a.isHTML5&&9===n&&0<a.position&&a.position===a.duration&&(c._wD(e+"Sound at end, resetting to position: 0"),b.position=0);a.paused&&0<=a.position&&(!a._iO.serverURL||0<a.position)?(c._wD(e+"Resuming from paused state",1),a.resume()):(a._iO=A(b,a._iO),(!a.isHTML5&&null!==a._iO.position&&0<a._iO.position||null!==a._iO.from&&0<a._iO.from||null!==a._iO.to)&&0===a.instanceCount&&0===a.playState&&!a._iO.serverURL&&(f=function(){a._iO=A(b,a._iO);a.play(a._iO)},
a.isHTML5&&!a._html5_canplay?(c._wD(e+"Beginning load for non-zero offset case"),a.load({_oncanplay:f})):a.isHTML5||a.loaded||a.readyState&&2===a.readyState||(c._wD(e+"Preloading for non-zero offset case"),a.load({onload:f})),a._iO=y()),(!a.instanceCount||a._iO.multiShotEvents||a.isHTML5&&a._iO.multiShot&&!B||!a.isHTML5&&8<n&&!a.getAutoPlay())&&a.instanceCount++,a._iO.onposition&&0===a.playState&&q(a),a.playState=1,a.paused=!1,a.position=a._iO.position===g||isNaN(a._iO.position)?0:a._iO.position,
a.isHTML5||(a._iO=pa(oa(a._iO))),a._iO.onplay&&d&&(a._iO.onplay.apply(a),r=!0),a.setVolume(a._iO.volume,!0),a.setPan(a._iO.pan,!0),1!==a._iO.playbackRate&&a.setPlaybackRate(a._iO.playbackRate),a.isHTML5?2>a.instanceCount?(m(),e=a._setup_html5(),a.setPosition(a._iO.position),e.play()):(c._wD(a.id+": Cloning Audio() for instance #"+a.instanceCount+"..."),k=new Audio(a._iO.url),F=function(){x.remove(k,"ended",F);a._onfinish(a);ta(k);k=null},h=function(){x.remove(k,"canplay",h);try{k.currentTime=a._iO.position/
1E3}catch(c){K(a.id+": multiShot play() failed to apply position of "+a._iO.position/1E3)}k.play()},x.add(k,"ended",F),a._iO.volume!==g&&(k.volume=Math.max(0,Math.min(1,a._iO.volume/100))),a.muted&&(k.muted=!0),a._iO.position?x.add(k,"canplay",h):k.play()):(f=l._start(a.id,a._iO.loops||1,9===n?a.position:a.position/1E3,a._iO.multiShot||!1),9!==n||f||(c._wD(e+"No sound hardware, or 32-sound ceiling hit",2),a._iO.onplayerror&&a._iO.onplayerror.apply(a))));return a};this.stop=function(b){var d=a._iO;
1===a.playState&&(c._wD(a.id+": stop()"),a._onbufferchange(0),a._resetOnPosition(0),a.paused=!1,a.isHTML5||(a.playState=0),Xa(),d.to&&a.clearOnPosition(d.to),a.isHTML5?a._a&&(b=a.position,a.setPosition(0),a.position=b,a._a.pause(),a.playState=0,a._onTimer(),F()):(l._stop(a.id,b),d.serverURL&&a.unload()),a.instanceCount=0,a._iO={},d.onstop&&d.onstop.apply(a));return a};this.setAutoPlay=function(b){c._wD(a.id+": Autoplay turned "+(b?"on":"off"));a._iO.autoPlay=b;a.isHTML5||(l._setAutoPlay(a.id,b),b&&
!a.instanceCount&&1===a.readyState&&(a.instanceCount++,c._wD(a.id+": Incremented instance count to "+a.instanceCount)))};this.getAutoPlay=function(){return a._iO.autoPlay};this.setPlaybackRate=function(b){var d=Math.max(.5,Math.min(4,b));d!==b&&c._wD(a.id+": setPlaybackRate("+b+"): limiting rate to "+d,2);if(a.isHTML5)try{a._iO.playbackRate=d,a._a.playbackRate=d}catch(e){c._wD(a.id+": setPlaybackRate("+d+") failed: "+e.message,2)}return a};this.setPosition=function(b){b===g&&(b=0);var d=a.isHTML5?
Math.max(b,0):Math.min(a.duration||a._iO.duration,Math.max(b,0));a.position=d;b=a.position/1E3;a._resetOnPosition(a.position);a._iO.position=d;if(!a.isHTML5)b=9===n?a.position:b,a.readyState&&2!==a.readyState&&l._setPosition(a.id,b,a.paused||!a.playState,a._iO.multiShot);else if(a._a){if(a._html5_canplay){if(a._a.currentTime.toFixed(3)!==b.toFixed(3)){c._wD(a.id+": setPosition("+b+")");try{a._a.currentTime=b,(0===a.playState||a.paused)&&a._a.pause()}catch(e){c._wD(a.id+": setPosition("+b+") failed: "+
e.message,2)}}}else if(b)return c._wD(a.id+": setPosition("+b+"): Cannot seek yet, sound not ready",2),a;a.paused&&a._onTimer(!0)}return a};this.pause=function(b){if(a.paused||0===a.playState&&1!==a.readyState)return a;c._wD(a.id+": pause()");a.paused=!0;a.isHTML5?(a._setup_html5().pause(),F()):(b||b===g)&&l._pause(a.id,a._iO.multiShot);a._iO.onpause&&a._iO.onpause.apply(a);return a};this.resume=function(){var b=a._iO;if(!a.paused)return a;c._wD(a.id+": resume()");a.paused=!1;a.playState=1;a.isHTML5?
(a._setup_html5().play(),m()):(b.isMovieStar&&!b.serverURL&&a.setPosition(a.position),l._pause(a.id,b.multiShot));!r&&b.onplay?(b.onplay.apply(a),r=!0):b.onresume&&b.onresume.apply(a);return a};this.togglePause=function(){c._wD(a.id+": togglePause()");if(0===a.playState)return a.play({position:9!==n||a.isHTML5?a.position/1E3:a.position}),a;a.paused?a.resume():a.pause();return a};this.setPan=function(b,c){b===g&&(b=0);c===g&&(c=!1);a.isHTML5||l._setPan(a.id,b);a._iO.pan=b;c||(a.pan=b,a.options.pan=
b);return a};this.setVolume=function(b,d){b===g&&(b=100);d===g&&(d=!1);a.isHTML5?a._a&&(c.muted&&!a.muted&&(a.muted=!0,a._a.muted=!0),a._a.volume=Math.max(0,Math.min(1,b/100))):l._setVolume(a.id,c.muted&&!a.muted||a.muted?0:b);a._iO.volume=b;d||(a.volume=b,a.options.volume=b);return a};this.mute=function(){a.muted=!0;a.isHTML5?a._a&&(a._a.muted=!0):l._setVolume(a.id,0);return a};this.unmute=function(){a.muted=!1;var b=a._iO.volume!==g;a.isHTML5?a._a&&(a._a.muted=!1):l._setVolume(a.id,b?a._iO.volume:
a.options.volume);return a};this.toggleMute=function(){return a.muted?a.unmute():a.mute()};this.onposition=this.onPosition=function(b,c,d){D.push({position:parseInt(b,10),method:c,scope:d!==g?d:a,fired:!1});return a};this.clearOnPosition=function(a,b){var c;a=parseInt(a,10);if(!isNaN(a))for(c=0;c<D.length;c++)a!==D[c].position||b&&b!==D[c].method||(D[c].fired&&v--,D.splice(c,1))};this._processOnPosition=function(){var b,c;b=D.length;if(!b||!a.playState||v>=b)return!1;for(--b;0<=b;b--)c=D[b],!c.fired&&
a.position>=c.position&&(c.fired=!0,v++,c.method.apply(c.scope,[c.position]));return!0};this._resetOnPosition=function(a){var b,c;b=D.length;if(!b)return!1;for(--b;0<=b;b--)c=D[b],c.fired&&a<=c.position&&(c.fired=!1,v--);return!0};y=function(){var b=a._iO,d=b.from,e=b.to,f,g;g=function(){c._wD(a.id+': "To" time of '+e+" reached.");a.clearOnPosition(e,g);a.stop()};f=function(){c._wD(a.id+': Playing "from" '+d);if(null!==e&&!isNaN(e))a.onPosition(e,g)};null===d||isNaN(d)||(b.position=d,b.multiShot=
!1,f());return b};q=function(){var b,c=a._iO.onposition;if(c)for(b in c)if(c.hasOwnProperty(b))a.onPosition(parseInt(b,10),c[b])};Xa=function(){var b,c=a._iO.onposition;if(c)for(b in c)c.hasOwnProperty(b)&&a.clearOnPosition(parseInt(b,10))};m=function(){a.isHTML5&&eb(a)};F=function(){a.isHTML5&&fb(a)};f=function(b){b||(D=[],v=0);r=!1;a._hasTimer=null;a._a=null;a._html5_canplay=!1;a.bytesLoaded=null;a.bytesTotal=null;a.duration=a._iO&&a._iO.duration?a._iO.duration:null;a.durationEstimate=null;a.buffered=
[];a.eqData=[];a.eqData.left=[];a.eqData.right=[];a.failures=0;a.isBuffering=!1;a.instanceOptions={};a.instanceCount=0;a.loaded=!1;a.metadata={};a.readyState=0;a.muted=!1;a.paused=!1;a.peakData={left:0,right:0};a.waveformData={left:[],right:[]};a.playState=0;a.position=null;a.id3={}};f();this._onTimer=function(b){var c,f=!1,g={};(a._hasTimer||b)&&a._a&&(b||(0<a.playState||1===a.readyState)&&!a.paused)&&(c=a._get_html5_duration(),c!==d&&(d=c,a.duration=c,f=!0),a.durationEstimate=a.duration,c=1E3*a._a.currentTime||
0,c!==e&&(e=c,f=!0),(f||b)&&a._whileplaying(c,g,g,g,g));return f};this._get_html5_duration=function(){var b=a._iO;return(b=a._a&&a._a.duration?1E3*a._a.duration:b&&b.duration?b.duration:null)&&!isNaN(b)&&Infinity!==b?b:null};this._apply_loop=function(a,b){!a.loop&&1<b&&c._wD("Note: Native HTML5 looping is infinite.",1);a.loop=1<b?"loop":""};this._setup_html5=function(b){b=A(a._iO,b);var c=B?Ya:a._a,d=decodeURI(b.url),e;B?d===decodeURI(Ma)&&(e=!0):d===decodeURI(u)&&(e=!0);if(c){if(c._s)if(B)c._s&&
c._s.playState&&!e&&c._s.stop();else if(!B&&d===decodeURI(u))return a._apply_loop(c,b.loops),c;e||(u&&f(!1),c.src=b.url,Ma=u=a.url=b.url,c._called_load=!1)}else b.autoLoad||b.autoPlay?(a._a=new Audio(b.url),a._a.load()):a._a=Sa&&10>opera.version()?new Audio(null):new Audio,c=a._a,c._called_load=!1,B&&(Ya=c);a.isHTML5=!0;a._a=c;c._s=a;h();a._apply_loop(c,b.loops);b.autoLoad||b.autoPlay?a.load():(c.autobuffer=!1,c.preload="auto");return c};h=function(){if(a._a._added_events)return!1;var b;a._a._added_events=
!0;for(b in I)I.hasOwnProperty(b)&&a._a&&a._a.addEventListener(b,I[b],!1);return!0};k=function(){var b;c._wD(a.id+": Removing event listeners");a._a._added_events=!1;for(b in I)I.hasOwnProperty(b)&&a._a&&a._a.removeEventListener(b,I[b],!1)};this._onload=function(b){var d=!!b||!a.isHTML5&&8===n&&a.duration;b=a.id+": ";c._wD(b+(d?"onload()":"Failed to load / invalid sound?"+(a.duration?" -":" Zero-length duration reported.")+" ("+a.url+")"),d?1:2);d||a.isHTML5||(!0===c.sandbox.noRemote&&c._wD(b+t("noNet"),
1),!0===c.sandbox.noLocal&&c._wD(b+t("noLocal"),1));a.loaded=d;a.readyState=d?3:2;a._onbufferchange(0);d||a.isHTML5||a._onerror();a._iO.onload&&fa(a,function(){a._iO.onload.apply(a,[d])});return!0};this._onerror=function(b,c){a._iO.onerror&&fa(a,function(){a._iO.onerror.apply(a,[b,c])})};this._onbufferchange=function(b){if(0===a.playState||b&&a.isBuffering||!b&&!a.isBuffering)return!1;a.isBuffering=1===b;a._iO.onbufferchange&&(c._wD(a.id+": Buffer state change: "+b),a._iO.onbufferchange.apply(a,[b]));
return!0};this._onsuspend=function(){a._iO.onsuspend&&(c._wD(a.id+": Playback suspended"),a._iO.onsuspend.apply(a));return!0};this._onfailure=function(b,d,e){a.failures++;c._wD(a.id+": Failure ("+a.failures+"): "+b);if(a._iO.onfailure&&1===a.failures)a._iO.onfailure(b,d,e);else c._wD(a.id+": Ignoring failure")};this._onwarning=function(b,c,d){if(a._iO.onwarning)a._iO.onwarning(b,c,d)};this._onfinish=function(){var b=a._iO.onfinish;a._onbufferchange(0);a._resetOnPosition(0);a.instanceCount&&(a.instanceCount--,
a.instanceCount||(Xa(),a.playState=0,a.paused=!1,a.instanceCount=0,a.instanceOptions={},a._iO={},F(),a.isHTML5&&(a.position=0)),a.instanceCount&&!a._iO.multiShotEvents||!b||(c._wD(a.id+": onfinish()"),fa(a,function(){b.apply(a)})))};this._whileloading=function(b,c,d,e){var f=a._iO;a.bytesLoaded=b;a.bytesTotal=c;a.duration=Math.floor(d);a.bufferLength=e;a.durationEstimate=a.isHTML5||f.isMovieStar?a.duration:f.duration?a.duration>f.duration?a.duration:f.duration:parseInt(a.bytesTotal/a.bytesLoaded*
a.duration,10);a.isHTML5||(a.buffered=[{start:0,end:a.duration}]);(3!==a.readyState||a.isHTML5)&&f.whileloading&&f.whileloading.apply(a)};this._whileplaying=function(b,c,d,e,f){var k=a._iO;if(isNaN(b)||null===b)return!1;a.position=Math.max(0,b);a._processOnPosition();!a.isHTML5&&8<n&&(k.usePeakData&&c!==g&&c&&(a.peakData={left:c.leftPeak,right:c.rightPeak}),k.useWaveformData&&d!==g&&d&&(a.waveformData={left:d.split(","),right:e.split(",")}),k.useEQData&&f!==g&&f&&f.leftEQ&&(b=f.leftEQ.split(","),
a.eqData=b,a.eqData.left=b,f.rightEQ!==g&&f.rightEQ&&(a.eqData.right=f.rightEQ.split(","))));1===a.playState&&(a.isHTML5||8!==n||a.position||!a.isBuffering||a._onbufferchange(0),k.whileplaying&&k.whileplaying.apply(a));return!0};this._oncaptiondata=function(b){c._wD(a.id+": Caption data received.");a.captiondata=b;a._iO.oncaptiondata&&a._iO.oncaptiondata.apply(a,[b])};this._onmetadata=function(b,d){c._wD(a.id+": Metadata received.");var e={},f,g;f=0;for(g=b.length;f<g;f++)e[b[f]]=d[f];a.metadata=
e;a._iO.onmetadata&&a._iO.onmetadata.call(a,a.metadata)};this._onid3=function(b,d){c._wD(a.id+": ID3 data received.");var e=[],f,g;f=0;for(g=b.length;f<g;f++)e[b[f]]=d[f];a.id3=A(a.id3,e);a._iO.onid3&&a._iO.onid3.apply(a)};this._onconnect=function(b){b=1===b;c._wD(a.id+": "+(b?"Connected.":"Failed to connect? - "+a.url),b?1:2);if(a.connected=b)a.failures=0,w(a.id)&&(a.getAutoPlay()?a.play(g,a.getAutoPlay()):a._iO.autoLoad&&a.load()),a._iO.onconnect&&a._iO.onconnect.apply(a,[b])};this._ondataerror=
function(b){0<a.playState&&(c._wD(a.id+": Data error: "+b),a._iO.ondataerror&&a._iO.ondataerror.apply(a))};this._debug()};ma=function(){return m.body||m.getElementsByTagName("div")[0]};E=function(b){return m.getElementById(b)};A=function(b,d){var e=b||{},a,f;a=d===g?c.defaultOptions:d;for(f in a)a.hasOwnProperty(f)&&e[f]===g&&(e[f]="object"!==typeof a[f]||null===a[f]?a[f]:A(e[f],a[f]));return e};fa=function(b,c){b.isHTML5||8!==n?c():h.setTimeout(c,0)};Q={onready:1,ontimeout:1,defaultOptions:1,flash9Options:1,
movieStarOptions:1};Aa=function(b,d){var e,a=!0,f=d!==g,h=c.setupOptions;if(b===g){a=[];for(e in h)h.hasOwnProperty(e)&&a.push(e);for(e in Q)Q.hasOwnProperty(e)&&("object"===typeof c[e]?a.push(e+": {...}"):c[e]instanceof Function?a.push(e+": function() {...}"):a.push(e));c._wD(t("setup",a.join(", ")));return!1}for(e in b)if(b.hasOwnProperty(e))if("object"!==typeof b[e]||null===b[e]||b[e]instanceof Array||b[e]instanceof RegExp)f&&Q[d]!==g?c[d][e]=b[e]:h[e]!==g?(c.setupOptions[e]=b[e],c[e]=b[e]):Q[e]===
g?(K(t(c[e]===g?"setupUndef":"setupError",e),2),a=!1):c[e]instanceof Function?c[e].apply(c,b[e]instanceof Array?b[e]:[b[e]]):c[e]=b[e];else if(Q[e]===g)K(t(c[e]===g?"setupUndef":"setupError",e),2),a=!1;else return Aa(b[e],e);return a};x=function(){function b(a){a=kb.call(a);var b=a.length;e?(a[1]="on"+a[1],3<b&&a.pop()):3===b&&a.push(!1);return a}function c(b,d){var g=b.shift(),h=[a[d]];if(e)g[h](b[0],b[1]);else g[h].apply(g,b)}var e=h.attachEvent,a={add:e?"attachEvent":"addEventListener",remove:e?
"detachEvent":"removeEventListener"};return{add:function(){c(b(arguments),"add")},remove:function(){c(b(arguments),"remove")}}}();I={abort:r(function(){c._wD(this._s.id+": abort")}),canplay:r(function(){var b=this._s,d;if(!b._html5_canplay){b._html5_canplay=!0;c._wD(b.id+": canplay");b._onbufferchange(0);d=b._iO.position===g||isNaN(b._iO.position)?null:b._iO.position/1E3;if(this.currentTime!==d){c._wD(b.id+": canplay: Setting position to "+d);try{this.currentTime=d}catch(e){c._wD(b.id+": canplay: Setting position of "+
d+" failed: "+e.message,2)}}b._iO._oncanplay&&b._iO._oncanplay()}}),canplaythrough:r(function(){var b=this._s;b.loaded||(b._onbufferchange(0),b._whileloading(b.bytesLoaded,b.bytesTotal,b._get_html5_duration()),b._onload(!0))}),durationchange:r(function(){var b=this._s,d;d=b._get_html5_duration();isNaN(d)||d===b.duration||(c._wD(this._s.id+": durationchange ("+d+")"+(b.duration?", previously "+b.duration:"")),b.durationEstimate=b.duration=d)}),ended:r(function(){var b=this._s;c._wD(b.id+": ended");
b._onfinish()}),error:r(function(){var b=ib[this.error.code]||null;c._wD(this._s.id+": HTML5 error, code "+this.error.code+(b?" ("+b+")":""));this._s._onload(!1);this._s._onerror(this.error.code,b)}),loadeddata:r(function(){var b=this._s;c._wD(b.id+": loadeddata");b._loaded||ua||(b.duration=b._get_html5_duration())}),loadedmetadata:r(function(){c._wD(this._s.id+": loadedmetadata")}),loadstart:r(function(){c._wD(this._s.id+": loadstart");this._s._onbufferchange(1)}),play:r(function(){this._s._onbufferchange(0)}),
playing:r(function(){c._wD(this._s.id+": playing "+String.fromCharCode(9835));this._s._onbufferchange(0)}),progress:r(function(b){var d=this._s,e,a,f;e=0;var g="progress"===b.type,k=b.target.buffered,h=b.loaded||0,m=b.total||1;d.buffered=[];if(k&&k.length){e=0;for(a=k.length;e<a;e++)d.buffered.push({start:1E3*k.start(e),end:1E3*k.end(e)});e=1E3*(k.end(0)-k.start(0));h=Math.min(1,e/(1E3*b.target.duration));if(g&&1<k.length){f=[];a=k.length;for(e=0;e<a;e++)f.push(1E3*b.target.buffered.start(e)+"-"+
1E3*b.target.buffered.end(e));c._wD(this._s.id+": progress, timeRanges: "+f.join(", "))}g&&!isNaN(h)&&c._wD(this._s.id+": progress, "+Math.floor(100*h)+"% loaded")}isNaN(h)||(d._whileloading(h,m,d._get_html5_duration()),h&&m&&h===m&&I.canplaythrough.call(this,b))}),ratechange:r(function(){c._wD(this._s.id+": ratechange")}),suspend:r(function(b){var d=this._s;c._wD(this._s.id+": suspend");I.progress.call(this,b);d._onsuspend()}),stalled:r(function(){c._wD(this._s.id+": stalled")}),timeupdate:r(function(){this._s._onTimer()}),
waiting:r(function(){var b=this._s;c._wD(this._s.id+": waiting");b._onbufferchange(1)})};sa=function(b){return b&&(b.type||b.url||b.serverURL)?b.serverURL||b.type&&ha(b.type)?!1:b.type?ea({type:b.type}):ea({url:b.url})||c.html5Only||b.url.match(/data:/i):!1};ta=function(b){var d;b&&(d=ua?"about:blank":c.html5.canPlayType("audio/wav")?"data:audio/wave;base64,/UklGRiYAAABXQVZFZm10IBAAAAABAAEARKwAAIhYAQACABAAZGF0YQIAAAD//w==":"about:blank",b.src=d,b._called_unload!==g&&(b._called_load=!1));B&&(Ma=null);
return d};ea=function(b){if(!c.useHTML5Audio||!c.hasHTML5)return!1;var d=b.url||null;b=b.type||null;var e=c.audioFormats,a;if(b&&c.html5[b]!==g)return c.html5[b]&&!ha(b);if(!M){M=[];for(a in e)e.hasOwnProperty(a)&&(M.push(a),e[a].related&&(M=M.concat(e[a].related)));M=new RegExp("\\.("+M.join("|")+")(\\?.*)?$","i")}(a=d?d.toLowerCase().match(M):null)&&a.length?a=a[1]:b&&(d=b.indexOf(";"),a=(-1!==d?b.substr(0,d):b).substr(6));a&&c.html5[a]!==g?d=c.html5[a]&&!ha(a):(b="audio/"+a,d=c.html5.canPlayType({type:b}),
d=(c.html5[a]=d)&&c.html5[b]&&!ha(b));return d};jb=function(){function b(a){var b,e=b=!1;if(!d||"function"!==typeof d.canPlayType)return b;if(a instanceof Array){k=0;for(b=a.length;k<b;k++)if(c.html5[a[k]]||d.canPlayType(a[k]).match(c.html5Test))e=!0,c.html5[a[k]]=!0,c.flash[a[k]]=!!a[k].match(pb);b=e}else a=d&&"function"===typeof d.canPlayType?d.canPlayType(a):!1,b=!(!a||!a.match(c.html5Test));return b}if(!c.useHTML5Audio||!c.hasHTML5)return u=c.html5.usingFlash=!0,!1;var d=Audio!==g?Sa&&10>opera.version()?
new Audio(null):new Audio:null,e,a,f={},h,k;h=c.audioFormats;for(e in h)if(h.hasOwnProperty(e)&&(a="audio/"+e,f[e]=b(h[e].type),f[a]=f[e],e.match(pb)?(c.flash[e]=!0,c.flash[a]=!0):(c.flash[e]=!1,c.flash[a]=!1),h[e]&&h[e].related))for(k=h[e].related.length-1;0<=k;k--)f["audio/"+h[e].related[k]]=f[e],c.html5[h[e].related[k]]=f[e],c.flash[h[e].related[k]]=f[e];f.canPlayType=d?b:null;c.html5=A(c.html5,f);c.html5.usingFlash=hb();u=c.html5.usingFlash;return!0};z={notReady:"Unavailable - wait until onready() has fired.",
notOK:"Audio support is not available.",domError:"soundManagerexception caught while appending SWF to DOM.",spcWmode:"Removing wmode, preventing known SWF loading issue(s)",swf404:"soundManager: Verify that %s is a valid path.",tryDebug:"Try soundManager.debugFlash = true for more security details (output goes to SWF.)",checkSWF:"See SWF output for more debug info.",localFail:"soundManager: Non-HTTP page ("+m.location.protocol+" URL?) Review Flash player security settings for this special case:\nhttp://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html\nMay need to add/allow path, eg. c:/sm2/ or /users/me/sm2/",
waitFocus:"soundManager: Special case: Waiting for SWF to load with window focus...",waitForever:"soundManager: Waiting indefinitely for Flash (will recover if unblocked)...",waitSWF:"soundManager: Waiting for 100% SWF load...",needFunction:"soundManager: Function object expected for %s",badID:'Sound ID "%s" should be a string, starting with a non-numeric character',currentObj:"soundManager: _debug(): Current sound objects",waitOnload:"soundManager: Waiting for window.onload()",docLoaded:"soundManager: Document already loaded",
onload:"soundManager: initComplete(): calling soundManager.onload()",onloadOK:"soundManager.onload() complete",didInit:"soundManager: init(): Already called?",secNote:"Flash security note: Network/internet URLs will not load due to security restrictions. Access can be configured via Flash Player Global Security Settings Page: http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html",badRemove:"soundManager: Failed to remove Flash node.",shutdown:"soundManager.disable(): Shutting down",
queue:"soundManager: Queueing %s handler",smError:"SMSound.load(): Exception: JS-Flash communication failed, or JS error.",fbTimeout:"No flash response, applying .swf_timedout CSS...",fbLoaded:"Flash loaded",fbHandler:"soundManager: flashBlockHandler()",manURL:"SMSound.load(): Using manually-assigned URL",onURL:"soundManager.load(): current URL already assigned.",badFV:'soundManager.flashVersion must be 8 or 9. "%s" is invalid. Reverting to %s.',as2loop:"Note: Setting stream:false so looping can work (flash 8 limitation)",
noNSLoop:"Note: Looping not implemented for MovieStar formats",needfl9:"Note: Switching to flash 9, required for MP4 formats.",mfTimeout:"Setting flashLoadTimeout = 0 (infinite) for off-screen, mobile flash case",needFlash:"soundManager: Fatal error: Flash is needed to play some required formats, but is not available.",gotFocus:"soundManager: Got window focus.",policy:"Enabling usePolicyFile for data access",setup:"soundManager.setup(): allowed parameters: %s",setupError:'soundManager.setup(): "%s" cannot be assigned with this method.',
setupUndef:'soundManager.setup(): Could not find option "%s"',setupLate:"soundManager.setup(): url, flashVersion and html5Test property changes will not take effect until reboot().",noURL:"soundManager: Flash URL required. Call soundManager.setup({url:...}) to get started.",sm2Loaded:"SoundManager 2: Ready. "+String.fromCharCode(10003),reset:"soundManager.reset(): Removing event callbacks",mobileUA:"Mobile UA detected, preferring HTML5 by default.",globalHTML5:"Using singleton HTML5 Audio() pattern for this device.",
ignoreMobile:"Ignoring mobile restrictions for this device."};t=function(){var b,c,e,a;b=kb.call(arguments);c=b.shift();if((a=z&&z[c]?z[c]:"")&&b&&b.length)for(c=0,e=b.length;c<e;c++)a=a.replace("%s",b[c]);return a};oa=function(b){8===n&&1<b.loops&&b.stream&&(p("as2loop"),b.stream=!1);return b};pa=function(b,d){b&&!b.usePolicyFile&&(b.onid3||b.usePeakData||b.useWaveformData||b.useEQData)&&(c._wD((d||"")+t("policy")),b.usePolicyFile=!0);return b};K=function(b){Ua&&console.warn!==g?console.warn(b):
c._wD(b)};xa=function(){return!1};Ga=function(b){for(var c in b)b.hasOwnProperty(c)&&"function"===typeof b[c]&&(b[c]=xa)};Ha=function(b){b===g&&(b=!1);(y||b)&&c.disable(b)};cb=function(b){var d=null;if(b)if(b.match(/\.swf(\?.*)?$/i)){if(d=b.substr(b.toLowerCase().lastIndexOf(".swf?")+4))return b}else b.lastIndexOf("/")!==b.length-1&&(b+="/");b=(b&&-1!==b.lastIndexOf("/")?b.substr(0,b.lastIndexOf("/")+1):"./")+c.movieURL;c.noSWFCache&&(b+="?ts="+(new Date).getTime());return b};Da=function(){n=parseInt(c.flashVersion,
10);8!==n&&9!==n&&(c._wD(t("badFV",n,8)),c.flashVersion=n=8);var b=c.debugMode||c.debugFlash?"_debug.swf":".swf";c.useHTML5Audio&&!c.html5Only&&c.audioFormats.mp4.required&&9>n&&(c._wD(t("needfl9")),c.flashVersion=n=9);c.version=c.versionNumber+(c.html5Only?" (HTML5-only mode)":9===n?" (AS3/Flash 9)":" (AS2/Flash 8)");8<n?(c.defaultOptions=A(c.defaultOptions,c.flash9Options),c.features.buffering=!0,c.defaultOptions=A(c.defaultOptions,c.movieStarOptions),c.filePatterns.flash9=new RegExp("\\.(mp3|"+
rb.join("|")+")(\\?.*)?$","i"),c.features.movieStar=!0):c.features.movieStar=!1;c.filePattern=c.filePatterns[8!==n?"flash9":"flash8"];c.movieURL=(8===n?"soundmanager2.swf":"soundmanager2_flash9.swf").replace(".swf",b);c.features.peakData=c.features.waveformData=c.features.eqData=8<n};ab=function(b,c){l&&l._setPolling(b,c)};Fa=function(){c.debugURLParam.test(ia)&&(c.setupOptions.debugMode=c.debugMode=!0);if(!E(c.debugID)){var b,d,e,a;if(!(!c.debugMode||E(c.debugID)||Ua&&c.useConsole&&c.consoleOnly)){b=
m.createElement("div");b.id=c.debugID+"-toggle";d={position:"fixed",bottom:"0px",right:"0px",width:"1.2em",height:"1.2em",lineHeight:"1.2em",margin:"2px",textAlign:"center",border:"1px solid #999",cursor:"pointer",background:"#fff",color:"#333",zIndex:10001};b.appendChild(m.createTextNode("-"));b.onclick=db;b.title="Toggle SM2 debug console";v.match(/msie 6/i)&&(b.style.position="absolute",b.style.cursor="hand");for(a in d)d.hasOwnProperty(a)&&(b.style[a]=d[a]);d=m.createElement("div");d.id=c.debugID;
d.style.display=c.debugMode?"block":"none";if(c.debugMode&&!E(b.id)){try{e=ma(),e.appendChild(b)}catch(f){throw Error(t("domError")+" \n"+f.toString());}e.appendChild(d)}}}};w=this.getSoundById;p=function(b,d){return b?c._wD(t(b),d):""};db=function(){var b=E(c.debugID),d=E(c.debugID+"-toggle");b&&(za?(d.innerHTML="+",b.style.display="none"):(d.innerHTML="-",b.style.display="block"),za=!za)};C=function(b,c,e){if(h.sm2Debugger!==g)try{sm2Debugger.handleEvent(b,c,e)}catch(a){return!1}return!0};U=function(){var b=
[];c.debugMode&&b.push("sm2_debug");c.debugFlash&&b.push("flash_debug");c.useHighPerformance&&b.push("high_performance");return b.join(" ")};Ja=function(){var b=t("fbHandler"),d=c.getMoviePercent(),e={type:"FLASHBLOCK"};c.html5Only||(c.ok()?(c.didFlashBlock&&c._wD(b+": Unblocked"),c.oMC&&(c.oMC.className=[U(),"movieContainer","swf_loaded"+(c.didFlashBlock?" swf_unblocked":"")].join(" "))):(u&&(c.oMC.className=U()+" movieContainer "+(null===d?"swf_timedout":"swf_error"),c._wD(b+": "+t("fbTimeout")+
(d?" ("+t("fbLoaded")+")":""))),c.didFlashBlock=!0,O({type:"ontimeout",ignoreInit:!0,error:e}),T(e)))};Ba=function(b,c,e){H[b]===g&&(H[b]=[]);H[b].push({method:c,scope:e||null,fired:!1})};O=function(b){b||(b={type:c.ok()?"onready":"ontimeout"});if(!q&&b&&!b.ignoreInit||"ontimeout"===b.type&&(c.ok()||y&&!b.ignoreInit))return!1;var d={success:b&&b.ignoreInit?c.ok():!y},e=b&&b.type?H[b.type]||[]:[],a=[],f,d=[d],g=u&&!c.ok();b.error&&(d[0].error=b.error);b=0;for(f=e.length;b<f;b++)!0!==e[b].fired&&a.push(e[b]);
if(a.length)for(b=0,f=a.length;b<f;b++)a[b].scope?a[b].method.apply(a[b].scope,d):a[b].method.apply(this,d),g||(a[b].fired=!0);return!0};R=function(){h.setTimeout(function(){c.useFlashBlock&&Ja();O();"function"===typeof c.onload&&(p("onload",1),c.onload.apply(h),p("onloadOK",1));c.waitForWindowLoad&&x.add(h,"load",R)},1)};Na=function(){if(G!==g)return G;var b=!1,c=navigator,e,a=h.ActiveXObject,f;try{f=c.plugins}catch(m){f=void 0}if(f&&f.length)(c=c.mimeTypes)&&c["application/x-shockwave-flash"]&&
c["application/x-shockwave-flash"].enabledPlugin&&c["application/x-shockwave-flash"].enabledPlugin.description&&(b=!0);else if(a!==g&&!v.match(/MSAppHost/i)){try{e=new a("ShockwaveFlash.ShockwaveFlash")}catch(k){e=null}b=!!e}return G=b};hb=function(){var b,d,e=c.audioFormats;Qa&&v.match(/os (1|2|3_0|3_1)\s/i)?(c.hasHTML5=!1,c.html5Only=!0,c.oMC&&(c.oMC.style.display="none")):c.useHTML5Audio&&(c.html5&&c.html5.canPlayType||(c._wD("SoundManager: No HTML5 Audio() support detected."),c.hasHTML5=!1),Ta&&
c._wD("soundManager: Note: Buggy HTML5 Audio in Safari on this OS X release, see https://bugs.webkit.org/show_bug.cgi?id=32159 - "+(G?"will use flash fallback for MP3/MP4, if available":" would use flash fallback for MP3/MP4, but none detected."),1));if(c.useHTML5Audio&&c.hasHTML5)for(d in da=!0,e)e.hasOwnProperty(d)&&e[d].required&&(c.html5.canPlayType(e[d].type)?c.preferFlash&&(c.flash[d]||c.flash[e[d].type])&&(b=!0):(da=!1,b=!0));c.ignoreFlash&&(b=!1,da=!0);c.html5Only=c.hasHTML5&&c.useHTML5Audio&&
!b;return!c.html5Only};ra=function(b){var d,e,a=0;if(b instanceof Array){d=0;for(e=b.length;d<e;d++)if(b[d]instanceof Object){if(c.canPlayMIME(b[d].type)){a=d;break}}else if(c.canPlayURL(b[d])){a=d;break}b[a].url&&(b[a]=b[a].url);b=b[a]}return b};eb=function(b){b._hasTimer||(b._hasTimer=!0,!va&&c.html5PollingInterval&&(null===ca&&0===qa&&(ca=setInterval(gb,c.html5PollingInterval)),qa++))};fb=function(b){b._hasTimer&&(b._hasTimer=!1,!va&&c.html5PollingInterval&&qa--)};gb=function(){var b;if(null===
ca||qa)for(b=c.soundIDs.length-1;0<=b;b--)c.sounds[c.soundIDs[b]].isHTML5&&c.sounds[c.soundIDs[b]]._hasTimer&&c.sounds[c.soundIDs[b]]._onTimer();else clearInterval(ca),ca=null};T=function(b){b=b!==g?b:{};"function"===typeof c.onerror&&c.onerror.apply(h,[{type:b.type!==g?b.type:null}]);b.fatal!==g&&b.fatal&&c.disable()};lb=function(){if(Ta&&Na()){var b=c.audioFormats,d,e;for(e in b)if(b.hasOwnProperty(e)&&("mp3"===e||"mp4"===e)&&(c._wD("soundManager: Using flash fallback for "+e+" format"),c.html5[e]=
!1,b[e]&&b[e].related))for(d=b[e].related.length-1;0<=d;d--)c.html5[b[e].related[d]]=!1}};this._setSandboxType=function(b){var d=c.sandbox;d.type=b;d.description=d.types[d.types[b]!==g?b:"unknown"];"localWithFile"===d.type?(d.noRemote=!0,d.noLocal=!1,p("secNote",2)):"localWithNetwork"===d.type?(d.noRemote=!1,d.noLocal=!0):"localTrusted"===d.type&&(d.noRemote=!1,d.noLocal=!1)};this._externalInterfaceOK=function(b){if(!c.swfLoaded){var d;C("swf",!0);C("flashtojs",!0);c.swfLoaded=!0;wa=!1;Ta&&lb();b&&
b.replace(/\+dev/i,"")===c.versionNumber.replace(/\+dev/i,"")?setTimeout(ya,N?100:1):(d='soundManager: Fatal: JavaScript file build "'+c.versionNumber+'" does not match Flash SWF build "'+b+'" at '+c.url+". Ensure both are up-to-date.",setTimeout(function(){throw Error(d);},0))}};na=function(b,d){function e(){var a=[],b,d=[];b="SoundManager "+c.version+(!c.html5Only&&c.useHTML5Audio?c.hasHTML5?" + HTML5 audio":", no HTML5 audio support":"");c.html5Only?c.html5PollingInterval&&a.push("html5PollingInterval ("+
c.html5PollingInterval+"ms)"):(c.preferFlash&&a.push("preferFlash"),c.useHighPerformance&&a.push("useHighPerformance"),c.flashPollingInterval&&a.push("flashPollingInterval ("+c.flashPollingInterval+"ms)"),c.html5PollingInterval&&a.push("html5PollingInterval ("+c.html5PollingInterval+"ms)"),c.wmode&&a.push("wmode ("+c.wmode+")"),c.debugFlash&&a.push("debugFlash"),c.useFlashBlock&&a.push("flashBlock"));a.length&&(d=d.concat([a.join(" + ")]));c._wD(b+(d.length?" + "+d.join(", "):""),1);mb()}function a(a,
b){return'<param name="'+a+'" value="'+b+'" />'}if(W&&X)return!1;if(c.html5Only)return Da(),e(),c.oMC=E(c.movieID),ya(),X=W=!0,!1;var f=d||c.url,h=c.altURL||f,k=ma(),l=U(),n=null,n=m.getElementsByTagName("html")[0],p,r,q,n=n&&n.dir&&n.dir.match(/rtl/i);b=b===g?c.id:b;Da();c.url=cb(ga?f:h);d=c.url;c.wmode=!c.wmode&&c.useHighPerformance?"transparent":c.wmode;null!==c.wmode&&(v.match(/msie 8/i)||!N&&!c.useHighPerformance)&&navigator.platform.match(/win32|win64/i)&&(L.push(z.spcWmode),c.wmode=null);k=
{name:b,id:b,src:d,quality:"high",allowScriptAccess:c.allowScriptAccess,bgcolor:c.bgColor,pluginspage:vb+"www.macromedia.com/go/getflashplayer",title:"JS/Flash audio component (SoundManager 2)",type:"application/x-shockwave-flash",wmode:c.wmode,hasPriority:"true"};c.debugFlash&&(k.FlashVars="debug=1");c.wmode||delete k.wmode;if(N)f=m.createElement("div"),r=['<object id="'+b+'" data="'+d+'" type="'+k.type+'" title="'+k.title+'" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0">',
a("movie",d),a("AllowScriptAccess",c.allowScriptAccess),a("quality",k.quality),c.wmode?a("wmode",c.wmode):"",a("bgcolor",c.bgColor),a("hasPriority","true"),c.debugFlash?a("FlashVars",k.FlashVars):"","</object>"].join("");else for(p in f=m.createElement("embed"),k)k.hasOwnProperty(p)&&f.setAttribute(p,k[p]);Fa();l=U();if(k=ma())if(c.oMC=E(c.movieID)||m.createElement("div"),c.oMC.id)q=c.oMC.className,c.oMC.className=(q?q+" ":"movieContainer")+(l?" "+l:""),c.oMC.appendChild(f),N&&(p=c.oMC.appendChild(m.createElement("div")),
p.className="sm2-object-box",p.innerHTML=r),X=!0;else{c.oMC.id=c.movieID;c.oMC.className="movieContainer "+l;p=l=null;c.useFlashBlock||(c.useHighPerformance?l={position:"fixed",width:"8px",height:"8px",bottom:"0px",left:"0px",overflow:"hidden"}:(l={position:"absolute",width:"6px",height:"6px",top:"-9999px",left:"-9999px"},n&&(l.left=Math.abs(parseInt(l.left,10))+"px")));ub&&(c.oMC.style.zIndex=1E4);if(!c.debugFlash)for(q in l)l.hasOwnProperty(q)&&(c.oMC.style[q]=l[q]);try{N||c.oMC.appendChild(f),
k.appendChild(c.oMC),N&&(p=c.oMC.appendChild(m.createElement("div")),p.className="sm2-object-box",p.innerHTML=r),X=!0}catch(u){throw Error(t("domError")+" \n"+u.toString());}}W=!0;e();return!0};la=function(){if(c.html5Only)return na(),!1;if(l)return!1;if(!c.url)return p("noURL"),!1;l=c.getMovie(c.id);l||(aa?(N?c.oMC.innerHTML=Ia:c.oMC.appendChild(aa),aa=null,W=!0):na(c.id,c.url),l=c.getMovie(c.id));"function"===typeof c.oninitmovie&&setTimeout(c.oninitmovie,1);Oa();return!0};S=function(){setTimeout($a,
1E3)};Ca=function(){h.setTimeout(function(){K("soundManager: useFlashBlock is false, 100% HTML5 mode is possible. Rebooting with preferFlash: false...");c.setup({preferFlash:!1}).reboot();c.didFlashBlock=!0;c.beginDelayedInit()},1)};$a=function(){var b,d=!1;c.url&&!ba&&(ba=!0,x.remove(h,"load",S),G&&wa&&!Va?p("waitFocus"):(q||(b=c.getMoviePercent(),0<b&&100>b&&(d=!0)),setTimeout(function(){b=c.getMoviePercent();d?(ba=!1,c._wD(t("waitSWF")),h.setTimeout(S,1)):(q||(c._wD("soundManager: No Flash response within expected time. Likely causes: "+
(0===b?"SWF load failed, ":"")+"Flash blocked or JS-Flash security error."+(c.debugFlash?" "+t("checkSWF"):""),2),!ga&&b&&(p("localFail",2),c.debugFlash||p("tryDebug",2)),0===b&&c._wD(t("swf404",c.url),1),C("flashtojs",!1,": Timed out"+(ga?" (Check flash security or flash blockers)":" (No plugin/missing SWF?)"))),!q&&ob&&(null===b?c.useFlashBlock||0===c.flashLoadTimeout?(c.useFlashBlock&&Ja(),p("waitForever")):!c.useFlashBlock&&da?Ca():(p("waitForever"),O({type:"ontimeout",ignoreInit:!0,error:{type:"INIT_FLASHBLOCK"}})):
0===c.flashLoadTimeout?p("waitForever"):!c.useFlashBlock&&da?Ca():Ha(!0)))},c.flashLoadTimeout)))};ka=function(){if(Va||!wa)return x.remove(h,"focus",ka),!0;Va=ob=!0;p("gotFocus");ba=!1;S();x.remove(h,"focus",ka);return!0};Oa=function(){L.length&&(c._wD("SoundManager 2: "+L.join(" "),1),L=[])};mb=function(){Oa();var b,d=[];if(c.useHTML5Audio&&c.hasHTML5){for(b in c.audioFormats)c.audioFormats.hasOwnProperty(b)&&d.push(b+" = "+c.html5[b]+(!c.html5[b]&&u&&c.flash[b]?" (using flash)":c.preferFlash&&
c.flash[b]&&u?" (preferring flash)":c.html5[b]?"":" ("+(c.audioFormats[b].required?"required, ":"")+"and no flash support)"));c._wD("SoundManager 2 HTML5 support: "+d.join(", "),1)}};Y=function(b){if(q)return!1;if(c.html5Only)return p("sm2Loaded",1),q=!0,R(),C("onload",!0),!0;var d=!0,e;c.useFlashBlock&&c.flashLoadTimeout&&!c.getMoviePercent()||(q=!0);e={type:!G&&u?"NO_FLASH":"INIT_TIMEOUT"};c._wD("SoundManager 2 "+(y?"failed to load":"loaded")+" ("+(y?"Flash security/load error":"OK")+") "+String.fromCharCode(y?
10006:10003),y?2:1);y||b?(c.useFlashBlock&&c.oMC&&(c.oMC.className=U()+" "+(null===c.getMoviePercent()?"swf_timedout":"swf_error")),O({type:"ontimeout",error:e,ignoreInit:!0}),C("onload",!1),T(e),d=!1):C("onload",!0);y||(c.waitForWindowLoad&&!ja?(p("waitOnload"),x.add(h,"load",R)):(c.waitForWindowLoad&&ja&&p("docLoaded"),R()));return d};Za=function(){var b,d=c.setupOptions;for(b in d)d.hasOwnProperty(b)&&(c[b]===g?c[b]=d[b]:c[b]!==d[b]&&(c.setupOptions[b]=c[b]))};ya=function(){if(q)return p("didInit"),
!1;if(c.html5Only)return q||(x.remove(h,"load",c.beginDelayedInit),c.enabled=!0,Y()),!0;la();try{l._externalInterfaceTest(!1),ab(!0,c.flashPollingInterval||(c.useHighPerformance?10:50)),c.debugMode||l._disableDebug(),c.enabled=!0,C("jstoflash",!0),c.html5Only||x.add(h,"unload",xa)}catch(b){return c._wD("js/flash exception: "+b.toString()),C("jstoflash",!1),T({type:"JS_TO_FLASH_EXCEPTION",fatal:!0}),Ha(!0),Y(),!1}Y();x.remove(h,"load",c.beginDelayedInit);return!0};P=function(){if(Z)return!1;Z=!0;Za();
Fa();!G&&c.hasHTML5&&(c._wD("SoundManager 2: No Flash detected"+(c.useHTML5Audio?". Trying HTML5-only mode.":", enabling HTML5."),1),c.setup({useHTML5Audio:!0,preferFlash:!1}));jb();!G&&u&&(L.push(z.needFlash),c.setup({flashLoadTimeout:1}));m.removeEventListener&&m.removeEventListener("DOMContentLoaded",P,!1);la();return!0};La=function(){"complete"===m.readyState&&(P(),m.detachEvent("onreadystatechange",La));return!0};Ea=function(){ja=!0;P();x.remove(h,"load",Ea)};Na();x.add(h,"focus",ka);x.add(h,
"load",S);x.add(h,"load",Ea);m.addEventListener?m.addEventListener("DOMContentLoaded",P,!1):m.attachEvent?m.attachEvent("onreadystatechange",La):(C("onload",!1),T({type:"NO_DOM2_EVENTS",fatal:!0}))}if(!h||!h.document)throw Error("SoundManager requires a browser with window and document objects.");var V=null;h.SM2_DEFER!==g&&SM2_DEFER||(V=new J);"object"===typeof module&&module&&"object"===typeof module.exports?(module.exports.SoundManager=J,module.exports.soundManager=V):"function"===typeof define&&
define.amd&&define(function(){return{constructor:J,getInstance:function(g){!h.soundManager&&g instanceof Function&&(g=g(J),g instanceof J&&(h.soundManager=g));return h.soundManager}}});h.SoundManager=J;h.soundManager=V})(window);

File diff suppressed because one or more lines are too long

View File

@ -1,6 +1,22 @@
; Registar App Settings
; Register App Settings
[App]
api_client_name = Your application name
api_client_website = https://example.com/
who_to_follow_provider = https://vinayaka.distsn.org/cgi-bin/vinayaka-user-match-osa-api.cgi?{{host}}+{{user}}
default_language = en_US
; Media embed settings
; YouPlay resolves YouTube MP4s on your server and sends this link to the user for privacy-friendly watching
; Vimeo embeds work in the same way as YouPlay embeds here because the official players contain too much spyware
[Media]
youplay = true
vimeo = true
; The proxy can be used optionally to resolve data for privacy-friendly media embeds on the server side - It is not used for Mastodon API requests on login
; Proxy type can be set to none, socks5, socks4, http or https - Example settings for locally installed Tor client
[Proxy]
type = socks5
domain = 127.0.0.1
port = 9050
username =
password =

View File

@ -5,3 +5,4 @@ ja_JP.EUC-JP EUC-JP
ko_KR.UTF-8 UTF-8
pl_PL.UTF-8 UTF-8
gl_ES.UTF-8 UTF-8
it_IT.UTF-8 UTF-8

View File

@ -34,6 +34,8 @@ echo '<link rel="stylesheet" href="/assets/css/dark.css" media="all">';
<script src="/assets/js/pomo/pomo.js"></script>
<script src="/assets/js/twemoji/twemoji.min.js"></script>
<script src="/assets/js/clipboard.js/clipboard.min.js"></script>
<script src="/assets/js/player/soundmanager.js"></script>
<script src="/assets/js/player/audio.js"></script>
<script>
if(!localStorage.getItem("current_id") | !localStorage.getItem("current_instance") | !localStorage.getItem("current_authtoken")) {
location.href = "/login";
@ -63,6 +65,8 @@ else if($.cookie("session") === undefined) {
resetApp();
}
}
server_setting_youplay = <?=$config["Media"]["youplay"] ? "true" : "false"?>;
server_setting_vimeo = <?=$config["Media"]["vimeo"] ? "true" : "false"?>;
</script>
</head>
<body>
@ -111,7 +115,7 @@ resetApp();
<ul class="header_nav_list">
<li class="header_nav_item search_form_wrap">
<form class="search_form" action="/search" method="GET">
<input id="search_form" class="search_form_input" placeholder="<?=_('Search Mastodon')?>" type="text" name="q" accesskey="/" autocomplete="off">
<input id="search_form" class="search_form_input" placeholder="<?=_('Search Mastodon')?>" type="text" name="q" accesskey="/">
<span class="search_form_submit">
<button type="submit">
<i class="fa fa-fw fa-search"></i>

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,652 @@
# Sylke Vicious <silkevicious@tuta.io>, 2018. #zanata
# Niklas Poslovski <ni.pos@yandex.com>, 2019. #zanata
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-09-30 09:53+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"PO-Revision-Date: 2019-01-13 02:37+0000\n"
"Last-Translator: Sylke Vicious <silkevicious@tuta.io>\n"
"Language-Team: Italian\n"
"Language: it\n"
"X-Generator: Zanata 4.6.2\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
msgid "Language"
msgstr "Lingua"
msgid "Language_en_US"
msgstr "English"
msgid "Language_de_DE"
msgstr "German"
msgid "Language_ja_JP"
msgstr "Japanese"
msgid "Language_ko_KR"
msgstr "Korean"
msgid "Language_pl_PL"
msgstr "Polish"
msgid "Language_pt_BR"
msgstr "Portuguese (Brazil)"
msgid "Language_gl_ES"
msgstr "Galician"
msgid "Sensitive content"
msgstr "Contenuto sensibile"
msgid "Click to view"
msgstr "Clicca per vedere"
msgid "SHOW MORE"
msgstr "MOSTRA DI PIÙ"
msgid "SHOW LESS"
msgstr "MOSTRA DI MENO"
msgid "Public"
msgstr "Pubblico"
msgid "Unlisted"
msgstr "Non elencato"
msgid "Followers-only"
msgstr "Solo seguaci"
msgid "Direct"
msgstr "Diretto"
msgid "Delete Toot"
msgstr "Elimina Toot"
msgid "Unpin Toot"
msgstr "Non fissare più questo Toot"
msgid "Pin Toot"
msgstr "Fissa Toot in alto"
msgid "Mute"
msgstr "Silenzia"
msgid "Block"
msgstr "Blocca"
msgid "Report this Toot"
msgstr "Segnala questo Toot"
msgid "Copy link to Toot"
msgstr "Copia il collegamento del Toot"
msgid "View original"
msgstr "Vedi originale"
msgid "Boosted"
msgstr "Boostato"
msgid "Pinned Toot"
msgstr "Toot Fissato"
msgid "favourited Your Toot"
msgstr "ha messo il tuo Toot nei preferiti"
msgid "boosted Your Toot"
msgstr "ha condiviso il tuo Toot"
msgid "followed you"
msgstr "ti segue"
msgid "Follow"
msgstr "Segui"
msgid "Toot your reply"
msgstr "Toota la tua risposta"
msgid "Reply"
msgstr "Rispondi"
msgid "Content warning"
msgstr "Contenuto sensibile"
msgid "Jan"
msgstr "Gen"
msgid "Feb"
msgstr "Feb"
msgid "Mar"
msgstr "Mar"
msgid "Apr"
msgstr "Apr"
msgid "May"
msgstr "Mag"
msgid "Jun"
msgstr "Giu"
msgid "Jul"
msgstr "Lug"
msgid "Aug"
msgstr "Ago"
msgid "Sep"
msgstr "Set"
msgid "Oct"
msgstr "Ott"
msgid "Nov"
msgstr "Nov"
msgid "Dec"
msgstr "Dic"
msgid "Changed setting to"
msgstr "Cambiate impostazioni in"
msgid "Mark as NSFW by default enabled"
msgstr "Segna come NSFW come predefinito abilitato"
msgid "Mark as NSFW by default disabled"
msgstr "Segna come NSFW come predefinito disabilitato"
msgid "Who to follow enabled"
msgstr "Chi seguire abilitato"
msgid "Who to follow disabled"
msgstr "Chi seguire disabilitato"
msgid "Changed about me setting"
msgstr "Cambiate impostazioni Su di me"
msgid "Uploaded new avatar"
msgstr "Caricata una nuova immagine di profilo"
msgid "Uploaded new header"
msgstr "Caricata una nuova immagine di copertina"
msgid "Account locked"
msgstr "Account bloccato"
msgid "Account unlocked"
msgstr "Account sbloccato"
msgid "Link previews enabled"
msgstr "Anteprime dei collegamenti abilitate"
msgid "Link previews disabled"
msgstr "Anteprime dei collegamenti disabilitate"
msgid "You didn't allow notifications"
msgstr "Non hai consentito le notifiche"
msgid "Desktop notifications enabled"
msgstr "Notifiche desktop abilitate"
msgid "Desktop notifications disabled"
msgstr "Notifiche desktop disabilitate"
msgid "Replies shown"
msgstr "Risposte mostrate"
msgid "Replies hidden"
msgstr "Risposte nascoste"
msgid "CW content shown"
msgstr "Contenuto sensibile mostrato"
msgid "CW content hidden"
msgstr "Contenuto sensibile nascosto"
msgid "NSFW content shown"
msgstr "Contenuto NSFW mostrato"
msgid "NSFW content hidden"
msgstr "Contenuto NSFW nascosto"
msgid "Reply to"
msgstr "Rispondi a"
msgid "Report"
msgstr "Segnala"
msgid "Report a Toot of"
msgstr "Segnala Toot di"
msgid "What's happening?"
msgstr "Cosa succede?"
msgid "Toot"
msgstr "Toot"
msgid "Compose new Toot"
msgstr "Componi un nuovo Toot"
msgid "Please describe what the problem with the Toot is."
msgstr "Per favore descrivi qual è il problema di questo Toot"
msgid "TOOTS"
msgstr "TOOTS"
msgid "PEOPLE"
msgstr "PERSONE"
msgid "Settings"
msgstr "Impostazioni"
msgid "GENERAL"
msgstr "GENERALE"
msgid "PROFILE"
msgstr "PROFILO"
msgid "APPEARANCE"
msgstr "INTERFACCIA"
msgid "Change instance"
msgstr "Cambia istanza"
msgid "Blank for default"
msgstr "Predefinito vuoto"
msgid "FOLLOWING"
msgstr "SEGUI"
msgid "Interesting accounts of devs"
msgstr "Account interessanti degli sviluppatori"
msgid "Halcyon for"
msgstr "Halcyon per"
msgid "About"
msgstr "A proposito di"
msgid "Terms"
msgstr "Termini"
msgid "Apps"
msgstr "Apps"
msgid "Source code"
msgstr "Codice sorgente"
msgid "Other instances"
msgstr "Altre istanze"
msgid "Privacy policy"
msgstr "Regole sulla Privacy"
msgid "Version"
msgstr "Versione"
msgid "Who to follow"
msgstr "Chi seguire"
msgid "Enable who to follow"
msgstr "Abilita Chi seguire"
msgid ""
"Halcyon needs to connect to an external server to get a list of users which "
"have similar interests as you. If you want to use this feature, please opt-"
"in."
msgstr ""
"Halcyon deve connettersi ad un server esterno per ottenere una lista di "
"utenti che hanno interessi simili a te. Se vuoi utilizzare questa funzione, "
"per favore abilitala."
msgid "MORE"
msgstr "DI PIÙ"
msgid "FOLLOWERS"
msgstr "SEGUACI"
msgid "Following"
msgstr "Seguendo"
msgid "You'll no longer receive notifications from this user"
msgstr "Non riceverai più notifiche da questo utente"
msgid "Unmuted this user"
msgstr "Non silenziare più questo utente"
msgid "This user has been blocked"
msgstr "Questo utente è stato bloccato"
msgid "Unblocked this user"
msgstr "Utente sbloccato"
msgid "Your Toot has been deleted"
msgstr "Il tuo Toot è stato eliminato"
msgid "Your Toot has been pinned"
msgstr "Il tuo Toot è stato fissato in alto"
msgid "Your Toot has been unpinned"
msgstr "Il tuo Toot non è più fissato in alto"
msgid "Edit profile"
msgstr "Modifica profilo"
msgid "FAVOURITES"
msgstr "PREFERITI"
msgid "Show"
msgstr "Mostra"
msgid "Blocking"
msgstr "Bloccati"
msgid "Muting"
msgstr "Silenziati"
msgid "Requested"
msgstr "Richieste"
msgid "Photos and toots"
msgstr "Foto e toot"
msgid "favourited your toot"
msgstr "ha messo nei preferiti il tuo toot"
msgid "boosted your toot"
msgstr "ha boostato il tuo toot"
msgid "mentioned you"
msgstr "ti ha menzionato"
msgid "Your Toot was posted!"
msgstr "Il tuo Toot è stato pubblicato!"
msgid "News"
msgstr "Novità"
msgid "Source"
msgstr "Codice Sorgente"
msgid "Privacy"
msgstr "Privacy"
msgid "Imprint"
msgstr "Imprint"
msgid "Contact"
msgstr "Contatti"
msgid "Login"
msgstr "Accedi"
msgid "Login to Halcyon"
msgstr "Accedi ad Halcyon"
msgid "create an account"
msgstr "crea un account"
msgid "or"
msgstr "o"
msgid "I agree with the"
msgstr "Sono d'accordo con"
msgid "What is Halcyon"
msgstr "Cos'è Halcyon"
msgid ""
"which aims to recreate the simple and beautiful user interface of Twitter "
"while keeping all advantages of decentral networks in focus."
msgstr ""
"che ha l'obbiettivo di ricreare l'interfaccia utente semplice e carina di "
"Twitter mantenendo tutti i vantaggi delle reti decentralizzate."
msgid "Halcyon is a webclient for"
msgstr "Halcyon è un client web per"
msgid "Contact / Feedback"
msgstr "Contattaci / Dacci la tua opinione"
msgid "Use my contact form"
msgstr "Usa il mio modulo di contatto"
msgid "Help us"
msgstr "Aiutaci"
msgid "Halcyon Terms of Use"
msgstr "Termini di utilizzo di Halcyon"
msgid ""
"This terms of use agreement is for the users of web service Halcyon for "
"Mastodon and Pleroma (Halcyon for short) hosted at"
msgstr ""
"Questi termini di utilizzo riguardano gli utenti del servizio web Halcyon "
"per Mastodon e Pleroma (abbreviato Halcyon) ospitato su"
msgid "Your Reply was posted!"
msgstr "La tua risposta è stata pubblicata!"
msgid "Toot reported successfully!"
msgstr "Toot segnalato con successo!"
msgid "Link successfully copied!"
msgstr "Collegamento copiato con successo!"
msgid "Home"
msgstr "Home"
msgid "Local"
msgstr "Locale"
msgid "Federated"
msgstr "Federata"
msgid "Notifications"
msgstr "Notifiche"
msgid "Search Mastodon"
msgstr "Cerca Mastodon"
msgid "View profile"
msgstr "Vedi profilo"
msgid "Log out"
msgstr "Disconnettiti"
msgid "All"
msgstr "Tutto"
msgid "new notitification"
msgstr "nuova notifica"
msgid "Show all NSFW content"
msgstr "Mostra tutto il contenuto NSFW"
msgid "Show all CW content"
msgstr "Mostra tutto il contenuto CW"
msgid "Show replies"
msgstr "Mostra risposte"
msgid "Desktop notifications"
msgstr "Notifiche desktop"
msgid "Enable link previews"
msgstr "Abilita anteprime dei collegamenti"
msgid "Auto update"
msgstr "Auto aggiorna"
msgid "Manual update"
msgstr "Aggiornamento manuale"
msgid "Appearance settings"
msgstr "Impostazioni di visualizzazione"
msgid "New posts streaming"
msgstr "Streaming dei nuovi post"
msgid "replies"
msgstr "risposte"
msgid "General settings"
msgstr "Impostazioni generali"
msgid "Default post privacy"
msgstr "Privacy predefinita dei post"
msgid "Mark as NSFW by default"
msgstr "Segna come NSFW in modo predefinito"
msgid "Media"
msgstr "Media"
msgid "FOLLOWS YOU"
msgstr "TI SEGUONO"
msgid "Local instance"
msgstr "Istanza locale"
msgid "Hashtag search filter"
msgstr "Filtri di ricerca per hashtag"
msgid "All instances"
msgstr "Tutte le istanze"
msgid "Local only"
msgstr "Solo in locale"
msgid "Lock account"
msgstr "Blocca account"
msgid "Header"
msgstr "Immagine di copertina"
msgid "Avatar"
msgstr "Immagine di profilo"
msgid "About me"
msgstr "Su di me"
msgid "Display name"
msgstr "Nome visualizzato"
msgid "Profile settings"
msgstr "Impostazioni del profilo"
msgid "Toots"
msgstr "Toot"
msgid "Favourites"
msgstr "Preferiti"
msgid "New favourite"
msgstr "Nuovo preferito"
msgid "New boost"
msgstr "Nuovo boost"
msgid "New follower"
msgstr "Nuovo seguace"
msgid "New mention"
msgstr "Nuova menzione"
msgid "Dark theme enabled"
msgstr "Tema scuro abilitato"
msgid "Dark theme disabled"
msgstr "Tema scuro disabilitato"
msgid "Only on top"
msgstr "Solo in cima"
msgid "Enable dark theme"
msgstr "Abilita tema scuro"
msgid "Please enter the new name for this list."
msgstr "Per favore inserisci il nuovo nome per questa lista."
msgid "The name of your list can't be empty!"
msgstr "Il nome della tua lista non può essere vuoto!"
msgid "Your list has been renamed"
msgstr "La tua lista è stata rinominata"
msgid "Are you sure that you want to delete this list?"
msgstr "Sei sicuro di voler eliminare questa lista?"
msgid "Your list has been deleted"
msgstr "La tua lista è stata eliminata"
msgid "Please enter the name of your new list."
msgstr "Per favore inserisci il nome della tua nuova lista."
msgid "Add"
msgstr "Aggiungi"
msgid "Remove"
msgstr "Rimuovi"
msgid "Add to list"
msgstr "Aggiungi alla lista"
msgid "Are you sure that you want to mute this user?"
msgstr "Sei sicuro di voler silenziare questo utente?"
msgid "Are you sure that you want to block this user?"
msgstr "Sei sicuro di voler bloccare questo utente?"
msgid "Are you sure that you want to delete this toot?"
msgstr "Sei sicuro di voler eliminare questo toot?"
msgid "Added this account to the list"
msgstr "Questo account è stato aggiunto alla lista"
msgid ""
"You need to follow this user to add him/her to the list. Do you want to do "
"that now?"
msgstr ""
"Devi seguire questo utente per aggiungerlo/a alla lista. Vuoi farlo ora?"
msgid "You successfully followed this user."
msgstr "Hai iniziato a seguire questo utente."
msgid "Removed this account from the list"
msgstr "Hai rimosso questo account dalla lista"
msgid "Joined at"
msgstr "Iscritto a"
msgid "Direct messages"
msgstr "Messaggi diretti"
msgid "Lists"
msgstr "Liste"
msgid "Open public profile"
msgstr "Apri profilo pubblico"
msgid "My Lists"
msgstr "Le mie liste"
msgid "Confirmation"
msgstr "Conferma"
msgid "Yes"
msgstr "Si"
msgid "Cancel"
msgstr "Annulla"
msgid "Prompt"
msgstr "Chiedi"
msgid "Ok"
msgstr "Ok"

View File

@ -45,6 +45,13 @@ localStorage.setItem('setting_show_bots', 'true');
localStorage.setItem('setting_show_content_warning', 'false');
localStorage.setItem('setting_show_nsfw', 'false');
localStorage.setItem('setting_compose_autocomplete', 'true');
localStorage.setItem('setting_play_gif','true');
localStorage.setItem('setting_play_video','true');
localStorage.setItem('setting_play_audio','true');
localStorage.setItem('setting_play_peertube','true');
localStorage.setItem('setting_play_youplay','false');
localStorage.setItem('setting_play_invidious','false');
localStorage.setItem('setting_play_vimeo','false');
localStorage.setItem('setting_post_privacy','".$profile["source"]["privacy"]."');
localStorage.setItem('setting_post_sensitive','".$profile["source"]["sensitive"]."');
$.cookie('darktheme','false',{path:'/',expires:3650});

22
media/video.php Normal file
View File

@ -0,0 +1,22 @@
<?php
if(!isset($_COOKIE["session"]) || $_COOKIE["session"] != "true") {
http_response_code(403);
die('Forbidden');
}
?>
<!DOCTYPE html>
<html lang="en" style="height:100%">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script src="/assets/js/player/youplay.js"></script>
</head>
<body style="margin:0;height:100%;overflow:hidden">
<video class="video-js vjs-default-skin" controls id="player" poster="<?=htmlspecialchars($_GET["preview"])?>" style="width:100%;height:100%">
Your browser does not support the video tag.
</video>
<script>
yp_player({share:false,use_desktop_skin:true,sources:[{src:"<?=htmlspecialchars($_GET["url"])?>",label:"Video",audio:true}]});
</script>
</body>
</html>

38
media/vimeo.php Normal file
View File

@ -0,0 +1,38 @@
<?php
$config = parse_ini_file('../config/config.ini',true);
if(!isset($_COOKIE["session"]) || $_COOKIE["session"] != "true" || !$config["Media"]["vimeo"]) {
http_response_code(403);
die('Forbidden');
}
?>
<!DOCTYPE html>
<html lang="en" style="height:100%">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script src="/assets/js/player/youplay.js"></script>
</head>
<body style="margin:0;height:100%;overflow:hidden">
<?php
include("vimeoclass.php");
$vdata = vimeo(htmlspecialchars($_GET["id"]));
if($vdata) {
$vlink = $vdata["dl"];
?>
<video class="video-js vjs-default-skin" controls id="player" poster="<?=$vdata["info"]["Thumbnail"]?>" title="<?=$vdata["info"]["Title"]?>" style="width:100%;height:100%">
Your browser does not support the video tag.
</video>
<script>
yp_player({share:false,use_desktop_skin:true,sources:[
<?php
for($i=0;$i<count($vlink);$i++) {
echo "{src:'".$vlink[$i]["url"]."',label:'".$vlink[$i]["type"]."',audio:true},";
}
?>
]});
</script>
<?php } else { ?>
Sorry, there was an error while trying to load your video.
<?php } ?>
</body>
</html>

45
media/vimeoclass.php Normal file
View File

@ -0,0 +1,45 @@
<?php
function curl_load($url) {
if(in_array('curl', get_loaded_extensions())){
$appSettings = parse_ini_file('../config/config.ini',true);
$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_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
if($appSettings["Proxy"]["type"]) {
curl_setopt($ch, CURLOPT_PROXY, $appSettings["Proxy"]["type"]."://".$appSettings["Proxy"]["domain"].":".$appSettings["Proxy"]["port"]);
curl_setopt($ch, CURLOPT_PROXYUSERPWD, $appSettings["Proxy"]["username"].":".$appSettings["Proxy"]["password"]);
}
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
$result = curl_exec($ch);
curl_close($ch);
return $result;
}
}
function vimeo($id) {
$data = curl_load("https://www.vimeo.com/".$id);
if(!strstr($data,"window.vimeo.exception_data")) {
$data = stristr($data, 'config_url":"');
$start = substr($data, strlen('config_url":"'));
$stop = stripos($start, ',');
$str = substr($start, 0, $stop);
$data = json_decode(curl_load(rtrim(str_replace("\\", "", $str), '"')));
$info = array();
$info["info"] = array();
$info["info"]["Title"] = $data->video->title;
$info["info"]["Thumbnail"] = $data->video->thumbs->base;
$info["dl"] = array();
for($i=0;$i<count($data->request->files->progressive);$i++) {
$xinfo = array();
$xinfo["url"] = $data->request->files->progressive[$i]->url;
$xinfo["type"] = $data->request->files->progressive[$i]->quality;
array_push($info["dl"],$xinfo);
}
return $info;
}
else {
return false;
}
}
?>

50
media/youplay.php Normal file
View File

@ -0,0 +1,50 @@
<?php
$config = parse_ini_file('../config/config.ini',true);
if(!isset($_COOKIE["session"]) || $_COOKIE["session"] != "true" || !$config["Media"]["youplay"]) {
http_response_code(403);
die('Forbidden');
}
?>
<!DOCTYPE html>
<html lang="en" style="height:100%">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script src="/assets/js/player/youplay.js"></script>
</head>
<body style="margin:0;height:100%;overflow:hidden">
<?php
include("ytclass.php");
$ytclass = new YTDownloader();
$vdata = $ytclass->getDownloadLinks(htmlspecialchars($_GET["id"]));
if($vdata) {
$vlink = $vdata["dl"];
?>
<video class="video-js vjs-default-skin" controls id="player" poster="<?=$vdata["info"]["Thumbnail"]?>" title="<?=$vdata["info"]["Title"]?>" style="width:100%;height:100%">
Your browser does not support the video tag.
</video>
<script>
yp_player({share:false,use_desktop_skin:true,sources:[
<?php
$formats = array();
for($i=0;$i<count($vlink);$i++) {
if(!strstr($vlink[$i]["type"]," Only)")) {
array_push($formats,$vlink[$i]["type"]);
echo "{src:'".$vlink[$i]["url"]."',label:'".$vlink[$i]["type"]."',audio:true},";
}
else if(strstr($vlink[$i]["type"],"(Video Only)") && !in_array(substr($vlink[$i]["type"],13),$formats)) echo "{src:'".$vlink[$i]["url"]."',label:'".substr($vlink[$i]["type"],13)."',audio:false},";
}
?>
],audio_url:[
<?php
for($i=0;$i<count($vlink);$i++) {
if(strstr($vlink[$i]["type"],"(Audio Only)")) echo "'".$vlink[$i]["url"]."',";
}
?>
]});
</script>
<?php } else { ?>
Sorry, there was an error while trying to load your video.
<?php } ?>
</body>
</html>

255
media/ytclass.php Normal file
View File

@ -0,0 +1,255 @@
<?php
class YTDownloader {
private $cache_dir;
private $cookie_dir;
private $itag_info = array(
// Full Video
18 => "MP4[640x360]",
22 => "HD MP4[1280x720]",
36 => "3GP[320x180]",
43 => "WEBM[640x360]",
17 => "3GP[176x144]",
// DASH videos
137 => "(Video Only) MP4[1920x1080]",
248 => "(Video Only) WEBM[1920x1080]",
136 => "(Video Only) MP4[1280x720]",
247 => "(Video Only) WEBM[1280x720]",
135 => "(Video Only) MP4[854x480]",
244 => "(Video Only) WEBM[854x480]",
134 => "(Video Only) MP4[640x360]",
243 => "(Video Only) WEBM[640x360]",
133 => "(Video Only) MP4[320x240]",
242 => "(Video Only) WEBM[320x240]",
160 => "(Video Only) MP4[176x144]",
278 => "(Video Only) WEBM[176x144]",
// Dash Audios
140 => "(Audio Only) M4A[128Kbps]",
171 => "(Audio Only) WEBM[128Kbps]",
249 => "(Audio Only) WEBM[50Kbps]",
250 => "(Audio Only) WEBM[70Kbps]",
251 => "(Audio Only) WEBM[160Kbps]"
);
private $itag_ext = array(
// Full Video
18 => ".mp4",
22 => ".mp4",
36 => ".3gp",
43 => ".webm",
17 => ".3gp",
// DASH videos
137 => ".mp4",
248 => ".webm",
136 => ".mp4",
247 => ".webm",
135 => ".mp4",
244 => ".webm",
134 => ".mp4",
243 => ".webm",
133 => ".mp4",
242 => ".webm",
160 => ".mp4",
278 => ".webm",
// Dash Audios
140 => ".mp4",
171 => ".webm",
249 => ".webm",
250 => ".webm",
251 => ".webm"
);
function __construct(){
$this->cache_dir = dirname(__FILE__).'/.cache';
$this->cookie_dir = sys_get_temp_dir();
if(!file_exists($this->cache_dir)) {
mkdir($this->cache_dir,0755);
}
}
public function getDownloadLinks($id) {
$returnData = FALSE;
$videoID = $this->extractId($id);
$webPage = $this->curlGet('https://www.youtube.com/watch?v='.$videoID);
$sts = null;
if(preg_match('|"sts":([0-9]{4,}),"|i', $webPage, $matches)) {
$sts = $matches[1];
}
foreach(array('vevo', 'embedded', 'detailpage') as $elKey) {
$query = http_build_query(array(
'c' => 'web',
'el' => $elKey,
'hl' => 'en_US',
'sts' => $sts,
'cver' => 'html5',
'eurl' => "https://youtube.googleapis.com/v/{$videoID}",
'html5' => '1',
'iframe' => '1',
'authuser' => '1',
'video_id' => $videoID,
));
if($this->is_Ok($videoData = $this->curlGet("http://www.youtube.com/get_video_info?{$query}"))) {
parse_str($videoData, $videoData);
break;
}
}
if(isset($videoData['status']) && $videoData['status'] !== 'fail') {
$vInfo['Title'] = $videoData['title'];
$vInfo['ChannelName'] = $videoData['author'];
$vInfo['ChannelId'] = $videoData['ucid'];
$vInfo['Thumbnail'] = str_replace('default', 'maxresdefault', $videoData['thumbnail_url']);
$vInfo['Duration'] = $videoData['length_seconds'];
$vInfo['Rating'] = $videoData['avg_rating'];
}
if (isset($videoData['url_encoded_fmt_stream_map']) && isset($videoData['adaptive_fmts'])) {
$draft1 = explode(',',$videoData['url_encoded_fmt_stream_map']);
$draft2 = explode(',',$videoData['adaptive_fmts']);
foreach ($draft1 as $key) {
$draftLink[] = $key;
}
foreach ($draft2 as $key) {
$draftLink[] = $key;
}
foreach($draftLink as $dlink) {
parse_str($dlink,$mLink[]);
}
if (isset($mLink[0]['s'])) {
$instructions = $this->get_instructions($webPage);
}
foreach($mLink as $linker) {
if(isset($linker['s'])) {
$linkData[] = array(
'url' => preg_replace('@(https\:\/\/)[^\.]+(\.googlevideo\.com)@', 'https://redirector$2', $linker['url']).'&signature='.$this->sig_decipher($linker['s'], $instructions).'&title='.$this->clean_name($videoData['title']),
'itag' => $linker['itag'],
'type' => isset($this->itag_info[$linker['itag']]) ? $this->itag_info[$linker['itag']] : 'Unknown'
);
} else {
$linkData[] = array(
'url' => preg_replace('@(https\:\/\/)[^\.]+(\.googlevideo\.com)@', 'https://redirector$2', $linker['url']).'&title='.$this->clean_name($videoData['title']),
'itag' => $linker['itag'],
'type' => isset($this->itag_info[$linker['itag']]) ? $this->itag_info[$linker['itag']] : 'Unknown'
);
}
}
}
if (!empty($vInfo)) {
$returnData['info'] = $vInfo;
}if (!empty($linkData)) {
$returnData['dl'] = $linkData;
}
return $returnData;
}
protected function curlGet($url) {
if(in_array('curl', get_loaded_extensions())){
$appSettings = parse_ini_file('../config/config.ini',true);
$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_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
//curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
if($appSettings["Proxy"]["type"]) {
curl_setopt($ch, CURLOPT_PROXY, $appSettings["Proxy"]["type"]."://".$appSettings["Proxy"]["domain"].":".$appSettings["Proxy"]["port"]);
curl_setopt($ch, CURLOPT_PROXYUSERPWD, $appSettings["Proxy"]["username"].":".$appSettings["Proxy"]["password"]);
}
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
$result = curl_exec($ch);
curl_close($ch);
return $result;
}
return FALSE;
}
private function is_Ok($var) {
if(!preg_match('|status=fail|i',$var)) {
return true;
}
}
private function extractId($str) {
if(preg_match('/[a-z0-9_-]{11}/i', $str, $matches)){
return $matches[0];
}
return FALSE;
}
private function get_instructions($html) {
$playerPattern = '/"assets":.+?"js":\s*("[^"]+")/';
if(preg_match($playerPattern, $html, $matches) && is_string($_player = json_decode($matches[1])) && strlen($_player) >= 1) {
$playerLink = substr($_player, 0, 2) == '//' ? "https:{$_player}" : "https://www.youtube.com{$_player}";
$cache_player = $this->cache_dir.'/.ht-'.md5($_player);
if(file_exists($cache_player)) {
return unserialize(file_get_contents($cache_player));
} else {
$js_code = $this->curlGet($playerLink);
$instructions = $this->sig_js_decode($js_code);
if($instructions){
file_put_contents($cache_player, serialize($instructions));
return $instructions;
}
}
}
return false;
}
private function clean_name($name) {
$special_chars = array(".","?", "[", "]", "/", "\\", "=", "<", ">", ":", ";", ",", "'", "\"", "&", "$", "#", "*", "(", ")", "|", "~", "`", "!", "{", "}", "%", "+", chr(0));
$filename = str_replace($special_chars,' ',$name);
$filename = preg_replace( "#\x{00a0}#siu", ' ', $filename );
$filename = str_replace( array( '%20', '+', ' '), '-', $filename );
$filename = preg_replace( '/[\r\n\t -]+/', '-', $filename );
$filename = trim( $filename, '.-_' );
return $filename;
}
private function sig_decipher($signature, $instructions) {
foreach($instructions as $opt){
$command = $opt[0];
$value = $opt[1];
if($command == 'swap'){
$temp = $signature[0];
$signature[0] = $signature[$value % strlen($signature)];
$signature[$value] = $temp;
} elseif($command == 'splice'){
$signature = substr($signature, $value);
} elseif($command == 'reverse'){
$signature = strrev($signature);
}
}
return trim($signature);
}
private function sig_js_decode($file){
$script = $this->getBetween($file, 'a=a.split("");', ';return a.join("")');
$script = str_replace(array("a,","\n"), array(',',''), $script);
$script2= $this->getBetween($file, 'var ' . substr($script, 0, 2).'={', '};');
$script2= str_replace('a,b', 'a', $script2);
$script = str_replace(substr($script, 0, 2).'.', '', $script);
$script = str_replace('(', '', $script);
$script = str_replace(')', '', $script);
$script_ex= explode(";", $script);
$script2_ex = explode("\n", $script2);
for($i = 0; $i < count($script2_ex); $i++) {
$tmp = isset($script2_ex[$i]) ? explode(':', $script2_ex[$i]) : [];
$n = isset($tmp[0]) ? $tmp[0] : '';
$m = isset($tmp[1]) ? $tmp[1] : '';
$tempS[$n] = $m;
}
for($i = 0; $i < count($script_ex); $i++) {
$tmp = isset($script_ex[$i]) ? explode(',', $script_ex[$i]) : [];
$a = isset($tmp[0]) ? $tmp[0] : '';
$b = isset($tmp[1]) ? $tmp[1] : '';
$deKey[] = $this->createCommad($a, $b, $tempS);
}
return $deKey;
}
private function createCommad($value, $num, $source) {
$result = '';
if (isset($source[$value]) && mb_strpos($source[$value], 'reverse')) {
$result = array('reverse', '');
} elseif (isset($source[$value]) && mb_strpos($source[$value], 'a.splice')) {
$result = array('splice', $num);
} else {
$result = array('swap', $num);
}
return $result;
}
private function getBetween($content, $start, $end) {
$r = explode($start, $content);
if (isset($r[1])) {
$r = explode($end, $r[1]);
return $r[0];
}
return '';
}
}

View File

@ -71,6 +71,7 @@ rewrite ^/settings/?$ /settings_general.php break;
rewrite ^/settings/profile/?$ /settings_profile.php break;
rewrite ^/settings/appearance/?$ /settings_appearance.php break;
rewrite ^/settings/filters/?$ /settings_filters.php break;
rewrite ^/settings/media/?$ /settings_media.php break;
# User
rewrite ^/@(.+)@(.+)\.([a-z]+)/?$ /user.php?user=@$1@$2\.$3 break;

103
settings_media.php Normal file
View File

@ -0,0 +1,103 @@
<?php include ('header.php'); ?>
<main id="main">
<?php include dirname(__FILE__).('/widgets/settings_header.php'); ?>
<div class="article_wrap">
<aside class="left_column">
<?php include dirname(__FILE__).('/widgets/side_current_user.php'); ?>
<?php include dirname(__FILE__).('/widgets/side_footer.php'); ?>
</aside>
<article class="center_column">
<header class="timeline_header">
<ul class="header_items">
<li class="item toots view"><?=_('Media settings')?></li>
</ul>
</header>
<div class="timeline">
<div style="float:left;width:50%;text-align:right;margin-top:16px">
<h3><?=_('Play animated GIFs')?></h3>
</div>
<div class="play_gif_wrap" style="float:left;width:50%">
<div class="switch">
<input type="checkbox" id="setting_play_gif">
<div class="switch-btn">
<span></span>
</div>
</div>
</div>
<div style="float:left;width:50%;text-align:right;margin-top:16px">
<h3><?=_('Enable video player')?></h3>
</div>
<div class="play_video_wrap" style="float:left;width:50%">
<div class="switch">
<input type="checkbox" id="setting_play_video">
<div class="switch-btn">
<span></span>
</div>
</div>
</div>
<div style="float:left;width:50%;text-align:right;margin-top:16px">
<h3><?=_('Enable audio player')?></h3>
</div>
<div class="play_audio_wrap" style="float:left;width:50%">
<div class="switch">
<input type="checkbox" id="setting_play_audio">
<div class="switch-btn">
<span></span>
</div>
</div>
</div>
<div style="float:left;width:50%;text-align:right;margin-top:16px">
<h3><?=_('Embed PeerTube videos')?></h3>
</div>
<div class="play_peertube_wrap" style="float:left;width:50%">
<div class="switch">
<input type="checkbox" id="setting_play_peertube">
<div class="switch-btn">
<span></span>
</div>
</div>
</div>
<?php if($config["Media"]["youplay"]) { ?>
<div style="float:left;width:50%;text-align:right;margin-top:16px">
<h3><?=_('Embed YouTube using YouPlay')?></h3>
</div>
<div class="play_youplay_wrap" style="float:left;width:50%">
<div class="switch">
<input type="checkbox" id="setting_play_youplay">
<div class="switch-btn">
<span></span>
</div>
</div>
</div>
<?php } else { ?>
<div style="float:left;width:50%;text-align:right;margin-top:16px">
<h3><?=_('Embed YouTube using Invidio.us')?></h3>
</div>
<div class="play_invidious_wrap" style="float:left;width:50%">
<div class="switch">
<input type="checkbox" id="setting_play_invidious">
<div class="switch-btn">
<span></span>
</div>
</div>
</div>
<?php } if($config["Media"]["vimeo"]) { ?>
<div style="float:left;width:50%;text-align:right;margin-top:16px">
<h3><?=_('Embed Vimeo using YouPlay')?></h3>
</div>
<div class="play_vimeo_wrap" style="float:left;width:50%">
<div class="switch">
<input type="checkbox" id="setting_play_vimeo">
<div class="switch-btn">
<span></span>
</div>
</div>
</div>
<?php } ?>
<span style="visibility:hidden">-</span>
</div>
</article>
</div>
</main>
<script src="/assets/js/halcyon/halcyonSettings.js"></script>
<?php include ('footer.php'); ?>

View File

@ -1 +1 @@
2.1.6
2.2.0

View File

@ -25,6 +25,11 @@
<h2><?=_('FILTERS')?></h2>
</a>
</li>
<li id="js-settings_nav_media" class="header_nav_item settings_media">
<a href="/settings/media">
<h2><?=_('MEDIA')?></h2>
</a>
</li>
</ul>
</div>
</div>