|  | @@ -4,6 +4,7 @@ import re
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  from .common import InfoExtractor
 | 
	
		
			
				|  |  |  from ..utils import (
 | 
	
		
			
				|  |  | +    determine_ext,
 | 
	
		
			
				|  |  |      ExtractorError,
 | 
	
		
			
				|  |  |      merge_dicts,
 | 
	
		
			
				|  |  |      orderedSet,
 | 
	
	
		
			
				|  | @@ -75,11 +76,20 @@ class SpankBangIE(InfoExtractor):
 | 
	
		
			
				|  |  |              if not f_url:
 | 
	
		
			
				|  |  |                  return
 | 
	
		
			
				|  |  |              f = parse_resolution(format_id)
 | 
	
		
			
				|  |  | -            f.update({
 | 
	
		
			
				|  |  | -                'url': f_url,
 | 
	
		
			
				|  |  | -                'format_id': format_id,
 | 
	
		
			
				|  |  | -            })
 | 
	
		
			
				|  |  | -            formats.append(f)
 | 
	
		
			
				|  |  | +            ext = determine_ext(f_url)
 | 
	
		
			
				|  |  | +            if format_id.startswith('m3u8') or ext == 'm3u8':
 | 
	
		
			
				|  |  | +                formats.extend(self._extract_m3u8_formats(
 | 
	
		
			
				|  |  | +                    f_url, video_id, 'mp4', entry_protocol='m3u8_native',
 | 
	
		
			
				|  |  | +                    m3u8_id='hls', fatal=False))
 | 
	
		
			
				|  |  | +            elif format_id.startswith('mpd') or ext == 'mpd':
 | 
	
		
			
				|  |  | +                formats.extend(self._extract_mpd_formats(
 | 
	
		
			
				|  |  | +                    f_url, video_id, mpd_id='dash', fatal=False))
 | 
	
		
			
				|  |  | +            elif ext == 'mp4' or f.get('width') or f.get('height'):
 | 
	
		
			
				|  |  | +                f.update({
 | 
	
		
			
				|  |  | +                    'url': f_url,
 | 
	
		
			
				|  |  | +                    'format_id': format_id,
 | 
	
		
			
				|  |  | +                })
 | 
	
		
			
				|  |  | +                formats.append(f)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          STREAM_URL_PREFIX = 'stream_url_'
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -93,28 +103,22 @@ class SpankBangIE(InfoExtractor):
 | 
	
		
			
				|  |  |                  r'data-streamkey\s*=\s*(["\'])(?P<value>(?:(?!\1).)+)\1',
 | 
	
		
			
				|  |  |                  webpage, 'stream key', group='value')
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            sb_csrf_session = self._get_cookies(
 | 
	
		
			
				|  |  | -                'https://spankbang.com')['sb_csrf_session'].value
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |              stream = self._download_json(
 | 
	
		
			
				|  |  |                  'https://spankbang.com/api/videos/stream', video_id,
 | 
	
		
			
				|  |  |                  'Downloading stream JSON', data=urlencode_postdata({
 | 
	
		
			
				|  |  |                      'id': stream_key,
 | 
	
		
			
				|  |  |                      'data': 0,
 | 
	
		
			
				|  |  | -                    'sb_csrf_session': sb_csrf_session,
 | 
	
		
			
				|  |  |                  }), headers={
 | 
	
		
			
				|  |  |                      'Referer': url,
 | 
	
		
			
				|  |  | -                    'X-CSRFToken': sb_csrf_session,
 | 
	
		
			
				|  |  | +                    'X-Requested-With': 'XMLHttpRequest',
 | 
	
		
			
				|  |  |                  })
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              for format_id, format_url in stream.items():
 | 
	
		
			
				|  |  | -                if format_id.startswith(STREAM_URL_PREFIX):
 | 
	
		
			
				|  |  | -                    if format_url and isinstance(format_url, list):
 | 
	
		
			
				|  |  | -                        format_url = format_url[0]
 | 
	
		
			
				|  |  | -                    extract_format(
 | 
	
		
			
				|  |  | -                        format_id[len(STREAM_URL_PREFIX):], format_url)
 | 
	
		
			
				|  |  | +                if format_url and isinstance(format_url, list):
 | 
	
		
			
				|  |  | +                    format_url = format_url[0]
 | 
	
		
			
				|  |  | +                extract_format(format_id, format_url)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        self._sort_formats(formats)
 | 
	
		
			
				|  |  | +        self._sort_formats(formats, field_preference=('preference', 'height', 'width', 'fps', 'tbr', 'format_id'))
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          info = self._search_json_ld(webpage, video_id, default={})
 | 
	
		
			
				|  |  |  
 |