jplayer-rails 2.4.1 → 2.5.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: cdb99efef11428a5a04bd45724ee97318ef7d41a
4
- data.tar.gz: ca0f6a9f854e8f04206f243060c07793e6dc15a7
3
+ metadata.gz: 4bedbc2e37a9c306255e09416b3393c0f0bfd464
4
+ data.tar.gz: cdacd7ecfa3261da2376aeae87f915090f2a8b9f
5
5
  SHA512:
6
- metadata.gz: f342f0e7325e9654bb09b6a12ed831022dffafa1f8476e443bddf1dff201c2e3cbbc646bc80249258e78ec8a6251442718f65386f294a3a9229aa5ef71149615
7
- data.tar.gz: 45120000d12c7777c48acbb9dfcc7521545a65a5f82e659a0b3599a82e35255e9d5eafb7123f506821c2ac1123f363e87e32a47cb2126374ebeee4a0c7e66d91
6
+ metadata.gz: dab5a328dadf9c98f6413f058660ae9cabca55319cd3a57b5dc4581940c79d235e4753f6120f2c8776ada5a628734d39e592d03d9ffdb8dd5368e725a8045ff7
7
+ data.tar.gz: f933da5ca76ab73af29565b437d8aa4b53f17dcf1f2f0166e771b7e7726e0555b3da0150dca6fd9d5fa65bc580c4edfd783af39375a751a203e7913052f6d3a6
data/README.md CHANGED
@@ -3,6 +3,7 @@
3
3
  jplayer for rails asset pipeline
4
4
 
5
5
  http://www.jplayer.org/
6
+
6
7
  https://github.com/happyworm/jPlayer
7
8
 
8
9
  ## Installation
@@ -1,5 +1,5 @@
1
1
  module Jplayer
2
2
  module Rails
3
- VERSION = "2.4.1"
3
+ VERSION = "2.5.0"
4
4
  end
5
5
  end
@@ -7,8 +7,8 @@
7
7
  * http://opensource.org/licenses/MIT
8
8
  *
9
9
  * Author: Mark J Panaghiston
10
- * Version: 2.4.1
11
- * Date: 21st June 2013
10
+ * Version: 2.5.0
11
+ * Date: 7th November 2013
12
12
  */
13
13
 
14
14
  /* Code verified using http://www.jshint.com/ */
@@ -163,12 +163,12 @@
163
163
  // "waiting", // jPlayer uses internally before bubbling.
164
164
  // "playing", // jPlayer uses internally before bubbling.
165
165
  "canplay",
166
- "canplaythrough",
166
+ "canplaythrough"
167
167
  // "seeking", // jPlayer uses internally before bubbling.
168
168
  // "seeked", // jPlayer uses internally before bubbling.
169
169
  // "timeupdate", // jPlayer uses internally before bubbling.
170
170
  // "ended", // jPlayer uses internally before bubbling.
171
- "ratechange"
171
+ // "ratechange" // jPlayer uses internally before bubbling.
172
172
  // "durationchange" // jPlayer uses internally before bubbling.
173
173
  // "volumechange" // jPlayer uses internally before bubbling.
174
174
  ];
@@ -468,8 +468,8 @@
468
468
  $.jPlayer.prototype = {
469
469
  count: 0, // Static Variable: Change it via prototype.
470
470
  version: { // Static Object
471
- script: "2.4.1",
472
- needFlash: "2.4.1",
471
+ script: "2.5.0",
472
+ needFlash: "2.5.0",
473
473
  flash: "unknown"
474
474
  },
475
475
  options: { // Instanced in $.jPlayer() constructor
@@ -479,6 +479,10 @@
479
479
  preload: 'metadata', // HTML5 Spec values: none, metadata, auto.
480
480
  volume: 0.8, // The volume. Number 0 to 1.
481
481
  muted: false,
482
+ playbackRate: 1,
483
+ defaultPlaybackRate: 1,
484
+ minPlaybackRate: 0.5,
485
+ maxPlaybackRate: 4,
482
486
  wmode: "opaque", // Valid wmode: window, transparent, opaque, direct, gpu.
483
487
  backgroundColor: "#000000", // To define the jPlayer div and Flash background color.
484
488
  cssSelectorAncestor: "#jp_container_1",
@@ -494,6 +498,8 @@
494
498
  volumeBar: ".jp-volume-bar",
495
499
  volumeBarValue: ".jp-volume-bar-value",
496
500
  volumeMax: ".jp-volume-max",
501
+ playbackRateBar: ".jp-playback-rate-bar",
502
+ playbackRateBarValue: ".jp-playback-rate-bar-value",
497
503
  currentTime: ".jp-current-time",
498
504
  duration: ".jp-duration",
499
505
  fullScreen: ".jp-full-screen", // *
@@ -598,11 +604,12 @@
598
604
  }
599
605
  },
