modified file wp-piwik

This commit is contained in:
2026-06-03 21:29:22 +00:00
committed by Gitium
parent 57bccfdbd1
commit 769efed689
2556 changed files with 368982 additions and 126264 deletions

View File

@ -0,0 +1,640 @@
@charset "UTF-8";
@keyframes ai-spin {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
@keyframes backgroundPosition {
0% {
background-position: -140px 0;
}
100% {
background-position: 140px 0;
}
}
.sr-only {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
border: 0;
}
.ai-row {
margin-left: -15px;
margin-right: -15px;
box-sizing: border-box;
}
.ai-row::after {
content: "";
display: table;
clear: both;
}
[class^="ai-col"] {
float: left;
padding-left: 15px;
padding-right: 15px;
width: 50%;
box-sizing: border-box;
}
.ai-btn {
display: inline-block;
font-weight: normal;
margin: 0;
line-height: normal;
border: 0;
box-shadow: none;
text-align: center;
vertical-align: middle;
cursor: pointer;
white-space: nowrap;
-ms-user-select: none;
user-select: none;
border-radius: 2px;
width: auto;
height: auto;
background-image: none;
padding: 11px 20px 11px;
font-size: 12px;
text-transform: uppercase;
background-color: #1c4866;
color: #ffffff;
text-decoration: none;
}
.ai-btn:hover,
.ai-btn:focus {
color: #ffffff;
background-color: #173a52;
}
.ai-btn-green {
background-color: #14b552;
}
.ai-btn-green:hover,
.ai-btn-green:focus {
color: #ffffff;
background-color: #119e48;
}
.ai-brand-module {
background-color: #1c4866;
padding: 15px;
color: #ffffff;
font-size: 12px;
}
.ai-brand-module p {
font-size: 12px;
}
.ai-brand-module a:not(.ai-btn) {
color: #ffcc00;
text-decoration: none;
}
.ai-brand-module-actions {
text-align: right;
}
.ai-brand-module-actions p {
margin: 0;
}
.ai-header {
margin: 12px 0 -12px;
height: 40px;
}
.ai-header-actions {
text-align: right;
}
.ai-logo {
display: inline-block;
position: relative;
top: -2px;
}
.ai-logo img {
height: 44px;
}
.ai-note {
font-style: italic;
}
.ai-list-inline {
margin: 0;
padding: 0;
list-style: none;
}
.ai-list-inline li {
display: inline-block;
margin: 0;
}
.ai-footer-links a::after {
content: "\007c";
color: #ffffff;
opacity: .5;
margin: 0 7px;
}
.ai-footer-links li:last-child a::after {
display: none;
}
.ai-module {
border: 1px solid #eeeeee;
margin-top: 12px;
padding: 15px;
}
.ai-module::after {
content: "";
display: table;
clear: both;
}
.ai-container {
margin-top: 12px;
}
.ai-field-controls-wrap {
padding: 15px;
border: 1px solid #eeeeee;
}
.ai-field-controls-wrap::after {
content: "";
display: table;
clear: both;
}
.ai-field-controls {
float: left;
}
.ai-field-controls .button {
margin-right: 5px;
}
.ai-field-controls-visibility {
float: right;
padding-top: 4px;
}
.ai-field-controls-visibility a {
text-decoration: none;
}
.ai-fields-expand-all {
margin-right: 8px;
padding-right: 6px;
border-right: 1px solid #f1f1f1;
}
.ai-fields-container {
padding: 15px;
border-left: 1px solid #eeeeee;
border-right: 1px solid #eeeeee;
}
.ai-field-repeatable {
margin-bottom: 15px;
border: 1px solid #d7d7d7;
box-shadow: 1px 1px 2px rgba(0, 0, 0, 0.07);
}
.ai-field-repeatable:last-child {
margin-bottom: 0;
}
.ai-field-repeatable:only-child .ai-remove-field {
display: none;
}
.ai-field-container {
padding: 15px;
background-color: #ffffff;
}
.ai-field-container::after {
content: "";
display: table;
clear: both;
}
.ai-field-container-links {
display: flex;
grid-gap: 20px;
}
.ai-field-container-links .ai-field-split {
width: 50%;
float: none;
}
.ai-field-head {
padding: 8px 15px 5px;
line-height: normal;
background-color: #d7d7d7;
background: linear-gradient(to bottom, #f1f1f1, #d7d7d7);
border-bottom: 1px solid #cccccc;
}
.ai-field-head::after {
content: "";
display: table;
clear: both;
}
.ai-field-head .toggle-indicator {
border-radius: 50%;
}
.ai-fields-sortable .ai-field-head {
cursor: move;
}
.ai-field-sort-handle {
position: relative;
top: 1px;
color: #0073aa;
}
.ai-field-sort-handle .dashicons {
font-size: 18px;
}
.ai-field-title {
font-weight: bold;
font-size: 1.05em;
margin-left: 8px;
padding-top: 3px;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
max-width: 80%;
display: inline-block;
}
.ai-field-toggle {
float: right;
}
.ai-field-cover {
float: left;
width: 100px;
height: 100px;
margin-right: 15px;
background-color: #eeeeee;
border: 1px solid #cccccc;
}
.ai-field-split {
float: left;
width: calc(50% - 71px);
margin-right: 15px;
}
.ai-field-split:nth-child(2n + 1) {
margin-right: 0;
}
.ai-container .button .dashicons,
.ai-module .button .dashicons {
font-size: 1.2em;
line-height: 1.7em;
}
.ai-form-field-group {
padding: 15px;
border: 1px solid #f1f1f1;
margin-bottom: 15px;
}
.ai-form-field-group :last-child {
margin-bottom: 0;
}
.ai-form-field-group-title {
margin-top: 0;
}
.ai-form-field {
margin-bottom: 15px;
}
.ai-form-field label {
display: inline-block;
font-weight: bold;
margin-bottom: 3px;
}
.ai-form-field input[type="text"],
.ai-form-field input[type="url"],
.ai-form-field input[type="search"],
.ai-form-field input[type="email"],
.ai-form-field input[type="password"],
.ai-form-field input[type="number"],
.ai-form-field input[type="tel"],
.ai-form-field input[type="date"],
.ai-form-field textarea,
.ai-form-field select {
width: 100%;
}
.ai-form-field input[type="checkbox"],
.ai-form-field input[type="radio"] {
display: inline-block;
position: relative;
top: 1px;
}
.ai-module-settings .ai-form-field input[type="text"],
.ai-module-settings .ai-form-field input[type="url"],
.ai-module-settings .ai-form-field input[type="search"],
.ai-module-settings .ai-form-field input[type="email"],
.ai-module-settings .ai-form-field input[type="password"],
.ai-module-settings .ai-form-field input[type="number"],
.ai-module-settings .ai-form-field input[type="tel"],
.ai-module-settings .ai-form-field input[type="date"],
.ai-module-settings .ai-form-field textarea,
.ai-module-settings .ai-form-field select {
width: 200px;
max-width: 100%;
display: block;
}
.ai-form-field-addon {
position: relative;
}
.ai-form-field-addon input {
padding-right: 80px;
}
.ai-form-field-addon button {
position: absolute;
top: 0;
right: -2px;
}
.ai-field-help {
margin: 5px 0 0;
font-style: italic;
color: #999;
}
.ai-form-field-checkbox-secondary {
margin-top: 7px;
}
.ai-remove-field {
float: right;
}
.ai-field-upload-cover {
display: block;
position: relative;
width: 100px;
height: 100px;
text-decoration: none;
color: initial;
overflow: hidden;
}
.ai-field-upload-cover img {
max-width: 100%;
display: none;
}
.ai-has-cover .ai-remove-cover {
display: block;
}
.ai-has-cover .ai-field-cover-placeholder {
display: none;
}
.ai-has-cover img {
display: inline-block;
}
.ai-field-cover-placeholder {
text-align: center;
font-style: normal;
font-size: .9em;
opacity: .8;
padding-top: 28px;
}
.ai-field-cover-placeholder::before {
content: "";
display: inline-block;
font: 400 20px/1 dashicons;
speak: none;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-decoration: none !important;
display: block;
}
.ai-track-loading .ai-field-cover-placeholder::before {
content: "\f463";
animation: rotation 1.2s infinite linear;
}
.ai-remove-cover {
color: #ffffff;
background-color: #ff0000;
width: 16px;
height: 16px;
font-size: 12px;
cursor: pointer;
position: absolute;
top: 0;
right: 0;
opacity: .9;
transition: opacity 0.18s ease-in;
display: none;
text-align: center;
}
.ai-remove-cover:hover {
opacity: 1;
}
.ai-remove-cover .dashicons {
font-size: 16px;
width: 100%;
height: 100%;
}
.ai-remove-all-fields .dashicons,
.ai-remove-field .dashicons {
color: #ff0000;
}
.ai-add-field-batch .dashicons,
.ai-add-field .dashicons {
color: #0073aa;
}
.ai-info-box {
background: #fffce6;
color: #948832;
font-size: 12px;
border: solid 1px #eeeac9;
padding: 15px;
margin: 0 0 15px 0;
}
.ai-player-type-message {
display: none;
}
.ai-drop-placeholder {
background-color: #f1f1f1;
border: 2px dashed #cccccc;
opacity: 0.5;
margin-bottom: 15px;
}
.ai-collapsed .ai-field-container {
display: none;
}
.ai-collapsed .toggle-indicator::before {
content: "\f140" !important;
}
.ai-module-shortcode .code {
display: block;
width: 100%;
margin-top: 3px;
padding: 10px 10px 8px;
font-weight: bold;
background: #f1f1f1;
}
.ai-sync-soundcloud.button {
display: none;
}
.ai-sync-soundcloud.button::before {
content: "\f463";
color: #d54e21;
display: inline-block;
font: 400 19px/1 dashicons;
speak: none;
position: relative;
left: -1px;
top: 4px;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
vertical-align: top;
}
.ai-track-loading .ai-sync-soundcloud.button::before {
animation: rotation 1.2s infinite linear;
}
.ai-soundcloud-track .ai-sync-soundcloud {
display: inline-block;
}
.ai-soundcloud-track .ai-upload {
display: none;
}
@media (max-width: 1100px) {
.ai-field-controls,
.ai-field-controls-visibility {
margin: 0;
float: none;
width: 100%;
}
.ai-field-controls {
margin-bottom: 5px;
}
.ai-field-container-links {
display: block;
}
.ai-field-container-links .ai-field-split,
.ai-field-split {
float: none;
width: 100%;
}
.ai-field-cover {
margin-bottom: 15px;
}
.ai-footer {
text-align: center;
}
.ai-footer .ai-brand-module-actions {
text-align: center;
margin-top: 10px;
}
.ai-footer [class^="ai-col"] {
width: 100%;
}
}
@media (max-width: 782px) {
.ai-container .button .dashicons,
.ai-module .button .dashicons {
line-height: 1.2em;
}
.ai-form-field-addon .button {
top: 2px;
}
}
@media (max-width: 600px) {
.ai-field-controls .button {
width: 100%;
}
.ai-header {
text-align: center;
}
.ai-header .ai-brand-module-actions {
margin-top: 10px;
}
.ai-header .ai-btn {
display: block;
}
.ai-header [class^="ai-col"] {
width: 100%;
}
}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,44 @@
/* General */
.ai-settings-box {
background-color: #ffffff;
padding: 25px;
border: 1px solid #D8D8D8;
box-shadow: 0px 2px 0px rgba(0, 0, 0, 0.04);
}
.ai-settings-box > :last-child {
margin-bottom: 0;
}
/* Header / Nav */
.ai-settings-main-content-nav-header {
margin: 15px 0 40px;
display: flex;
align-items: center;
}
.ai-settings-main-content-nav {
display: flex;
grid-gap: 20px;
}
.ai-settings-main-content-nav-link {
color: #646970;
text-decoration: none;
font-size: 16px;
}
.ai-settings-main-content-nav-link.is-active {
font-weight: 700;
}
.ai-settings-main-content-nav-link.is-active,
.ai-settings-main-content-nav-link:hover {
color: #1D2327;
}
.ai-settings-main-content-nav-filters {
margin-left: auto;
}

View File

@ -0,0 +1 @@
.ai-settings-box{background-color:#fff;padding:25px;border:1px solid #d8d8d8;box-shadow:0 2px 0 rgba(0,0,0,.04)}.ai-settings-box>:last-child{margin-bottom:0}.ai-settings-main-content-nav-header{margin:15px 0 40px;display:flex;align-items:center}.ai-settings-main-content-nav{display:flex;grid-gap:20px}.ai-settings-main-content-nav-link{color:#646970;text-decoration:none;font-size:16px}.ai-settings-main-content-nav-link.is-active{font-weight:700}.ai-settings-main-content-nav-link.is-active,.ai-settings-main-content-nav-link:hover{color:#1d2327}.ai-settings-main-content-nav-filters{margin-left:auto}

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@ -0,0 +1,560 @@
/* eslint-env browser, jquery */
/* eslint-disable prefer-arrow-callback, prefer-template, func-names, no-var, object-shorthand, no-alert */
/* global wp ai_scripts */
jQuery(function($) {
// Return early if ai_scripts are not available
if (!ai_scripts) {
// eslint-disable-line camelcase
return;
}
// eslint-disable-next-line vars-on-top
var AudioIgniter = (function() {
var el = {
$trackContainer: $(".ai-fields-container"),
trackFieldClassName: ".ai-field-repeatable",
$addTrackButtonTop: $(".ai-add-field-top"),
$addTrackButtonBottom: $(".ai-add-field-bottom"),
removeFieldButtonClassName: ".ai-remove-field",
$removeAllTracksButton: $(".ai-remove-all-fields"),
$batchUploadButton: $(".ai-add-field-batch"),
$trackDownloadUsesTrackUrlButton: $(".ai-use-track-url-download"),
audioUploadButtonClassName: ".ai-upload",
coverUploadButtonClassName: ".ai-field-upload-cover",
coverRemoveClassName: ".ai-remove-cover",
fieldTitleClassName: ".ai-field-title",
trackTitleClassName: ".ai-track-title",
trackArtistClassName: ".ai-track-artist",
trackLyricsClassName: ".ai-track-lyrics",
trackUrlClassName: ".ai-track-url",
trackDownloadUrlClassName: ".ai-track-download-url",
trackDownloadUsesTrackUrlClassName: ".ai-track-download-uses-track-url",
hasCoverClass: "ai-has-cover",
fieldHeadClassName: ".ai-field-head",
fieldCollapsedClass: "ai-collapsed",
$expandAllButton: $(".ai-fields-expand-all"),
$collapseAllButton: $(".ai-fields-collapse-all"),
$shortcodeInputField: $("#ai_shortcode"),
soundCloudTrackClass: "ai-soundcloud-track"
};
/**
* Generate a rfc4122 version 4 compliant UUID
* http://stackoverflow.com/a/2117523
*
* @returns {string} - UUID
*/
function uuid() {
return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function(
c
) {
var r = (Math.random() * 16) | 0;
var v = c === "x" ? r : (r & 0x3) | 0x8;
return v.toString(16);
});
}
/**
* Check if field is collapsed
*
* @param {Object} $field - jQuery object
* @returns {*|boolean}
*/
function isFieldCollapsed($field) {
return $field.hasClass(el.fieldCollapsedClass);
}
/**
* Collapse a field
*
* @param {Object} $field - jQuery object
*/
function collapseField($field) {
$field.addClass(el.fieldCollapsedClass);
}
/**
* Expand a field
*
* @param {Object} $field - jQuery object
*/
function expandField($field) {
$field.removeClass(el.fieldCollapsedClass);
}
/**
* Resets the cover image placeholder state
*
* @param {Object} $field - the remove button jQuery object
*/
function resetCoverImage($field) {
var $coverWrap = $field.find("." + el.hasCoverClass);
$coverWrap
.removeClass(el.hasCoverClass)
.find("img")
.attr("src", "")
.attr("alt", "");
$coverWrap
.parent()
.find("input")
.val("");
}
/**
* Resets a form field
* - Clears input values
* - Clears thumbnail
*
* @param {object} $field - the field's jQuery object
* @param {string} [hash] - UUID or random hash
*/
function resetField($field, hash) {
var fieldHash = $field.data("uid");
var newHash = hash || uuid();
$field.attr("data-uid", newHash);
$field
.find("input, textarea, select")
.not(":button")
.each(function() {
var $this = $(this);
$this.attr("id", $this.attr("id").replace(fieldHash, newHash));
$this.attr("name", $this.attr("name").replace(fieldHash, newHash));
$this.val("");
});
$field.find("label").each(function() {
var $this = $(this);
$this.attr("for", $this.attr("for").replace(fieldHash, newHash));
});
$field.find(el.fieldTitleClassName).text("");
$field.removeClass(el.soundCloudTrackClass);
expandField($field);
resetCoverImage($field);
}
/**
* Checks if a track field is clear of values
*
* @param {object} $field - Track field jQuery object
* @returns {boolean}
*/
function isTrackFieldEmpty($field) {
var isEmpty = true;
var $inputs = $field.find("input");
$inputs.each(function() {
if ($(this).val()) {
isEmpty = false;
}
});
return isEmpty;
}
/**
* Gets the first field from $trackContainer
* and appends it back after resetting it
*
* @param {string} [hash] - UUID or random hash
* @param {jQuery} [$container] - A jQuery element as the container
*
* return {Object} - jQuery object
*/
function getNewTrackField(hash, $container) {
var newHash = hash || uuid();
var $parent = $container || el.$trackContainer;
var $clone = $parent
.find(el.trackFieldClassName)
.first()
.clone()
.hide()
.show();
resetField($clone, newHash);
return $clone;
}
/**
* Removes an element (or many) from the DOM
* by fading it out first
*
* @param {Object} $el - jQuery object of the element(s) to be removed
* @param {Function} [callback] - Optional callback
*/
function removeElement($el, callback) {
$el.fadeOut("fast", function() {
$(this).remove();
if (callback && typeof callback === "function") {
callback();
}
});
}
/**
* Populates a track field
*
* @param {Object} $field - The field's jQuery object
* @param {Object} media - WP Media Manager media object
*/
function populateTrackField($field, media) {
var $urlInput = $field.find(el.trackUrlClassName);
var $titleInput = $field.find(el.trackTitleClassName);
var $artistInput = $field.find(el.trackArtistClassName);
var $fieldTitle = $field.find(el.fieldTitleClassName);
if (media.url) {
$urlInput.val(media.url);
}
if (media.title && $titleInput.val() === "") {
$titleInput.val(media.title);
$fieldTitle.text(media.title);
}
if (media.meta && media.meta.artist && $artistInput.val() === "") {
$artistInput.val(media.meta.artist);
}
}
/**
* Sets a cover image for the field
*
* @param $field - The field's jQuery object
* @param {Object} cover - Cover object
* @param {number} cover.id - Image ID
* @param {string} cover.url - Image URL
* @param {string} [cover.alt] - Image alt text
*/
function setTrackFieldCover($field, cover) {
var $coverField = $field.find(el.coverUploadButtonClassName);
if (!cover || !cover.url || !cover.id) {
return;
}
$coverField
.find("img")
.attr("src", cover.url)
.attr("alt", cover.alt || "");
$coverField
.addClass(el.hasCoverClass)
.siblings("input")
.val(cover.id);
}
/**
* Initializes the WordPress Media Manager
*
* @param {Object} opts - Options object
* @param {string} opts.handler - Handler identifier of the media frame,
* this allows multiple media manager frames with different functionalities
* @param {string} [opts.type] - Filter media manager by type (audio, image etc)
* @param {string} [opts.title=Select Media] - Title of the media manager frame
* @param {boolean} [opts.multiple=false] - Accept multiple selections
* @param {Function} [opts.onMediaSelect] - Do something after media selection
*/
function wpMediaInit(opts) {
if (!opts.handler) {
throw new Error("Missing `handler` option");
}
/* eslint-disable */
var multiple = opts.multiple || false;
var title = opts.title || "Select media";
var mediaManager = wp.media.frames[opts.handler];
/* eslint-enable */
if (mediaManager) {
mediaManager.open();
return;
}
mediaManager = wp.media({
title: title,
multiple: multiple,
library: {
type: opts.type
}
});
mediaManager.open();
mediaManager.on("select", function() {
var attachments;
var attachmentModels = mediaManager.state().get("selection");
if (multiple) {
attachments = attachmentModels.map(function(attachment) {
return attachment.toJSON();
});
} else {
attachments = attachmentModels.first().toJSON();
}
if (opts.onMediaSelect && typeof opts.onMediaSelect === "function") {
opts.onMediaSelect(attachments);
}
});
}
/**
* Collapsible bindings
*/
el.$trackContainer.on("click", el.fieldHeadClassName, function(e) {
var $this = $(this);
var $parentField = $this.parents(el.trackFieldClassName);
if (isFieldCollapsed($parentField)) {
expandField($parentField);
} else {
collapseField($parentField);
}
e.preventDefault();
});
el.$expandAllButton.on("click", function(e) {
var $this = $(this);
var $container = $this
.closest(".ai-container")
.find(".ai-fields-container");
expandField($container.find(el.trackFieldClassName));
e.preventDefault();
});
el.$collapseAllButton.on("click", function(e) {
var $this = $(this);
var $container = $this
.closest(".ai-container")
.find(".ai-fields-container");
collapseField($container.find(el.trackFieldClassName));
e.preventDefault();
});
/**
* Field control bindings
* (Add, remove buttons etc)
*/
/* Bind track title to title input value */
el.$trackContainer.on("keyup", el.trackTitleClassName, function() {
var $this = $(this);
var $fieldTitle = $this
.parents(el.trackFieldClassName)
.find(el.fieldTitleClassName);
$fieldTitle.text($this.val());
});
/* Add Field Top */
el.$addTrackButtonTop.on("click", function() {
var $this = $(this);
var $container = $this
.closest(".ai-container")
.find(".ai-fields-container");
$container.prepend(getNewTrackField(undefined, $container));
});
/* Add Field Bottom */
el.$addTrackButtonBottom.on("click", function() {
var $this = $(this);
var $container = $this
.closest(".ai-container")
.find(".ai-fields-container");
$container.append(getNewTrackField(undefined, $container));
});
/* Remove Track */
el.$trackContainer.on("click", el.removeFieldButtonClassName, function() {
var $this = $(this);
removeElement($this.parents(".ai-field-repeatable"));
});
/* Remove All Tracks */
el.$removeAllTracksButton.on("click", function() {
var $this = $(this);
var $container = $this
.closest(".ai-container")
.find(".ai-fields-container");
var $trackFields = $container.find(el.trackFieldClassName);
if (window.confirm(ai_scripts.messages.confirm_clear_tracks)) {
if ($trackFields.length > 1) {
removeElement($trackFields.slice(1));
resetField($trackFields);
} else {
resetField($trackFields);
}
}
});
/**
* Bind media uploaders
*/
/* Audio upload */
el.$trackContainer.on("click", el.audioUploadButtonClassName, function() {
var $this = $(this);
var $parentTrackField = $this.parents(el.trackFieldClassName);
wpMediaInit({
handler: "ai-audio",
title: ai_scripts.messages.media_title_upload,
type: "audio",
onMediaSelect: function(media) {
populateTrackField($parentTrackField, media);
}
});
});
/**
* Cover image upload
*
* Element `coverUploadButtonClassName` *must* have
* an `img` and `coverRemoveClassName` elements
* as children
*/
el.$trackContainer
.on("click", el.coverUploadButtonClassName, function(e) {
var $this = $(this);
wpMediaInit({
handler: "ai-cover",
title: ai_scripts.messages.media_title_upload_cover,
type: "image",
onMediaSelect: function(media) {
setTrackFieldCover($this.parents(el.trackFieldClassName), {
id: media.id,
url: media.sizes.thumbnail
? media.sizes.thumbnail.url
: media.sizes.full.url,
alt: media.alt
});
}
});
e.preventDefault();
})
/* Remove Image */
.on("click", el.coverRemoveClassName, function(e) {
var $this = $(this);
resetCoverImage($this.parents(el.trackFieldClassName));
e.stopPropagation();
e.preventDefault();
});
/**
* Hide / show options based on player type
*
* Different player types support different kind of options.
* E.g. "Simple Player" doesn't support tracklist height, etc.
*/
var $settingsWrap = $(".ai-module-settings");
var $typeSelect = $(".ai-form-select-player-type");
function getUnsupportedSettings($el) {
var settingsString = $el.data("no-support");
if (typeof settingsString !== "string") {
return [];
}
return settingsString
.replace(/\s/g, "") // remove all whitespace
.split(",")
.map(function(x) {
return "_audioigniter_" + x;
});
}
function filterUIBasedOnPlayerType($el) {
var type = $el.val();
// Reset styles
var $shortcodeMetaBox = $("#ai-meta-box-shortcode");
var $messageBox = $(".ai-player-type-message");
var info = $el.data("info");
$shortcodeMetaBox.show();
if (info) {
$messageBox.text(info).show();
} else {
$messageBox.text("").hide();
}
// Player specific controls
switch (type) {
case "global-footer":
$shortcodeMetaBox.hide();
break;
default:
return;
}
}
function filterSettings() {
var $formFields;
var $type = $typeSelect.find(":selected");
var unsupportedSettings = getUnsupportedSettings($type);
filterUIBasedOnPlayerType($type);
if (unsupportedSettings.length === 0) {
$formFields = $settingsWrap.find(".ai-form-field");
$formFields.show();
return;
}
$settingsWrap.find("input", "select", "textarea").each(function() {
var $this = $(this);
var $parent = $this.parents(".ai-form-field");
if (unsupportedSettings.indexOf($this.attr("name")) > -1) {
$parent.hide();
} else {
$parent.show();
}
});
}
filterSettings();
$typeSelect.on("change", filterSettings);
/**
* Shortcode select on click
*/
el.$shortcodeInputField.on("click", function() {
$(this).select();
});
/**
* Export public methods and variables
*/
return {
elements: el,
uuid: uuid,
collapseField: collapseField,
expandField: expandField,
isFieldCollapsed: isFieldCollapsed,
isTrackFieldEmpty: isTrackFieldEmpty,
resetField: resetField,
resetCoverImage: resetCoverImage,
getNewTrackField: getNewTrackField,
removeElement: removeElement,
populateTrackField: populateTrackField,
setTrackFieldCover: setTrackFieldCover,
wpMediaInit: wpMediaInit
};
})();
// Expose the AudioIgniter instance as a global
if (!window.AudioIgniter) {
window.AudioIgniter = AudioIgniter;
}
});

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,169 @@
<?php
/**
* AudioIgniter_Admin_Page_Upsell class.
*
* @since 2.0.0
*/
class AudioIgniter_Admin_Page_Upsell {
/**
* Settings tabs.
*
* @since 2.0.0
*
* @var array
*/
protected $tabs = array();
/**
* Settings page slug.
*
* @since 2.0.0
*/
protected static $page_slug = 'audioigniter-upsell';
/**
* @since 2.0.0
*/
public function __construct() {
add_action( 'admin_menu', array( $this, 'register' ) );
$this->tabs = array(
'general' => array(
'title' => _x( 'General', 'settings tab title', 'audioigniter' ),
'callback' => array( $this, 'tab_general' ),
),
);
}
/**
* Register the page
*
* @since 2.0.0
*
* @return void
*/
public function register() {
$page_slug = 'edit.php?post_type=' . AudioIgniter()->post_type;
add_submenu_page( $page_slug, __( 'AudioIgniter Settings', 'audioigniter' ), __( 'Go Pro!', 'audioigniter' ), 'manage_options', self::$page_slug, array( $this, 'render_page' ) );
}
/**
* Renders the onboarding page.
*
* @since 2.0.0
*/
public function render_page() {
$active_tab = isset( $_GET['tab'] ) ? sanitize_key( wp_unslash( $_GET['tab'] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification
if ( ! array_key_exists( $active_tab, $this->tabs ) ) {
reset( $this->tabs );
$active_tab = key( $this->tabs );
}
?>
<div class="wrap ai-settings-wrap">
<h2 class="ai-settings-header-title">
<?php esc_html_e( 'AudioIgniter Settings', 'audioigniter' ); ?>
</h2>
<div class="ai-settings-main-wrap">
<div class="ai-settings-wp-notices">
<hr class="wp-header-end">
</div>
<div class="ai-settings-main">
<?php $this->generate_tabs( $active_tab ); ?>
</div>
</div>
</div>
<?php
}
/**
* Creates the navigation tabs.
*
* @since 2.0.0
*/
public function generate_tabs( $active_tab ) {
?>
<div class="ai-settings-main-content-nav-header ai-settings-box">
<div class="ai-settings-main-content-nav">
<?php foreach ( $this->tabs as $tab => $tab_info ) : ?>
<?php if ( empty( $tab_info['title'] ) ) {
continue;
} ?>
<a href="<?php echo esc_url( $this->get_tab_url( $tab ) ); ?>" class="ai-settings-main-content-nav-link <?php echo esc_attr( $active_tab === $tab ? 'is-active' : '' ); ?>"><?php echo esc_html( $tab_info['title'] ); ?></a>
<?php endforeach; ?>
</div>
</div>
<div class="ai-settings-main-content tab-content-<?php echo esc_attr( $active_tab ); ?>">
<?php if ( is_callable( $this->tabs[ $active_tab ]['callback'] ) ) {
call_user_func( $this->tabs[ $active_tab ]['callback'], $active_tab );
} ?>
</div>
<?php
}
/**
* @since 2.0.0
*/
public function tab_general( $active_tab ) {
$stats_enabled = false;
?>
<form method="post" action="options.php">
<div style="border:1px solid black; padding: 50px 15px; background-color: white;">
TODO: Leave disabled option below and write some upsell stuff. Maybe add images. Or replace everything with upsell info.
</div>
<table class="form-table">
<tr>
<th scope="row"><label for="audioigniter_stats_enabled"><?php esc_html_e( 'Analytics', 'audioigniter' ); ?></label></th>
<td>
<label for="audioigniter_stats_enabled">
<input disabled type="checkbox" id="upsell_stats_enabled" name="upsell_stats_enabled" value="1">
<?php esc_html_e( 'Enable analytics', 'audioigniter' ); ?>
</label>
<p class="description" id="tagline-description">
<?php esc_html_e( 'When disabled, no new events will be logged and processed into the database.', 'audioigniter' ); ?>
</p>
</td>
</tr>
</table>
<?php submit_button(); ?>
</form>
<?php
}
/**
* Returns the setting page's URL.
*
* @since 2.0.0
*
* @return string
*/
private function get_page_url() {
return add_query_arg( array(
'post_type' => 'ai_playlist',
'page' => self::$page_slug,
), admin_url( 'edit.php' ) );
}
/**
* Returns the URL of a specific tab.
*
* @since 2.0.0
*
* @return string
*/
private function get_tab_url( $tab ) {
return add_query_arg( array(
'tab' => $tab,
), $this->get_page_url() );
}
}

View File

@ -0,0 +1,368 @@
<?php
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
/**
* Class AudioIgniter_Sanitizer
*
* Provides static sanitization functions.
*
* @since 1.0.0
*/
class AudioIgniter_Sanitizer {
/**
* Sanitizes the player type.
*
* @version 1.4.0
* @since 1.4.0
*
* @uses AudioIgniter->get_player_types()
*
* @param string $value Player type to sanitize.
*
* @return string
*/
public static function player_type( $value ) {
$choices = AudioIgniter()->get_player_types();
if ( array_key_exists( $value, $choices ) ) {
return $value;
}
return 'full';
}
/**
* Sanitizes a playlist (repeatable tracks).
*
* @version 1.2.0
* @since 1.0.0
*
* @uses AudioIgniter_Sanitizer::playlist_track()
*
* @param array $post_tracks Input values to sanitize, as passed by the playlist metabox.
* @param int|null $post_id Optional. Post ID where the track belongs to.
*
* @return array
*/
public static function metabox_playlist( $post_tracks, $post_id = null ) {
if ( empty( $post_tracks ) || ! is_array( $post_tracks ) ) {
return array();
}
$tracks = array();
foreach ( $post_tracks as $uid => $track_data ) {
$track = self::playlist_track( $track_data, $post_id, $uid );
if ( false !== $track ) {
$tracks[] = $track;
}
}
return apply_filters( 'audioigniter_sanitize_playlist', $tracks, $post_tracks, $post_id );
}
/**
* Sanitizes a single playlist track.
*
* @since 1.0.0
*
* @uses AudioIgniter::get_default_track_values()
*
* @param array $track Input values to sanitize.
* @param int|null $post_id Optional. Post ID where the track belongs to.
* @param string $track_uid Optional. UID that identifies the track in the metabox list.
*
* @return array|false Array if at least one field is completed, false otherwise.
*/
public static function playlist_track( $track, $post_id = null, $track_uid = '' ) {
$track = wp_parse_args( $track, AudioIgniter::get_default_track_values() );
$sanitized_track = array();
$sanitized_track['cover_id'] = intval( $track['cover_id'] );
$sanitized_track['title'] = sanitize_text_field( $track['title'] );
$sanitized_track['artist'] = sanitize_text_field( $track['artist'] );
$sanitized_track['track_url'] = esc_url_raw( $track['track_url'] );
$sanitized_track['buy_link'] = esc_url_raw( $track['buy_link'] );
$sanitized_track['download_url'] = esc_url_raw( $track['download_url'] );
$sanitized_track['download_uses_track_url'] = ! empty( $track['download_uses_track_url'] ) ? 1 : 0;
$sanitized_track = array_map( 'trim', $sanitized_track );
$tmp = array_filter( $sanitized_track );
if ( empty( $tmp ) ) {
$sanitized_track = false;
}
return apply_filters( 'audioigniter_sanitize_playlist_track', $sanitized_track, $track, $post_id, $track_uid );
}
/**
* Sanitizes a checkbox value.
*
* @since 1.0.0
*
* @param int|string|bool $input Input value to sanitize.
*
* @return int|string Returns 1 if $input evaluates to 1, an empty string otherwise.
*/
public static function checkbox( $input ) {
if ( 1 == $input ) { // WPCS: loose comparison ok.
return 1;
}
return '';
}
/**
* Sanitizes a checkbox value. Value is passed by reference.
*
* Useful when sanitizing form checkboxes. Since browsers don't send any data when a checkbox
* is not checked, checkbox() throws an error.
* checkbox_ref() however evaluates &$input as null so no errors are thrown.
*
* @since 1.0.0
*
* @param int|string|bool &$input Input value to sanitize.
*
* @return int|string Returns 1 if $input evaluates to 1, an empty string otherwise.
*/
public static function checkbox_ref( &$input ) {
if ( 1 == $input ) { // WPCS: loose comparison ok.
return 1;
}
return '';
}
/**
* Sanitizes integer input while differentiating zero from empty string.
*
* @since 1.0.0
*
* @param mixed $input Input value to sanitize.
*
* @return int|string Integer value (including zero), or an empty string otherwise.
*/
public static function intval_or_empty( $input ) {
if ( is_null( $input ) || false === $input || '' === $input ) {
return '';
}
if ( 0 == $input ) { // WPCS: loose comparison ok.
return 0;
}
return intval( $input );
}
/**
* Returns a sanitized hex color code.
*
* @since 1.0.0
*
* @param string $str The color string to be sanitized.
* @param bool $return_hash Whether to return the color code prepended by a hash.
* @param string $return_fail The value to return on failure.
*
* @return string A valid hex color code on success, an empty string on failure.
*/
public static function hex_color( $str, $return_hash = true, $return_fail = '' ) {
if ( false === $str || empty( $str ) || 'false' === $str ) {
return $return_fail;
}
// Allow keywords and predefined colors
if ( in_array( $str, array( 'transparent', 'initial', 'inherit', 'black', 'silver', 'gray', 'grey', 'white', 'maroon', 'red', 'purple', 'fuchsia', 'green', 'lime', 'olive', 'yellow', 'navy', 'blue', 'teal', 'aqua', 'orange', 'aliceblue', 'antiquewhite', 'aquamarine', 'azure', 'beige', 'bisque', 'blanchedalmond', 'blueviolet', 'brown', 'burlywood', 'cadetblue', 'chartreuse', 'chocolate', 'coral', 'cornflowerblue', 'cornsilk', 'crimson', 'darkblue', 'darkcyan', 'darkgoldenrod', 'darkgray', 'darkgrey', 'darkgreen', 'darkkhaki', 'darkmagenta', 'darkolivegreen', 'darkorange', 'darkorchid', 'darkred', 'darksalmon', 'darkseagreen', 'darkslateblue', 'darkslategray', 'darkslategrey', 'darkturquoise', 'darkviolet', 'deeppink', 'deepskyblue', 'dimgray', 'dimgrey', 'dodgerblue', 'firebrick', 'floralwhite', 'forestgreen', 'gainsboro', 'ghostwhite', 'gold', 'goldenrod', 'greenyellow', 'grey', 'honeydew', 'hotpink', 'indianred', 'indigo', 'ivory', 'khaki', 'lavender', 'lavenderblush', 'lawngreen', 'lemonchiffon', 'lightblue', 'lightcoral', 'lightcyan', 'lightgoldenrodyellow', 'lightgray', 'lightgreen', 'lightgrey', 'lightpink', 'lightsalmon', 'lightseagreen', 'lightskyblue', 'lightslategray', 'lightslategrey', 'lightsteelblue', 'lightyellow', 'limegreen', 'linen', 'mediumaquamarine', 'mediumblue', 'mediumorchid', 'mediumpurple', 'mediumseagreen', 'mediumslateblue', 'mediumspringgreen', 'mediumturquoise', 'mediumvioletred', 'midnightblue', 'mintcream', 'mistyrose', 'moccasin', 'navajowhite', 'oldlace', 'olivedrab', 'orangered', 'orchid', 'palegoldenrod', 'palegreen', 'paleturquoise', 'palevioletred', 'papayawhip', 'peachpuff', 'peru', 'pink', 'plum', 'powderblue', 'rosybrown', 'royalblue', 'saddlebrown', 'salmon', 'sandybrown', 'seagreen', 'seashell', 'sienna', 'skyblue', 'slateblue', 'slategray', 'slategrey', 'snow', 'springgreen', 'steelblue', 'tan', 'thistle', 'tomato', 'turquoise', 'violet', 'wheat', 'whitesmoke', 'yellowgreen', 'rebeccapurple' ), true ) ) {
return $str;
}
// Include the hash if not there.
// The regex below depends on in.
if ( substr( $str, 0, 1 ) !== '#' ) {
$str = '#' . $str;
}
preg_match( '/(#)([0-9a-fA-F]{6})/', $str, $matches );
if ( count( $matches ) === 3 ) {
if ( $return_hash ) {
return $matches[1] . $matches[2];
} else {
return $matches[2];
}
}
return $return_fail;
}
/**
* Sanitizes a CSS color.
*
* Tries to validate and sanitize values in these formats:
* - rgba()
* - 3 and 6 digit hex values, optionally prefixed with `#`
* - Predefined CSS named colors/keywords, such as 'transparent', 'initial', 'inherit', 'black', 'silver', etc.
*
* @since 1.7.1
*
* @param string $color The color value to sanitize
* @param bool $return_hash Whether to return hex color prefixed with a `#`
* @param string $return_fail Value to return when $color fails validation.
*
* @return string
*/
public static function rgba_color( $color, $return_hash = true, $return_fail = '' ) {
if ( false === $color || empty( $color ) || 'false' === $color ) {
return $return_fail;
}
// Allow keywords and predefined colors
if ( in_array( $color, array( 'transparent', 'initial', 'inherit', 'black', 'silver', 'gray', 'grey', 'white', 'maroon', 'red', 'purple', 'fuchsia', 'green', 'lime', 'olive', 'yellow', 'navy', 'blue', 'teal', 'aqua', 'orange', 'aliceblue', 'antiquewhite', 'aquamarine', 'azure', 'beige', 'bisque', 'blanchedalmond', 'blueviolet', 'brown', 'burlywood', 'cadetblue', 'chartreuse', 'chocolate', 'coral', 'cornflowerblue', 'cornsilk', 'crimson', 'darkblue', 'darkcyan', 'darkgoldenrod', 'darkgray', 'darkgrey', 'darkgreen', 'darkkhaki', 'darkmagenta', 'darkolivegreen', 'darkorange', 'darkorchid', 'darkred', 'darksalmon', 'darkseagreen', 'darkslateblue', 'darkslategray', 'darkslategrey', 'darkturquoise', 'darkviolet', 'deeppink', 'deepskyblue', 'dimgray', 'dimgrey', 'dodgerblue', 'firebrick', 'floralwhite', 'forestgreen', 'gainsboro', 'ghostwhite', 'gold', 'goldenrod', 'greenyellow', 'grey', 'honeydew', 'hotpink', 'indianred', 'indigo', 'ivory', 'khaki', 'lavender', 'lavenderblush', 'lawngreen', 'lemonchiffon', 'lightblue', 'lightcoral', 'lightcyan', 'lightgoldenrodyellow', 'lightgray', 'lightgreen', 'lightgrey', 'lightpink', 'lightsalmon', 'lightseagreen', 'lightskyblue', 'lightslategray', 'lightslategrey', 'lightsteelblue', 'lightyellow', 'limegreen', 'linen', 'mediumaquamarine', 'mediumblue', 'mediumorchid', 'mediumpurple', 'mediumseagreen', 'mediumslateblue', 'mediumspringgreen', 'mediumturquoise', 'mediumvioletred', 'midnightblue', 'mintcream', 'mistyrose', 'moccasin', 'navajowhite', 'oldlace', 'olivedrab', 'orangered', 'orchid', 'palegoldenrod', 'palegreen', 'paleturquoise', 'palevioletred', 'papayawhip', 'peachpuff', 'peru', 'pink', 'plum', 'powderblue', 'rosybrown', 'royalblue', 'saddlebrown', 'salmon', 'sandybrown', 'seagreen', 'seashell', 'sienna', 'skyblue', 'slateblue', 'slategray', 'slategrey', 'snow', 'springgreen', 'steelblue', 'tan', 'thistle', 'tomato', 'turquoise', 'violet', 'wheat', 'whitesmoke', 'yellowgreen', 'rebeccapurple' ), true ) ) {
return $color;
}
preg_match( '/rgba\(\s*(\d{1,3}\.?\d*\%?)\s*,\s*(\d{1,3}\.?\d*\%?)\s*,\s*(\d{1,3}\.?\d*\%?)\s*,\s*(\d{1}\.?\d*\%?)\s*\)/', $color, $rgba_matches );
if ( ! empty( $rgba_matches ) && 5 === count( $rgba_matches ) ) {
for ( $i = 1; $i < 4; $i++ ) {
if ( strpos( $rgba_matches[ $i ], '%' ) !== false ) {
$rgba_matches[ $i ] = self::float_0_100( $rgba_matches[ $i ] );
} else {
$rgba_matches[ $i ] = self::int_0_255( $rgba_matches[ $i ] );
}
}
$rgba_matches[4] = self::float_0_1( $rgba_matches[ $i ] );
return sprintf( 'rgba(%s, %s, %s, %s)', $rgba_matches[1], $rgba_matches[2], $rgba_matches[3], $rgba_matches[4] );
}
// Not a color function either. Let's see if it's a hex color.
// Include the hash if not there.
// The regex below depends on in.
if ( substr( $color, 0, 1 ) !== '#' ) {
$color = '#' . $color;
}
preg_match( '/(#)([0-9a-fA-F]{6})/', $color, $matches );
if ( 3 === count( $matches ) ) {
if ( $return_hash ) {
return $matches[1] . $matches[2];
} else {
return $matches[2];
}
}
return $return_fail;
}
/**
* Sanitizes a percentage value, 0% - 100%
*
* Accepts float values with or without the percentage sign `%`
* Returns a string suffixed with the percentage sign `%`.
*
* @since 1.7.1
*
* @param mixed $value
*
* @return string A percentage value, including the percentage sign.
*/
public static function float_0_100( $value ) {
$value = str_replace( '%', '', $value );
if ( floatval( $value ) > 100 ) {
$value = 100;
} elseif ( floatval( $value ) < 0 ) {
$value = 0;
}
return floatval( $value ) . '%';
}
/**
* Sanitizes a decimal CSS color value, 0 - 255.
*
* Accepts float values with or without the percentage sign `%`
* Returns a string suffixed with the percentage sign `%`.
*
* @since 1.7.1
*
* @param mixed $value
*
* @return int A number between 0-255.
*/
public static function int_0_255( $value ) {
if ( intval( $value ) > 255 ) {
$value = 255;
} elseif ( intval( $value ) < 0 ) {
$value = 0;
}
return intval( $value );
}
/**
* Sanitizes a CSS opacity value, 0 - 1.
*
* @since 1.7.1
*
* @param mixed $value
*
* @return float A number between 0-1.
*/
public static function float_0_1( $value ) {
if ( floatval( $value ) > 1 ) {
$value = 1;
} elseif ( floatval( $value ) < 0 ) {
$value = 0;
}
return floatval( $value );
}
/**
* Removes elements whose keys are not valid data-attribute names.
*
* @since 1.0.0
*
* @param array $array Input array to sanitize.
*
* @return array()
*/
public static function html_data_attributes_array( $array ) {
$keys = array_keys( $array );
$key_prefix = 'data-';
// Remove keys that are not data attributes.
foreach ( $keys as $key ) {
if ( substr( $key, 0, strlen( $key_prefix ) ) !== $key_prefix ) {
unset( $array[ $key ] );
}
}
return $array;
}
/**
* Returns false when value is empty or null.
* Only use with array_filter() or similar, as the naming can lead to confusion.
*
* @since 1.2.0
*
* @param mixed $value Array value to check whether empty or null.
*
* @return bool false if empty or null, true otherwise.
*/
public static function array_filter_empty_null( $value ) {
if ( '' === $value || is_null( $value ) ) {
return false;
}
return true;
}
}

View File

@ -0,0 +1,423 @@
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: AudioIgniter\n"
"POT-Creation-Date: 2024-11-19 13:49+0200\n"
"PO-Revision-Date: 2016-08-29 19:22+0300\n"
"Last-Translator: Anastis Sourgoutsidis <anastis@cssigniter.com>\n"
"Language-Team: Anastis Sourgoutsidis <anastis@cssigniter.com>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
"X-Generator: Poedit 3.5\n"
"X-Poedit-Basepath: ..\n"
"X-Poedit-WPHeader: audioigniter.php\n"
"X-Poedit-SourceCharset: UTF-8\n"
"X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c;_nx:4c,1,2;esc_attr__;"
"esc_attr_e;esc_attr_x:1,2c;esc_html__;esc_html_e;esc_html_x:1,2c;_n_noop:1,2;"
"_nx_noop:3c,1,2;__ngettext_noop:1,2\n"
"X-Poedit-Flags-xgettext: --add-comments=translators:\n"
"X-Poedit-SearchPath-0: .\n"
"X-Poedit-SearchPathExcluded-0: *.js\n"
#. translators: %s is the track's title.
#: audioigniter.php:220
#, php-format
msgid "Play %s"
msgstr ""
#. translators: %s is the track's title.
#: audioigniter.php:222
#, php-format
msgid "Pause %s"
msgstr ""
#: audioigniter.php:223
msgid "Previous track"
msgstr ""
#: audioigniter.php:224
msgid "Next track"
msgstr ""
#: audioigniter.php:225
msgid "Toggle track listing repeat"
msgstr ""
#: audioigniter.php:226
msgid "Toggle track repeat"
msgstr ""
#: audioigniter.php:227
msgid "Toggle track listing visibility"
msgstr ""
#: audioigniter.php:228
msgid "Buy this track"
msgstr ""
#: audioigniter.php:229
msgid "Download this track"
msgstr ""
#: audioigniter.php:230
msgid "Volume Up"
msgstr ""
#: audioigniter.php:231
msgid "Volume Down"
msgstr ""
#: audioigniter.php:232
msgid "Open track lyrics"
msgstr ""
#: audioigniter.php:233
msgid "Set playback rate"
msgstr ""
#: audioigniter.php:234
msgid "Skip forward"
msgstr ""
#: audioigniter.php:235
msgid "Skip backward"
msgstr ""
#: audioigniter.php:236
msgid "Shuffle"
msgstr ""
#: audioigniter.php:249
msgid ""
"Do you really want to remove all tracks? (This will not delete your audio "
"files)."
msgstr ""
#: audioigniter.php:250
msgid "Select or upload audio media"
msgstr ""
#: audioigniter.php:251
msgid "Select a cover image"
msgstr ""
#: audioigniter.php:294
msgctxt "post type general name"
msgid "Playlists"
msgstr ""
#: audioigniter.php:295 audioigniter.php:311
msgctxt "post type singular name"
msgid "Playlist"
msgstr ""
#: audioigniter.php:296
msgctxt "admin menu"
msgid "AudioIgniter"
msgstr ""
#: audioigniter.php:297
msgctxt "admin menu"
msgid "All Playlists"
msgstr ""
#: audioigniter.php:298
msgctxt "add new on admin bar"
msgid "Playlist"
msgstr ""
#: audioigniter.php:299 audioigniter.php:300
msgid "Add New Playlist"
msgstr ""
#: audioigniter.php:301
msgid "Edit Playlist"
msgstr ""
#: audioigniter.php:302
msgid "New Playlist"
msgstr ""
#: audioigniter.php:303
msgid "View Playlist"
msgstr ""
#: audioigniter.php:304
msgid "Search Playlists"
msgstr ""
#: audioigniter.php:305
msgid "No playlists found"
msgstr ""
#: audioigniter.php:306
msgid "No playlists found in the trash"
msgstr ""
#: audioigniter.php:331 audioigniter.php:857
msgid "Tracks"
msgstr ""
#: audioigniter.php:332
msgid "Settings"
msgstr ""
#: audioigniter.php:333 audioigniter.php:1325
msgid "Shortcode"
msgstr ""
#: audioigniter.php:391
msgid "AudioIgniter Logo"
msgstr ""
#: audioigniter.php:400
msgid "Upgrade to Pro"
msgstr ""
#: audioigniter.php:424
msgid "Support"
msgstr ""
#: audioigniter.php:428
msgid "Documentation"
msgstr ""
#: audioigniter.php:432
msgid "Rate this plugin"
msgstr ""
#. translators: %s is a URL.
#: audioigniter.php:455
#, php-format
msgid ""
"Thank you for creating with <a href=\"%s\" target=\"_blank\">AudioIgniter</a>"
msgstr ""
#: audioigniter.php:501
msgid "Toggle track visibility"
msgstr ""
#: audioigniter.php:512
msgid "Remove Cover Image"
msgstr ""
#: audioigniter.php:525
msgid "Upload Cover"
msgstr ""
#: audioigniter.php:543 audioigniter.php:550
msgid "Title"
msgstr ""
#: audioigniter.php:558 audioigniter.php:565
msgid "Artist"
msgstr ""
#: audioigniter.php:574 audioigniter.php:581
msgid "Buy link"
msgstr ""
#: audioigniter.php:594 audioigniter.php:603
msgid "Audio file or radio stream"
msgstr ""
#: audioigniter.php:607
msgid "Upload"
msgstr ""
#: audioigniter.php:618 audioigniter.php:625
msgid "Download URL"
msgstr ""
#: audioigniter.php:639
msgid "Remove Track"
msgstr ""
#: audioigniter.php:654
msgid "Add Track"
msgstr ""
#: audioigniter.php:661
msgid "Clear Playlist"
msgstr ""
#: audioigniter.php:667
msgid "Expand All"
msgstr ""
#: audioigniter.php:670
msgid "Collapse All"
msgstr ""
#: audioigniter.php:709
msgid "Player &amp; Track listing"
msgstr ""
#: audioigniter.php:714
msgid "Player Type"
msgstr ""
#: audioigniter.php:745
msgid "Show track listing by default"
msgstr ""
#: audioigniter.php:759
msgid "Show track listing visibility toggle button"
msgstr ""
#: audioigniter.php:773
msgid "Reverse track order"
msgstr ""
#: audioigniter.php:779
msgid "Starting volume"
msgstr ""
#: audioigniter.php:790
msgid "0-100"
msgstr ""
#: audioigniter.php:795
msgid "Enter a value between 0 and 100 in increments of 10"
msgstr ""
#: audioigniter.php:809
msgid "Limit track listing height"
msgstr ""
#: audioigniter.php:815 audioigniter.php:825
msgid "Track listing height"
msgstr ""
#: audioigniter.php:830
msgid "Set a number of pixels"
msgstr ""
#: audioigniter.php:836
msgid "Maximum player width"
msgstr ""
#: audioigniter.php:844
msgid "Automatic width"
msgstr ""
#: audioigniter.php:849
#, no-php-format
msgid ""
"Set a number of pixels, or leave empty to automatically cover 100% of the "
"available area (recommended)."
msgstr ""
#: audioigniter.php:869
msgid "Show track numbers in tracklist"
msgstr ""
#: audioigniter.php:883
msgid "Show track covers in tracklist"
msgstr ""
#: audioigniter.php:897
msgid "Show active track's cover"
msgstr ""
#: audioigniter.php:911
msgid "Show artist names"
msgstr ""
#: audioigniter.php:925
msgid "Show track extra buttons (buy link, download button etc)"
msgstr ""
#: audioigniter.php:939
msgid "Open buy links in new window"
msgstr ""
#: audioigniter.php:947
msgid "Track &amp; Track listing repeat"
msgstr ""
#: audioigniter.php:959
msgid "Repeat track listing enabled by default"
msgstr ""
#: audioigniter.php:973
msgid "Show track listing repeat toggle button"
msgstr ""
#: audioigniter.php:990
msgid "Show \"Powered by AudioIgniter\" link"
msgstr ""
#: audioigniter.php:994
msgid ""
"We've put a great deal of effort into building this plugin. If you feel like "
"it, let others know about it by enabling this option."
msgstr ""
#: audioigniter.php:1014
msgid "Grab the shortcode"
msgstr ""
#: audioigniter.php:1048
msgid "Full Player"
msgstr ""
#: audioigniter.php:1053
msgid "Simple Player"
msgstr ""
#: audioigniter.php:1276
msgid "ID doesn't match a playlist"
msgstr ""
#: inc/class-audioigniter-admin-page-upsell.php:32
msgctxt "settings tab title"
msgid "General"
msgstr ""
#: inc/class-audioigniter-admin-page-upsell.php:47
#: inc/class-audioigniter-admin-page-upsell.php:65
msgid "AudioIgniter Settings"
msgstr ""
#: inc/class-audioigniter-admin-page-upsell.php:47
msgid "Go Pro!"
msgstr ""
#: inc/class-audioigniter-admin-page-upsell.php:123
msgid "Analytics"
msgstr ""
#: inc/class-audioigniter-admin-page-upsell.php:127
msgid "Enable analytics"
msgstr ""
#: inc/class-audioigniter-admin-page-upsell.php:130
msgid ""
"When disabled, no new events will be logged and processed into the database."
msgstr ""
#. Plugin Name of the plugin/theme
msgid "AudioIgniter"
msgstr ""
#. Plugin URI of the plugin/theme
msgid "https://www.cssigniter.com/plugins/audioigniter/"
msgstr ""
#. Description of the plugin/theme
msgid ""
"AudioIgniter lets you create music playlists and embed them in your "
"WordPress posts, pages or custom post types and serve your audio content in "
"style!"
msgstr ""
#. Author of the plugin/theme
msgid "The CSSIgniter Team"
msgstr ""
#. Author URI of the plugin/theme
msgid "https://www.cssigniter.com"
msgstr ""

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,68 @@
/*!
Copyright (c) 2015 Jed Watson.
Based on code that is Copyright 2013-2015, Facebook, Inc.
All rights reserved.
*/
/*!
Copyright (c) 2018 Jed Watson.
Licensed under the MIT License (MIT), see
http://jedwatson.github.io/classnames
*/
/*!
* Adapted from jQuery UI core
*
* http://jqueryui.com
*
* Copyright 2014 jQuery Foundation and other contributors
* Released under the MIT license.
* http://jquery.org/license
*
* http://api.jqueryui.com/category/ui-core/
*/
/*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */
/**
* @license React
* react-dom.production.min.js
*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
/**
* @license React
* react.production.min.js
*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
/**
* @license React
* scheduler.production.min.js
*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
/** @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
*/

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,54 @@
<!doctype html><html><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>AudioIgniter</title><style>body {
padding-bottom: 120px;
}</style><script defer="defer" src="style.js"></script><script defer="defer" src="app.js"></script><link href="style.css" rel="stylesheet"></head><body><div id="audioigniter-01" class="audioigniter-root" data-player-type="full" data-tracks-url="/dev-tracks.json" data-display-active-cover="true" data-display-tracklist-covers="true" data-display-credits="true" data-display-tracklist="true" data-allow-tracklist-toggle="true" data-allow-tracklist-loop="true" data-allow-track-loop="true" data-allow-playback-rate="true" data-display-track-no="true" data-display-artist-names="true" data-display-buy-buttons="true" data-buy-buttons-target="true" data-volume="50" data-cycle-tracks="true" data-limit-tracklist-height="true" data-tracklist-height="185" data-reverse-track-order="false" data-skip-amount="15" data-max-width="600px" data-initial-track="1" data-stop-on-finish="true" data-tracks-delay="5" data-timer-countdown="false" data-shuffle="true" data-shuffle-default="true" data-soundcloud-client-id="" data-remember-last="true" data-player-buttons='[
{
"title": "CSSIgniter",
"url": "https://cssigniter.com",
"icon": "<svg width=\"48\" height=\"48\" viewBox=\"0 0 48 48\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M48 24C48 10.7452 37.2548 0 24 0C10.7452 0 0 10.7452 0 24C0 35.9789 8.77641 45.908 20.25 47.7084V30.9375H14.1562V24H20.25V18.7125C20.25 12.6975 23.8331 9.375 29.3152 9.375C31.9402 9.375 34.6875 9.84375 34.6875 9.84375V15.75H31.6613C28.68 15.75 27.75 17.6002 27.75 19.5V24H34.4062L33.3422 30.9375H27.75V47.7084C39.2236 45.908 48 35.9789 48 24Z\" fill=\"black\"/>\n</svg>"
},
{
"title": "",
"url": "https://cssigniter.com",
"icon": "<svg width=\"48\" height=\"40\" viewBox=\"0 0 48 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M15.1003 39.5001C33.2091 39.5001 43.1166 24.4935 43.1166 11.4838C43.1166 11.0619 43.1072 10.6307 43.0884 10.2088C45.0157 8.81501 46.679 7.0886 48 5.11068C46.205 5.90929 44.2993 6.43085 42.3478 6.65756C44.4026 5.4259 45.9411 3.49103 46.6781 1.21162C44.7451 2.3572 42.6312 3.16531 40.4269 3.60131C38.9417 2.02321 36.978 0.97832 34.8394 0.62819C32.7008 0.278059 30.5064 0.642189 28.5955 1.66428C26.6846 2.68637 25.1636 4.3095 24.2677 6.28271C23.3718 8.25592 23.1509 10.4693 23.6391 12.5807C19.725 12.3843 15.8959 11.3675 12.4 9.59628C8.90405 7.82507 5.81939 5.33896 3.34594 2.29912C2.0888 4.46657 1.70411 7.03138 2.27006 9.47227C2.83601 11.9132 4.31013 14.047 6.39281 15.4401C4.82926 15.3904 3.29995 14.9694 1.93125 14.2119V14.3338C1.92985 16.6084 2.7162 18.8133 4.15662 20.5736C5.59704 22.334 7.60265 23.5412 9.8325 23.9901C8.38411 24.3863 6.86396 24.4441 5.38969 24.1588C6.01891 26.115 7.24315 27.8259 8.89154 29.0528C10.5399 30.2796 12.5302 30.9613 14.5847 31.0026C11.0968 33.7423 6.78835 35.2283 2.35313 35.2213C1.56657 35.2201 0.780798 35.1719 0 35.0769C4.50571 37.9676 9.74706 39.5029 15.1003 39.5001Z\" fill=\"black\"/>\n</svg>"
},
{
"title": "Another title",
"url": "https://cssigniter.com",
"icon": ""
}
]
'></div><div id="audioigniter-02" class="audioigniter-root" data-player-type="simple" data-tracks-url="/dev-tracks.json" data-display-credits="true" data-display-track-no="true" data-allow-playback-rate="true" data-display-artist-names="true" data-display-buy-buttons="true" data-buy-buttons-target="true" data-allow-track-loop="true" data-volume="50" data-reverse-track-order="false" data-max-width="600px" data-initial-track="3" data-stop-on-finish="false" data-tracks-delay="0" data-timer-countdown="false" data-shuffle="true" data-soundcloud-client-id="" data-player-buttons='[
{
"title": "CSSIgniter",
"url": "https://cssigniter.com",
"icon": "<svg width=\"48\" height=\"48\" viewBox=\"0 0 48 48\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M48 24C48 10.7452 37.2548 0 24 0C10.7452 0 0 10.7452 0 24C0 35.9789 8.77641 45.908 20.25 47.7084V30.9375H14.1562V24H20.25V18.7125C20.25 12.6975 23.8331 9.375 29.3152 9.375C31.9402 9.375 34.6875 9.84375 34.6875 9.84375V15.75H31.6613C28.68 15.75 27.75 17.6002 27.75 19.5V24H34.4062L33.3422 30.9375H27.75V47.7084C39.2236 45.908 48 35.9789 48 24Z\" fill=\"black\"/>\n</svg>"
},
{
"title": "",
"url": "https://cssigniter.com",
"icon": "<svg width=\"48\" height=\"40\" viewBox=\"0 0 48 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M15.1003 39.5001C33.2091 39.5001 43.1166 24.4935 43.1166 11.4838C43.1166 11.0619 43.1072 10.6307 43.0884 10.2088C45.0157 8.81501 46.679 7.0886 48 5.11068C46.205 5.90929 44.2993 6.43085 42.3478 6.65756C44.4026 5.4259 45.9411 3.49103 46.6781 1.21162C44.7451 2.3572 42.6312 3.16531 40.4269 3.60131C38.9417 2.02321 36.978 0.97832 34.8394 0.62819C32.7008 0.278059 30.5064 0.642189 28.5955 1.66428C26.6846 2.68637 25.1636 4.3095 24.2677 6.28271C23.3718 8.25592 23.1509 10.4693 23.6391 12.5807C19.725 12.3843 15.8959 11.3675 12.4 9.59628C8.90405 7.82507 5.81939 5.33896 3.34594 2.29912C2.0888 4.46657 1.70411 7.03138 2.27006 9.47227C2.83601 11.9132 4.31013 14.047 6.39281 15.4401C4.82926 15.3904 3.29995 14.9694 1.93125 14.2119V14.3338C1.92985 16.6084 2.7162 18.8133 4.15662 20.5736C5.59704 22.334 7.60265 23.5412 9.8325 23.9901C8.38411 24.3863 6.86396 24.4441 5.38969 24.1588C6.01891 26.115 7.24315 27.8259 8.89154 29.0528C10.5399 30.2796 12.5302 30.9613 14.5847 31.0026C11.0968 33.7423 6.78835 35.2283 2.35313 35.2213C1.56657 35.2201 0.780798 35.1719 0 35.0769C4.50571 37.9676 9.74706 39.5029 15.1003 39.5001Z\" fill=\"black\"/>\n</svg>"
},
{
"title": "Another title",
"url": "https://cssigniter.com",
"icon": ""
}
]
'></div><div id="audioigniter-03" class="audioigniter-root" data-track='{"title":"Sunrise","subtitle":"Thoribass","audio":"https:\/\/www.cssigniter.com\/assets\/audioigniter\/sunrise.mp3","buyUrl":"https:\/\/google.com","downloadUrl":"https:\/\/www.cssigniter.com\/assets\/audioigniter\/sunrise.mp3","cover":"https:\/\/www.cssigniter.com\/demos\/audioigniter\/wp-content\/uploads\/sites\/48\/2016\/08\/CyberSDF-Flame-and-Go.jpg","lyrics":"Some lyrics"}' data-display-active-cover="false" data-display-credits="true" data-allow-playback-rate="false" data-display-buy-buttons="true" data-volume="100" data-skip-amount="0" data-stop-on-finish="true" data-timer-countdown="false" data-player-type="full" data-tracks-url="" data-display-tracklist="false" data-allow-tracklist-toggle="true" data-allow-tracklist-loop="true" data-allow-track-loop="true" data-display-track-no="false" data-display-artist-names="true" data-buy-buttons-target="true" data-cycle-tracks="false" data-limit-tracklist-height="false" data-tracklist-height="185" data-reverse-track-order="false" data-max-width="600px" data-initial-track="1" data-tracks-delay="0" data-shuffle="false" data-shuffle-default="false" data-remember-last="false"></div><div id="audioigniter-04" class="audioigniter-root" data-player-type="global-footer" data-tracks-url="/dev-tracks.json" data-display-active-cover="true" data-display-tracklist-covers="true" data-display-credits="true" data-display-tracklist="false" data-allow-tracklist-toggle="true" data-allow-tracklist-loop="true" data-allow-track-loop="true" data-display-track-no="true" data-allow-playback-rate="true" data-display-artist-names="true" data-display-buy-buttons="true" data-buy-buttons-target="true" data-volume="50" data-skip-amount="15" data-cycle-tracks="false" data-limit-tracklist-height="true" data-tracklist-height="185" data-reverse-track-order="false" data-max-width="600px" data-initial-track="1" data-stop-on-finish="false" data-tracks-delay="0" data-timer-countdown="true" data-shuffle="true" data-soundcloud-client-id="" data-remember-last="true" data-player-buttons='[
{
"title": "CSSIgniter",
"url": "https://cssigniter.com",
"icon": "<svg width=\"48\" height=\"48\" viewBox=\"0 0 48 48\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M48 24C48 10.7452 37.2548 0 24 0C10.7452 0 0 10.7452 0 24C0 35.9789 8.77641 45.908 20.25 47.7084V30.9375H14.1562V24H20.25V18.7125C20.25 12.6975 23.8331 9.375 29.3152 9.375C31.9402 9.375 34.6875 9.84375 34.6875 9.84375V15.75H31.6613C28.68 15.75 27.75 17.6002 27.75 19.5V24H34.4062L33.3422 30.9375H27.75V47.7084C39.2236 45.908 48 35.9789 48 24Z\" fill=\"black\"/>\n</svg>"
},
{
"title": "",
"url": "https://cssigniter.com",
"icon": "<svg width=\"48\" height=\"40\" viewBox=\"0 0 48 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M15.1003 39.5001C33.2091 39.5001 43.1166 24.4935 43.1166 11.4838C43.1166 11.0619 43.1072 10.6307 43.0884 10.2088C45.0157 8.81501 46.679 7.0886 48 5.11068C46.205 5.90929 44.2993 6.43085 42.3478 6.65756C44.4026 5.4259 45.9411 3.49103 46.6781 1.21162C44.7451 2.3572 42.6312 3.16531 40.4269 3.60131C38.9417 2.02321 36.978 0.97832 34.8394 0.62819C32.7008 0.278059 30.5064 0.642189 28.5955 1.66428C26.6846 2.68637 25.1636 4.3095 24.2677 6.28271C23.3718 8.25592 23.1509 10.4693 23.6391 12.5807C19.725 12.3843 15.8959 11.3675 12.4 9.59628C8.90405 7.82507 5.81939 5.33896 3.34594 2.29912C2.0888 4.46657 1.70411 7.03138 2.27006 9.47227C2.83601 11.9132 4.31013 14.047 6.39281 15.4401C4.82926 15.3904 3.29995 14.9694 1.93125 14.2119V14.3338C1.92985 16.6084 2.7162 18.8133 4.15662 20.5736C5.59704 22.334 7.60265 23.5412 9.8325 23.9901C8.38411 24.3863 6.86396 24.4441 5.38969 24.1588C6.01891 26.115 7.24315 27.8259 8.89154 29.0528C10.5399 30.2796 12.5302 30.9613 14.5847 31.0026C11.0968 33.7423 6.78835 35.2283 2.35313 35.2213C1.56657 35.2201 0.780798 35.1719 0 35.0769C4.50571 37.9676 9.74706 39.5029 15.1003 39.5001Z\" fill=\"black\"/>\n</svg>"
},
{
"title": "Another title",
"url": "https://cssigniter.com",
"icon": ""
}
]
'></div></body></html>

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,223 @@
=== AudioIgniter Music Player ===
Contributors: cssigniterteam, anastis, silencerius, tsiger
Tags: audio, audio player, html5 player, mp3 player, podcast
Requires at least: 6.0
Tested up to: 6.8
Stable tag: 2.0.1
License: GPLv2 or later
License URI: http://www.gnu.org/licenses/gpl-2.0.html
AudioIgniter lets you create music playlists and embed them in your WordPress posts, pages or custom post types and serve your audio content in style!
== Description ==
Looking for an MP3 music player? AudioIgniter lets you create music playlists and embed them in your WordPress posts, pages or custom post types. By using the standard WordPress media upload functionality, you can create new audio playlists in minutes. Oh, you can use AudioIgniter to stream your radio show too!
https://www.youtube.com/watch?v=AmRDYlVW_3M
Check out [the demo](https://www.cssigniter.com/preview/audioigniter/) now!
**Selling digital music?**
You can combine [AudioIgniter with WooCommerce to easily sell individual tracks](https://www.cssigniter.com/sell-individual-tracks-using-audioigniter-with-woocommerce/).
**Features:**
* Supports audio and radio streaming
* Unlimited playlists
* Unlimited tracks
* 100% Compatible with Elementor
* 100% Compatible with Visual Composer
* 100% Compatible with Gutenberg Block Editor
* Responsive layout
* Embed through shortcode
* Flexible settings per playlist
* Show/Hide track listing
* Show/Hide track numbers in tracklist
* Show numbers in reverse order
* Show/Hide track covers in playlist
* Show/Hide active tracks cover
* Show/Hide artist name
* Custom "Buy track" URL field
* Custom "Download" URL field
* "Full" or "Simple" player mode (Great for podcasts)
* Limit track listing height
* Repeat track listing option
* Maximum player width
* Automatic ID3 Tag extraction from MP3 files
* Heavily tested on the 150 most popular free themes on WordPress.org
**Supported Services:**
* Acast
* Amazon S3
* Anchor
* Art19
* AudioBoom
* Castbox
* Captivate
* Icecast
* Podbean
* Radiojar
* Shoutcast
* Speaker
* Stitcher
* Libsyn
**But wait, there's more!**
A [Pro version](https://www.cssigniter.com/plugins/audioigniter) is also available! Here's what you get if you decide to upgrade:
* Bulk upload functionality
* Rearrange tracks functionality
* Stop Tracks From Other Players (Multiple Players In One Page)
* Track skipping functionality (You can adjust the number of seconds)
* Playback rate (1x, 1.5x, 2x)
* Lyrics per track
* Individual Track Repeat Mode
* Non-continuous playback (Stop each track after playing)
* Optional customizable delay between tracks
* Shuffle playlist mode
* Starting track option
* Default track timer to countdown mode
* Fixed position player (Continuous play must be supported by your theme)
* Internal taxonomy for archiving purposes
* Customize the colors through the Customizer
* Custom block for the Gutenberg Block Editor (With the ability to change colors per player)
* Widget & Shortcode available
* Streaming service button links
* Sync download URL with audio URL automatically
* Standalone shortcode for single tracks (without the need to create a playlist)
* Remember last played track and position
* Per-playlist and per-track analytics
**PREMIUM SUPPORT**
You can expect the same level of support for both the free and pro version of our plugin. Average response time: 24 hours.
**JOIN OUR COMMUNITY**
Join our [Facebook group](https://www.facebook.com/groups/2601788933169108) to discuss new features and stay up to date on our latest releases.
**Contribute**
Visit the [GitHub repository](https://github.com/cssigniter/audioigniter) for full source code and to report any bugs.
== Installation ==
1. Upload the plugin files to the `/wp-content/plugins/audioigniter` directory, or install the plugin through the WordPress plugins screen directly.
2. Activate the plugin through the "Plugins" screen in WordPress
3. In the WordPress admin dashboard you should see a new top level menu named "AudioIgniter"
4. Navigate to the Add New Playlist menu item and add your tracks!
== Screenshots ==
1. The AudioIgniter player
2. Managing your playlists via an intuitive and user friendly interface
3. Advanced player customization
== Changelog ==
= 2.0.1 =
Fixed issue where a PHP notice would get thrown (in WP 6.7) regarding translations loading too early.
Fixed issue where the player would break when repeating a single track via the [ai_track] shortcode (pro).
Allow short-circuiting individual tracks from appearing in the endpoint, by returning false in the audioigniter_playlist_endpoint_track filter.
= 2.0.0 =
* Added AudioIgniter top level menu.
* Fixed an issue where downloaded tracks would get the full URL as a filename, when the "Use the track URL as the download URL" was checked.
* Fixed an issue with the "Remember last position" the moment a track starts playing.
* Fixed an issue where the duration as a countdown would show weird format in some cases.
* Added base support so that the Shuffle button can now be displayed without being enabled/on by default (Pro feature).
* Added base support for AudioIgniter Analytics (Pro feature).
= 1.9.0 =
* Fixed a JavaScript error in the admin when selecting an image without thumbnails.
* Show the playlist shortcode metabox on the side.
* Show the playlist shortcode on the admin playlists listing page.
* Action 'audioigniter_metabox_tracks_field_controls' now passes $location and $post_id parameters.
* Repeatable fields overhaul.
* Underlying support for new Pro functionality (Use track as download url, player buttons, single track shortcode).
= 1.8.0 =
* General performance updates.
* Upgrade of base libraries.
* Drop support for Internet Explorer.
* Removed unneeded nonce.
* The playlists' shortcode meta box now has a 'low' priority so that it's displayed last.
= 1.7.3 =
* Top "Add Track" prepends a track, and bottom "Add Track" appends a track.
= 1.7.2 =
* Provide minimized and optimized stylesheet.
* Updated shortcode to support HTML classes via the class="" parameter.
= 1.7.1 =
* Added support for x3 playback rate.
* Added base support for user controlled shuffle button, in playlists that shuffle mode is enabled (Pro feature).
* Fixed a deprecation warning "Required parameter follows optional parameter" that would appear in PHP 8.
* Fixed spinner positioning on simple track listing.
* Introduced method AudioIgniter_Sanitizer::rgba_color()
= 1.7.0 =
* Added a loading spinner while the track is buffering.
* Developer note - Changed: Static property AudioIgniter::$version is now non-static and should be accessed as such.
= 1.6.3 =
* Fixed SVG appearance in TwentyTwenty theme.
= 1.6.2 =
* Fixed an issue where the download buttons would suggest an ugly filename consisting of the URL in a sanitized form.
= 1.6.1 =
* Fixed an issue where reverse track order would not work correctly under some particular option configurations.
= 1.6.0 =
* Change the layout of volume controls to be a bit more spacey.
* Hidden volume controls in mobile devices (improves player appearance in mobile).
= 1.5.1 =
* Minor performance improvements.
= 1.5.0 =
* Added new filters: 'aiStrings', 'audioigniter_get_playlist_data_attributes_array'.
* Added new actions: 'audioigniter_metabox_tracks_repeatable_track_fields_column_1', 'audioigniter_metabox_tracks_repeatable_track_fields_column_2', 'audioigniter_metabox_settings_group_player_track_listing_fields', 'audioigniter_metabox_settings_group_tracks_fields', 'audioigniter_metabox_settings_group_player_track_track_listing_repeat_fields'.
* Upgraded React / ReactDOM and dependencies to latest versions.
* Fixed issue with viewing buy/download buttons vs track repeat button.
* Fixed some untranslatable strings.
* Added base support for per-track Lyrics (requires Pro version).
* Added base support for single track looping (requires Pro version).
* Rearranged track listing settings layout.
= 1.4.2 =
* Accessibility enhancements.
= 1.4.1 =
* Developer enhancements.
= 1.4.0 =
* Code changes to accommodate a new player type, Global Footer Player, available in AudioIgniter Pro.
* Introduced AudioIgniter::is_playlist() for easier playlist ID validation.
* Added some translators comments.
= 1.3.0 =
* Added a new player type! From now on you can use a simpler playlist type if you don't need the full fledged player.
* Player type can now be selected via a simple dropdown.
* Updated some settings' labels to reflect the setting's function more accurately.
* Fixed an issue which prevented the player from working in IE11 sometimes.
* Fixed an issue where reversing a playlist would result in playing the incorrect tracks.
* Dropped IE9 support.
= 1.2.0 =
* Added support for initial volume setting.
* Show the tracklist toggle button when the tracklist is hidden by default.
* Added support for downloading tracks.
* Fixed issue where tracklist wouldn't display when there was only one track.
= 1.1.0 =
* Updated CSSIgniter links to https
* Added a button to enable repeating the playlist. Added admin option for the default state of the repeat button.
* Fixed a bug where the playlist would not get shown if it contained only one track.
* Added option to choose whether track links should open in a new window or not.
= 1.0.1 =
* Stop looping over the tracklist when the player finishes playing the last track.
* A couple of strings could not be translated.
= 1.0.0 =
* Initial release.

View File

@ -0,0 +1,10 @@
<?php
if ( ! defined( 'WP_UNINSTALL_PLUGIN' ) ||
! WP_UNINSTALL_PLUGIN ||
dirname( WP_UNINSTALL_PLUGIN ) !== dirname( plugin_basename( __FILE__ ) )
) {
status_header( 404 );
exit;
}
flush_rewrite_rules();