Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Youtube POST upload in Java

Help :( Does anyone know how to write a POST request for uploading Youtube videos via the Youtube API, in Java?

The structure of the POST request required is described here.

Unfortunately I can't use the Youtube Java client libraries, because I'm working in Android, which doesn't support them.

I have some attempted code below, but it doesn't work (I get the error that conn.getResponseCode() is null).


public void videoUpload() {

    HttpURLConnection conn = null;
    // BufferedReader br = null;
    DataOutputStream dos = null;
    InputStream inStream = null;

    // InputStream is = null;
    // OutputStream os = null;
    // boolean ret = false;
    // String StrMessage = "";
    //file path

    // get filename from videoURI
    String path = "file:///sdcard/";
    String existingFileName = "video.3gp";
    File videoFile = new File(path + existingFileName);

    // String lineEnd = "\r\n";
    String twoHyphens = "--";
    String boundary = "b93dcbA3";
    String ver = "2";

    int bytesRead, bytesAvailable, bufferSize;
    byte[] buffer;
    int maxBufferSize = 1024;

    // String responseFromServer = "";

    try {
        FileInputStream fileInputStream = new FileInputStream(videoFile);

        URL url = new URL("http://uploads.gdata.youtube.com/feeds/api/users/[XXXXXXXXXX]/uploads");
        conn = (HttpURLConnection) url.openConnection();

        // Allow Inputs
        conn.setDoInput(true);
        // Allow Outputs
        conn.setDoOutput(true);
        // Don't use a cached copy.
        conn.setUseCaches(false);

        // Use a post method.
        conn.setRequestMethod("POST");
        // conn.setRequestProperty("Connection", "Keep-Alive");
        conn.setRequestProperty("Host", "uploads.gdata.youtube.com");
        conn.setRequestProperty("Authorization", "GoogleLogin auth=" + token);
        conn.setRequestProperty("GData-Version", ver);
        conn.setRequestProperty("X-Gdata-Client", clientId);
        conn.setRequestProperty("X-GData-Key", "key=" + developerKey);
        conn.setRequestProperty("Slug", existingFileName); //fix this
        conn.setRequestProperty("Content-Type",
                "multipart/related;boundary=" + boundary);
        conn.setRequestProperty("Content-Length", new Long(videoFile //and this
                .length()).toString());
        conn.setRequestProperty("Connection", "close");

        //do we not want a boundary string here?

        conn.setRequestProperty("Content-Type",
        "application/atom+xml; charset=UTF-8");

        //and here?
        conn.setRequestProperty("Content-Type", "video/3gpp");
        conn.setRequestProperty("Content-Transfer-Encoding", "binary");

        dos = new DataOutputStream(conn.getOutputStream());
        dos.write((twoHyphens + boundary).toString().getBytes());

        StringBuilder test_xml = new StringBuilder();
        test_xml.append("<?xml version='1.0' encoding='UTF-8'?>\n");
        test_xml.append("<entry xmlns=\"http://www.w3.org/2005/Atom\"\n");
        test_xml.append("xmlns:media=\"http://search.yahoo.com/mrss/\"\n");
        test_xml.append("xmlns:yt=\"http://gdata.youtube.com/schemas/2007\">\n");
        test_xml.append("<media:group>\n");
        test_xml.append("<media:title type=\"plain\">Test Video</media:title>\n");
        test_xml.append("<media:description type=\"plain\">\nTest Video\n</media:description>\n");
        test_xml.append("<media:category\n");
        test_xml.append("scheme=\"http://gdata.youtube.com/schemas/2007/categories.cat\">People\n");
        test_xml.append("</media:category>\n");
        test_xml.append("<media:keywords>toast, election, wedding</media:keywords>\n");
        test_xml.append("</media:group>\n");
        test_xml.append("</entry>");

        dos.write(test_xml.toString().getBytes("UTF-8"));

        // System.out.println(test_xml.toString());
        dos.write((twoHyphens + boundary).toString().getBytes());

        // create a buffer of maximum size
        bytesAvailable = fileInputStream.available();
        bufferSize = Math.min(bytesAvailable, maxBufferSize);
        buffer = new byte[bufferSize];

        // read file and write it into form
        bytesRead = fileInputStream.read(buffer, 0, bufferSize);
        while (bytesRead > 0) {
            // dos.flush();
            dos.write(buffer, 0, bufferSize);
            bytesAvailable = fileInputStream.available();
            bufferSize = Math.min(bytesAvailable, maxBufferSize);
            bytesRead = fileInputStream.read(buffer, 0, bufferSize);
        }

        // byte [] buf = new byte[2048]; // Transfer in 2k chunks
        // int bytesRead = 0;
        // while ((bytesRead = fileInputStream.read(buf, 0, buf.length)) >=
        // 0) {
        // dos.write(buf, 0, bytesRead);
        // // dos.flush();
        // }

        // send multipart form data necesssary after file data
        // dos.writeBytes(lineEnd);
        // dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);
        dos.write((twoHyphens + boundary + twoHyphens).toString()
                .getBytes());

        // close streams
        fileInputStream.close();
        dos.flush();
        dos.close();


    } catch (MalformedURLException ex) {
        ex.printStackTrace();
    } catch (IOException ioe) {
        ioe.printStackTrace();
    }


    int responseCode;
    StringBuilder outputBuilder = new StringBuilder();
    try {
        responseCode = conn.getResponseCode();
        if (responseCode == HttpURLConnection.HTTP_OK) {
            inStream = conn.getInputStream();
        } else {
            inStream = conn.getErrorStream();
        }

        String string;
        if (inStream != null) {
            BufferedReader reader = new BufferedReader(
                    new InputStreamReader(inStream));
            while (null != (string = reader.readLine())) {
                outputBuilder.append(string).append("\n");
            }
        }
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } finally {
        if (inStream != null) {
            try {
                inStream.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

    System.out.println(outputBuilder.toString());
    Log.d(LOG_TAG, outputBuilder.toString());
}
like image 470
AP257 Avatar asked Nov 06 '22 16:11

AP257


1 Answers

I've used the Apache file upload library before and it simplifies post requests for files etc. greatly: Apache commons file upload

like image 125
James B Avatar answered Nov 12 '22 21:11

James B