600
606
  verticalVolume: false, // Calculate volume from the bottom of the volume bar. Default is from the left. Also volume affects either width or height.
601
- // globalVolume: false, // Not implemented: Set to make volume changes affect all jPlayer instances
602
- // globalMute: false, // Not implemented: Set to make mute changes affect all jPlayer instances
607
+ verticalPlaybackRate: false,
608
+ globalVolume: false, // Set to make volume and muted changes affect all jPlayer instances with this option enabled
603
609
  idPrefix: "jp", // Prefix for the ids of html elements created by jPlayer. For flash, this must not include characters: . - + * / \
604
610
  noConflict: "jQuery",
605
611
  emulateHtml: false, // Emulates the HTML5 Media element on the jPlayer element.
612
+ consoleAlerts: true, // Alerts are sent to the console.log() instead of alert().
606
613
  errorAlerts: false,
607
614
  warningAlerts: false
608
615
  },
@@ -650,7 +657,7 @@
650
657
  videoHeight: 0, // Intrinsic height of the video in pixels.
651
658
  readyState: 0,
652
659
  networkState: 0,
653
- playbackRate: 1,
660
+ playbackRate: 1, // Warning - Now both an option and a status property
654
661
  ended: 0
655
662
 
656
663
  /* Persistant status properties created dynamically at _init():
@@ -660,6 +667,7 @@
660
667
  nativeVideoControls
661
668
  noFullWindow
662
669
  noVolume
670
+ playbackRateEnabled // Warning - Technically, we can have both Flash and HTML, so this might not be correct if the Flash is active. That is a niche case.
663
671
  */
664
672
  },
665
673
 
@@ -687,8 +695,23 @@
687
695
  flashCanPlay: true,
688
696
  media: 'audio'
689
697
  },
698
+ m3u8a: { // AAC / MP4 / Apple HLS
699
+ codec: 'application/vnd.apple.mpegurl; codecs="mp4a.40.2"',
700
+ flashCanPlay: false,
701
+ media: 'audio'
702
+ },
703
+ m3ua: { // M3U
704
+ codec: 'audio/mpegurl',
705
+ flashCanPlay: false,
706
+ media: 'audio'
707
+ },
690
708
  oga: { // OGG
691
- codec: 'audio/ogg; codecs="vorbis"',
709
+ codec: 'audio/ogg; codecs="vorbis, opus"',
710
+ flashCanPlay: false,
711
+ media: 'audio'
712
+ },
713
+ flac: { // FLAC
714
+ codec: 'audio/x-flac',
692
715
  flashCanPlay: false,
693
716
  media: 'audio'
694
717
  },
@@ -717,6 +740,16 @@
717
740
  flashCanPlay: true,
718
741
  media: 'video'
719
742
  },
743
+ m3u8v: { // H.264 / AAC / MP4 / Apple HLS
744
+ codec: 'application/vnd.apple.mpegurl; codecs="avc1.42E01E, mp4a.40.2"',
745
+ flashCanPlay: false,
746
+ media: 'video'
747
+ },
748
+ m3uv: { // M3U
749
+ codec: 'audio/mpegurl',
750
+ flashCanPlay: false,
751
+ media: 'video'
752
+ },
720
753
  ogv: { // OGG
721
754
  codec: 'video/ogg; codecs="theora, vorbis"',
722
755
  flashCanPlay: false,
@@ -1032,7 +1065,17 @@
1032
1065
  this.element.append(htmlObj);
1033
1066
  this.internal.flash.jq = $(htmlObj);
1034
1067
  }
1035
-
1068
+
1069
+ // Setup playbackRate ability before using _addHtmlEventListeners()
1070
+ if(this.html.used && !this.flash.used) { // If only HTML
1071
+ // Using the audio element capabilities for playbackRate. ie., Assuming video element is the same.
1072
+ this.status.playbackRateEnabled = this._testPlaybackRate('audio');
1073
+ } else {
1074
+ this.status.playbackRateEnabled = false;
1075
+ }
1076
+
1077
+ this._updatePlaybackRate();
1078
+
1036
1079
  // Add the HTML solution if being used.
