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>&lt;a href="http://www.youtubeinmp3.com/download/?video=https://www.youtube.com/watch?v=-2Y4t9elm_A"&gt;Download MP3 - Volbeat - Mary Ann's Place (Official Video)&lt;/a&gt;</code>

        <a onclick="toggle_visibility('linkpopup');" class="close">&times;</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">&times;</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">&times;</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:&amp;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&amp;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&amp;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 &amp; 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 &amp; 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.

Author: endkugelfang, 2016-01-07

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.

 1
Author: Stephen C, 2016-01-07 11:34:17