prompt: You will be provided with a partial code base and an issue statement explaining a problem to resolve.
  <issue>
  FunnyOrDie extractor not finding thumbnails
  python -m youtube_dl -v --skip-download --write-info-json --no-playlist -f mp4 http://www.funnyordie.com/videos/e402820827/please-use-this-song-jon-lajoie extracts the video properly but not a thumbnail. Here's the resulting JSON:
  {"display_id": "e402820827", "extractor": "FunnyOrDie", "description": "Please use this to sell something", "format": "0 - unknown", "format_id": "0", "playlist_index": null, "stitle": "Please Use This Song (Jon Lajoie)", "playlist": null, "title": "Please Use This Song (Jon Lajoie)", "url": "http://vo.fod4.com/v/e402820827/v600.mp4", "extractor_key": "FunnyOrDie", "id": "e402820827", "ext": "mp4", "webpage_url": "http://www.funnyordie.com/videos/e402820827/please-use-this-song-jon-lajoie", "fulltitle": "Please Use This Song (Jon Lajoie)", "thumbnail": null, "webpage_url_basename": "please-use-this-song-jon-lajoie"}
  
  FunnyorDie's RSS feed entry for this page does contain a thumbnail:
  media:thumbnail url="http://t.fod4.com/t/e402820827/c480x270_50.jpg" width="464" height="348"
  
  
  </issue>
  <code>
  [start of youtube_dl/extractor/funnyordie.py]
  1 from __future__ import unicode_literals
  2 
  3 import json
  4 import re
  5 
  6 from .common import InfoExtractor
  7 
  8 
  9 class FunnyOrDieIE(InfoExtractor):
  10     _VALID_URL = r'https?://(?:www\.)?funnyordie\.com/(?P<type>embed|videos)/(?P<id>[0-9a-f]+)(?:$|[?#/])'
  11     _TEST = {
  12         'url': 'http://www.funnyordie.com/videos/0732f586d7/heart-shaped-box-literal-video-version',
  13         'file': '0732f586d7.mp4',
  14         'md5': 'f647e9e90064b53b6e046e75d0241fbd',
  15         'info_dict': {
  16             'description': ('Lyrics changed to match the video. Spoken cameo '
  17                 'by Obscurus Lupa (from ThatGuyWithTheGlasses.com). Based on a '
  18                 'concept by Dustin McLean (DustFilms.com). Performed, edited, '
  19                 'and written by David A. Scott.'),
  20             'title': 'Heart-Shaped Box: Literal Video Version',
  21         },
  22     }
  23 
  24     def _real_extract(self, url):
  25         mobj = re.match(self._VALID_URL, url)
  26 
  27         video_id = mobj.group('id')
  28         webpage = self._download_webpage(url, video_id)
  29 
  30         video_url = self._search_regex(
  31             [r'type="video/mp4" src="(.*?)"', r'src="([^>]*?)" type=\'video/mp4\''],
  32             webpage, 'video URL', flags=re.DOTALL)
  33 
  34         if mobj.group('type') == 'embed':
  35             post_json = self._search_regex(
  36                 r'fb_post\s*=\s*(\{.*?\});', webpage, 'post details')
  37             post = json.loads(post_json)
  38             title = post['name']
  39             description = post.get('description')
  40             thumbnail = post.get('picture')
  41         else:
  42             title = self._og_search_title(webpage)
  43             description = self._og_search_description(webpage)
  44             thumbnail = None
  45 
  46         return {
  47             'id': video_id,
  48             'url': video_url,
  49             'ext': 'mp4',
  50             'title': title,
  51             'description': description,
  52             'thumbnail': thumbnail,
  53         }
  54
  [end of youtube_dl/extractor/funnyordie.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/funnyordie.py b/youtube_dl/extractor/funnyordie.py
  --- a/youtube_dl/extractor/funnyordie.py
  +++ b/youtube_dl/extractor/funnyordie.py
  @@ -8,18 +8,27 @@
   
   class FunnyOrDieIE(InfoExtractor):
       _VALID_URL = r'https?://(?:www\.)?funnyordie\.com/(?P<type>embed|videos)/(?P<id>[0-9a-f]+)(?:$|[?#/])'
  -    _TEST = {
  +    _TESTS = [{
           'url': 'http://www.funnyordie.com/videos/0732f586d7/heart-shaped-box-literal-video-version',
  -        'file': '0732f586d7.mp4',
           'md5': 'f647e9e90064b53b6e046e75d0241fbd',
           'info_dict': {
  -            'description': ('Lyrics changed to match the video. Spoken cameo '
  -                'by Obscurus Lupa (from ThatGuyWithTheGlasses.com). Based on a '
  -                'concept by Dustin McLean (DustFilms.com). Performed, edited, '
  -                'and written by David A. Scott.'),
  +            'id': '0732f586d7',
  +            'ext': 'mp4',
               'title': 'Heart-Shaped Box: Literal Video Version',
  +            'description': 'md5:ea09a01bc9a1c46d9ab696c01747c338',
  +            'thumbnail': 're:^http:.*\.jpg$',
  +        },
  +    }, {
  +        'url': 'http://www.funnyordie.com/embed/e402820827',
  +        'md5': '0e0c5a7bf45c52b95cd16aa7f28be0b6',
  +        'info_dict': {
  +            'id': 'e402820827',
  +            'ext': 'mp4',
  +            'title': 'Please Use This Song (Jon Lajoie)',
  +            'description': 'md5:2ed27d364f5a805a6dba199faaf6681d',
  +            'thumbnail': 're:^http:.*\.jpg$',
           },
  -    }
  +    }]
   
       def _real_extract(self, url):
           mobj = re.match(self._VALID_URL, url)
  @@ -31,23 +40,15 @@
               [r'type="video/mp4" src="(.*?)"', r'src="([^>]*?)" type=\'video/mp4\''],
               webpage, 'video URL', flags=re.DOTALL)
   
  -        if mobj.group('type') == 'embed':
  -            post_json = self._search_regex(
  -                r'fb_post\s*=\s*(\{.*?\});', webpage, 'post details')
  -            post = json.loads(post_json)
  -            title = post['name']
  -            description = post.get('description')
  -            thumbnail = post.get('picture')
  -        else:
  -            title = self._og_search_title(webpage)
  -            description = self._og_search_description(webpage)
  -            thumbnail = None
  +        post_json = self._search_regex(
  +            r'fb_post\s*=\s*(\{.*?\});', webpage, 'post details')
  +        post = json.loads(post_json)
   
           return {
               'id': video_id,
               'url': video_url,
               'ext': 'mp4',
  -            'title': title,
  -            'description': description,
  -            'thumbnail': thumbnail,
  +            'title': post['name'],
  +            'description': post.get('description'),
  +            'thumbnail': post.get('picture'),
           }
  
