prompt: You will be provided with a partial code base and an issue statement explaining a problem to resolve.
  <issue>
  Unable to extract video_id from http://teamcoco.com/video/80187/conan-becomes-a-mary-kay-beauty-consultant
  python -m youtube_dl -v --skip-download http://teamcoco.com/video/80187/conan-becomes-a-mary-kay-beauty-consultant
  [debug] System config: []
  [debug] User config: []
  [debug] Command-line args: ['-v', '--skip-download', 'http://teamcoco.com/video/80187/conan-becomes-a-mary-kay-beauty-consultant']
  [debug] Encodings: locale UTF-8, fs utf-8, out UTF-8, pref UTF-8
  [debug] youtube-dl version 2014.04.04.1
  [debug] Python version 2.7.5 - Darwin-13.1.0-x86_64-i386-64bit
  [debug] Proxy map: {}
  [Teamcoco] 80187/conan-becomes-a-mary-kay-beauty-consultant: Downloading webpage
  ERROR: Unable to extract video id; please report this issue on https://yt-dl.org/bug . Be sure to call youtube-dl with the --verbose flag and include its complete output. Make sure you are using the latest version; type  youtube-dl -U  to update.
  Traceback (most recent call last):
    File "/Users/jill/june/.virtualenv/lib/python2.7/site-packages/youtube_dl/YoutubeDL.py", line 511, in extract_info
      ie_result = ie.extract(url)
    File "/Users/jill/june/.virtualenv/lib/python2.7/site-packages/youtube_dl/extractor/common.py", line 161, in extract
      return self._real_extract(url)
    File "/Users/jill/june/.virtualenv/lib/python2.7/site-packages/youtube_dl/extractor/teamcoco.py", line 32, in _real_extract
      webpage, 'video id')
    File "/Users/jill/june/.virtualenv/lib/python2.7/site-packages/youtube_dl/extractor/common.py", line 380, in _html_search_regex
      res = self._search_regex(pattern, string, name, default, fatal, flags)
    File "/Users/jill/june/.virtualenv/lib/python2.7/site-packages/youtube_dl/extractor/common.py", line 370, in _search_regex
      raise RegexNotFoundError(u'Unable to extract %s' % _name)
  RegexNotFoundError: Unable to extract video id; please report this issue on https://yt-dl.org/bug . Be sure to call youtube-dl with the --verbose flag and include its complete output. Make sure you are using the latest version; type  youtube-dl -U  to update.
  
  
  </issue>
  <code>
  [start of youtube_dl/extractor/teamcoco.py]
  1 from __future__ import unicode_literals
  2 
  3 import re
  4 
  5 from .common import InfoExtractor
  6 from ..utils import (
  7     ExtractorError,
  8 )
  9 
  10 
  11 class TeamcocoIE(InfoExtractor):
  12     _VALID_URL = r'http://teamcoco\.com/video/(?P<url_title>.*)'
  13     _TEST = {
  14         'url': 'http://teamcoco.com/video/louis-ck-interview-george-w-bush',
  15         'file': '19705.mp4',
  16         'md5': 'cde9ba0fa3506f5f017ce11ead928f9a',
  17         'info_dict': {
  18             "description": "Louis C.K. got starstruck by George W. Bush, so what? Part one.",
  19             "title": "Louis C.K. Interview Pt. 1 11/3/11"
  20         }
  21     }
  22 
  23     def _real_extract(self, url):
  24         mobj = re.match(self._VALID_URL, url)
  25         if mobj is None:
  26             raise ExtractorError('Invalid URL: %s' % url)
  27         url_title = mobj.group('url_title')
  28         webpage = self._download_webpage(url, url_title)
  29 
  30         video_id = self._html_search_regex(
  31             r'<article class="video" data-id="(\d+?)"',
  32             webpage, 'video id')
  33 
  34         self.report_extraction(video_id)
  35 
  36         data_url = 'http://teamcoco.com/cvp/2.0/%s.xml' % video_id
  37         data = self._download_xml(data_url, video_id, 'Downloading data webpage')
  38 
  39         qualities = ['500k', '480p', '1000k', '720p', '1080p']
  40         formats = []
  41         for filed in data.findall('files/file'):
  42             if filed.attrib.get('playmode') == 'all':
  43                 # it just duplicates one of the entries
  44                 break
  45             file_url = filed.text
  46             m_format = re.search(r'(\d+(k|p))\.mp4', file_url)
  47             if m_format is not None:
  48                 format_id = m_format.group(1)
  49             else:
  50                 format_id = filed.attrib['bitrate']
  51             tbr = (
  52                 int(filed.attrib['bitrate'])
  53                 if filed.attrib['bitrate'].isdigit()
  54                 else None)
  55 
  56             try:
  57                 quality = qualities.index(format_id)
  58             except ValueError:
  59                 quality = -1
  60             formats.append({
  61                 'url': file_url,
  62                 'ext': 'mp4',
  63                 'tbr': tbr,
  64                 'format_id': format_id,
  65                 'quality': quality,
  66             })
  67 
  68         self._sort_formats(formats)
  69 
  70         return {
  71             'id': video_id,
  72             'formats': formats,
  73             'title': self._og_search_title(webpage),
  74             'thumbnail': self._og_search_thumbnail(webpage),
  75             'description': self._og_search_description(webpage),
  76         }
  77
  [end of youtube_dl/extractor/teamcoco.py]
  </code>
  
  I need you to solve this issue by generating a single patch file that I can apply directly to this repository using git apply. Please respond with a single patch file in the following format.
  <patch>
  diff --git a/file.py b/file.py
  --- a/file.py
  +++ b/file.py
  @@ -1,27 +1,35 @@
   def euclidean(a, b):
  -    while b:
  -        a, b = b, a % b
  -    return a
  +    if b == 0:
  +        return a
  +    return euclidean(b, a % b)
   
   
   def bresenham(x0, y0, x1, y1):
       points = []
       dx = abs(x1 - x0)
       dy = abs(y1 - y0)
  -    sx = 1 if x0 < x1 else -1
  -    sy = 1 if y0 < y1 else -1
  -    err = dx - dy
  +    x, y = x0, y0
  +    sx = -1 if x0 > x1 else 1
  +    sy = -1 if y0 > y1 else 1
   
  -    while True:
  -        points.append((x0, y0))
  -        if x0 == x1 and y0 == y1:
  -            break
  -        e2 = 2 * err
  -        if e2 > -dy:
  -            err -= dy
  -            x0 += sx
  -        if e2 < dx:
  -            err += dx
  -            y0 += sy
  +    if dx > dy:
  +        err = dx / 2.0
  +        while x != x1:
  +            points.append((x, y))
  +            err -= dy
  +            if err < 0:
  +                y += sy
  +                err += dx
  +            x += sx
  +    else:
  +        err = dy / 2.0
  +        while y != y1:
  +            points.append((x, y))
  +            err -= dx
  +            if err < 0:
  +                x += sx
  +                err += dy
  +            y += sy
  +
  +    points.append((x, y))
       return points
  
  </patch>
