【问题标题】:How to get youtube video id from URL with java?如何使用 java 从 URL 获取 youtube 视频 ID?
【发布时间】:2014-11-01 07:42:38
【问题描述】:

【问题讨论】:

  • 点击链接。看看它把你重定向到哪里
  • 我怎样才能得到它的ID?
  • 如果您向该 URL 发送请求,它将以 3xx HTTP 响应响应您,将您重定向到实际的 Youtube URL。 youtube.com/watch?v=..... 格式! en.wikipedia.org/wiki/List_of_HTTP_status_codes#3xx_Redirection
  • 谢谢!你说的对。但是我怎么能用java代码处理呢?

标签: java video youtube


【解决方案1】:

以下代码将提取以下类型网址的视频 ID。

http://www.youtube.com/watch?v=dQw4w9WgXcQ&a=GxdCwVVULXctT2lYDEPllDR0LRTutYfW
http://www.youtube.com/watch?v=dQw4w9WgXcQ 
http://youtu.be/dQw4w9WgXcQ 
http://www.youtube.com/embed/dQw4w9WgXcQ
http://www.youtube.com/v/dQw4w9WgXcQ 
http://www.youtube.com/e/dQw4w9WgXcQ
http://www.youtube.com/watch?v=dQw4w9WgXcQ
http://www.youtube.com/watch?feature=player_embedded&v=dQw4w9WgXcQ
http://www.youtube-nocookie.com/v/6L3ZvIMwZFM?version=3&hl=en_US&rel=0

String pattern = "(?<=watch\\?v=|/videos/|embed\\/|youtu.be\\/|\\/v\\/|\\/e\\/|watch\\?v%3D|watch\\?feature=player_embedded&v=|%2Fvideos%2F|embed%\u200C\u200B2F|youtu.be%2F|%2Fv%2F)[^#\\&\\?\\n]*";

        Pattern compiledPattern = Pattern.compile(pattern);
        Matcher matcher = compiledPattern.matcher(url); //url is youtube url for which you want to extract the id.
        if (matcher.find()) {
             return matcher.group();
        }

【讨论】:

  • @Stephan 谢谢我会检查你发送的链接。
  • 我认为忽略特殊字符的方式存在错误。
【解决方案2】:

6UW3xuJinEg(我的意思是youtu.be/ 之后的字符串)大部分时间都是 ID。但是为了更确定您可以向该 URL 发送 HTTP GET 请求,它会以 HTTP302 重定向响应响应您,您可以在其中找到实际的重定向 URL。您可以解析该 URL 您之前的代码。

要发送和接收该请求和响应,您可以使用 jsoup 之类的库。但因为它只是一个简单的 GET 请求,您可以简单地使用 java 套接字。

在 80 端口上连接到 youtube.be 并将其写入输出流:

GET /6UW3xuJinEg HTTP/1.1



# Don't forget the blank lines

【讨论】:

  • 还有其他选择吗?我只需要更改该代码 >Pattern.compile("(?
  • 如果没有v=...,只需获取/? 之间的字符串或字符串结尾。
  • 好点 - 有点像验证电子邮件地址 - 正则表达式可能相当好并且涵盖很多情况,但只有一种方法可以真正验证电子邮件地址......询问负责它的服务器
【解决方案3】:

我找到了解决方案 .. 我扩展了那个 URL .. 和它的工作 ..

public static String expandUrl(String shortenedUrl)  {
        URL url;
        String expandedURL = "";
        try {
            url = new URL(shortenedUrl);
            // open connection
            HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection(Proxy.NO_PROXY); 
            // stop following browser redirect
            httpURLConnection.setInstanceFollowRedirects(false);
            // extract location header containing the actual destination URL
            expandedURL = httpURLConnection.getHeaderField("Location");
            httpURLConnection.disconnect();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }    
         return expandedURL;
    }

【讨论】:

  • 这不是我在回答中写的吗? :))
  • @CodeJockey 这段代码有那么重要吗?此外他说 HttpConnection 不是他想要的,但他用 Http 解决方案回答了自己的问题并接受了它。
  • @MJafarMash 我不能代表 krishan,但似乎他正在寻找 Java 中的实际代码——也许可以说是有点为我做这个的语气(?)——但不像 sooo很多人问这样的问题,他找到了回答他问题的代码,把它带回来,并将其添加为答案。您的回答绝对有用,因为它为阅读它的任何人提供了很好的信息和不同的路径,但我可以看到有人说它在技术上没有“回答问题”
  • @CodeJockey 你是对的。我从你的回答中得到了它,但我必须解释完整..我需要什么。
【解决方案4】:
private String getYouTubeId(String youTubeUrl) {
        String pattern = "https?://(?:[0-9A-Z-]+\\.)?(?:youtu\\.be/|youtube\\.com\\S*[^\\w\\-\\s])([\\w\\-]{11})(?=[^\\w\\-]|$)(?![?=&+%\\w]*(?:['\"][^<>]*>|</a>))[?=&+%\\w]*";

        Pattern compiledPattern = Pattern.compile(pattern,
                Pattern.CASE_INSENSITIVE);
        Matcher matcher = compiledPattern.matcher(youTubeUrl);
        if (matcher.find()) {
            return matcher.group(1);
        }
        return null;
}

使用此方法,它在大多数情况下都可以在上述答案中返回 Null。 测试案例:

https://m.youtube.com/watch?feature=youtu.be&v=ROkXM3csNWY
https://www.youtube.com/watch?v=rie69P0W668
https://m.youtube.com/watch?feature=youtu.be&v=JqyzwbpYYqc
https://www.youtube.com/watch?v=YPln3JP_gKs&feature=youtu.be

