| 
					
				 | 
			
			
				@@ -1,6 +1,7 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 # coding: utf-8 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 from __future__ import unicode_literals 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import datetime 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import re 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 from .common import InfoExtractor 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -8,8 +9,8 @@ from ..utils import ( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     clean_html, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     int_or_none, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     parse_duration, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    parse_iso8601, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     parse_resolution, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    try_get, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     url_or_none, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -24,8 +25,9 @@ class CCMAIE(InfoExtractor): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             'ext': 'mp4', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             'title': 'L\'espot de La Marató de TV3', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             'description': 'md5:f12987f320e2f6e988e9908e4fe97765', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            'timestamp': 1470918540, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            'upload_date': '20160811', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            'timestamp': 1478608140, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            'upload_date': '20161108', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            'age_limit': 0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     }, { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         'url': 'http://www.ccma.cat/catradio/alacarta/programa/el-consell-de-savis-analitza-el-derbi/audio/943685/', 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -35,8 +37,24 @@ class CCMAIE(InfoExtractor): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             'ext': 'mp3', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             'title': 'El Consell de Savis analitza el derbi', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             'description': 'md5:e2a3648145f3241cb9c6b4b624033e53', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            'upload_date': '20171205', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            'timestamp': 1512507300, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            'upload_date': '20170512', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            'timestamp': 1494622500, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            'vcodec': 'none', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            'categories': ['Esports'], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    }, { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        'url': 'http://www.ccma.cat/tv3/alacarta/crims/crims-josep-tallada-lespereu-me-capitol-1/video/6031387/', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        'md5': 'b43c3d3486f430f3032b5b160d80cbc3', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        'info_dict': { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            'id': '6031387', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            'ext': 'mp4', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            'title': 'Crims - Josep Talleda, l\'"Espereu-me" (capítol 1)', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            'description': 'md5:7cbdafb640da9d0d2c0f62bad1e74e60', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            'timestamp': 1582577700, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            'upload_date': '20200224', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            'subtitles': 'mincount:4', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            'age_limit': 16, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            'series': 'Crims', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     }] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -72,17 +90,27 @@ class CCMAIE(InfoExtractor): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         informacio = media['informacio'] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         title = informacio['titol'] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        durada = informacio.get('durada', {}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        durada = informacio.get('durada') or {} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         duration = int_or_none(durada.get('milisegons'), 1000) or parse_duration(durada.get('text')) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        timestamp = parse_iso8601(informacio.get('data_emissio', {}).get('utc')) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        tematica = try_get(informacio, lambda x: x['tematica']['text']) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        timestamp = None 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        data_utc = try_get(informacio, lambda x: x['data_emissio']['utc']) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        try: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            timestamp = datetime.datetime.strptime( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                data_utc, '%Y-%d-%mT%H:%M:%S%z').timestamp() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        except TypeError: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            pass 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         subtitles = {} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        subtitols = media.get('subtitols', {}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if subtitols: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            sub_url = subtitols.get('url') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        subtitols = media.get('subtitols') or [] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if isinstance(subtitols, dict): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            subtitols = [subtitols] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        for st in subtitols: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            sub_url = st.get('url') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             if sub_url: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 subtitles.setdefault( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    subtitols.get('iso') or subtitols.get('text') or 'ca', []).append({ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    st.get('iso') or st.get('text') or 'ca', []).append({ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         'url': sub_url, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -97,6 +125,16 @@ class CCMAIE(InfoExtractor): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     'height': int_or_none(imatges.get('alcada')), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 }] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        age_limit = None 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        codi_etic = try_get(informacio, lambda x: x['codi_etic']['id']) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if codi_etic: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            codi_etic_s = codi_etic.split('_') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if len(codi_etic_s) == 2: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if codi_etic_s[1] == 'TP': 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    age_limit = 0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                else: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    age_limit = int_or_none(codi_etic_s[1]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             'id': media_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             'title': title, 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -106,4 +144,9 @@ class CCMAIE(InfoExtractor): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             'thumbnails': thumbnails, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             'subtitles': subtitles, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             'formats': formats, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            'age_limit': age_limit, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            'alt_title': informacio.get('titol_complet'), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            'episode_number': int_or_none(informacio.get('capitol')), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            'categories': [tematica] if tematica else None, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            'series': informacio.get('programa'), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 |