golden_diff: diff --git a/youtube_dl/extractor/teamcoco.py b/youtube_dl/extractor/teamcoco.py
  --- a/youtube_dl/extractor/teamcoco.py
  +++ b/youtube_dl/extractor/teamcoco.py
  @@ -9,8 +9,18 @@
   
   
   class TeamcocoIE(InfoExtractor):
  -    _VALID_URL = r'http://teamcoco\.com/video/(?P<url_title>.*)'
  -    _TEST = {
  +    _VALID_URL = r'http://teamcoco\.com/video/(?P<video_id>\d*)?/?(?P<url_title>.*)'
  +    _TESTS = [
  +    {
  +        'url': 'http://teamcoco.com/video/80187/conan-becomes-a-mary-kay-beauty-consultant',
  +        'file': '80187.mp4',
  +        'md5': '3f7746aa0dc86de18df7539903d399ea',
  +        'info_dict': {
  +            'title': 'Conan Becomes A Mary Kay Beauty Consultant',
  +            'description': 'Mary Kay is perhaps the most trusted name in female beauty, so of course Conan is a natural choice to sell their products.'
  +        }
  +    },
  +    {
           'url': 'http://teamcoco.com/video/louis-ck-interview-george-w-bush',
           'file': '19705.mp4',
           'md5': 'cde9ba0fa3506f5f017ce11ead928f9a',
  @@ -19,6 +29,7 @@
               "title": "Louis C.K. Interview Pt. 1 11/3/11"
           }
       }
  +    ]
   
       def _real_extract(self, url):
           mobj = re.match(self._VALID_URL, url)
  @@ -26,11 +37,13 @@
               raise ExtractorError('Invalid URL: %s' % url)
           url_title = mobj.group('url_title')
           webpage = self._download_webpage(url, url_title)
  -
  -        video_id = self._html_search_regex(
  -            r'<article class="video" data-id="(\d+?)"',
  -            webpage, 'video id')
  -
  +        
  +        video_id = mobj.group("video_id")
  +        if video_id == '':
  +            video_id = self._html_search_regex(
  +                r'<article class="video" data-id="(\d+?)"',
  +                webpage, 'video id')
  +        
           self.report_extraction(video_id)
   
           data_url = 'http://teamcoco.com/cvp/2.0/%s.xml' % video_id
  
