diff --git a/LICENSE b/LICENSE index 4a1068b1..32a7b851 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2014 University of Washington +Copyright (c) 2014-2025 The Able Player Contributors Able Player development is supported in part by The AccessComputing project, with financial support from the National Science Foundation diff --git a/README.md b/README.md index 50d64df1..79b316a2 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,6 @@ Able Player ========== +![image](https://user-images.githubusercontent.com/55474996/227562765-7a17103c-4c93-4a17-82b4-fc1e401972b0.png) *Able Player* is a fully accessible cross-browser HTML5 media player. @@ -158,8 +159,8 @@ to all use cases, both audio and video. ```HTML - - + + @@ -595,7 +596,7 @@ perfect synchronization between all timed text files, Able Player (in version 3. a Video Transcript Sorter (VTS). The VTS displays all timed text content from all sources in a table, and provides several features that enable users to rearrange content and modify start and end times. Users can also insert new content into the table, which can be useful -for authoring low frequency content such as chapters and description. Too use VTS, +for authoring low frequency content such as chapters and description. To use VTS, add the following HTML to the desired location within any web page that includes an Able Player instance: diff --git a/build/ableplayer.dist.js b/build/ableplayer.dist.js index fe8a1e50..f594182e 100644 --- a/build/ableplayer.dist.js +++ b/build/ableplayer.dist.js @@ -1396,7 +1396,6 @@ var AblePlayerInstances = []; (function ($) { $(function () { - $('video, audio').each(function (index, element) { if ($(element).data('able-player') !== undefined) { AblePlayerInstances.push(new AblePlayer($(this),$(element))); @@ -1444,14 +1443,14 @@ var AblePlayerInstances = []; // autoplay (Boolean; if present always resolves to true, regardless of value) if ($(media).attr('autoplay') !== undefined) { - this.autoplay = true; // this value remains constant + this.autoplay = true; // this value remains constant this.okToPlay = true; // this value can change dynamically } else { this.autoplay = false; this.okToPlay = false; } - + // loop (Boolean; if present always resolves to true, regardless of value) if ($(media).attr('loop') !== undefined) { this.loop = true; @@ -1476,13 +1475,13 @@ var AblePlayerInstances = []; this.hasPoster = false; } - // get height and width attributes, if present - // and add them to variables - // Not currently used, but might be useful for resizing player - if ($(media).attr('width')) { - this.width = $(media).attr('width'); + // get height and width attributes, if present + // and add them to variables + // Not currently used, but might be useful for resizing player + if ($(media).attr('width')) { + this.width = $(media).attr('width'); } - if ($(media).attr('height')) { + if ($(media).attr('height')) { this.height = $(media).attr('height'); } @@ -1533,13 +1532,13 @@ var AblePlayerInstances = []; else { this.useChaptersButton = true; } - - // Control whether text descriptions are read aloud + + // Control whether text descriptions are read aloud // set to "false" if the sole purpose of the WebVTT descriptions file // is to integrate text description into the transcript - // set to "true" to write description text to a div - // This variable does *not* control the method by which description is read. - // For that, see below (this.descMethod) + // set to "true" to write description text to a div + // This variable does *not* control the method by which description is read. + // For that, see below (this.descMethod) if ($(media).data('descriptions-audible') !== undefined && $(media).data('descriptions-audible') === false) { this.readDescriptionsAloud = false; } @@ -1551,12 +1550,12 @@ var AblePlayerInstances = []; this.readDescriptionsAloud = true; } - // Method by which text descriptions are read + // Method by which text descriptions are read // valid values of data-desc-reader are: - // 'brower' (default) - text-based audio description is handled by the browser, if supported - // 'screenreader' - text-based audio description is always handled by screen readers - // The latter may be preferable by owners of websites in languages that are not well supported - // by the Web Speech API + // 'brower' (default) - text-based audio description is handled by the browser, if supported + // 'screenreader' - text-based audio description is always handled by screen readers + // The latter may be preferable by owners of websites in languages that are not well supported + // by the Web Speech API if ($(media).data('desc-reader') == 'screenreader') { this.descReader = 'screenreader'; } @@ -1564,11 +1563,11 @@ var AblePlayerInstances = []; this.descReader = 'browser'; } - // Default state of captions and descriptions - // This setting is overridden by user preferences, if they exist - // values for data-state-captions and data-state-descriptions are 'on' or 'off' + // Default state of captions and descriptions + // This setting is overridden by user preferences, if they exist + // values for data-state-captions and data-state-descriptions are 'on' or 'off' if ($(media).data('state-captions') == 'off') { - this.defaultStateCaptions = 0; // off + this.defaultStateCaptions = 0; // off } else { this.defaultStateCaptions = 1; // on by default @@ -1580,13 +1579,13 @@ var AblePlayerInstances = []; this.defaultStateDescriptions = 0; // off by default } - // Default setting for prefDescPause - // Extended description (i.e., pausing during description) is on by default - // but this settings give website owners control over that - // since they know the nature of their videos, and whether pausing is necessary - // This setting is overridden by user preferences, if they exist + // Default setting for prefDescPause + // Extended description (i.e., pausing during description) is on by default + // but this settings give website owners control over that + // since they know the nature of their videos, and whether pausing is necessary + // This setting is overridden by user preferences, if they exist if ($(media).data('desc-pause-default') == 'off') { - this.defaultDescPause = 0; // off + this.defaultDescPause = 0; // off } else { this.defaultDescPause = 1; // on by default @@ -1632,7 +1631,7 @@ var AblePlayerInstances = []; if (this.transcriptSrcHasRequiredParts()) { this.transcriptType = 'manual'; } - else { + else { } } @@ -1737,31 +1736,31 @@ var AblePlayerInstances = []; // Skin // valid values of data-skin are: - // 'legacy' (default), two rows of controls; seekbar positioned in available space within top row - // '2020', all buttons in one row beneath a full-width seekbar - if ($(media).data('skin') == '2020') { - this.skin = '2020'; + // '2020' (default as of 5.0), all buttons in one row beneath a full-width seekbar + // 'legacy', two rows of controls; seekbar positioned in available space within top row + if ($(media).data('skin') == 'legacy') { + this.skin = 'legacy'; } else { - this.skin = 'legacy'; + this.skin = '2020'; } - // Size - // width of Able Player is determined using the following order of precedence: - // 1. data-width attribute + // Size + // width of Able Player is determined using the following order of precedence: + // 1. data-width attribute // 2. width attribute (for video or audio, although it is not valid HTML for audio) // 3. Intrinsic size from video (video only, determined later) if ($(media).data('width') !== undefined) { this.playerWidth = parseInt($(media).data('width')); } else if ($(media)[0].getAttribute('width')) { - // NOTE: jQuery attr() returns null for all invalid HTML attributes + // NOTE: jQuery attr() returns null for all invalid HTML attributes // (e.g., width on