Added new media players with support for audio and third party services
This commit is contained in:
parent
d9648da624
commit
19379369a3
|
@ -57,6 +57,7 @@ RewriteRule ^settings/?$ settings_general\.php [NC,L]
|
||||||
RewriteRule ^settings/profile/?$ settings_profile\.php [NC,L]
|
RewriteRule ^settings/profile/?$ settings_profile\.php [NC,L]
|
||||||
RewriteRule ^settings/appearance/?$ settings_appearance\.php [NC,L]
|
RewriteRule ^settings/appearance/?$ settings_appearance\.php [NC,L]
|
||||||
RewriteRule ^settings/filters/?$ settings_filters\.php [NC,L]
|
RewriteRule ^settings/filters/?$ settings_filters\.php [NC,L]
|
||||||
|
RewriteRule ^settings/media/?$ settings_media\.php [NC,L]
|
||||||
|
|
||||||
# User
|
# User
|
||||||
RewriteBase /
|
RewriteBase /
|
||||||
|
|
|
@ -125,6 +125,10 @@ halcyon.domain.tld {
|
||||||
r ^/settings/filters/?$
|
r ^/settings/filters/?$
|
||||||
to /settings_filters.php
|
to /settings_filters.php
|
||||||
}
|
}
|
||||||
|
rewrite {
|
||||||
|
r ^/settings/media/?$
|
||||||
|
to /settings_media.php
|
||||||
|
}
|
||||||
# End settings
|
# End settings
|
||||||
|
|
||||||
# Begin user
|
# Begin user
|
||||||
|
|
|
@ -18,13 +18,15 @@ We moved our instances list to a wiki page: https://notabug.org/halcyon-suite/ha
|
||||||
- Twitter like UI, familiar interface.
|
- Twitter like UI, familiar interface.
|
||||||
- Able to use on all instances.
|
- Able to use on all instances.
|
||||||
- No tracking, No ads.
|
- No tracking, No ads.
|
||||||
- Supports multiple languages
|
- Supports multiple languages.
|
||||||
|
- Privacy-friendly video embeds.
|
||||||
|
|
||||||
## Install
|
## Install
|
||||||
[![Install Halcyon with YunoHost](https://install-app.yunohost.org/install-with-yunohost.png)](https://install-app.yunohost.org/?app=halcyon)
|
[![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
|
or read our new wiki pages to install it manually: https://notabug.org/halcyon-suite/halcyon/wiki
|
||||||
|
|
||||||
## Blog
|
## 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.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.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
|
- 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)
|
- [LascauxSRL/lsx-emojipicker](https://github.com/LascauxSRL/lsx-emojipicker)
|
||||||
- [osapon/Pomo](https://github.com/osapon/Pomo)
|
- [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)
|
- [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)
|
||||||
|
|
|
@ -612,3 +612,22 @@ color:#FFF !important;
|
||||||
.instance_field {
|
.instance_field {
|
||||||
border:1px solid #000000;
|
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;
|
||||||
|
}
|
||||||
|
|
|
@ -2684,3 +2684,92 @@ border-radius:5px;
|
||||||
padding-top:34px;
|
padding-top:34px;
|
||||||
padding-bottom:35px;
|
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%;
|
||||||
|
}
|
||||||
|
|
|
@ -39,39 +39,39 @@ $(".h-card > a").each(function(i) {
|
||||||
$(this).attr('href',getRelativeURL($(this).attr('href')));
|
$(this).attr('href',getRelativeURL($(this).attr('href')));
|
||||||
});
|
});
|
||||||
$(".toot_article a,.profile_bio a,.follows_profile_bio a").each(function(i) {
|
$(".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_%]+)\/?$/);
|
const pltags = $(this).attr('href').match(/https?:\/\/.+..+\/tag\/([a-zA-Z\d_%]+)\/?$/);
|
||||||
if(pltags) {
|
if(pltags) $(this).attr('target','_self').attr('href','/search?q='+pltags[1]);
|
||||||
$(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 mstags = $(this).attr('href').match(/https:\/\/.+..+\/tags\/([a-zA-Z\d_%]+)\/?$/);
|
const plusers = $(this).attr('href').match(/https?:\/\/.+..+\/users\/([a-zA-Z\d_]+)(\/statuses\/\d+)\/?$/);
|
||||||
if(mstags) {
|
if(plusers) $(this).attr('target','_self').attr('href','/@'+plusers[1]+'@'+$(this).attr('href').split("/")[2]);
|
||||||
$(this).attr('target','_self').attr('href','/search?q='+mstags[1]);
|
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 plusers = $(this).attr('href').match(/https:\/\/.+..+\/users\/([a-zA-Z\d_]+)(\/statuses\/\d+)\/?$/);
|
const msstatus = $(this).attr('href').match(/https?:\/\/.+..+\/@([a-zA-Z\d_]+)(\/\d+)\/?$/);
|
||||||
if(plusers) {
|
if(msstatus) $(this).attr('target','_self').attr('href',"javascript:openStatus('"+msstatus[0]+"');void(0)");
|
||||||
$(this).attr('target','_self').attr('href','/@'+plusers[1]+'@'+$(this).attr('href').split("/")[2]);
|
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 msusers = $(this).attr('href').match(/https:\/\/.+..+\/@([a-zA-Z\d_]+)\/?$/);
|
const gsstatus = $(this).attr('href').match(/https?:\/\/.+..+\/notice\/(\d+)\/?$/);
|
||||||
if(msusers) {
|
if(gsstatus) $(this).attr('target','_self').attr('href',"javascript:openStatus('"+gsstatus[0]+"');void(0)");
|
||||||
$(this).attr('target','_self').attr('href','/@'+msusers[1]+'@'+$(this).attr('href').split("/")[2]);
|
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)");
|
||||||
const msstatus = $(this).attr('href').match(/https:\/\/.+..+\/@([a-zA-Z\d_]+)(\/\d+)\/?$/);
|
});
|
||||||
if(msstatus) {
|
$(".toot_article a").each(function(i) {
|
||||||
$(this).attr('target','_self').attr('href',"javascript:openStatus('"+msstatus[0]+"');void(0)");
|
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 msstatus2 = $(this).attr('href').match(/https:\/\/.+..+\/users\/([a-zA-Z\d_]+)\/?$/);
|
const ivcom = $(this).attr('href').match(/https?:\/\/(www\.)?invidio\.us\/watch\?v=([a-zA-Z\d_-]+)/);
|
||||||
if(msstatus2) {
|
const ytbe = $(this).attr('href').match(/https?:\/\/(www\.)?youtu\.be\/([a-zA-Z\d_-]+)/);
|
||||||
$(this).attr('target','_self').attr('href',"javascript:openStatus('"+msstatus2[0]+"');void(0)");
|
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 gsstatus = $(this).attr('href').match(/https:\/\/.+..+\/notice\/(\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(gsstatus) {
|
if(ytcom) embedMedia("youtube",$(this).closest(".toot_article"),ytcom[2]);
|
||||||
$(this).attr('target','_self').attr('href',"javascript:openStatus('"+gsstatus[0]+"');void(0)");
|
else if(htcom) embedMedia("youtube",$(this).closest(".toot_article"),htcom[2]);
|
||||||
}
|
else if(ivcom) embedMedia("youtube",$(this).closest(".toot_article"),ivcom[2]);
|
||||||
const plstatus = $(this).attr('href').match(/https:\/\/.+..+\/objects\/([\da-z]{8}-[\da-z]{4}-[\da-z]{4}-[\da-z]{4}-[\da-z]{12})\/?$/);
|
else if(ytbe) embedMedia("youtube",$(this).closest(".toot_article"),ytbe[2]);
|
||||||
if(plstatus) {
|
else if(htbe) embedMedia("youtube",$(this).closest(".toot_article"),htbe[2]);
|
||||||
$(this).attr('target','_self').attr('href',"javascript:openStatus('"+plstatus[0]+"');void(0)");
|
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/"));
|
||||||
if(localStorage.setting_link_previews == "true") {
|
else if(localStorage.setting_link_previews == "true") {
|
||||||
if(!window.cards) {
|
if(!window.cards) {
|
||||||
cards = new Array();
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -365,6 +365,102 @@ $(document).ready(function() {
|
||||||
loadfilters();
|
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) {
|
function selectbox($this) {
|
||||||
var $this = $($this);
|
var $this = $($this);
|
||||||
var numberOfOptions = $this.children('option').length;
|
var numberOfOptions = $this.children('option').length;
|
||||||
|
|
|
@ -1,26 +1,46 @@
|
||||||
function mediaattachments_template(status) {
|
function mediaattachments_template(status) {
|
||||||
let media_views = "";
|
let media_views = "";
|
||||||
|
var border = "";
|
||||||
if(status.media_attachments[0].remote_url != null) {
|
if(status.media_attachments[0].remote_url != null) {
|
||||||
status.media_attachments[0].url = status.media_attachments[0].remote_url;
|
status.media_attachments[0].url = status.media_attachments[0].remote_url;
|
||||||
}
|
}
|
||||||
|
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") {
|
if(status.media_attachments[0].url === "/files/original/missing.png") {
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
else if(!status.sensitive || localStorage.setting_show_nsfw == "true") {
|
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 {
|
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'>
|
<div class='sensitive_alart'>
|
||||||
<span class="text1">${__('Sensitive content')}</span>
|
<span class="text1">${__('Sensitive content')}</span>
|
||||||
<span class="text2">${__('Click to view')}</span>
|
<span class="text2">${__('Click to view')}</span>
|
||||||
</div>`;
|
</div>`;
|
||||||
}
|
}
|
||||||
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 += (`
|
media_views += (`
|
||||||
<div class="media_attachment" otype="video/gifv" mediacount="0">
|
<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>`);
|
</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 {
|
} else {
|
||||||
if ( status.media_attachments.length <= 2 ) {
|
if ( status.media_attachments.length <= 2 ) {
|
||||||
for ( let i in status.media_attachments ) {
|
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 = "";
|
var account_state_icons = "";
|
||||||
if(status.account.locked == true) account_state_icons += " <i class='fa fa-lock'></i>";
|
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'>";
|
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">
|
<li sid="${status.id}" class="toot_entry">
|
||||||
<div class="toot_entry_body">
|
<div class="toot_entry_body">
|
||||||
<a href="${status_account_link}">
|
<a href="${status_account_link}">
|
||||||
|
@ -177,7 +197,6 @@ ${alart_text}
|
||||||
<span class="status_content emoji_poss">
|
<span class="status_content emoji_poss">
|
||||||
${status.content}
|
${status.content}
|
||||||
</span>
|
</span>
|
||||||
${media_views}
|
|
||||||
</article>
|
</article>
|
||||||
<footer class="toot_footer"${toot_footer_width}>
|
<footer class="toot_footer"${toot_footer_width}>
|
||||||
<div class="toot_reaction">
|
<div class="toot_reaction">
|
||||||
|
@ -202,7 +221,8 @@ ${toot_reblog_button}
|
||||||
</section>
|
</section>
|
||||||
</div>
|
</div>
|
||||||
</li>`);
|
</li>`);
|
||||||
return $(html)
|
html.find(".toot_article").append(media_views);
|
||||||
|
return html
|
||||||
} else {
|
} else {
|
||||||
for(i=0;i<status.reblog.emojis.length;i++) {
|
for(i=0;i<status.reblog.emojis.length;i++) {
|
||||||
status.reblog.content = status.reblog.content.replace(new RegExp(":"+status.reblog.emojis[i].shortcode+":","g"),"<img src='"+status.reblog.emojis[i].url+"' class='emoji'>");
|
status.reblog.content = status.reblog.content.replace(new RegExp(":"+status.reblog.emojis[i].shortcode+":","g"),"<img src='"+status.reblog.emojis[i].url+"' class='emoji'>");
|
||||||
|
@ -275,7 +295,7 @@ var own_toot_buttons = (`<li><a class="mute_button" mid="${status.reblog.account
|
||||||
var account_state_icons = "";
|
var account_state_icons = "";
|
||||||
if(status.reblog.account.locked == true) account_state_icons += " <i class='fa fa-lock'></i>";
|
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'>";
|
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">
|
<li sid="${status.id}" class="toot_entry">
|
||||||
<div class="boost_author_box">
|
<div class="boost_author_box">
|
||||||
<a href="${status_account_link}">
|
<a href="${status_account_link}">
|
||||||
|
@ -321,7 +341,6 @@ ${alart_text}
|
||||||
<span class="status_content emoji_poss">
|
<span class="status_content emoji_poss">
|
||||||
${status.reblog.content}
|
${status.reblog.content}
|
||||||
</span>
|
</span>
|
||||||
${media_views}
|
|
||||||
</article>
|
</article>
|
||||||
<footer class="toot_footer" style="width:320px">
|
<footer class="toot_footer" style="width:320px">
|
||||||
<div class="toot_reaction">
|
<div class="toot_reaction">
|
||||||
|
@ -351,7 +370,8 @@ ${media_views}
|
||||||
</section>
|
</section>
|
||||||
</div>
|
</div>
|
||||||
</li>`);
|
</li>`);
|
||||||
return $(html)
|
html.find(".toot_article").append(media_views);
|
||||||
|
return html
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
function timeline_pinned_template(status) {
|
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 = "";
|
var account_state_icons = "";
|
||||||
if(status.account.locked == true) account_state_icons += " <i class='fa fa-lock'></i>";
|
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'>";
|
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">
|
<li sid="${status.id}" class="toot_entry">
|
||||||
<div class="pinned_notice_box">
|
<div class="pinned_notice_box">
|
||||||
<i class="fa fa-fw fa-thumb-tack"></i>${__('Pinned Toot')}</span>
|
<i class="fa fa-fw fa-thumb-tack"></i>${__('Pinned Toot')}</span>
|
||||||
|
@ -457,7 +477,6 @@ ${alart_text}
|
||||||
<span class="status_content emoji_poss">
|
<span class="status_content emoji_poss">
|
||||||
${status.content}
|
${status.content}
|
||||||
</span>
|
</span>
|
||||||
${media_views}
|
|
||||||
</article>
|
</article>
|
||||||
<footer class="toot_footer" style="width:320px">
|
<footer class="toot_footer" style="width:320px">
|
||||||
<div class="toot_reaction">
|
<div class="toot_reaction">
|
||||||
|
@ -487,7 +506,8 @@ ${media_views}
|
||||||
</section>
|
</section>
|
||||||
</div>
|
</div>
|
||||||
</li>`);
|
</li>`);
|
||||||
return $(html)
|
html.find(".toot_article").append(media_views);
|
||||||
|
return html
|
||||||
}
|
}
|
||||||
function notifications_template(NotificationObj) {
|
function notifications_template(NotificationObj) {
|
||||||
const notice_author_link = getRelativeURL(NotificationObj.account.url, NotificationObj.account.id);
|
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 = "";
|
var account_state_icons = "";
|
||||||
if(NotificationObj.status.account.locked == true) account_state_icons += " <i class='fa fa-lock'></i>";
|
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'>";
|
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">
|
<li sid="${NotificationObj.status.id}" class="toot_entry">
|
||||||
<div class="toot_entry_body">
|
<div class="toot_entry_body">
|
||||||
<a href="${toot_author_link}">
|
<a href="${toot_author_link}">
|
||||||
|
@ -716,7 +736,6 @@ ${alart_text}
|
||||||
<span class="status_content emoji_poss">
|
<span class="status_content emoji_poss">
|
||||||
${NotificationObj.status.content}
|
${NotificationObj.status.content}
|
||||||
</span>
|
</span>
|
||||||
${media_views}
|
|
||||||
</article>
|
</article>
|
||||||
<footer class="toot_footer"${toot_footer_width}>
|
<footer class="toot_footer"${toot_footer_width}>
|
||||||
<div class="toot_reaction">
|
<div class="toot_reaction">
|
||||||
|
@ -741,7 +760,8 @@ ${toot_reblog_button}
|
||||||
</section>
|
</section>
|
||||||
</div>
|
</div>
|
||||||
</li>`);
|
</li>`);
|
||||||
return $(html);
|
html.find(".toot_article").append(media_views);
|
||||||
|
return html
|
||||||
} else {
|
} else {
|
||||||
const html=(`
|
const html=(`
|
||||||
<li sid="${NotificationObj.id}" class="notice_entry fol">
|
<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 = "";
|
var account_state_icons = "";
|
||||||
if(status.account.locked == true) account_state_icons += " <i class='fa fa-lock'></i>";
|
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'>";
|
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 sid="${status.id}" class="toot_detail ${class_options}">
|
||||||
<div class="toot_detail_body">
|
<div class="toot_detail_body">
|
||||||
<header class="toot_header">
|
<header class="toot_header">
|
||||||
|
@ -923,7 +943,6 @@ ${alart_text}
|
||||||
<span class="status_content emoji_poss">
|
<span class="status_content emoji_poss">
|
||||||
${status.content}
|
${status.content}
|
||||||
</span>
|
</span>
|
||||||
${media_views}
|
|
||||||
</article>
|
</article>
|
||||||
<time datetime="${status_attr_datetime}">${status_datetime}</time>
|
<time datetime="${status_attr_datetime}">${status_datetime}</time>
|
||||||
</section>
|
</section>
|
||||||
|
@ -1024,7 +1043,8 @@ ${current_instance_charlimit}
|
||||||
</div>
|
</div>
|
||||||
</form>`);
|
</form>`);
|
||||||
history.pushState(null, null, getRelativeURL(status.account.url, status.account.id, '/status/'+status.id));
|
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 {
|
} else {
|
||||||
const status_datetime= getConversionedDate(null, status.reblog.created_at),
|
const status_datetime= getConversionedDate(null, status.reblog.created_at),
|
||||||
status_attr_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 = "";
|
var account_state_icons = "";
|
||||||
if(status.reblog.account.locked == true) account_state_icons += " <i class='fa fa-lock'></i>";
|
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'>";
|
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 sid="${status.reblog.id}" class="toot_detail ${class_options}">
|
||||||
<div class="toot_detail_body">
|
<div class="toot_detail_body">
|
||||||
<header class="toot_header">
|
<header class="toot_header">
|
||||||
|
@ -1135,7 +1155,6 @@ ${alart_text}
|
||||||
<span class="status_content emoji_poss">
|
<span class="status_content emoji_poss">
|
||||||
${status.reblog.content}
|
${status.reblog.content}
|
||||||
</span>
|
</span>
|
||||||
${media_views}
|
|
||||||
</article>
|
</article>
|
||||||
<time datetime="${status_attr_datetime}">${status_datetime}</time>
|
<time datetime="${status_attr_datetime}">${status_datetime}</time>
|
||||||
</section>
|
</section>
|
||||||
|
@ -1242,7 +1261,8 @@ ${current_instance_charlimit}
|
||||||
</form>
|
</form>
|
||||||
`);
|
`);
|
||||||
history.pushState(null, null, getRelativeURL(status.reblog.account.url, status.reblog.id, '/status/'+status.reblog.id));
|
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) {
|
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 = "";
|
var account_state_icons = "";
|
||||||
if(status.account.locked == true) account_state_icons += " <i class='fa fa-lock'></i>";
|
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'>";
|
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 sid="${status.id}" class="toot_entry ${class_options}">
|
||||||
<div class="toot_entry_body">
|
<div class="toot_entry_body">
|
||||||
<div class="icon_box">
|
<div class="icon_box">
|
||||||
|
@ -1385,7 +1405,6 @@ ${alart_text}
|
||||||
<span class="status_content emoji_poss">
|
<span class="status_content emoji_poss">
|
||||||
${status.content}
|
${status.content}
|
||||||
</span>
|
</span>
|
||||||
${media_views}
|
|
||||||
</article>
|
</article>
|
||||||
<footer class="toot_footer"${toot_footer_width}>
|
<footer class="toot_footer"${toot_footer_width}>
|
||||||
<div class="toot_reaction">
|
<div class="toot_reaction">
|
||||||
|
@ -1410,7 +1429,8 @@ ${toot_reblog_button}
|
||||||
</section>
|
</section>
|
||||||
</div>
|
</div>
|
||||||
</div>`);
|
</div>`);
|
||||||
return $(html)
|
html.find(".toot_article").append(media_views);
|
||||||
|
return html
|
||||||
} else {
|
} else {
|
||||||
const status_datetime= getRelativeDatetime(Date.now(), getConversionedDate(null, status.reblog.created_at)),
|
const status_datetime= getRelativeDatetime(Date.now(), getConversionedDate(null, status.reblog.created_at)),
|
||||||
status_attr_datetime = 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 = "";
|
var account_state_icons = "";
|
||||||
if(status.reblog.account.locked == true) account_state_icons += " <i class='fa fa-lock'></i>";
|
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'>";
|
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 sid="${status.id}" class="toot_entry ${class_options}">
|
||||||
<div class="boost_author_box">
|
<div class="boost_author_box">
|
||||||
<a href="${status_account_link}">
|
<a href="${status_account_link}">
|
||||||
|
@ -1525,7 +1545,6 @@ ${alart_text}
|
||||||
<span class="status_content emoji_poss">
|
<span class="status_content emoji_poss">
|
||||||
${status.reblog.content}
|
${status.reblog.content}
|
||||||
</span>
|
</span>
|
||||||
${media_views}
|
|
||||||
</article>
|
</article>
|
||||||
<footer class="toot_footer" style="width:320px">
|
<footer class="toot_footer" style="width:320px">
|
||||||
<div class="toot_reaction">
|
<div class="toot_reaction">
|
||||||
|
@ -1555,6 +1574,7 @@ ${media_views}
|
||||||
</section>
|
</section>
|
||||||
</div>
|
</div>
|
||||||
</div>`);
|
</div>`);
|
||||||
return $(html)
|
html.find(".toot_article").append(media_views);
|
||||||
|
return html
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1133,6 +1133,9 @@ $(function() {
|
||||||
$(document).on('click','.toot_entry.ancestors_status, .toot_entry.descendants_status', function(e) {
|
$(document).on('click','.toot_entry.ancestors_status, .toot_entry.descendants_status', function(e) {
|
||||||
$("#js-overlay_content .temporary_object").empty();
|
$("#js-overlay_content .temporary_object").empty();
|
||||||
});
|
});
|
||||||
|
$(document).on('click','.player',function(e) {
|
||||||
|
e.stopPropagation();
|
||||||
|
});
|
||||||
$(document).on('click','.toot_entry', function(e) {
|
$(document).on('click','.toot_entry', function(e) {
|
||||||
setOverlayStatus($(this).attr('sid'));
|
setOverlayStatus($(this).attr('sid'));
|
||||||
});
|
});
|
||||||
|
|
|
@ -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.
|
|
@ -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.
|
|
@ -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.
|
|
@ -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);
|
|
@ -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
|
@ -1,6 +1,22 @@
|
||||||
; Registar App Settings
|
; Register App Settings
|
||||||
[App]
|
[App]
|
||||||
api_client_name = Your application name
|
api_client_name = Your application name
|
||||||
api_client_website = https://example.com/
|
api_client_website = https://example.com/
|
||||||
who_to_follow_provider = https://vinayaka.distsn.org/cgi-bin/vinayaka-user-match-osa-api.cgi?{{host}}+{{user}}
|
who_to_follow_provider = https://vinayaka.distsn.org/cgi-bin/vinayaka-user-match-osa-api.cgi?{{host}}+{{user}}
|
||||||
default_language = en_US
|
default_language = en_US
|
||||||
|
|
||||||
|
; 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 =
|
||||||
|
|
|
@ -5,3 +5,4 @@ ja_JP.EUC-JP EUC-JP
|
||||||
ko_KR.UTF-8 UTF-8
|
ko_KR.UTF-8 UTF-8
|
||||||
pl_PL.UTF-8 UTF-8
|
pl_PL.UTF-8 UTF-8
|
||||||
gl_ES.UTF-8 UTF-8
|
gl_ES.UTF-8 UTF-8
|
||||||
|
it_IT.UTF-8 UTF-8
|
||||||
|
|
|
@ -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/pomo/pomo.js"></script>
|
||||||
<script src="/assets/js/twemoji/twemoji.min.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/clipboard.js/clipboard.min.js"></script>
|
||||||
|
<script src="/assets/js/player/soundmanager.js"></script>
|
||||||
|
<script src="/assets/js/player/audio.js"></script>
|
||||||
<script>
|
<script>
|
||||||
if(!localStorage.getItem("current_id") | !localStorage.getItem("current_instance") | !localStorage.getItem("current_authtoken")) {
|
if(!localStorage.getItem("current_id") | !localStorage.getItem("current_instance") | !localStorage.getItem("current_authtoken")) {
|
||||||
location.href = "/login";
|
location.href = "/login";
|
||||||
|
@ -63,6 +65,8 @@ else if($.cookie("session") === undefined) {
|
||||||
resetApp();
|
resetApp();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
server_setting_youplay = <?=$config["Media"]["youplay"] ? "true" : "false"?>;
|
||||||
|
server_setting_vimeo = <?=$config["Media"]["vimeo"] ? "true" : "false"?>;
|
||||||
</script>
|
</script>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
@ -111,7 +115,7 @@ resetApp();
|
||||||
<ul class="header_nav_list">
|
<ul class="header_nav_list">
|
||||||
<li class="header_nav_item search_form_wrap">
|
<li class="header_nav_item search_form_wrap">
|
||||||
<form class="search_form" action="/search" method="GET">
|
<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">
|
<span class="search_form_submit">
|
||||||
<button type="submit">
|
<button type="submit">
|
||||||
<i class="fa fa-fw fa-search"></i>
|
<i class="fa fa-fw fa-search"></i>
|
||||||
|
|
Binary file not shown.
Binary file not shown.
|
@ -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"
|
||||||
|
|
|
@ -45,6 +45,13 @@ localStorage.setItem('setting_show_bots', 'true');
|
||||||
localStorage.setItem('setting_show_content_warning', 'false');
|
localStorage.setItem('setting_show_content_warning', 'false');
|
||||||
localStorage.setItem('setting_show_nsfw', 'false');
|
localStorage.setItem('setting_show_nsfw', 'false');
|
||||||
localStorage.setItem('setting_compose_autocomplete', 'true');
|
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_privacy','".$profile["source"]["privacy"]."');
|
||||||
localStorage.setItem('setting_post_sensitive','".$profile["source"]["sensitive"]."');
|
localStorage.setItem('setting_post_sensitive','".$profile["source"]["sensitive"]."');
|
||||||
$.cookie('darktheme','false',{path:'/',expires:3650});
|
$.cookie('darktheme','false',{path:'/',expires:3650});
|
||||||
|
|
|
@ -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>
|
|
@ -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>
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
|
@ -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>
|
|
@ -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 '';
|
||||||
|
}
|
||||||
|
}
|
|
@ -71,6 +71,7 @@ rewrite ^/settings/?$ /settings_general.php break;
|
||||||
rewrite ^/settings/profile/?$ /settings_profile.php break;
|
rewrite ^/settings/profile/?$ /settings_profile.php break;
|
||||||
rewrite ^/settings/appearance/?$ /settings_appearance.php break;
|
rewrite ^/settings/appearance/?$ /settings_appearance.php break;
|
||||||
rewrite ^/settings/filters/?$ /settings_filters.php break;
|
rewrite ^/settings/filters/?$ /settings_filters.php break;
|
||||||
|
rewrite ^/settings/media/?$ /settings_media.php break;
|
||||||
|
|
||||||
# User
|
# User
|
||||||
rewrite ^/@(.+)@(.+)\.([a-z]+)/?$ /user.php?user=@$1@$2\.$3 break;
|
rewrite ^/@(.+)@(.+)\.([a-z]+)/?$ /user.php?user=@$1@$2\.$3 break;
|
||||||
|
|
|
@ -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'); ?>
|
|
@ -1 +1 @@
|
||||||
2.1.6
|
2.2.0
|
||||||
|
|
|
@ -25,6 +25,11 @@
|
||||||
<h2><?=_('FILTERS')?></h2>
|
<h2><?=_('FILTERS')?></h2>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
|
<li id="js-settings_nav_media" class="header_nav_item settings_media">
|
||||||
|
<a href="/settings/media">
|
||||||
|
<h2><?=_('MEDIA')?></h2>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
Loading…
Reference in New Issue