verification_info: {"golden_diff": "diff --git a/youtube_dl/extractor/teamcoco.py b/youtube_dl/extractor/teamcoco.py\n--- a/youtube_dl/extractor/teamcoco.py\n+++ b/youtube_dl/extractor/teamcoco.py\n@@ -9,8 +9,18 @@\n \n \n class TeamcocoIE(InfoExtractor):\n-    _VALID_URL = r'http://teamcoco\\.com/video/(?P<url_title>.*)'\n-    _TEST = {\n+    _VALID_URL = r'http://teamcoco\\.com/video/(?P<video_id>\\d*)?/?(?P<url_title>.*)'\n+    _TESTS = [\n+    {\n+        'url': 'http://teamcoco.com/video/80187/conan-becomes-a-mary-kay-beauty-consultant',\n+        'file': '80187.mp4',\n+        'md5': '3f7746aa0dc86de18df7539903d399ea',\n+        'info_dict': {\n+            'title': 'Conan Becomes A Mary Kay Beauty Consultant',\n+            'description': 'Mary Kay is perhaps the most trusted name in female beauty, so of course Conan is a natural choice to sell their products.'\n+        }\n+    },\n+    {\n         'url': 'http://teamcoco.com/video/louis-ck-interview-george-w-bush',\n         'file': '19705.mp4',\n         'md5': 'cde9ba0fa3506f5f017ce11ead928f9a',\n@@ -19,6 +29,7 @@\n             \"title\": \"Louis C.K. Interview Pt. 1 11/3/11\"\n         }\n     }\n+    ]\n \n     def _real_extract(self, url):\n         mobj = re.match(self._VALID_URL, url)\n@@ -26,11 +37,13 @@\n             raise ExtractorError('Invalid URL: %s' % url)\n         url_title = mobj.group('url_title')\n         webpage = self._download_webpage(url, url_title)\n-\n-        video_id = self._html_search_regex(\n-            r'<article class=\"video\" data-id=\"(\\d+?)\"',\n-            webpage, 'video id')\n-\n+        \n+        video_id = mobj.group(\"video_id\")\n+        if video_id == '':\n+            video_id = self._html_search_regex(\n+                r'<article class=\"video\" data-id=\"(\\d+?)\"',\n+                webpage, 'video id')\n+        \n         self.report_extraction(video_id)\n \n         data_url = 'http://teamcoco.com/cvp/2.0/%s.xml' % video_id\n", "issue": "Unable to extract video_id from http://teamcoco.com/video/80187/conan-becomes-a-mary-kay-beauty-consultant\npython -m youtube_dl -v --skip-download http://teamcoco.com/video/80187/conan-becomes-a-mary-kay-beauty-consultant\n[debug] System config: []\n[debug] User config: []\n[debug] Command-line args: ['-v', '--skip-download', 'http://teamcoco.com/video/80187/conan-becomes-a-mary-kay-beauty-consultant']\n[debug] Encodings: locale UTF-8, fs utf-8, out UTF-8, pref UTF-8\n[debug] youtube-dl version 2014.04.04.1\n[debug] Python version 2.7.5 - Darwin-13.1.0-x86_64-i386-64bit\n[debug] Proxy map: {}\n[Teamcoco] 80187/conan-becomes-a-mary-kay-beauty-consultant: Downloading webpage\nERROR: Unable to extract video id; please report this issue on https://yt-dl.org/bug . Be sure to call youtube-dl with the --verbose flag and include its complete output. Make sure you are using the latest version; type  youtube-dl -U  to update.\nTraceback (most recent call last):\n  File \"/Users/jill/june/.virtualenv/lib/python2.7/site-packages/youtube_dl/YoutubeDL.py\", line 511, in extract_info\n    ie_result = ie.extract(url)\n  File \"/Users/jill/june/.virtualenv/lib/python2.7/site-packages/youtube_dl/extractor/common.py\", line 161, in extract\n    return self._real_extract(url)\n  File \"/Users/jill/june/.virtualenv/lib/python2.7/site-packages/youtube_dl/extractor/teamcoco.py\", line 32, in _real_extract\n    webpage, 'video id')\n  File \"/Users/jill/june/.virtualenv/lib/python2.7/site-packages/youtube_dl/extractor/common.py\", line 380, in _html_search_regex\n    res = self._search_regex(pattern, string, name, default, fatal, flags)\n  File \"/Users/jill/june/.virtualenv/lib/python2.7/site-packages/youtube_dl/extractor/common.py\", line 370, in _search_regex\n    raise RegexNotFoundError(u'Unable to extract %s' % _name)\nRegexNotFoundError: Unable to extract video id; please report this issue on https://yt-dl.org/bug . Be sure to call youtube-dl with the --verbose flag and include its complete output. Make sure you are using the latest version; type  youtube-dl -U  to update.\n\n", "before_files": [{"content": "from __future__ import unicode_literals\n\nimport re\n\nfrom .common import InfoExtractor\nfrom ..utils import (\n    ExtractorError,\n)\n\n\nclass TeamcocoIE(InfoExtractor):\n    _VALID_URL = r'http://teamcoco\\.com/video/(?P<url_title>.*)'\n    _TEST = {\n        'url': 'http://teamcoco.com/video/louis-ck-interview-george-w-bush',\n        'file': '19705.mp4',\n        'md5': 'cde9ba0fa3506f5f017ce11ead928f9a',\n        'info_dict': {\n            \"description\": \"Louis C.K. got starstruck by George W. Bush, so what? Part one.\",\n            \"title\": \"Louis C.K. Interview Pt. 1 11/3/11\"\n        }\n    }\n\n    def _real_extract(self, url):\n        mobj = re.match(self._VALID_URL, url)\n        if mobj is None:\n            raise ExtractorError('Invalid URL: %s' % url)\n        url_title = mobj.group('url_title')\n        webpage = self._download_webpage(url, url_title)\n\n        video_id = self._html_search_regex(\n            r'<article class=\"video\" data-id=\"(\\d+?)\"',\n            webpage, 'video id')\n\n        self.report_extraction(video_id)\n\n        data_url = 'http://teamcoco.com/cvp/2.0/%s.xml' % video_id\n        data = self._download_xml(data_url, video_id, 'Downloading data webpage')\n\n        qualities = ['500k', '480p', '1000k', '720p', '1080p']\n        formats = []\n        for filed in data.findall('files/file'):\n            if filed.attrib.get('playmode') == 'all':\n                # it just duplicates one of the entries\n                break\n            file_url = filed.text\n            m_format = re.search(r'(\\d+(k|p))\\.mp4', file_url)\n            if m_format is not None:\n                format_id = m_format.group(1)\n            else:\n                format_id = filed.attrib['bitrate']\n            tbr = (\n                int(filed.attrib['bitrate'])\n                if filed.attrib['bitrate'].isdigit()\n                else None)\n\n            try:\n                quality = qualities.index(format_id)\n            except ValueError:\n                quality = -1\n            formats.append({\n                'url': file_url,\n                'ext': 'mp4',\n                'tbr': tbr,\n                'format_id': format_id,\n                'quality': quality,\n            })\n\n        self._sort_formats(formats)\n\n        return {\n            'id': video_id,\n            'formats': formats,\n            'title': self._og_search_title(webpage),\n            'thumbnail': self._og_search_thumbnail(webpage),\n            'description': self._og_search_description(webpage),\n        }\n", "path": "youtube_dl/extractor/teamcoco.py"}]}