@@ -86,13 +86,12 @@ namespace DiscordCoreAPI {
8686
8787 SoundCloudRequestBuilder::SoundCloudRequestBuilder (ConfigManager* configManagerNew) : HttpsClientCore{ jsonifier::string{ configManagerNew->getBotToken () } } {};
8888
89- jsonifier::string collectSongIdFromSearchQuery (jsonifier::string_view string) {
89+ inline bool collectSongIdFromSearchQuery (jsonifier::string_view string, jsonifier::string& stringNew ) {
9090 if (string.find (" soundcloud.com" ) != jsonifier::string::npos) {
91- jsonifier::string returnString{};
92- returnString = string.substr (string.find (" soundcloud.com/" ) + jsonifier::string{ " soundcloud.com/" }.size ());
93- return returnString;
91+ stringNew = string.substr (string.find (" soundcloud.com/" ) + jsonifier::string{ " soundcloud.com/" }.size ());
92+ return true ;
9493 } else {
95- return static_cast <jsonifier::string>(string) ;
94+ return false ;
9695 }
9796 }
9897
@@ -104,7 +103,7 @@ namespace DiscordCoreAPI {
104103 HttpsWorkloadData dataPackage{ HttpsWorkloadType::SoundCloudGetSearchResults };
105104 dataPackage.baseUrl = " https://soundcloud.com/" ;
106105 dataPackage.headersToInsert [" User-Agent" ] = " Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36" ;
107- dataPackage.relativePath = collectSongIdFromSearchQuery ( songQuery) ;
106+ dataPackage.relativePath = songQuery;
108107 dataPackage.workloadClass = HttpsWorkloadClass::Get;
109108 HttpsResponseData returnData = submitWorkloadAndGetResult (std::move (dataPackage));
110109 Song results{};
@@ -172,26 +171,34 @@ namespace DiscordCoreAPI {
172171 }
173172 }
174173 }
174+ results.type = SongType::SoundCloud;
175175 return results;
176176 } catch (const HttpsError& error) {
177177 MessagePrinter::printError<PrintMessageType::Https>(" SoundCloudRequestBuilder::collectSearchResults() Error: " + jsonifier::string{ error.what () });
178178 }
179179 return {};
180180 }
181181
182- jsonifier::vector<Song> SoundCloudRequestBuilder::collectSearchResults (jsonifier::string_view songQuery) {
182+ jsonifier::vector<Song> SoundCloudRequestBuilder::collectSearchResults (jsonifier::string_view songQuery, int32_t limit ) {
183183 if (clientId == " " ) {
184184 SoundCloudRequestBuilder::collectClientId ();
185185 }
186186 try {
187+ jsonifier::string newString{};
188+ jsonifier::vector<Song> results{};
189+ if (collectSongIdFromSearchQuery (songQuery, newString)) {
190+ auto result = collectSingleResult (newString);
191+ if (result.songId != " " ) {
192+ results.emplace_back (result);
193+ }
194+ return results;
195+ }
187196 HttpsWorkloadData dataPackage{ HttpsWorkloadType::SoundCloudGetSearchResults };
188197 dataPackage.baseUrl = baseUrl02;
189198 dataPackage.headersToInsert [" User-Agent" ] = " Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36" ;
190- dataPackage.relativePath =
191- " /search?q=" + urlEncode (collectSongIdFromSearchQuery (songQuery).data ()) + " &facet=model&client_id=" + SoundCloudRequestBuilder::clientId;
192- dataPackage.workloadClass = HttpsWorkloadClass::Get;
193- HttpsResponseData returnData = submitWorkloadAndGetResult (std::move (dataPackage));
194- jsonifier::vector<Song> results{};
199+ dataPackage.relativePath = " /search?q=" + urlEncode (songQuery) + " &facet=model&client_id=" + SoundCloudRequestBuilder::clientId;
200+ dataPackage.workloadClass = HttpsWorkloadClass::Get;
201+ HttpsResponseData returnData = submitWorkloadAndGetResult (std::move (dataPackage));
195202 SoundCloudSearchResults resultsNew{};
196203 parser.parseJson <true , true >(resultsNew, returnData.responseData );
197204 for (auto & value: resultsNew.collection ) {
@@ -208,7 +215,7 @@ namespace DiscordCoreAPI {
208215 }
209216 }
210217 if (isItFound) {
211- jsonifier::string newString = value.title ;
218+ newString = value.title ;
212219 if (newString.size () > 0 ) {
213220 if (newString.size () > 256 ) {
214221 newString = newString.substr (0 , 256 );
@@ -227,14 +234,18 @@ namespace DiscordCoreAPI {
227234 if (newString.size () > 0 ) {
228235 songNew.thumbnailUrl = newString;
229236 }
237+ songNew.type = SongType::SoundCloud;
230238 songNew.viewUrl = value.viewUrl ;
231239 songNew.duration = TimeStamp::convertMsToDurationString (value.duration );
232240 songNew.firstDownloadUrl += " ?client_id=" + SoundCloudRequestBuilder::clientId + " &track_authorization=" + value.trackAuthorization ;
233241 if (songNew.thumbnailUrl .find (" -" ) != jsonifier::string::npos) {
234242 jsonifier::string newerString = songNew.thumbnailUrl .substr (0 , songNew.thumbnailUrl .findLastOf (" -" ) + 1 );
235243 newerString += " t500x500.jpg" ;
236244 songNew.thumbnailUrl = newerString;
237- results.emplace_back (songNew);
245+ }
246+ results.emplace_back (songNew);
247+ if (results.size () >= limit) {
248+ break ;
238249 }
239250 }
240251 }
@@ -256,7 +267,7 @@ namespace DiscordCoreAPI {
256267 }
257268 dataPackage01.workloadClass = HttpsWorkloadClass::Get;
258269 dataPackage01.headersToInsert [" Connection" ] = " Keep-Alive" ;
259- dataPackage01.headersToInsert [" User-Agent" ] = " Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115 .0.0.0 Safari/537.36" ;
270+ dataPackage01.headersToInsert [" User-Agent" ] = " Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117 .0.0.0 Safari/537.36" ;
260271 HttpsResponseData results = submitWorkloadAndGetResult (std::move (dataPackage01));
261272 SecondDownloadUrl downloadUrl{};
262273 Song newerSong{ songNew };
@@ -272,15 +283,15 @@ namespace DiscordCoreAPI {
272283 while (newString.find (" #EXTINF:" ) != jsonifier::string::npos) {
273284 jsonifier::string newString01 = " #EXTINF:" ;
274285 jsonifier::string newString02 = newString.substr (newString.find (" #EXTINF:" ) + newString01.size ());
275- auto commandFind = newString02.find (" ," );
286+ auto commandFind = newString02.find (" ," );
276287 jsonifier::string newString00 = newString02.substr (0 , commandFind);
277288 jsonifier::string newString03 = newString02.substr (commandFind + 2 , newString02.find (" #EXTINF:" ) - (newString00.size () + 3 ));
278- newString = newString02.substr (commandFind);
289+ newString = newString02.substr (commandFind);
279290 if (newString03.find (" #EXT-X-ENDLIST" ) != jsonifier::string::npos) {
280291 newString03 = newString03.substr (0 , newString03.find (" #EXT-X-ENDLIST" ));
281292 }
282293 jsonifier::string newString04 = newString03.substr (newString03.findFirstOf (" 1234567890" ));
283- uint64_t firstNumber01 = std::stoull (newString04.substr (0 , newString04.find (" /" )).data ());
294+ uint64_t firstNumber01 = std::stoull (newString04.substr (0 , newString04.find (" /" )).data ());
284295 jsonifier::string newString05 = newString04.substr (newString04.find (" /" ) + 1 );
285296 uint64_t secondNumber = std::stoull (newString05.substr (0 , newString05.find (" /" )).data ());
286297 DownloadUrl downloadUrlNew{};
@@ -301,7 +312,7 @@ namespace DiscordCoreAPI {
301312 dataPackage02.baseUrl = newerSong.secondDownloadUrl ;
302313 dataPackage02.workloadClass = HttpsWorkloadClass::Get;
303314 dataPackage02.headersToInsert [" Connection" ] = " Keep-Alive" ;
304- dataPackage02.headersToInsert [" User-Agent" ] = " Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115 .0.0.0 Safari/537.36" ;
315+ dataPackage02.headersToInsert [" User-Agent" ] = " Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117 .0.0.0 Safari/537.36" ;
305316 auto headersNew = submitWorkloadAndGetResult (std::move (dataPackage02));
306317 uint64_t valueBitRate{};
307318 uint64_t valueLength{};
@@ -333,20 +344,20 @@ namespace DiscordCoreAPI {
333344 HttpsWorkloadData dataPackage02{ HttpsWorkloadType::SoundCloudGetClientId };
334345 dataPackage02.baseUrl = baseUrl;
335346 dataPackage02.relativePath = " /search?q=testValue" ;
336- dataPackage02.headersToInsert [" User-Agent" ] = " Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115 .0.0.0 Safari/537.36" ;
347+ dataPackage02.headersToInsert [" User-Agent" ] = " Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117 .0.0.0 Safari/537.36" ;
337348 dataPackage02.workloadClass = HttpsWorkloadClass::Get;
338349 HttpsResponseData returnData = submitWorkloadAndGetResult (std::move (dataPackage02));
339350 jsonifier::vector<jsonifier::string> assetPaths{};
340351 jsonifier::string newString01 = " crossorigin src=" ;
341352 jsonifier::string newerString{};
342353 newerString = returnData.responseData ;
343354 if (newerString.find (newString01) != jsonifier::string::npos) {
344- jsonifier::string newString = newerString.substr (newerString.find (newString01) + newString01.size ());
355+ jsonifier::string newString = newerString.substr (newerString.find (newString01) + newString01.size ());
345356 jsonifier::string newString02 = newString.substr (1 , newString.find (" .js" ) + 2 );
346357 assetPaths.emplace_back (newString02);
347358 while (newString.find (" crossorigin src=" ) != jsonifier::string::npos) {
348359 jsonifier::string newString03 = newString.substr (1 , newString.find (" .js" ) + 2 );
349- newString = newString.substr (newString.find (" crossorigin src=" ) + newString01.size ());
360+ newString = newString.substr (newString.find (" crossorigin src=" ) + newString01.size ());
350361 assetPaths.emplace_back (newString03);
351362 }
352363 HttpsWorkloadData dataPackage03{ HttpsWorkloadType::SoundCloudGetClientId };
@@ -356,7 +367,8 @@ namespace DiscordCoreAPI {
356367 jsonifier::string newerString02{};
357368 newerString02.insert (newerString02.begin (), returnData02.responseData .begin (), returnData02.responseData .end ());
358369
359- jsonifier::string newString03 = newerString02.substr (newerString02.find (" JSON.stringify({client_id:\" " ) + jsonifier::string_view{ " JSON.stringify({client_id:\" " }.size ());
370+ jsonifier::string newString03 =
371+ newerString02.substr (newerString02.find (" JSON.stringify({client_id:\" " ) + jsonifier::string_view{ " JSON.stringify({client_id:\" " }.size ());
360372
361373 if (newString03.find (" \" ,nonce:e.nonce}))))" ) != jsonifier::string::npos) {
362374 clientIdNew = newString03.substr (0 , newString03.find (" \" ,nonce:e.nonce}))))" ));
@@ -402,8 +414,10 @@ namespace DiscordCoreAPI {
402414 for (uint64_t x = 0 ; x < songNew.finalDownloadUrls .size (); ++x) {
403415 HttpsWorkloadData dataPackage03{ HttpsWorkloadType::SoundCloudGetSearchResults };
404416 if (counter < songNew.finalDownloadUrls .size ()) {
405- jsonifier::string baseUrlNew = songNew.finalDownloadUrls .at (x).urlPath .substr (0 , jsonifier::string_view{ " https://cf-hls-opus-media.sndcdn.com/media/" }.size ());
406- jsonifier::string relativeUrl = songNew.finalDownloadUrls .at (x).urlPath .substr (jsonifier::string_view{ " https://cf-hls-opus-media.sndcdn.com/media/" }.size ());
417+ jsonifier::string baseUrlNew =
418+ songNew.finalDownloadUrls .at (x).urlPath .substr (0 , jsonifier::string_view{ " https://cf-hls-opus-media.sndcdn.com/media/" }.size ());
419+ jsonifier::string relativeUrl =
420+ songNew.finalDownloadUrls .at (x).urlPath .substr (jsonifier::string_view{ " https://cf-hls-opus-media.sndcdn.com/media/" }.size ());
407421 dataPackage03.baseUrl = baseUrlNew;
408422 dataPackage03.relativePath = relativeUrl;
409423 }
@@ -466,8 +480,8 @@ namespace DiscordCoreAPI {
466480 return SoundCloudRequestBuilder::collectSingleResult (searchQuery);
467481 }
468482
469- jsonifier::vector<Song> SoundCloudAPI::searchForSong (jsonifier::string_view searchQuery) {
470- return collectSearchResults (searchQuery);
483+ jsonifier::vector<Song> SoundCloudAPI::searchForSong (jsonifier::string_view searchQuery, int32_t limit ) {
484+ return collectSearchResults (searchQuery, limit );
471485 }
472486
473487 Song SoundCloudAPI::collectFinalSong (const Song& songNew) {
0 commit comments