|  | @@ -161,24 +161,53 @@ class ArteTVPlus7IE(InfoExtractor):
 | 
	
		
			
				|  |  |              'es': 'E[ESP]',
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +        langcode = LANGS.get(lang, lang)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |          formats = []
 | 
	
		
			
				|  |  |          for format_id, format_dict in player_info['VSR'].items():
 | 
	
		
			
				|  |  |              f = dict(format_dict)
 | 
	
		
			
				|  |  |              versionCode = f.get('versionCode')
 | 
	
		
			
				|  |  | -            langcode = LANGS.get(lang, lang)
 | 
	
		
			
				|  |  | -            lang_rexs = [r'VO?%s-' % re.escape(langcode), r'VO?.-ST%s$' % re.escape(langcode)]
 | 
	
		
			
				|  |  | -            lang_pref = None
 | 
	
		
			
				|  |  | -            if versionCode:
 | 
	
		
			
				|  |  | -                matched_lang_rexs = [r for r in lang_rexs if re.match(r, versionCode)]
 | 
	
		
			
				|  |  | -                lang_pref = -10 if not matched_lang_rexs else 10 * len(matched_lang_rexs)
 | 
	
		
			
				|  |  | -            source_pref = 0
 | 
	
		
			
				|  |  | -            if versionCode is not None:
 | 
	
		
			
				|  |  | -                # The original version with subtitles has lower relevance
 | 
	
		
			
				|  |  | -                if re.match(r'VO-ST(F|A|E)', versionCode):
 | 
	
		
			
				|  |  | -                    source_pref -= 10
 | 
	
		
			
				|  |  | -                # The version with sourds/mal subtitles has also lower relevance
 | 
	
		
			
				|  |  | -                elif re.match(r'VO?(F|A|E)-STM\1', versionCode):
 | 
	
		
			
				|  |  | -                    source_pref -= 9
 | 
	
		
			
				|  |  | +            l = re.escape(langcode)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            # Language preference from most to least priority
 | 
	
		
			
				|  |  | +            # Reference: section 5.6.3 of
 | 
	
		
			
				|  |  | +            # http://www.arte.tv/sites/en/corporate/files/complete-technical-guidelines-arte-geie-v1-05.pdf
 | 
	
		
			
				|  |  | +            PREFERENCES = (
 | 
	
		
			
				|  |  | +                # original version in requested language, without subtitles
 | 
	
		
			
				|  |  | +                r'VO{0}$'.format(l),
 | 
	
		
			
				|  |  | +                # original version in requested language, with partial subtitles in requested language
 | 
	
		
			
				|  |  | +                r'VO{0}-ST{0}$'.format(l),
 | 
	
		
			
				|  |  | +                # original version in requested language, with subtitles for the deaf and hard-of-hearing in requested language
 | 
	
		
			
				|  |  | +                r'VO{0}-STM{0}$'.format(l),
 | 
	
		
			
				|  |  | +                # non-original (dubbed) version in requested language, without subtitles
 | 
	
		
			
				|  |  | +                r'V{0}$'.format(l),
 | 
	
		
			
				|  |  | +                # non-original (dubbed) version in requested language, with subtitles partial subtitles in requested language
 | 
	
		
			
				|  |  | +                r'V{0}-ST{0}$'.format(l),
 | 
	
		
			
				|  |  | +                # non-original (dubbed) version in requested language, with subtitles for the deaf and hard-of-hearing in requested language
 | 
	
		
			
				|  |  | +                r'V{0}-STM{0}$'.format(l),
 | 
	
		
			
				|  |  | +                # original version in requested language, with partial subtitles in different language
 | 
	
		
			
				|  |  | +                r'VO{0}-ST(?!{0}).+?$'.format(l),
 | 
	
		
			
				|  |  | +                # original version in requested language, with subtitles for the deaf and hard-of-hearing in different language
 | 
	
		
			
				|  |  | +                r'VO{0}-STM(?!{0}).+?$'.format(l),
 | 
	
		
			
				|  |  | +                # original version in different language, with partial subtitles in requested language
 | 
	
		
			
				|  |  | +                r'VO(?:(?!{0}).+?)?-ST{0}$'.format(l),
 | 
	
		
			
				|  |  | +                # original version in different language, with subtitles for the deaf and hard-of-hearing in requested language
 | 
	
		
			
				|  |  | +                r'VO(?:(?!{0}).+?)?-STM{0}$'.format(l),
 | 
	
		
			
				|  |  | +                # original version in different language, without subtitles
 | 
	
		
			
				|  |  | +                r'VO(?:(?!{0}))?$'.format(l),
 | 
	
		
			
				|  |  | +                # original version in different language, with partial subtitles in different language
 | 
	
		
			
				|  |  | +                r'VO(?:(?!{0}).+?)?-ST(?!{0}).+?$'.format(l),
 | 
	
		
			
				|  |  | +                # original version in different language, with subtitles for the deaf and hard-of-hearing in different language
 | 
	
		
			
				|  |  | +                r'VO(?:(?!{0}).+?)?-STM(?!{0}).+?$'.format(l),
 | 
	
		
			
				|  |  | +            )
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            for pref, p in enumerate(PREFERENCES):
 | 
	
		
			
				|  |  | +                if re.match(p, versionCode):
 | 
	
		
			
				|  |  | +                    lang_pref = len(PREFERENCES) - pref
 | 
	
		
			
				|  |  | +                    break
 | 
	
		
			
				|  |  | +            else:
 | 
	
		
			
				|  |  | +                lang_pref = -1
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |              format = {
 | 
	
		
			
				|  |  |                  'format_id': format_id,
 | 
	
		
			
				|  |  |                  'preference': -10 if f.get('videoFormat') == 'M3U8' else None,
 | 
	
	
		
			
				|  | @@ -188,7 +217,6 @@ class ArteTVPlus7IE(InfoExtractor):
 | 
	
		
			
				|  |  |                  'height': int_or_none(f.get('height')),
 | 
	
		
			
				|  |  |                  'tbr': int_or_none(f.get('bitrate')),
 | 
	
		
			
				|  |  |                  'quality': qfunc(f.get('quality')),
 | 
	
		
			
				|  |  | -                'source_preference': source_pref,
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              if f.get('mediaType') == 'rtmp':
 |