listPage.html 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="utf-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1">
  6. <meta name="author" content="CodeHim">
  7. <title>Playlist</title>
  8. <!-- css/style.css -->
  9. <style>
  10. @import url('https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css');
  11. *, *:before, *:after {
  12. outline: 0;
  13. -webkit-box-sizing: border-box;
  14. box-sizing: border-box;
  15. }
  16. input, button {
  17. outline: none;
  18. }
  19. a, a:hover, a:visited {
  20. color: #ddd;
  21. text-decoration: none;
  22. }
  23. .flex {
  24. display: -webkit-flex;
  25. display: flex;
  26. }
  27. .flex-wrap {
  28. display: -webkit-flex;
  29. display: flex;
  30. -webkit-flex-wrap: wrap;
  31. flex-wrap: wrap;
  32. }
  33. .flex-align {
  34. -webkit-align-items: center;
  35. align-items: center;
  36. }
  37. .w-full {
  38. width: 100%;
  39. }
  40. /* HTML5 Audio Player with Playlist, source: https://codepen.io/sekedus/pen/ExxjZEz */
  41. #simp button, #simp input, #simp img {
  42. border: 0;
  43. }
  44. #simp {
  45. max-width: 600px;
  46. font-size: 14px;
  47. font-family: "Segoe UI", Tahoma, sans-serif;
  48. text-align: initial;
  49. line-height: initial;
  50. background: #17212b;
  51. color: #ddd;
  52. margin: 0 auto;
  53. border-radius: 6px;
  54. overflow: hidden;
  55. }
  56. #simp .simp-album {
  57. padding: 20px 25px 5px;
  58. }
  59. #simp .simp-album .simp-cover {
  60. margin-right: 20px;
  61. }
  62. #simp .simp-album .simp-cover img {
  63. max-width: 80px;
  64. width: 100%;
  65. margin: 0;
  66. padding: 0;
  67. display: block;
  68. }
  69. #simp .simp-album .simp-title {
  70. font-size: 120%;
  71. font-weight: bold;
  72. }
  73. #simp .simp-album .simp-artist {
  74. font-size: 90%;
  75. color: #6c7883;
  76. }
  77. #simp .simp-controls {
  78. padding: 15px;
  79. }
  80. #simp .simp-controls button {
  81. font-size: 130%;
  82. width: 32px;
  83. height: 32px;
  84. background: none;
  85. color: #ddd;
  86. padding: 7px;
  87. cursor: pointer;
  88. border: 0;
  89. border-radius: 3px;
  90. }
  91. #simp .simp-controls button[disabled] {
  92. color: #636469;
  93. cursor: initial;
  94. }
  95. #simp .simp-controls button:not([disabled]):hover {
  96. background: #4082bc;
  97. color: #fff;
  98. }
  99. #simp .simp-controls .simp-prev, #simp .simp-controls .simp-next {
  100. font-size: 100%;
  101. }
  102. #simp .simp-controls .simp-tracker, #simp .simp-controls .simp-volume {
  103. flex: 1;
  104. margin-left: 10px;
  105. position: relative;
  106. }
  107. #simp .simp-controls .simp-buffer {
  108. position: absolute;
  109. top: 50%;
  110. right: 0;
  111. left: 0;
  112. height: 5px;
  113. margin-top: -2.5px;
  114. border-radius: 100px;
  115. }
  116. #simp .simp-controls .simp-loading .simp-buffer {
  117. -webkit-animation: audio-progress 1s linear infinite;
  118. animation: audio-progress 1s linear infinite;
  119. background-image: linear-gradient(-45deg, #000 25%, transparent 25%, transparent 50%, #000 50%, #000 75%, transparent 75%, transparent);
  120. background-repeat: repeat-x;
  121. background-size: 25px 25px;
  122. color: transparent;
  123. }
  124. #simp .simp-controls .simp-time, #simp .simp-controls .simp-others {
  125. margin-left: 10px;
  126. }
  127. #simp .simp-controls .simp-volume {
  128. max-width: 110px;
  129. }
  130. #simp .simp-controls .simp-volume .simp-mute {
  131. margin-right: 5px;
  132. }
  133. #simp .simp-controls .simp-others .simp-active {
  134. background: #242f3d;
  135. }
  136. #simp .simp-controls .simp-others .simp-shide button {
  137. font-size: 100%;
  138. padding: 0;
  139. width: 24px;
  140. height: 14px;
  141. display: block;
  142. }
  143. #simp .simp-controls input[type=range] {
  144. -webkit-appearance: none;
  145. background: transparent;
  146. height: 19px;
  147. margin: 0;
  148. width: 100%;
  149. display: block;
  150. position: relative;
  151. z-index: 2;
  152. }
  153. #simp .simp-controls input[type=range]::-webkit-slider-runnable-track {
  154. background: rgba(183,197,205,.66);
  155. height: 5px;
  156. border-radius: 2.5px;
  157. transition: box-shadow .3s ease;
  158. position: relative;
  159. }
  160. #simp .simp-controls input[type=range]::-moz-range-track {
  161. background: rgba(183,197,205,.66);
  162. height: 5px;
  163. border-radius: 2.5px;
  164. transition: box-shadow .3s ease;
  165. position: relative;
  166. }
  167. #simp .simp-controls .simp-load .simp-progress::-webkit-slider-runnable-track {
  168. background: #2f3841;
  169. }
  170. #simp .simp-controls .simp-load .simp-progress::-moz-range-track {
  171. background: #2f3841;
  172. }
  173. #simp .simp-controls .simp-loading .simp-progress::-webkit-slider-runnable-track {
  174. background: rgba(255,255,255,.25);
  175. }
  176. #simp .simp-controls .simp-loading .simp-progress::-moz-range-track {
  177. background: rgba(255,255,255,.25);
  178. }
  179. #simp .simp-controls input[type=range]::-webkit-slider-thumb {
  180. -webkit-appearance: none;
  181. background: #fff;
  182. height: 13px;
  183. width: 13px;
  184. margin-top: -4px;
  185. cursor: pointer;
  186. border-radius: 50%;
  187. box-shadow: 0 1px 1px rgba(0,0,0,.15), 0 0 0 1px rgba(47,52,61,.2);
  188. }
  189. #simp .simp-controls input[type=range]::-moz-range-thumb {
  190. -webkit-appearance: none;
  191. background: #fff;
  192. height: 13px;
  193. width: 13px;
  194. cursor: pointer;
  195. border-radius: 50%;
  196. box-shadow: 0 1px 1px rgba(0,0,0,.15), 0 0 0 1px rgba(47,52,61,.2);
  197. }
  198. #simp .simp-footer {
  199. padding: 10px 10px 12px;
  200. font-size: 90%;
  201. text-align: center;
  202. opacity: .7;
  203. }
  204. #simp .simp-display {
  205. overflow: hidden;
  206. max-height: 650px;
  207. transition: max-height .5s ease-in-out;
  208. }
  209. #simp .simp-hide {
  210. max-height: 0;
  211. }
  212. /* playlist */
  213. #simp ul {
  214. margin: 5px 0 0;
  215. padding: 0;
  216. list-style: none;
  217. max-height: calc(100vh - 300px);
  218. }
  219. #simp ul li {
  220. white-space: nowrap;
  221. overflow: hidden;
  222. text-overflow: ellipsis;
  223. display: block;
  224. margin: 0;
  225. padding: 8px 20px;
  226. cursor: pointer;
  227. }
  228. #simp ul li:last-child {
  229. padding-bottom: 13px;
  230. }
  231. #simp ul li:nth-child(odd) {
  232. background: #0e1621;
  233. }
  234. #simp ul li:hover {
  235. background: #242f3d;
  236. }
  237. #simp ul li.simp-active {
  238. background: #4082bc;
  239. color: #fff;
  240. }
  241. #simp ul li .simp-desc {
  242. font-size: 90%;
  243. opacity: .5;
  244. margin-left: 5px;
  245. }
  246. /* playlist scrollbar */
  247. #simp ul {
  248. overflow-y: auto;
  249. overflow-x: hidden;
  250. scrollbar-color: #73797f #2f3841;
  251. }
  252. #simp ul::-webkit-scrollbar-track {
  253. background-color: #2f3841;
  254. }
  255. #simp ul::-webkit-scrollbar {
  256. width: 6px;
  257. background-color: #2f3841;
  258. }
  259. #simp ul::-webkit-scrollbar-thumb {
  260. background-color: #73797f;
  261. }
  262. /* progress animation */
  263. @-webkit-keyframes audio-progress {
  264. to {
  265. background-position: 25px 0;
  266. }
  267. }
  268. @keyframes audio-progress {
  269. to {
  270. background-position: 25px 0;
  271. }
  272. }
  273. /* mobile */
  274. @media screen and (max-width:480px) {
  275. #simp .simp-controls .simp-volume, #simp .simp-controls .simp-others {
  276. display: none;
  277. }
  278. #simp .simp-controls .simp-time {
  279. margin-right: 10px;
  280. }
  281. }
  282. @media screen and (max-width:370px) {
  283. #simp .simp-time .simp-slash, #simp .simp-time .end-time {
  284. display: none;
  285. }
  286. }
  287. </style>
  288. <!-- css/demo.css -->
  289. <style>
  290. @import url('https://fonts.googleapis.com/css?family=Roboto&display=swap');
  291. @import url('https://stackpath.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css');
  292. * {
  293. margin: 0;
  294. padding: 0;
  295. }
  296. body {
  297. font-family: 'Roboto', sans-serif;
  298. font-style: normal;
  299. font-weight: 300;
  300. font-smoothing: antialiased;
  301. -webkit-font-smoothing: antialiased;
  302. -moz-osx-font-smoothing: grayscale;
  303. font-size: 15px;
  304. background: #eee;
  305. }
  306. .intro {
  307. background: #fff;
  308. padding: 60px 30px;
  309. color: #333;
  310. margin-bottom: 15px;
  311. line-height: 1.5;
  312. text-align: center;
  313. }
  314. .intro h1 {
  315. font-size: 18pt;
  316. padding-bottom: 15px;
  317. }
  318. .intro p {
  319. font-size: 14px;
  320. }
  321. .action {
  322. text-align: center;
  323. display: block;
  324. margin-top: 20px;
  325. }
  326. a.btn {
  327. text-decoration: none;
  328. color: #666;
  329. border: 2px solid #666;
  330. padding: 10px 15px;
  331. display: inline-block;
  332. margin-left: 5px;
  333. }
  334. a.btn:hover {
  335. background: #666;
  336. color: #fff;
  337. transition: .3s;
  338. -webkit-transition: .3s;
  339. }
  340. .btn:before {
  341. font-family: FontAwesome;
  342. font-weight: normal;
  343. margin-right: 10px;
  344. }
  345. .github:before {
  346. content: "\f09b"
  347. }
  348. .down:before {
  349. content: "\f019"
  350. }
  351. .back:before {
  352. content: "\f112"
  353. }
  354. .credit {
  355. background: #fff;
  356. padding: 12px;
  357. font-size: 9pt;
  358. text-align: center;
  359. color: #333;
  360. margin-top: 40px;
  361. }
  362. .credit span:before {
  363. font-family: FontAwesome;
  364. color: #e41b17;
  365. content: "\f004";
  366. }
  367. .credit a {
  368. color: #333;
  369. text-decoration: none;
  370. }
  371. .credit a:hover {
  372. color: #1DBF73;
  373. }
  374. .credit a:hover:after {
  375. font-family: FontAwesome;
  376. content: "\f08e";
  377. font-size: 9pt;
  378. position: absolute;
  379. margin: 3px;
  380. }
  381. main {
  382. background: #fff;
  383. padding:: 20px;
  384. }
  385. article li {
  386. color: #444;
  387. font-size: 15px;
  388. margin-left: 33px;
  389. line-height: 1.5;
  390. padding: 5px;
  391. }
  392. article h1,
  393. article h2,
  394. article h3,
  395. article h4,
  396. article p {
  397. padding: 14px;
  398. color: #333;
  399. }
  400. article p {
  401. font-size: 15px;
  402. line-height: 1.5;
  403. }
  404. @media only screen and (min-width: 720px) {
  405. main {
  406. max-width: 720px;
  407. margin-left: auto;
  408. margin-right: auto;
  409. padding: 24px;
  410. }
  411. }
  412. .set-overlayer,
  413. .set-glass,
  414. .set-sticky {
  415. cursor: pointer;
  416. height: 45px;
  417. line-height: 45px;
  418. padding: 0 15px;
  419. color: #333;
  420. font-size: 16px;
  421. }
  422. .set-overlayer:after,
  423. .set-glass:after,
  424. .to-active:after,
  425. .set-sticky:after {
  426. font-family: FontAwesome;
  427. font-size: 18pt;
  428. position: relative;
  429. float: right;
  430. }
  431. .set-overlayer:after,
  432. .set-glass:after,
  433. .set-sticky:after {
  434. content: "\f204";
  435. transition: .6s;
  436. }
  437. .to-active:after {
  438. content: "\f205";
  439. color: #008080;
  440. transition: .6s;
  441. }
  442. .set-overlayer,
  443. .set-glass,
  444. .set-sticky,
  445. .source,
  446. .theme-tray {
  447. margin: 10px;
  448. background: #f2f2f2;
  449. border-radius: 5px;
  450. border: 2px solid #f1f1f1;
  451. box-sizing: border-box;
  452. }
  453. /* Syntax Highlighter*/
  454. pre.prettyprint {
  455. padding: 15px !important;
  456. margin: 10px;
  457. border: 0 !important;
  458. background: #f2f2f2;
  459. overflow: auto;
  460. }
  461. .source {
  462. white-space: pre;
  463. overflow: auto;
  464. max-height: 400px;
  465. }
  466. code {
  467. border: 1px solid #ddd;
  468. padding: 2px;
  469. border-radius: 2px;
  470. }
  471. </style>
  472. </head>
  473. <body>
  474. <main>
  475. <!-- Start DEMO HTML (Use the following code into your project)-->
  476. <div class="simple-audio-player" id="simp" data-config='{"shide_top":false,"shide_btm":false,"auto_load":true}'>
  477. <div class="simp-playlist">
  478. <ul>
  479. <!--
  480. <li><span class="simp-source" data-src="http://www.archive.org/download/CanonInD_261/CanoninD.mp3">Canon in D</span><span class="simp-desc">Johann Pachelbel</span></li>
  481. <li><span class="simp-source" data-src="https://www.script-tutorials.com/demos/363/data/05.mp3">Artist 5</span></li>
  482. <li><span class="simp-source" data-src="https://www.dropbox.com/s/6pays95q2a9jrsf/2020.01.02.mp3?dl=1" data-cover="https://i.postimg.cc/sDBycWS8/NMS-2019.jpg">Nightmare Side</span><span class="simp-desc">Set Stori</span></li>
  483. <li class="simp-active"><span class="simp-source" data-src="https://www.dropbox.com/s/k011ag91uktonbv/Angklung%20Preman%20Pensiun.mp3?dl=1">Angklung Preman Pensiun</span></li>
  484. <li><span class="simp-source" data-src="https://www.dropbox.com/s/prgte33m86n9ce7/Canon%20Rock%20%28JerryC%29%20-%20funtwo.mp3?dl=1">Canon Rock (JerryC)</span><span class="simp-desc">by Funtwo</span></li>
  485. <li><span class="simp-source" data-src="http://listento.ardanradio.com:1059/;">105.9 FM Ardan Radio</span><span class="simp-desc">Streaming Radio</span></li>
  486. <li><span class="simp-source" data-src="https://archive.org/download/78_jailhouse-rock_elvis-presley-jerry-leiber-mike-stoller_gbia0080595b/Jailhouse%20Rock%20-%20Elvis%20Presley%20-%20Jerry%20Leiber-restored.mp3">Jailhouse Rock</span><span class="simp-desc">Elvis Presley</span></li>
  487. <li><span class="simp-source" data-src="https://archive.org/download/J._Period_and_Michael_Jackson_-_Man_Or_The_Music-2010/17%20Smooth%20Criminal.mp3">Smooth Criminal</span><span class="simp-desc">Michael Jackson</span></li>
  488. <li><span class="simp-source" data-src="https://archive.org/download/OldPop_256/VillagePeople-Y.m.c.a.mp3">Y.M.C.A</span><span class="simp-desc">Village People</span></li>
  489. <li><span class="simp-source" data-src="https://archive.org/download/chuckberryjohnnyb.goode/Chuck%20Berry%20-%20Johnny%20B.%20Goode.mp3">Johnny B. Goode</span><span class="simp-desc">Chuck Berry</span></li>
  490. <li><span class="simp-source" data-src="https://archive.org/download/AnimalsTheHouseOfTheRisingSun_201811/Animals%20-%20The%20House%20Of%20The%20Rising%20Sun.mp3">House of the Rising Sun</span><span class="simp-desc">The Animals</span></li>
  491. <li><span class="simp-source" data-src="https://archive.org/download/DontStopMeNow_255/Queen-DontStopMeNow.mp3">Don't Stop Me Now</span><span class="simp-desc">Queen</span></li>
  492. <li><span class="simp-source" data-src="https://archive.org/download/NeverGonnaGiveYouUpOriginal/Never%20Gonna%20Give%20You%20Up%20Original.mp3">Never Gonna Give You Up</span><span class="simp-desc">Rick Astley</span></li>
  493. <li><span class="simp-source" data-src="https://archive.org/download/gunsnrosessweetchildomine_202003/Guns%20N%27%20Roses%20-%20Sweet%20Child%20%27O%20Mine.mp3">Sweet Child O' Mine</span><span class="simp-desc">Guns N' Roses</span></li>
  494. <li><span class="simp-source" data-src="https://archive.org/download/01.TheFinalCountdown/01.%20The%20Final%20Countdown.mp3">The Final Countdown</span><span class="simp-desc">Europe</span></li>
  495. <li><span class="simp-source" data-src="https://archive.org/download/1MyHeartWillGoOnLoveThemeFromTitanic/1%20-%20My%20Heart%20Will%20Go%20On%20%28Love%20Theme%20from%20_Titanic_%29.mp3">My Heart Will Go On</span><span class="simp-desc">Céline Dion</span></li>
  496. <li><span class="simp-source" data-src="https://archive.org/download/tntvillage_323140/John%20Lennon%20-%20Imagine/01%20Imagine.mp3">Imagine</span><span class="simp-desc">John Lennon</span></li>
  497. <li><span class="simp-source" data-src="https://archive.org/download/TheBeatles1970HeyJudeAppleRecords6e062.0434807HeyJude/The%20Beatles%20-%201970%20-%20Hey%20Jude%20%28Apple%20Records%3B%20%236e%20062.04348%29_07%20-%20Hey%20Jude.mp3">Hey Jude</span><span class="simp-desc">The Beatles</span></li>
  498. <li><span class="simp-source" data-src="https://archive.org/download/TakeMeHomeCountryRoad/JohnDenver-TakeMeHomeCountryRoad.mp3">Take Me Home, Country Roads</span><span class="simp-desc">John Denver</span></li>
  499. -->
  500. <!-- list place here -->
  501. </ul>
  502. </div>
  503. <div class="simp-footer">GUI Made with 💖 &amp; 🙌 by <a href="https://bit.ly/sekedus" target="_blank" title="Sekedus">Sekedus</a></div>
  504. </div>
  505. <!-- END EDMO HTML (Happy Coding!)-->
  506. </main>
  507. <!-- js/script.js -->
  508. <script>
  509. /*
  510. Example: https://www.codehim.com/demo/javascript-audio-player-with-playlist/
  511. */
  512. // Multiple events to a listener
  513. function addEventListener_multi(element, eventNames, handler) {
  514. var events = eventNames.split(' ');
  515. events.forEach(e => element.addEventListener(e, handler, false));
  516. }
  517. // Random numbers in a specific range
  518. function getRandom(min, max) {
  519. min = Math.ceil(min);
  520. max = Math.floor(max);
  521. return Math.floor(Math.random() * (max - min + 1)) + min;
  522. }
  523. // Position element inside element
  524. function getRelativePos(elm) {
  525. var pPos = elm.parentNode.getBoundingClientRect(); // parent pos
  526. var cPos = elm.getBoundingClientRect(); // target pos
  527. var pos = {};
  528. pos.top = cPos.top - pPos.top + elm.parentNode.scrollTop,
  529. pos.right = cPos.right - pPos.right,
  530. pos.bottom = cPos.bottom - pPos.bottom,
  531. pos.left = cPos.left - pPos.left;
  532. return pos;
  533. }
  534. function formatTime(val) {
  535. var h = 0, m = 0, s;
  536. val = parseInt(val, 10);
  537. if (val > 60 * 60) {
  538. h = parseInt(val / (60 * 60), 10);
  539. val -= h * 60 * 60;
  540. }
  541. if (val > 60) {
  542. m = parseInt(val / 60, 10);
  543. val -= m * 60;
  544. }
  545. s = val;
  546. val = (h > 0) ? h + ':' : '';
  547. val += (m > 0) ? ((m < 10 && h > 0) ? '0' : '') + m + ':' : '0:';
  548. val += ((s < 10) ? '0' : '') + s;
  549. return val;
  550. }
  551. function simp_initTime() {
  552. simp_controls.querySelector('.start-time').innerHTML = formatTime(simp_audio.currentTime); //calculate current value time
  553. if (!simp_isStream) {
  554. simp_controls.querySelector('.end-time').innerHTML = formatTime(simp_audio.duration); //calculate total value time
  555. simp_progress.value = simp_audio.currentTime / simp_audio.duration * 100; //progress bar
  556. }
  557. // ended of the audio
  558. if (simp_audio.currentTime == simp_audio.duration) {
  559. simp_controls.querySelector('.simp-plause').classList.remove('fa-pause');
  560. simp_controls.querySelector('.simp-plause').classList.add('fa-play');
  561. simp_audio.removeEventListener('timeupdate', simp_initTime);
  562. if (simp_isNext) { //auto load next audio
  563. var elem;
  564. simp_a_index++;
  565. if (simp_a_index == simp_a_url.length) { //repeat all audio
  566. simp_a_index = 0;
  567. elem = simp_a_url[0];
  568. } else {
  569. elem = simp_a_url[simp_a_index];
  570. }
  571. simp_changeAudio(elem);
  572. simp_setAlbum(simp_a_index);
  573. } else {
  574. simp_isPlaying = false;
  575. }
  576. }
  577. }
  578. function simp_initAudio() {
  579. // if readyState more than 2, audio file has loaded
  580. simp_isLoaded = simp_audio.readyState == 4 ? true : false;
  581. simp_isStream = simp_audio.duration == 'Infinity' ? true : false;
  582. simp_controls.querySelector('.simp-plause').disabled = false;
  583. simp_progress.disabled = simp_isStream ? true : false;
  584. if (!simp_isStream) {
  585. simp_progress.parentNode.classList.remove('simp-load', 'simp-loading');
  586. simp_controls.querySelector('.end-time').innerHTML = formatTime(simp_audio.duration);
  587. }
  588. simp_audio.addEventListener('timeupdate', simp_initTime); //tracking load progress
  589. if (simp_isLoaded && simp_isPlaying) simp_audio.play();
  590. // progress bar click event
  591. addEventListener_multi(simp_progress, 'touchstart mousedown', function (e) {
  592. if (simp_isStream) {
  593. e.stopPropagation();
  594. return false;
  595. }
  596. if (simp_audio.readyState == 4) {
  597. simp_audio.removeEventListener('timeupdate', simp_initTime);
  598. simp_audio.pause();
  599. }
  600. });
  601. addEventListener_multi(simp_progress, 'touchend mouseup', function (e) {
  602. if (simp_isStream) {
  603. e.stopPropagation();
  604. return false;
  605. }
  606. if (simp_audio.readyState == 4) {
  607. simp_audio.currentTime = simp_progress.value * simp_audio.duration / 100;
  608. simp_audio.addEventListener('timeupdate', simp_initTime);
  609. if (simp_isPlaying) simp_audio.play();
  610. }
  611. });
  612. }
  613. function simp_loadAudio(elem) {
  614. simp_progress.parentNode.classList.add('simp-loading');
  615. simp_controls.querySelector('.simp-plause').disabled = true;
  616. simp_audio.querySelector('source').src = elem.dataset.src;
  617. simp_audio.load();
  618. simp_audio.volume = parseFloat(simp_v_num / 100); //based on valume input value
  619. simp_audio.addEventListener('canplaythrough', simp_initAudio); //play audio without stop for buffering
  620. // if audio fails to load, only IE/Edge 9.0 or above
  621. simp_audio.addEventListener('error', function () {
  622. alert('Please reload the page.');
  623. });
  624. }
  625. function simp_setAlbum(index) {
  626. simp_cover.innerHTML = simp_a_url[index].dataset.cover ? '<div style="background:url(' + simp_a_url[index].dataset.cover + ') no-repeat;background-size:cover;width:80px;height:80px;"></div>' : '<i class="fa fa-music fa-5x"></i>';
  627. simp_title.innerHTML = simp_source[index].querySelector('.simp-source').innerHTML;
  628. simp_artist.innerHTML = simp_source[index].querySelector('.simp-desc') ? simp_source[index].querySelector('.simp-desc').innerHTML : '';
  629. }
  630. function simp_changeAudio(elem) {
  631. simp_isLoaded = false;
  632. simp_controls.querySelector('.simp-prev').disabled = simp_a_index == 0 ? true : false;
  633. simp_controls.querySelector('.simp-plause').disabled = simp_auto_load ? true : false;
  634. simp_controls.querySelector('.simp-next').disabled = simp_a_index == simp_a_url.length - 1 ? true : false;
  635. simp_progress.parentNode.classList.add('simp-load');
  636. simp_progress.disabled = true;
  637. simp_progress.value = 0;
  638. simp_controls.querySelector('.start-time').innerHTML = '00:00';
  639. simp_controls.querySelector('.end-time').innerHTML = '00:00';
  640. elem = simp_isRandom && simp_isNext ? simp_a_url[getRandom(0, simp_a_url.length - 1)] : elem;
  641. // playlist, audio is running
  642. for (var i = 0; i < simp_a_url.length; i++) {
  643. simp_a_url[i].parentNode.classList.remove('simp-active');
  644. if (simp_a_url[i] == elem) {
  645. simp_a_index = i;
  646. simp_a_url[i].parentNode.classList.add('simp-active');
  647. }
  648. }
  649. // scrolling to element inside element
  650. var simp_active = getRelativePos(simp_source[simp_a_index]);
  651. simp_source[simp_a_index].parentNode.scrollTop = simp_active.top;
  652. if (simp_auto_load || simp_isPlaying) simp_loadAudio(elem);
  653. if (simp_isPlaying) {
  654. simp_controls.querySelector('.simp-plause').classList.remove('fa-play');
  655. simp_controls.querySelector('.simp-plause').classList.add('fa-pause');
  656. }
  657. }
  658. function simp_startScript() {
  659. ap_simp = document.querySelector('#simp');
  660. simp_audio = ap_simp.querySelector('#audio');
  661. simp_album = ap_simp.querySelector('.simp-album');
  662. simp_cover = simp_album.querySelector('.simp-cover');
  663. simp_title = simp_album.querySelector('.simp-title');
  664. simp_artist = simp_album.querySelector('.simp-artist');
  665. simp_controls = ap_simp.querySelector('.simp-controls');
  666. simp_progress = simp_controls.querySelector('.simp-progress');
  667. simp_volume = simp_controls.querySelector('.simp-volume');
  668. simp_v_slider = simp_volume.querySelector('.simp-v-slider');
  669. simp_v_num = simp_v_slider.value; //default volume
  670. simp_others = simp_controls.querySelector('.simp-others');
  671. simp_auto_load = simp_config.auto_load; //auto load audio file
  672. if (simp_config.shide_top) simp_album.parentNode.classList.toggle('simp-hide');
  673. if (simp_config.shide_btm) {
  674. simp_playlist.classList.add('simp-display');
  675. simp_playlist.classList.toggle('simp-hide');
  676. }
  677. if (simp_a_url.length <= 1) {
  678. simp_controls.querySelector('.simp-prev').style.display = 'none';
  679. simp_controls.querySelector('.simp-next').style.display = 'none';
  680. simp_others.querySelector('.simp-plext').style.display = 'none';
  681. simp_others.querySelector('.simp-random').style.display = 'none';
  682. }
  683. // Playlist listeners
  684. simp_source.forEach(function (item, index) {
  685. if (item.classList.contains('simp-active')) simp_a_index = index; //playlist contains '.simp-active'
  686. item.addEventListener('click', function () {
  687. simp_audio.removeEventListener('timeupdate', simp_initTime);
  688. simp_a_index = index;
  689. simp_changeAudio(this.querySelector('.simp-source'));
  690. simp_setAlbum(simp_a_index);
  691. });
  692. });
  693. // FIRST AUDIO LOAD =======
  694. simp_changeAudio(simp_a_url[simp_a_index]);
  695. simp_setAlbum(simp_a_index);
  696. // FIRST AUDIO LOAD =======
  697. // Controls listeners
  698. simp_controls.querySelector('.simp-plauseward').addEventListener('click', function (e) {
  699. var eles = e.target.classList;
  700. if (eles.contains('simp-plause')) {
  701. if (simp_audio.paused) {
  702. if (!simp_isLoaded) simp_loadAudio(simp_a_url[simp_a_index]);
  703. simp_audio.play();
  704. simp_isPlaying = true;
  705. eles.remove('fa-play');
  706. eles.add('fa-pause');
  707. } else {
  708. simp_audio.pause();
  709. simp_isPlaying = false;
  710. eles.remove('fa-pause');
  711. eles.add('fa-play');
  712. }
  713. } else {
  714. if (eles.contains('simp-prev') && simp_a_index != 0) {
  715. simp_a_index = simp_a_index - 1;
  716. e.target.disabled = simp_a_index == 0 ? true : false;
  717. } else if (eles.contains('simp-next') && simp_a_index != simp_a_url.length - 1) {
  718. simp_a_index = simp_a_index + 1;
  719. e.target.disabled = simp_a_index == simp_a_url.length - 1 ? true : false;
  720. }
  721. simp_audio.removeEventListener('timeupdate', simp_initTime);
  722. simp_changeAudio(simp_a_url[simp_a_index]);
  723. simp_setAlbum(simp_a_index);
  724. }
  725. });
  726. // Audio volume
  727. simp_volume.addEventListener('click', function (e) {
  728. var eles = e.target.classList;
  729. if (eles.contains('simp-mute')) {
  730. if (eles.contains('fa-volume-up')) {
  731. eles.remove('fa-volume-up');
  732. eles.add('fa-volume-off');
  733. simp_v_slider.value = 0;
  734. } else {
  735. eles.remove('fa-volume-off');
  736. eles.add('fa-volume-up');
  737. simp_v_slider.value = simp_v_num;
  738. }
  739. } else {
  740. simp_v_num = simp_v_slider.value;
  741. if (simp_v_num != 0) {
  742. simp_controls.querySelector('.simp-mute').classList.remove('fa-volume-off');
  743. simp_controls.querySelector('.simp-mute').classList.add('fa-volume-up');
  744. }
  745. }
  746. simp_audio.volume = parseFloat(simp_v_slider.value / 100);
  747. });
  748. // Others
  749. simp_others.addEventListener('click', function (e) {
  750. var eles = e.target.classList;
  751. if (eles.contains('simp-plext')) {
  752. simp_isNext = simp_isNext && !simp_isRandom ? false : true;
  753. if (!simp_isRandom) simp_isRanext = simp_isRanext ? false : true;
  754. eles.contains('simp-active') && !simp_isRandom ? eles.remove('simp-active') : eles.add('simp-active');
  755. } else if (eles.contains('simp-random')) {
  756. simp_isRandom = simp_isRandom ? false : true;
  757. if (simp_isNext && !simp_isRanext) {
  758. simp_isNext = false;
  759. simp_others.querySelector('.simp-plext').classList.remove('simp-active');
  760. } else {
  761. simp_isNext = true;
  762. simp_others.querySelector('.simp-plext').classList.add('simp-active');
  763. }
  764. eles.contains('simp-active') ? eles.remove('simp-active') : eles.add('simp-active');
  765. } else if (eles.contains('simp-shide-top')) {
  766. simp_album.parentNode.classList.toggle('simp-hide');
  767. } else if (eles.contains('simp-shide-bottom')) {
  768. simp_playlist.classList.add('simp-display');
  769. simp_playlist.classList.toggle('simp-hide');
  770. }
  771. });
  772. }
  773. // Start simple player
  774. if (document.querySelector('#simp')) {
  775. var simp_auto_load, simp_audio, simp_album, simp_cover, simp_title, simp_artist, simp_controls, simp_progress, simp_volume, simp_v_slider, simp_v_num, simp_others;
  776. var ap_simp = document.querySelector('#simp');
  777. var simp_playlist = ap_simp.querySelector('.simp-playlist');
  778. var simp_source = simp_playlist.querySelectorAll('li');
  779. var simp_a_url = simp_playlist.querySelectorAll('[data-src]');
  780. var simp_a_index = 0;
  781. var simp_isPlaying = false;
  782. var simp_isNext = true; //auto play
  783. var simp_isRandom = false; //play random
  784. var simp_isRanext = false; //check if before random starts, simp_isNext value is true
  785. var simp_isStream = false; //radio streaming
  786. var simp_isLoaded = false; //audio file has loaded
  787. var simp_config = ap_simp.dataset.config ? JSON.parse(ap_simp.dataset.config) : {
  788. shide_top: false, //show/hide album
  789. shide_btm: false, //show/hide playlist
  790. auto_load: false //auto load audio file
  791. };
  792. var simp_elem = '';
  793. simp_elem += '<audio id="audio" preload><source src="" type="audio/mpeg"></audio>';
  794. simp_elem += '<div class="simp-display"><div class="simp-album w-full flex-wrap"><div class="simp-cover"><i class="fa fa-music fa-5x"></i></div><div class="simp-info"><div class="simp-title">Title</div><div class="simp-artist">Artist</div></div></div></div>';
  795. simp_elem += '<div class="simp-controls flex-wrap flex-align">';
  796. simp_elem += '<div class="simp-plauseward flex flex-align"><button type="button" class="simp-prev fa fa-backward" disabled></button><button type="button" class="simp-plause fa fa-play" disabled></button><button type="button" class="simp-next fa fa-forward" disabled></button></div>';
  797. simp_elem += '<div class="simp-tracker simp-load"><input class="simp-progress" type="range" min="0" max="100" value="0" disabled /><div class="simp-buffer"></div></div>';
  798. simp_elem += '<div class="simp-time flex flex-align"><span class="start-time">00:00</span><span class="simp-slash">&#160;/&#160;</span><span class="end-time">00:00</span></div>';
  799. simp_elem += '<div class="simp-volume flex flex-align"><button type="button" class="simp-mute fa fa-volume-up"></button><input class="simp-v-slider" type="range" min="0" max="100" value="100" /></div>';
  800. simp_elem += '<div class="simp-others flex flex-align"><button type="button" class="simp-plext simp-active fa fa-play-circle" title="Auto Next"></button><button type="button" class="simp-random fa fa-random" title="Random"></button><div class="simp-shide"><button type="button" class="simp-shide-top fa fa-caret-up" title="Show/Hide Album"></button><button type="button" class="simp-shide-bottom fa fa-caret-down" title="Show/Hide Playlist"></button></div></div>';
  801. simp_elem += '</div>'; //simp-controls
  802. var simp_player = document.createElement('div');
  803. simp_player.classList.add('simp-player');
  804. simp_player.innerHTML = simp_elem;
  805. ap_simp.insertBefore(simp_player, simp_playlist);
  806. simp_startScript();
  807. }
  808. </script>
  809. </body>
  810. </html>