-
Notifications
You must be signed in to change notification settings - Fork 130
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Fix: wrong YouTube playlist detection #630
base: master
Are you sure you want to change the base?
Changes from all commits
85e3f8e
bfb3051
17a956c
609b852
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -7,10 +7,7 @@ | |||||||||||||||||||||||||||||||||||||||||||||||||||||
import org.apache.commons.text.StringEscapeUtils; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
import org.hildan.fxgson.FxGson; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
import preferences.AppSettings; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
import properties.MessageCategory; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
import properties.Mode; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
import properties.OS; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
import properties.Program; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
import properties.*; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
import java.io.*; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
import java.net.*; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -33,6 +30,7 @@ | |||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
import static properties.Program.YT_DLP; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
import static support.Constants.*; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
import static utils.Utility.extractQueryParams; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
public class Utility { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
private static final Random RANDOM_GENERATOR = new Random(System.currentTimeMillis()); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -860,4 +858,93 @@ public static int parseStringToInt(String string, String errorMessage, MessageCa | |||||||||||||||||||||||||||||||||||||||||||||||||||||
return 0; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
public static String formatYoutubeLink(String link) throws MalformedURLException, URISyntaxException { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
String videoId = null; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
URI uri = URI.create(link); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
String domain = uri.getHost(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
if ("youtu.be".equals(domain)) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
String path = uri.getPath(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (path != null && path.length() > 1) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
videoId = path.substring(1); // removing the leading "/" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
else if ("www.youtube.com".equals(domain) || "youtube.com".equals(domain)) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
Map<String, String> queryParams = extractQueryParams(link, "v"); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
videoId = queryParams.get("v"); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (videoId != null) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
uri = new URI("https", "www.youtube.com", "/watch", "v=" + videoId, null); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
link = uri.toString(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
} else { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
throw new MalformedURLException(link + " is not a valid youtube link!"); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
return link; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
/** | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
* Extracts the specified query parameters from the given URL. If no parameter names are provided (null or empty), all parameters are returned. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
* | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
* @param urlLink The URL string from which to extract parameters. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
* @param paramNames The names of the query parameters to extract. If null or empty, all parameters will be returned. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
* @return A map containing the query parameter names and their corresponding values. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
*/ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
public static Map<String, String> extractQueryParams(String urlLink, String... paramNames) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
Map<String, String> paramMap = new HashMap<>(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
URL url = null; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
try { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
url = URI.create(urlLink).toURL(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
} catch (MalformedURLException e) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
msgBroker.msgLinkError("Connection to the link timed out! Please check your internet connection. " + e.getMessage()); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
String query = url != null ? url.getQuery() : null; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
// query is null or empty, return an empty map (no query parameters) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (query == null || query.isEmpty()) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
return paramMap; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
// splitting query string into individual parameters | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
String[] params = query.split("&"); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
// check if specific parameters are requested or if all should be returned | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
boolean returnAllParams = (paramNames == null || paramNames.length == 0); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
for (String param : params) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
String[] pair = param.split("="); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (pair.length == 2) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
String paramName = pair[0]; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
String paramValue = pair[1]; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
// add parameter to the map if it's requested or if all parameters should be returned | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (returnAllParams || contains(paramNames, paramName)) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
paramMap.put(paramName, paramValue); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
return paramMap; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
/** | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
* Helper method to check if an array contains a specific value. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
* | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
* @param array The array to check. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
* @param value The value to search for. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
* @return True if the array contains the value, false otherwise. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
*/ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
private static boolean contains(String[] array, String value) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (array == null) return false; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
for (String item : array) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (item.equals(value)) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
return true; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
return false; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+934
to
+949
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Consider using Java's built-in method for array contains check. The Consider replacing the method with this more concise and potentially more efficient version: -private static boolean contains(String[] array, String value) {
- if (array == null) return false;
- for (String item : array) {
- if (item.equals(value)) {
- return true;
- }
- }
- return false;
-}
+private static boolean contains(String[] array, String value) {
+ return array != null && Arrays.asList(array).contains(value);
+} This change utilizes Java's 📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Improve error handling and efficiency in
extractQueryParams
.The method correctly extracts query parameters, but there are opportunities for improvement:
Consider applying these changes:
These changes address the issues mentioned in the past review comment and improve the overall efficiency and robustness of the method.
📝 Committable suggestion