【讨论】:

    【解决方案5】:

    您可以使用我创建的正则表达式:

     public static String  YOUTUBE_PATTERN_ID = "^(?:(?:\\w*.?://)?\\w*.?\\w*-?.?\\w*/(?:embed|e|v|watch|.*/)?\\??(?:feature=\\w*\\.?\\w*)?&?(?:v=)?/?)([\\w\\d_-]+).*";
    
    Pattern matcher = Pattern.compile(YOUTUBE_PATTERN_ID).matcher(url)
      if (matcher.find()) {
            return matcher.group(1)
      }
    

    https://regex101.com/r/b0yMMd/1

    使用来自这个答案的 sn-p 基数:https://stackoverflow.com/a/35436389/7138308

    var regex = /^(?:(?:\w*.?:\/\/)?\w*.?\w*\-?.?\w*\/(?:embed|e|v|watch|.*\/)?\??(?:feature=\w*\.?\w*)?\&?(?:v=)?\/?)([\w\d_-]+).*/i;
    
    // An array of all the youtube URLs
    var youtubeLinks = [
        'http://www.youtube.com/watch?v=u8nQa1cJyX8&a=GxdCwVVULXctT2lYDEPllDR0LRTutYfW ',
        'http://www.youtube.com/watch?v=u8nQa1cJyX-8  ',
        'http://youtu.be/0zM3nApSvMg ',
        'http://www.youtube.com/user/IngridMichaelsonVEVO#p/a/u/1/KdwsulMb8EQ  ',
        'http://youtu.be/dQw4w9WgXcQ  ',
        'http://www.youtube.com/embed/dQw4w9WgXcQ  ',
        'http://www.youtube.com/v/dQw4w9WgXcQ  ',
        'http://www.youtube.com/e/dQw4w9WgXcQ  ',
        'http://www.youtube.com/watch?v=dQw4w9WgXcQ  ',
        'http://www.youtube.com/?v=dQw4w9WgXcQ  ',
        'http://www.youtube.com/watch?feature=player_embedded&v=dQw4w9WgXcQ  ',
        'http://www.youtube.com/?feature=player_embedded&v=dQw4w9WgXcQ  ',
        'http://www.youtube.com/user/IngridMichaelsonVEVO#p/u/11/KdwsulMb8EQ  ',
        'http://www.youtube-nocookie.com/v/6L3ZvIMwZFM?version=3&hl=en_US&rel=0 ',
        'https://m.youtube.com/watch?feature=youtu.be&v=ROkXM3csNWY ',
        'https://www.youtube.com/watch?v=rie69P0W668 ',
        'https://m.youtube.com/watch?feature=youtu.be&v=JqyzwbpYYqc ',
        'https://www.youtube.com/watch?v=YPln3JP_gKs&feature=youtu.be ',
        'https://www.youtube.com/watch?v=l-kX8Z4u0Kw&list=PLhml-dmiPOedRDLV8n1ro_OTdzKjOdlyp'
    ];
    
    // An object to store the results
    var youtubeIds = {};
    
    // Iterate over the youtube URLs
    youtubeLinks.forEach(function(url) {
        // Get the value of second captured group to extract youtube ID
        var id = "<span class='youtubeId'>" + (url.match(regex) || [0, 0, 'No ID present'])[1] + "</span>";
    
        // Add the URL and the extracted ID in the result object
        youtubeIds[url] = id;
    });
    
    // Log the object in the browser console
    console.log(youtubeIds);
    
    // To show the result on the page
    document.getElementById('output').innerHTML = JSON.stringify(youtubeIds, 0, 4);
    .youtubeId {
        color: green;
        font-weight: bold;
    }
    &lt;pre id="output"&gt;&lt;/pre&gt;

    【讨论】:

      【解决方案6】:

      在这里试试这个代码。

      // (?:youtube(?:-nocookie)?\.com\/(?:[^\/\n\s]+\/\S+\/|(?:v|e(?:mbed)?)\/|\S*?[?&]v=)|youtu\.be\/)([a-zA-Z0-9_-]{11})
      final static String reg = "(?:youtube(?:-nocookie)?\\.com\\/(?:[^\\/\\n\\s]+\\/\\S+\\/|(?:v|e(?:mbed)?)\\/|\\S*?[?&]v=)|youtu\\.be\\/)([a-zA-Z0-9_-]{11})";
      
      public static String getVideoId(String videoUrl) {
          if (videoUrl == null || videoUrl.trim().length() <= 0)
              return null;
      
          Pattern pattern = Pattern.compile(reg, Pattern.CASE_INSENSITIVE);
          Matcher matcher = pattern.matcher(videoUrl);
      
          if (matcher.find())
              return matcher.group(1);
          return null;
      }
      

      你可以从这里找到我的整个解析器代码 https://github.com/TheFinestArtist/YouTubePlayerActivity/blob/master/library/src/main/java/com/thefinestartist/ytpa/utils/YoutubeUrlParser.java

      这是我为播放 Youtube 视频而制作的有用的开源软件。 https://github.com/TheFinestArtist/YouTubePlayerActivity

      【讨论】:

        猜你喜欢
        • 2012-05-22
        • 2011-03-28
        • 2019-12-07
        • 1970-01-01
        • 2011-07-22
        • 2011-11-05
        • 2016-01-21
        • 1970-01-01
        相关资源
        最近更新 更多