1037
1080
  if(this.html.used) {
1038
1081
 
@@ -1140,6 +1183,23 @@
1140
1183
  return false;
1141
1184
  }
1142
1185
  },
1186
+ _testPlaybackRate: function(type) {
1187
+ // type: String 'audio' or 'video'
1188
+ var el, rate = 0.5;
1189
+ type = typeof type === 'string' ? type : 'audio';
1190
+ el = document.createElement(type);
1191
+ // Wrapping in a try/catch, just in case older HTML5 browsers throw and error.
1192
+ try {
1193
+ if('playbackRate' in el) {
1194
+ el.playbackRate = rate;
1195
+ return el.playbackRate === rate;
1196
+ } else {
1197
+ return false;
1198
+ }
1199
+ } catch(err) {
1200
+ return false;
1201
+ }
1202
+ },
1143
1203
  _uaBlocklist: function(list) {
1144
1204
  // list : object with properties that are all regular expressions. Property names are irrelevant.
1145
1205
  // Returns true if the user agent is matched in list.
@@ -1185,6 +1245,11 @@
1185
1245
  mediaElement.muted = this.options.muted;
1186
1246
  mediaElement.volume = this.options.volume;
1187
1247
 
1248
+ if(this.status.playbackRateEnabled) {
1249
+ mediaElement.defaultPlaybackRate = this.options.defaultPlaybackRate;
1250
+ mediaElement.playbackRate = this.options.playbackRate;
1251
+ }
1252
+
1188
1253
  // Create the event listeners
1189
1254
  // Only want the active entity to affect jPlayer and bubble events.
1190
1255
  // Using entity.gate so that object is referenced and gate property always current
@@ -1262,6 +1327,14 @@
1262
1327
  self._trigger($.jPlayer.event.volumechange);
1263
1328
  }
1264
1329
  }, false);
