Java-HttpUrlConnection contiene documento HTTP invece di JSON
Sto cercando di scaricare un file MP3 di un determinato file youtube da Youtubeinmp3.com
A volte funziona abbastanza bene e talvolta l'api restituisce un documento HTTP invece di un oggetto JSON. Ho provato a inviare diverse richieste all'API con l'aiuto di un ciclo foreach e della funzione getAudioLink, come puoi vedere nel codice qui sotto. Il mio oggetto musicTitle contiene tre stringhe (VideoID, VideoTitle e ThumbnailURL). Tutti sono memorizzati in un elenco che viene creato ogni volta che inizia una ricerca.
Ma non so perché l'API a volte restituisce un documento HTTP invece di un oggetto JSON. Il codice di errore che ottengo viene attivato dall'analisi del documento HTTP e può anche essere visto di seguito.
public static void main(String[] args)
{
....
for (MusicTitle musicTitle : myList)
{
System.out.println(getAudioLink(YOUTUBE_URL_C + musicTitle.getVideoID()));
}
}
public static String getAudioLink(String inputLink)
{
String result = null;
HttpURLConnection request = null;
URL url = null;
try
{
url = new URL("http://YoutubeInMP3.com/fetch/?format=JSON&video=" + inputLink);
System.out.println(url.toString());
request = (HttpURLConnection) url.openConnection();
request.connect();
InputStreamReader reader = new InputStreamReader((InputStream)request.getContent());
JsonParser jsonParser = new JsonParser(); // GSON-Library
JsonObject youtubeInMP3 = (JsonObject)jsonParser.parse(reader).getAsJsonObject();
if (youtubeInMP3 != null)
{
result = youtubeInMP3.get("link").getAsString();
}
request.disconnect();
reader.close();
}
catch (MalformedURLException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
return result;
}
Codice di errore:
Exception in thread "main" com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 12 path $
at com.google.gson.JsonParser.parse(JsonParser.java:65)
at Main.getAudioLink(Main.java:51)
at Main.main(Main.java:30)
Caused by: com.google.gson.stream.MalformedJsonException: Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 12 path $
at com.google.gson.stream.JsonReader.syntaxError(JsonReader.java:1573)
at com.google.gson.stream.JsonReader.checkLenient(JsonReader.java:1423)
at com.google.gson.stream.JsonReader.doPeek(JsonReader.java:546)
at com.google.gson.stream.JsonReader.peek(JsonReader.java:429)
at com.google.gson.JsonParser.parse(JsonParser.java:60)
... 2 more
MODIFICA 1
Ad esempio se cerco la band "Volbeat" restituisce il documento HTTP visto di seguito.
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Your MP3 Is Ready</title>
<meta name="description" content="Download and alternatively edit your YouTube video before saving the MP3 on your device." />
<meta name="keywords" content="edit, download, convert, youtube, mp3" />
<meta name="author" content="YouTube In MP3" />
<meta name="distribution" content="global">
<meta name="language" content="en" />
<link rel="stylesheet" type="text/css" href="/css/style.css?v=1.2.2">
<link href='http://fonts.googleapis.com/css?family=Open+Sans:400,400italic|Roboto' rel='stylesheet' type='text/css'>
<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/font-awesome/4.4.0/css/font-awesome.min.css">
<script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body class="home">
<div id="fb-root"></div>
<script>(function(d, s, id) {
var js, fjs = d.getElementsByTagName(s)[0];
if (d.getElementById(id)) return;
js = d.createElement(s); js.id = id;
js.src = "//connect.facebook.net/en_US/sdk.js#xfbml=1&version=v2.5";
fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));</script>
<header>
<p><a href="/"><img src="/images/icon.png" class="verticalAlign" alt="YouTube In MP3 Icon"> <span class="logoText">YouTubeInMP3.com</span></a></p>
<nav>
<ul>
<li><a><i class="fa fa-bars fa-2x verticalAlign"></i> Menu</a>
<ul>
<li><a href="/blog/">Blog</a></li>
<li><a href="/faq/">FAQ</a></li>
<li><a href="/tos/">Terms of Service</a></li>
<li><a href="/privacy/">Privacy Policy</a></li>
</ul>
</li>
<li><a href="/api/"><i class="fa fa-cog fa-2x verticalAlign"></i> API</a></li>
<li><a href="/"><i class="fa fa-home fa-2x verticalAlign"></i> Home</a></li>
</ul>
</nav>
</header>
<div id="contain-160" class="ad ad-160 loader"></div>
<div class="link-popup" id="linkpopup">
<div class="popup">
<h2>Link to this MP3</h2>
<p><i class="fa fa-link fa-2x verticalAlign"></i> Direct Link:</p>
<code>http://www.youtubeinmp3.com/download/?video=https://www.youtube.com/watch?v=-2Y4t9elm_A</code>
<p><i class="fa fa-comment fa-2x verticalAlign"></i> Forum:</p>
<code>[url=http://www.youtubeinmp3.com/download/?video=https://www.youtube.com/watch?v=-2Y4t9elm_A]Download MP3 - Volbeat - Mary Ann's Place (Official Video)[/url]</code>
<p><i class="fa fa-code fa-2x verticalAlign"></i> HTML:</p>
<code><a href="http://www.youtubeinmp3.com/download/?video=https://www.youtube.com/watch?v=-2Y4t9elm_A">Download MP3 - Volbeat - Mary Ann's Place (Official Video)</a></code>
<a onclick="toggle_visibility('linkpopup');" class="close">×</a>
</div>
</div>
<div class="link-popup" id="editShow">
<div class="popup">
<div class="paddingBottomOptions">
<h2><i class="fa fa-scissors"></i> Cut MP3</h2>
<input placeholder="Cut From" class="cutMP3Slider" type="text" id="slider-margin-value-min" /> -
<input placeholder="Cut To" class="cutMP3Slider" type="text" id="slider-margin-value-max" /><br />
</div>
<div class="paddingBottomOptions">
<h2><i class="fa fa-eye"></i> Show video editor</h2>
<div class="checkBoxDiv">
Display Video Editor: <input class="checkBoxRight" type="checkbox" id="displayEditor"><br />
Always display Video Editor: <input class="checkBoxRight" type="checkbox" id="permanentDisplay">
</div>
</div>
<div class="paddingBottomOptions">
<h2><i class="fa fa-tag"></i> ID3 Tags</h2>
<div class="checkBoxDiv">
Identify ID3 Tags Automatically: <input checked="checked" disabled class="checkBoxRight" type="checkbox" id="autoID3">
</div>
</div>
<h2><i class="fa fa-font"></i> Change MP3 name</h2>
<input class="fullWidth" value="Volbeat - Mary Ann's Place (Official Video).mp3" placeholder="MP3 Name" type="text" id="customMP3Name" />
<a onclick="toggle_visibility('editShow');" class="close">×</a>
</div>
</div>
<div class="link-popup" id="shareShow">
<div class="popup">
<h2>Spread the word</h2>
<div class="socialButtons">
<a target="_blank" href="https://www.facebook.com/sharer/sharer.php?u=https://www.facebook.com/YouTubeInMP3com"><i class="fa fa-facebook-square fa-3x verticalAlign"></i></a>
<a target="_blank" href="https://twitter.com/intent/tweet?text=Simple way to extract audio and download MP3s from YouTube:&url=http://www.youtubeinmp3.com"><i class="fa fa-twitter-square fa-3x verticalAlign"></i></a>
<a target="_blank" href="http://pinterest.com/pin/create/button/?url=http://www.youtubeinmp3.com&description=Simple way to extract audio and download MP3s from YouTube&media=http://www.youtubeinmp3.com/images/icon.png"><i class="fa fa-pinterest-square fa-3x verticalAlign"></i></a>
<a target="_blank" href="https://plus.google.com/share?url=http://www.youtubeinmp3.com"><i class="fa fa-google-plus-square fa-3x verticalAlign"></i></a>
<a target="_blank" href="http://www.tumblr.com/share?v=3&u=http://www.youtubeinmp3.com&s=Simple way to extract audio and download MP3s from YouTube"><i class="fa fa-tumblr-square fa-3x verticalAlign"></i></a>
</div>
<h2>Facebook</h2>
<div class="facebookMargin">
<div id="fb-root"></div>
<script>(function(d, s, id) {
var js, fjs = d.getElementsByTagName(s)[0];
if (d.getElementById(id)) return;
js = d.createElement(s); js.id = id;
js.src = "//connect.facebook.net/en_US/sdk.js#xfbml=1&version=v2.5";
fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));</script>
<div class="fb-page" data-href="http://www.facebook.com/YouTubeInMP3com" data-small-header="false" data-adapt-container-width="true" data-hide-cover="false" data-show-facepile="false" data-show-posts="false"><div class="fb-xfbml-parse-ignore"><blockquote cite="http://www.facebook.com/YouTubeInMP3com"><a href="http://www.facebook.com/YouTubeInMP3com">YouTubeInMP3.com - Download MP3 Files From Youtube</a></blockquote></div></div>
</div>
<a onclick="toggle_visibility('shareShow');" class="close">×</a>
</div>
</div>
<section class="video">
<form id="form" action="" method="GET">
<input id="video" type="search" name="video" placeholder="Paste A Link Or Search For A Video Title" />
<!-- Small screen search results -->
<div id="searchResultMobile" class="searchResultMobile loader"></div>
<button id="searchButton" onclick="search()" type="submit"><i class="fa fa-search"></i> Convert To MP3</button>
<!-- Large screen search results -->
<div id="searchResultLarge" class="searchResultLarge loader"></div>
</form>
<link rel="stylesheet" property="stylesheet" type="text/css" href="//cdnjs.cloudflare.com/ajax/libs/noUiSlider/8.0.2/nouislider.min.css">
<script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/noUiSlider/8.0.2/nouislider.js"></script>
<div class="embed loader">
<div id="player"></div>
<div id="slider"></div>
</div>
<div class="infoBox">
<h1 class="titleVideo"><img class="thumbnailTitle" alt="YouTube Thumbnail" src="http://img.youtube.com/vi/-2Y4t9elm_A/default.jpg"> Volbeat - Mary Ann's Place (Official Video)</h1>
<p class="floatLeft"><i class="fa fa-clock-o"></i> Length: <span class="bold">
|
<a target="_blank" href="https://www.facebook.com/sharer/sharer.php?u=https://www.facebook.com/YouTubeInMP3com"><i class="fa fa-facebook-square fa-2x verticalAlign"></i></a>
<a target="_blank" href="https://twitter.com/intent/tweet?text=Simple way to extract audio and download MP3s from YouTube:&url=http://www.youtubeinmp3.com"><i class="fa fa-twitter-square fa-2x verticalAlign"></i></a>
<a target="_blank" href="http://pinterest.com/pin/create/button/?url=http://www.youtubeinmp3.com&description=Simple way to extract audio and download MP3s from YouTube&media=http://www.youtubeinmp3.com/images/icon.png"><i class="fa fa-pinterest-square fa-2x verticalAlign"></i></a>
<a target="_blank" href="https://plus.google.com/share?url=http://www.youtubeinmp3.com"><i class="fa fa-google-plus-square fa-2x verticalAlign"></i></a>
<a target="_blank" href="http://www.tumblr.com/share?v=3&u=http://www.youtubeinmp3.com&s=Simple way to extract audio and download MP3s from YouTube"><i class="fa fa-tumblr-square fa-2x verticalAlign"></i></a>
<script src="/js/social.js" type="text/javascript"></script>
</p>
<div id="status">
</div>
<p class="download-buttons fullWidth">
<a class="button fullWidth" id="download" href="get/?i=6%2FARY3w4SlqKhP7hMpnw8skpb2vhQEwDg9rFg6URKpAEbyz736HFUpKqz6uO8TSy5YETAnmYwF995a0lNbbZLw%3D%3D"><i class="fa fa-download"></i> Convert & Download MP3</a>
<a onclick="toggle_visibility('editShow');" class="button button-gray"><i class="fa fa-cogs"></i> Settings</a><a rel="nofollow" href="http://www.youtubeinmp4.com/youtube.php?video=http://www.youtube.com/watch?v=-2Y4t9elm_A" class="button button-gray"><i class="fa fa-television"></i> Download in MP4 format</a><a rel="nofollow" href="http://www.saveitoffline.com/go/?l=http://www.saveitoffline.com/#http://www.youtube.com/watch?v=-2Y4t9elm_A" class="button button-gray"><i class="fa fa-file-o"></i> Other Formats</a>
</p>
<div id="contain-300" class="ad ad-300 loader"></div>
<div class="floatRight">
<div class="firstBlock">
<h2 class="firstBlockHeader">How do I download my MP3?</h2>
Your video has been prepared and is ready to be downloaded.<br />
To continue, simply press <strong>"Convert & Download MP3"</strong>.<br /><br />
Your MP3 has been converted to the highest quality possible and ID3 tags have been automatically identified and added.<br />
You can customize your download by changing the <a class="green" onclick="toggle_visibility('editShow');">Options</a>.<br />
</div>
<div class="secondBlock">
<h2 class="secondBlockHeader">How do I edit my MP3?</h2>
You can edit your MP3 by clicking "Settings" (grey button, found above on the left side) button.<br>
There are two ways of editing an MP3 before downloading it:<br>
<br>
1) Specify the start and end time manually, in the Settings menu.<br>
2) Enable the video editor from the Settings menu and use the sliders to set the start and end time.
</div>
</div>
</div>
<span class="messagePage" id="message"></span>
<link rel="stylesheet" property="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/tooltipster/3.3.0/css/tooltipster.min.css">
<script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/tooltipster/3.3.0/js/jquery.tooltipster.min.js"></script>
<script type="text/javascript" src="/js/client.js?v=1.2.1"></script>
<script type="text/javascript" src="//apis.google.com/js/client.js?onload=init" onload="externalLoad()"></script>
</section>
<div id="contain-728" class="ad ad-728 loader"></div>
<script type="text/javascript">
var durationSeconds = 184;
var videoId = "-2Y4t9elm_A";
var editMin = '';
var editMax = '';
var convert = 1;
</script>
<script src="/js/process.js?v=1.2.1" type="text/javascript"></script>
<footer>
<p>Want to forbid downloading a file? <a href="/privacy/">Contact us</a>.<br>
By downloading content from this site, you agree with the <a href="/tos/">Terms of Service</a>.</p>
</footer>
<div class="loader" id="load-160">
<!-- Conversant Media 120x600 and 160x600 SkyScraper CODE for YouTubeInMP3 -->
<script type="text/javascript">var vclk_options = {sid:80572,media_id:3,media_type:7,version:"1.4"};</script><script class="vclk_pub_code" type="text/javascript" src="http://cdn.fastclick.net/js/adcodes/pubcode.min.js?sid=80572&media_id=3&media_type=7&version=1.4&exc=1"></script><noscript><a href="http://media.fastclick.net/w/click.here?sid=80572&m=3&c=1" target="_blank"><img src="http://media.fastclick.net/w/get.media?sid=80572&m=3&tp=7&d=s&c=1&vcm_acv=1.4" width="160" height="600" border="1"></a></noscript>
<!-- Conversant Media 120x600 and 160x600 SkyScraper CODE for YouTubeInMP3 -->
</div>
<div class="loader" id="load-300">
<!-- ValueClick Media 300x250 Medium Rectangle CODE for YouTubeInMP3 -->
<script type="text/javascript">var vclk_options = {sid:80572,media_id:6,media_type:8,version:"1.4"};</script><script class="vclk_pub_code" type="text/javascript" src="http://cdn.fastclick.net/js/adcodes/pubcode.min.js?sid=80572&media_id=6&media_type=8&version=1.4&exc=1"></script><noscript><a href="http://media.fastclick.net/w/click.here?sid=80572&m=6&c=1" target="_blank"><img src="http://media.fastclick.net/w/get.media?sid=80572&m=6&tp=8&d=s&c=1&vcm_acv=1.4" width="300" height="250" border="1"></a></noscript>
<!-- ValueClick Media 300x250 Medium Rectangle CODE for YouTubeInMP3 -->
</div>
<div class="loader" id="load-728">
<!-- Conversant Media 468x60 and 728x90 Banner CODE for YouTubeInMP3 -->
<script type="text/javascript">var vclk_options = {sid:80572,media_id:1,media_type:5,version:"1.4"};</script><script class="vclk_pub_code" type="text/javascript" src="http://cdn.fastclick.net/js/adcodes/pubcode.min.js?sid=80572&media_id=1&media_type=5&version=1.4&exc=1"></script><noscript><a href="http://media.fastclick.net/w/click.here?sid=80572&m=1&c=1" target="_blank"><img src="http://media.fastclick.net/w/get.media?sid=80572&m=1&tp=5&d=s&c=1&vcm_acv=1.4" width="728" height="90" border="1"></a></noscript>
<!-- Conversant Media 468x60 and 728x90 Banner CODE for YouTubeInMP3 -->
</div>
<script type="text/javascript" src="/js/loader.js?v=1.2.2"></script>
<script data-cfasync="false" type="text/javascript" src="http://www.onclicktop.com/a/display.php?r=439235"></script>
<!-- Start of StatCounter Code for Default Guide -->
<script type="text/javascript">
var sc_project=8077308;
var sc_invisible=1;
var sc_security="6b707000";
</script>
<script type="text/javascript"
src="http://www.statcounter.com/counter/counter.js"></script>
<noscript><div class="statcounter"></div></noscript>
<!-- End of StatCounter Code for Default Guide -->
</body>
</html>
MODIFICA 2
Se cerco brani o band popolari ricevo ~12 risultati validi su 15. Ma se cerco tracce che nessuno ascolterebbe ricevo ~ 1 di 15 risultati validi.
È possibile che il server web che gestisce le informazioni dell'API YoutubeInMp3 risponda con documenti HTTP se (il server web) non conosce la traccia e il corrispondente link di download?
MODIFICA 3
Come ho supposto il problema è che il server web non conosce la traccia. Se visito manualmente il link del documento HTML ricevuto, devo confermare che la traccia è trasformato. Dopo di che posso scaricarlo manualmente e con l'aiuto del mio programma.
Quindi immagino che la risposta HTML sia un indizio che il server Web non ha una risposta valida alla mia richiesta.
1 answers
... non so perché l'API a volte restituisce un documento HTTP
Il documento HTTP è probabilmente un rapporto di errore di qualche tipo. Se questo è il caso, esso (il documento HTML) dovrebbe darti alcuni indizi su quale sia il vero problema.
Stampare il codice HTML. Se non riesci a capire cosa significa il rapporto, aggiungilo alla tua domanda in modo che possiamo aiutarti.