verification_info: {"golden_diff": "diff --git a/youtube_dl/extractor/funnyordie.py b/youtube_dl/extractor/funnyordie.py\n--- a/youtube_dl/extractor/funnyordie.py\n+++ b/youtube_dl/extractor/funnyordie.py\n@@ -8,18 +8,27 @@\n \n class FunnyOrDieIE(InfoExtractor):\n     _VALID_URL = r'https?://(?:www\\.)?funnyordie\\.com/(?P<type>embed|videos)/(?P<id>[0-9a-f]+)(?:$|[?#/])'\n-    _TEST = {\n+    _TESTS = [{\n         'url': 'http://www.funnyordie.com/videos/0732f586d7/heart-shaped-box-literal-video-version',\n-        'file': '0732f586d7.mp4',\n         'md5': 'f647e9e90064b53b6e046e75d0241fbd',\n         'info_dict': {\n-            'description': ('Lyrics changed to match the video. Spoken cameo '\n-                'by Obscurus Lupa (from ThatGuyWithTheGlasses.com). Based on a '\n-                'concept by Dustin McLean (DustFilms.com). Performed, edited, '\n-                'and written by David A. Scott.'),\n+            'id': '0732f586d7',\n+            'ext': 'mp4',\n             'title': 'Heart-Shaped Box: Literal Video Version',\n+            'description': 'md5:ea09a01bc9a1c46d9ab696c01747c338',\n+            'thumbnail': 're:^http:.*\\.jpg$',\n+        },\n+    }, {\n+        'url': 'http://www.funnyordie.com/embed/e402820827',\n+        'md5': '0e0c5a7bf45c52b95cd16aa7f28be0b6',\n+        'info_dict': {\n+            'id': 'e402820827',\n+            'ext': 'mp4',\n+            'title': 'Please Use This Song (Jon Lajoie)',\n+            'description': 'md5:2ed27d364f5a805a6dba199faaf6681d',\n+            'thumbnail': 're:^http:.*\\.jpg$',\n         },\n-    }\n+    }]\n \n     def _real_extract(self, url):\n         mobj = re.match(self._VALID_URL, url)\n@@ -31,23 +40,15 @@\n             [r'type=\"video/mp4\" src=\"(.*?)\"', r'src=\"([^>]*?)\" type=\\'video/mp4\\''],\n             webpage, 'video URL', flags=re.DOTALL)\n \n-        if mobj.group('type') == 'embed':\n-            post_json = self._search_regex(\n-                r'fb_post\\s*=\\s*(\\{.*?\\});', webpage, 'post details')\n-            post = json.loads(post_json)\n-            title = post['name']\n-            description = post.get('description')\n-            thumbnail = post.get('picture')\n-        else:\n-            title = self._og_search_title(webpage)\n-            description = self._og_search_description(webpage)\n-            thumbnail = None\n+        post_json = self._search_regex(\n+            r'fb_post\\s*=\\s*(\\{.*?\\});', webpage, 'post details')\n+        post = json.loads(post_json)\n \n         return {\n             'id': video_id,\n             'url': video_url,\n             'ext': 'mp4',\n-            'title': title,\n-            'description': description,\n-            'thumbnail': thumbnail,\n+            'title': post['name'],\n+            'description': post.get('description'),\n+            'thumbnail': post.get('picture'),\n         }\n", "issue": "FunnyOrDie extractor not finding thumbnails\npython -m youtube_dl -v --skip-download --write-info-json --no-playlist -f mp4 http://www.funnyordie.com/videos/e402820827/please-use-this-song-jon-lajoie extracts the video properly but not a thumbnail. Here's the resulting JSON:\n{\"display_id\": \"e402820827\", \"extractor\": \"FunnyOrDie\", \"description\": \"Please use this to sell something\", \"format\": \"0 - unknown\", \"format_id\": \"0\", \"playlist_index\": null, \"stitle\": \"Please Use This Song (Jon Lajoie)\", \"playlist\": null, \"title\": \"Please Use This Song (Jon Lajoie)\", \"url\": \"http://vo.fod4.com/v/e402820827/v600.mp4\", \"extractor_key\": \"FunnyOrDie\", \"id\": \"e402820827\", \"ext\": \"mp4\", \"webpage_url\": \"http://www.funnyordie.com/videos/e402820827/please-use-this-song-jon-lajoie\", \"fulltitle\": \"Please Use This Song (Jon Lajoie)\", \"thumbnail\": null, \"webpage_url_basename\": \"please-use-this-song-jon-lajoie\"}\n\nFunnyorDie's RSS feed entry for this page does contain a thumbnail:\nmedia:thumbnail url=\"http://t.fod4.com/t/e402820827/c480x270_50.jpg\" width=\"464\" height=\"348\"\n\n", "before_files": [{"content": "from __future__ import unicode_literals\n\nimport json\nimport re\n\nfrom .common import InfoExtractor\n\n\nclass FunnyOrDieIE(InfoExtractor):\n    _VALID_URL = r'https?://(?:www\\.)?funnyordie\\.com/(?P<type>embed|videos)/(?P<id>[0-9a-f]+)(?:$|[?#/])'\n    _TEST = {\n        'url': 'http://www.funnyordie.com/videos/0732f586d7/heart-shaped-box-literal-video-version',\n        'file': '0732f586d7.mp4',\n        'md5': 'f647e9e90064b53b6e046e75d0241fbd',\n        'info_dict': {\n            'description': ('Lyrics changed to match the video. Spoken cameo '\n                'by Obscurus Lupa (from ThatGuyWithTheGlasses.com). Based on a '\n                'concept by Dustin McLean (DustFilms.com). Performed, edited, '\n                'and written by David A. Scott.'),\n            'title': 'Heart-Shaped Box: Literal Video Version',\n        },\n    }\n\n    def _real_extract(self, url):\n        mobj = re.match(self._VALID_URL, url)\n\n        video_id = mobj.group('id')\n        webpage = self._download_webpage(url, video_id)\n\n        video_url = self._search_regex(\n            [r'type=\"video/mp4\" src=\"(.*?)\"', r'src=\"([^>]*?)\" type=\\'video/mp4\\''],\n            webpage, 'video URL', flags=re.DOTALL)\n\n        if mobj.group('type') == 'embed':\n            post_json = self._search_regex(\n                r'fb_post\\s*=\\s*(\\{.*?\\});', webpage, 'post details')\n            post = json.loads(post_json)\n            title = post['name']\n            description = post.get('description')\n            thumbnail = post.get('picture')\n        else:\n            title = self._og_search_title(webpage)\n            description = self._og_search_description(webpage)\n            thumbnail = None\n\n        return {\n            'id': video_id,\n            'url': video_url,\n            'ext': 'mp4',\n            'title': title,\n            'description': description,\n            'thumbnail': thumbnail,\n        }\n", "path": "youtube_dl/extractor/funnyordie.py"}]}