1330
+ mediaElement.addEventListener("ratechange", function() {
1331
+ if(entity.gate) {
1332
+ self.options.defaultPlaybackRate = mediaElement.defaultPlaybackRate;
1333
+ self.options.playbackRate = mediaElement.playbackRate;
1334
+ self._updatePlaybackRate();
1335
+ self._trigger($.jPlayer.event.ratechange);
1336
+ }
1337
+ }, false);
1265
1338
  mediaElement.addEventListener("suspend", function() { // Seems to be the only way of capturing that the iOS4 browser did not actually play the media from the page code. ie., It needs a user gesture.
1266
1339
  if(entity.gate) {
1267
1340
  self._seeked();
@@ -1406,6 +1479,7 @@
1406
1479
  paused = this.status.paused;
1407
1480
 
1408
1481
  this.setMedia(this.status.media);
1482
+ this.volumeWorker(this.options.volume);
1409
1483
  if(currentTime > 0) {
1410
1484
  if(paused) {
1411
1485
  this.pause(currentTime);
@@ -1582,12 +1656,28 @@
1582
1656
  this.html.active = false;
1583
1657
  this.flash.active = false;
1584
1658
  },
1659
+ _escapeHtml: function(s) {
1660
+ return s.split('&').join('&amp;').split('<').join('&lt;').split('>').join('&gt;').split('"').join('&quot;');
1661
+ },
1662
+ _qualifyURL: function(url) {
1663
+ var el = document.createElement('div');
1664
+ el.innerHTML= '<a href="' + this._escapeHtml(url) + '">x</a>';
1665
+ return el.firstChild.href;
1666
+ },
1667
+ _absoluteMediaUrls: function(media) {
1668
+ var self = this;
1669
+ $.each(media, function(type, url) {
1670
+ if(self.format[type]) {
1671
+ media[type] = self._qualifyURL(url);
1672
+ }
1673
+ });
1674
+ return media;
1675
+ },
1585
1676
  setMedia: function(media) {
1586
1677
 
1587
1678
  /* media[format] = String: URL of format. Must contain all of the supplied option's video or audio formats.
1588
1679
  * media.poster = String: Video poster URL.
1589
- * media.subtitles = String: * NOT IMPLEMENTED * URL of subtitles SRT file
1590
- * media.chapters = String: * NOT IMPLEMENTED * URL of chapters SRT file
1680
+ * media.track = Array: Of objects defining the track element: kind, src, srclang, label, def.
1591
1681
  * media.stream = Boolean: * NOT IMPLEMENTED * Designating actual media streams. ie., "false/undefined" for files. Plan to refresh the flash every so often.
1592
1682
  */
1593
1683
 
@@ -1599,6 +1689,9 @@
1599
1689
  this._resetGate();
1600
1690
  this._resetActive();
1601
1691
 
1692
+ // Convert all media URLs to absolute URLs.
1693
+ media = this._absoluteMediaUrls(media);
1694
+
1602
1695
  $.each(this.formats, function(formatPriority, format) {
1603
1696
  var isVideo = self.format[format].media === 'video';
1604
1697
  $.each(self.solutions, function(solutionPriority, solution) {
@@ -1742,16 +1835,33 @@
1742
1835
  this._urlNotSetError("pause");
1743
1836
  }
1744
1837
  },
1745
- pauseOthers: function() {
1746
- var self = this;
1747
- $.each(this.instances, function(i, element) {
1748
- if(self.element !== element) { // Do not this instance.
1749
- if(element.data("jPlayer").status.srcSet) { // Check that media is set otherwise would cause error event.
1750
- element.jPlayer("pause");
1838
+ tellOthers: function(command, conditions) {
1839
+ var self = this,
1840
+ hasConditions = typeof conditions === 'function',
1841
+ args = Array.prototype.slice.call(arguments); // Convert arguments to an Array.
1842
+
1843
+ if(typeof command !== 'string') { // Ignore, since no command.
1844
+ return; // Return undefined to maintain chaining.
1845
+ }
1846
+ if(hasConditions) {
1847
+ args.splice(1, 1); // Remove the conditions from the arguments
1848
+ }
1849
+
1850
+ $.each(this.instances, function() {
1851
+ // Remember that "this" is the instance's "element" in the $.each() loop.
1852
+ if(self.element !== this) { // Do not tell my instance.
1853
+ if(!hasConditions || conditions.call(this.data("jPlayer"), self)) {
1854
+ this.jPlayer.apply(this, args);
1751
1855
  }
1752
1856
  }
1753
1857
  });
1754
1858
  },
1859
+ pauseOthers: function(time) {
1860
+ this.tellOthers("pause", function() {
1861
+ // In the conditions function, the "this" context is the other instance's jPlayer object.
1862
+ return this.status.srcSet;
1863
+ }, time);
1864
+ },
1755
1865
  stop: function() {
1756
1866
  if(this.status.srcSet) {
1757
1867
  if(this.html.active) {
@@ -1776,9 +1886,18 @@
1776
1886
  }
1777
1887
  },
1778
1888
  _muted: function(muted) {
1889
+ this.mutedWorker(muted);
1890
+ if(this.options.globalVolume) {
1891
+ this.tellOthers("mutedWorker", function() {
1892
+ // Check the other instance has global volume enabled.
1893
+ return this.options.globalVolume;
1894
+ }, muted);
1895
+ }
1896
+ },
1897
+ mutedWorker: function(muted) {
1779
1898
  this.options.muted = muted;
1780
1899
  if(this.html.used) {
1781
- this._html_mute(muted);
1900
+ this._html_setProperty('muted', muted);
1782
1901
  }
1783
1902
  if(this.flash.used) {
1784
1903
  this._flash_mute(muted);
@@ -1817,11 +1936,20 @@
1817
1936
  }
1818
1937
  },
1819
1938
  volume: function(v) {
1939
+ this.volumeWorker(v);
1940
+ if(this.options.globalVolume) {
1941
+ this.tellOthers("volumeWorker", function() {
1942
+ // Check the other instance has global volume enabled.
1943
+ return this.options.globalVolume;
1944
+ }, v);
1945
+ }
1946
+ },
1947
+ volumeWorker: function(v) {
1820
1948
  v = this._limitValue(v, 0, 1);
1821
1949
  this.options.volume = v;
1822
1950
 
1823
1951
  if(this.html.used) {
1824
- this._html_volume(v);
1952
+ this._html_setProperty('volume', v);
1825
1953
  }
1826
1954
  if(this.flash.used) {
1827
1955
  this._flash_volume(v);
@@ -1979,6 +2107,51 @@
1979
2107
  playBar: function() { // Handles clicks on the playBar
1980
2108
  // The seekBar handles this event as the event propagates up the DOM.
1981
2109
  },
2110
+ playbackRate: function(pbr) {
2111
+ this._setOption("playbackRate", pbr);
2112
+ },
2113
+ playbackRateBar: function(e) { // Handles clicks on the playbackRateBar
2114
+ if(this.css.jq.playbackRateBar.length) {
2115
+ // Using $(e.currentTarget) to enable multiple playbackRate bars
2116
+ var $bar = $(e.currentTarget),
2117
+ offset = $bar.offset(),
2118
+ x = e.pageX - offset.left,
2119
+ w = $bar.width(),
2120
+ y = $bar.height() - e.pageY + offset.top,
2121
+ h = $bar.height(),
2122
+ ratio, pbr;
2123
+ if(this.options.verticalPlaybackRate) {
2124
+ ratio = y/h;
2125
+ } else {
2126
+ ratio = x/w;
2127
+ }
2128
+ pbr = ratio * (this.options.maxPlaybackRate - this.options.minPlaybackRate) + this.options.minPlaybackRate;
2129
+ this.playbackRate(pbr);
2130
+ }
2131
+ },
2132
+ playbackRateBarValue: function() { // Handles clicks on the playbackRateBarValue
2133
+ // The playbackRateBar handles this event as the event propagates up the DOM.
2134
+ },
2135
+ _updatePlaybackRate: function() {
2136
+ var pbr = this.options.playbackRate,
2137
+ ratio = (pbr - this.options.minPlaybackRate) / (this.options.maxPlaybackRate - this.options.minPlaybackRate);
2138
+ if(this.status.playbackRateEnabled) {
2139
+ if(this.css.jq.playbackRateBar.length) {
2140
+ this.css.jq.playbackRateBar.show();
2141
+ }
2142
+ if(this.css.jq.playbackRateBarValue.length) {
2143
+ this.css.jq.playbackRateBarValue.show();
2144
+ this.css.jq.playbackRateBarValue[this.options.verticalPlaybackRate ? "height" : "width"]((ratio*100)+"%");
2145
+ }
2146
+ } else {
2147
+ if(this.css.jq.playbackRateBar.length) {
2148
+ this.css.jq.playbackRateBar.hide();
2149
+ }
2150
+ if(this.css.jq.playbackRateBarValue.length) {
2151
+ this.css.jq.playbackRateBarValue.hide();
2152
+ }
2153
+ }
2154
+ },
1982
2155
  repeat: function() { // Handle clicks on the repeat button
1983
2156
  this._loop(true);
1984
2157
  },
@@ -2083,6 +2256,9 @@
2083
2256
  case "muted" :
2084
2257
  this._muted(value);
2085
2258
  break;
2259
+ case "globalVolume" :
2260
+ this.options[key] = value;
2261
+ break;
2086
2262
  case "cssSelectorAncestor" :
2087
2263
  this._cssSelectorAncestor(value); // Set and refresh all associations for the new ancestor.
2088
2264
  break;
@@ -2091,6 +2267,28 @@
2091
2267
  self._cssSelector(fn, cssSel); // NB: The option is set inside this function, after further validity checks.
2092
2268
  });
2093
2269
  break;
2270
+ case "playbackRate" :
2271
+ this.options[key] = value = this._limitValue(value, this.options.minPlaybackRate, this.options.maxPlaybackRate);
2272
+ if(this.html.used) {
2273
+ this._html_setProperty('playbackRate', value);
2274
+ }
2275
+ this._updatePlaybackRate();
2276
+ break;
2277
+ case "defaultPlaybackRate" :
2278
+ this.options[key] = value = this._limitValue(value, this.options.minPlaybackRate, this.options.maxPlaybackRate);
2279
+ if(this.html.used) {
2280
+ this._html_setProperty('defaultPlaybackRate', value);
2281
+ }
2282
+ this._updatePlaybackRate();
2283
+ break;
2284
+ case "minPlaybackRate" :
2285
+ this.options[key] = value = this._limitValue(value, 0.1, this.options.maxPlaybackRate - 0.1);
2286
+ this._updatePlaybackRate();
2287
+ break;
2288
+ case "maxPlaybackRate" :
2289
+ this.options[key] = value = this._limitValue(value, this.options.minPlaybackRate + 0.1, 16);
2290
+ this._updatePlaybackRate();
2291
+ break;
2094
2292
  case "fullScreen" :
2095
2293
  if(this.options[key] !== value) { // if changed
2096
2294
  var wkv = $.jPlayer.nativeFeatures.fullscreen.used.webkitVideo;
@@ -2510,20 +2708,12 @@
2510
2708
  }
2511
2709
  }
2512
2710
  },
2513
- _html_volume: function(v) {
2514
- if(this.html.audio.available) {
2515
- this.htmlElement.audio.volume = v;
2516
- }
2517
- if(this.html.video.available) {
2518
- this.htmlElement.video.volume = v;
2519
- }
2520
- },
2521
- _html_mute: function(m) {
2711
+ _html_setProperty: function(property, value) {
2522
2712
  if(this.html.audio.available) {
2523
- this.htmlElement.audio.muted = m;
2713
+ this.htmlElement.audio[property] = value;
2524
2714
  }
2525
2715
  if(this.html.video.available) {
2526
- this.htmlElement.video.muted = m;
2716
+ this.htmlElement.video[property] = value;
2527
2717
  }
2528
2718
  },
2529
2719
  _flash_setAudio: function(media) {
@@ -2718,17 +2908,22 @@
2718
2908
  _error: function(error) {
2719
2909
  this._trigger($.jPlayer.event.error, error);
2720
2910
  if(this.options.errorAlerts) {
2721
- this._alert("Error!" + (error.message ? "\n\n" + error.message : "") + (error.hint ? "\n\n" + error.hint : "") + "\n\nContext: " + error.context);
2911
+ this._alert("Error!" + (error.message ? "\n" + error.message : "") + (error.hint ? "\n" + error.hint : "") + "\nContext: " + error.context);
2722
2912
  }
2723
2913
  },
2724
2914
  _warning: function(warning) {
2725
2915
  this._trigger($.jPlayer.event.warning, undefined, warning);
2726
2916
  if(this.options.warningAlerts) {
2727
- this._alert("Warning!" + (warning.message ? "\n\n" + warning.message : "") + (warning.hint ? "\n\n" + warning.hint : "") + "\n\nContext: " + warning.context);
2917
+ this._alert("Warning!" + (warning.message ? "\n" + warning.message : "") + (warning.hint ? "\n" + warning.hint : "") + "\nContext: " + warning.context);
2728
2918
  }
2729
2919
  },
2730
2920
  _alert: function(message) {
2731
- alert("jPlayer " + this.version.script + " : id='" + this.internal.self.id +"' : " + message);
2921
+ var msg = "jPlayer " + this.version.script + " : id='" + this.internal.self.id +"' : " + message;
2922
+ if(!this.options.consoleAlerts) {
2923
+ alert(msg);
2924
+ } else if(console && console.log) {
2925
+ console.log(msg);
2926
+ }
2732
2927
  },
2733
2928
  _emulateHtmlBridge: function() {
2734
2929
  var self = this;
metadata CHANGED
@@ -1,41 +1,41 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jplayer-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.4.1
4
+ version: 2.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tony Miller
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-09-24 00:00:00.000000000 Z
11
+ date: 2014-03-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ~>
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
19
  version: '1.3'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ~>
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.3'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - '>='
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
33
  version: '0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - '>='
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  description: jPlayer for the rails asset pipeline.
@@ -45,12 +45,12 @@ executables: []
45
45
  extensions: []
46
46
  extra_rdoc_files: []
47
47
  files:
48
+ - LICENSE.txt
49
+ - README.md
48
50
  - lib/jplayer-rails.rb
49
51
  - lib/jplayer-rails/version.rb
50
- - vendor/assets/javascripts/jquery.jplayer.js
51
52
  - vendor/assets/javascripts/Jplayer.swf
52
- - LICENSE.txt
53
- - README.md
53
+ - vendor/assets/javascripts/jquery.jplayer.js
54
54
  homepage: ''
55
55
  licenses:
56
56
  - MIT
@@ -61,19 +61,18 @@ require_paths:
61
61
  - lib
62
62
  required_ruby_version: !ruby/object:Gem::Requirement
63
63
  requirements:
64
- - - '>='
64
+ - - ">="
65
65
  - !ruby/object:Gem::Version
66
66
  version: '0'
67
67
  required_rubygems_version: !ruby/object:Gem::Requirement
68
68
  requirements:
69
- - - '>='
69
+ - - ">="
70
70
  - !ruby/object:Gem::Version
71
71
  version: '0'
72
72
  requirements: []
73
73
  rubyforge_project:
74
- rubygems_version: 2.0.3
74
+ rubygems_version: 2.2.2
75
75
  signing_key:
76
76
  specification_version: 4
77
77
  summary: jPlayer for the rails asset pipeline
78
78
  test_files: []
79
- has_rdoc: