1
0

saavn-search.js 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. var results_container = document.querySelector("#saavn-results")
  2. var results_objects = {};
  3. const searchUrl = "https://jiosaavn-api-privatecvc2.vercel.app/search/songs?query=";
  4. function SaavnSearch() {
  5. event.preventDefault(); // stop page changing to #, which will reload the page
  6. var query = document.querySelector("#saavn-search-box").value.trim()
  7. query = encodeURIComponent(query);
  8. if(query==lastSearch) {doSaavnSearch(query)}
  9. window.location.hash = lastSearch;
  10. if(query.length > 0) {
  11. window.location.hash = query
  12. }
  13. }
  14. var page_index = 1;
  15. function nextPage() {
  16. var query = document.querySelector("#saavn-search-box").value.trim();
  17. if (!query) {query = lastSearch;}
  18. query = encodeURIComponent(query);
  19. doSaavnSearch(query,0,true)
  20. }
  21. async function doSaavnSearch(query,NotScroll,page) {
  22. window.location.hash = query;
  23. document.querySelector("#saavn-search-box").value = decodeURIComponent(query);
  24. if(!query) {return 0;}
  25. results_container.innerHTML = `<span class="loader">Searching</span>`;
  26. query=query+"&limit=40";
  27. if(page) {
  28. ;page_index=page_index+1;query=query+"&page="+page_index;
  29. } else {query=query+"&page=1";page_index=1;}
  30. // try catch
  31. try {
  32. var response = await fetch(searchUrl + query);
  33. } catch(error) {
  34. results_container.innerHTML = `<span class="error">Error: ${error} <br> Check if API is down </span>`;
  35. }
  36. var json = await response.json();
  37. /* If response code isn't 200, display error*/
  38. if (response.status !== 200) {
  39. results_container.innerHTML = `<span class="error">Error: ${json.message}</span>`;
  40. console.log(response)
  41. return 0;
  42. }
  43. var json = json.data.results;
  44. var results = [];
  45. if(!json) {results_container.innerHTML = "<p> No result found. Try other Library </p>";return;}
  46. lastSearch = decodeURI(window.location.hash.substring(1));
  47. for(let track of json) {
  48. song_name = TextAbstract(track.name,25);
  49. album_name = TextAbstract(track.album.name,20);
  50. if (track.album.name == track.name) {
  51. album_name = ""
  52. }
  53. var measuredTime = new Date(null);
  54. measuredTime.setSeconds(track.duration); // specify value of SECONDS
  55. var play_time = measuredTime.toISOString().substr(11, 8);
  56. if (play_time.startsWith("00:0")) {
  57. play_time = play_time.slice(4);
  58. }
  59. if (play_time.startsWith("00:")) {
  60. play_time = play_time.slice(3);
  61. }
  62. var song_id = track.id;
  63. var year = track.year;
  64. var song_image = track.image[1].link;
  65. var song_artist = TextAbstract(track.primaryArtists,30);
  66. var bitrate = document.getElementById('saavn-bitrate');
  67. var bitrate_i = bitrate.options[bitrate.selectedIndex].value;
  68. if(track.downloadUrl) {
  69. var download_url = track.downloadUrl[bitrate_i]['link'];
  70. var quality = "";
  71. if (bitrate_i == 4) {quality = 320} else {quality = 160;}
  72. // push object to results array
  73. results_objects[song_id] = {
  74. track: track
  75. };
  76. results.push(`
  77. <div class="text-left song-container" style="margin-bottom:20px;border-radius:10px;background-color:#1c1c1c;padding:10px;">
  78. <div class="row" style="margin:auto;">
  79. <div class="col-auto" style="padding:0px;padding-right:0px;border-style:none;">
  80. <img id="${song_id}-i" class="img-fluid d-inline" style="width:115px;border-radius:5px;height:115px;padding-right:10px;" src="${song_image}" loading="lazy"/>
  81. </div>
  82. <div class="col" style="border-style:none;padding:2px;">
  83. <p class="float-right fit-content" style="margin:0px;color:#fff;padding-right:10px;">${year}</p>
  84. <p id="${song_id}-n" class="fit-content" style="margin:0px;color:#fff;max-width:100%;">${song_name}</p>
  85. <p id="${song_id}-a" class="fit-content" style="margin:0px;color:#fff;max-width:100%;">${album_name}<br/></p>
  86. <p id="${song_id}-ar" class="fit-content" style="margin:0px;color:#fff;max-width:100%;">${song_artist}<br/></p>
  87. <button class="btn btn-primary song-btn" type="button" style="margin:0px 2px;" onclick='PlayAudio("${download_url}","${song_id}")'>▶</button>
  88. <button class="btn btn-primary song-btn" type="button" style="margin:0px 2px;" onclick='AddDownload("${song_id}")'>DL</button>
  89. <p class="float-right fit-content" style="margin:0px;color:#fff;padding-right:10px;padding-top:15px;">${play_time}<br/></p>
  90. </div>
  91. </div>
  92. </div>
  93. `
  94. ); }
  95. }
  96. results_container.innerHTML = results.join(' ');
  97. if(!NotScroll){
  98. document.getElementById("saavn-results").scrollIntoView();
  99. }
  100. }
  101. function TextAbstract(text, length) {
  102. if (text == null) {
  103. return "";
  104. }
  105. if (text.length <= length) {
  106. return text;
  107. }
  108. text = text.substring(0, length);
  109. last = text.lastIndexOf(" ");
  110. text = text.substring(0, last);
  111. return text + "...";
  112. }
  113. if(window.location.hash) {
  114. doSaavnSearch(window.location.hash.substring(1));
  115. } else {doSaavnSearch('english',1);}
  116. addEventListener('hashchange', event => { });
  117. onhashchange = event => {doSaavnSearch(window.location.hash.substring(1))};
  118. // If Bitrate changes, search again
  119. $('#saavn-bitrate').on('change', function () {
  120. doSaavnSearch(lastSearch);
  121. /*
  122. var isDirty = !this.options[this.selectedIndex].defaultSelected;
  123. if (isDirty) {
  124. // Value Changed
  125. doSaavnSearch(lastSearch)
  126. } else {
  127. // Do Nothing
  128. } */
  129. });
  130. document.getElementById("loadmore").addEventListener('click',nextPage)