65 ''' |
65 ''' |
66 construct youtube video oembed link |
66 construct youtube video oembed link |
67 ''' |
67 ''' |
68 if re.match(r".*feature=player_embedded.+", source) != None: |
68 if re.match(r".*feature=player_embedded.+", source) != None: |
69 return "http://www.youtube.com/oembed?url=http://youtube.com/watch?v="\ |
69 return "http://www.youtube.com/oembed?url=http://youtube.com/watch?v="\ |
70 + source[len(source)-11:] +"&format=json" |
70 + source[len(source)-11:] +"&format=json" |
71 return "http://www.youtube.com/oembed?url=" + source + "&format=json" |
71 return "http://www.youtube.com/oembed?url=" + source + "&format=json" |
72 |
72 |
73 class Command(BaseCommand): |
73 class Command(BaseCommand): |
74 ''' |
74 ''' |
75 Command class |
75 Command class |
99 return "http://{base_url}ldtplatform/ldt/embed/v3/config?json_url=" \ |
101 return "http://{base_url}ldtplatform/ldt/embed/v3/config?json_url=" \ |
100 "http://{base_url}ldtplatform/ldt/cljson/id/{ldt_id}&" \ |
102 "http://{base_url}ldtplatform/ldt/cljson/id/{ldt_id}&" \ |
101 "player_id=player_project_{ldt_id}&" \ |
103 "player_id=player_project_{ldt_id}&" \ |
102 "ldt_id={ldt_id}".format(base_url=self.base_url, ldt_id=ldtid) |
104 "ldt_id={ldt_id}".format(base_url=self.base_url, ldt_id=ldtid) |
103 |
105 |
104 def clean_media_project(self, element, force, newsrc=None): |
106 def clean_media_project(self, element, newsrc=None): |
105 ''' |
107 ''' |
106 change media objects' videopath and source if necessary |
108 change media objects' videopath and source if necessary |
107 change project .ldt |
109 change project .ldt |
108 ''' |
110 ''' |
109 basesrc = element.src |
111 basesrc = element.src |
110 if force: |
112 if self.force: |
111 element.videopath = '' |
113 element.videopath = '' |
112 element.save() |
114 element.save() |
113 if newsrc != None: |
115 if newsrc != None: |
114 if force: |
116 if self.force: |
115 element.src = newsrc |
117 element.src = newsrc |
116 element.save() |
118 element.save() |
117 self.mycsvfile.writerow([ |
119 self.mycsvfile.writerow([ |
118 "Media", |
120 "Media", |
119 basesrc, |
121 basesrc, |
142 return |
144 return |
143 self.stdout.write(" Initializing project", ending='') |
145 self.stdout.write(" Initializing project", ending='') |
144 else: |
146 else: |
145 self.stdout.write(" Project has to be initialized ", ending='') |
147 self.stdout.write(" Project has to be initialized ", ending='') |
146 return |
148 return |
147 ldtproj = models.Project.objects.filter\ |
149 ldtproj = models.Project.objects.filter( |
148 (content=models.Content.objects.filter(media_obj_id=element.id)[0]) |
150 content=models.Content.objects.filter(media_obj_id=element.id)[0] |
|
151 ) |
149 for singleproject in ldtproj: |
152 for singleproject in ldtproj: |
150 root = etree.XML(singleproject.ldt.encode('utf-8'), self.parser) |
153 root = etree.XML(singleproject.ldt.encode('utf-8'), self.parser) |
151 if root.xpath('medias/media') == []: |
154 if root.xpath('medias/media') == []: |
152 self.stdout.write(" le .ldt ne contient pas de media", ending='') |
155 self.stdout.write(" le .ldt ne contient pas de media", ending='') |
153 continue |
156 continue |
154 if root.xpath('medias/media')[0].get("video") != '': |
157 if root.xpath('medias/media')[0].get("video") != '': |
155 embedurl = self.construct_ldt_embed(singleproject.ldt_id) |
158 embedurl = self.construct_ldt_embed(singleproject.ldt_id) |
156 if force: |
159 if self.force: |
157 root.xpath('medias/media')[0].set("video", '') |
160 root.xpath('medias/media')[0].set("video", '') |
158 self.stdout.write(" changing videopath arg in .ldt ", ending='') |
161 self.stdout.write(" changing videopath arg in .ldt ", ending='') |
159 self.mycsvfile.writerow([ |
162 self.mycsvfile.writerow([ |
160 "Project", |
163 "Project", |
161 embedurl, |
164 embedurl, |
167 singleproject.save() |
170 singleproject.save() |
168 self.logger.info("%s DONE\n", embedurl) |
171 self.logger.info("%s DONE\n", embedurl) |
169 element.save() |
172 element.save() |
170 |
173 |
171 |
174 |
172 |
175 def __init__(self, *args, **kwargs): |
173 def handle(self, *args, **options): |
176 super(Command, self).__init__(*args, **kwargs) |
174 ''' |
|
175 handle |
|
176 ''' |
|
177 self.base_url = Site.objects.get_current().domain + settings.BASE_URL |
177 self.base_url = Site.objects.get_current().domain + settings.BASE_URL |
178 self.parser = etree.XMLParser(encoding='utf-8') |
178 self.parser = etree.XMLParser(encoding='utf-8') |
179 self.logger = logging.getLogger(__name__) |
179 self.logger = logging.getLogger(__name__) |
|
180 self.force = False |
|
181 self.mycsvfile = None |
|
182 |
|
183 |
|
184 def handle(self, *args, **options): |
|
185 ''' |
|
186 handle |
|
187 ''' |
180 path = options['path'] |
188 path = options['path'] |
181 force = options['force'] |
189 self.force = options['force'] |
182 if not path: |
190 if not path: |
183 path = 'mediaInformations.csv' |
191 path = 'mediaInformations.csv' |
184 try: |
192 try: |
185 csvfile = open(path, 'wb') |
193 csvfile = open(path, 'wb') |
186 except IOError: |
194 except IOError: |
197 ]) |
205 ]) |
198 j = 0 |
206 j = 0 |
199 files1 = models.Media.objects.all() #this list contains every media |
207 files1 = models.Media.objects.all() #this list contains every media |
200 for elem1 in files1: |
208 for elem1 in files1: |
201 if number_of_contents(elem1) == 0: |
209 if number_of_contents(elem1) == 0: |
202 if force: |
210 if self.force: |
203 elem1.delete() #if there is no content |
211 elem1.delete() #if there is no content |
204 #linked to the media, the media is removed for the database |
212 #linked to the media, the media is removed for the database |
205 self.stdout.write(" No content found, media has been removed") |
213 self.stdout.write(" No content found, media has been removed") |
206 else: |
214 else: |
207 self.stdout.write(" No content found, media will be removed") |
215 self.stdout.write(" No content found, media will be removed") |
212 "deleting object (no content)" |
220 "deleting object (no content)" |
213 ]) |
221 ]) |
214 j += 1 |
222 j += 1 |
215 continue |
223 continue |
216 if elem1.src.lower() == to_https(elem1.src, elem1.videopath).lower(): |
224 if elem1.src.lower() == to_https(elem1.src, elem1.videopath).lower(): |
217 self.clean_media_project(elem1, force) |
225 self.clean_media_project(elem1) |
218 if re.match(r".*\.youtube\.com.*", elem1.src) != None\ |
226 if re.match(r".*\.youtube\.com.*", elem1.src) != None \ |
219 or re.match(r".*youtu\.be.+", elem1.src) != None: |
227 or re.match(r".*youtu\.be.+", elem1.src) != None: |
220 myembed = construct_youtube_embed(elem1.src) |
228 myembed = construct_youtube_embed(elem1.src) |
221 if requests.get(myembed).status_code == 404: |
229 if requests.get(myembed).status_code == 404: |
222 self.stdout.write("%s : Video doesn't exists"% elem1.src) |
230 self.stdout.write("%s : Video doesn't exists"% elem1.src) |
223 if number_of_projects(elem1) > 0: |
231 if number_of_projects(elem1) > 0: |
224 ldtproj = models.Project.objects.get(id=models.Content.objects.filter\ |
232 ldtproj = models.Project.objects.get( |
225 (media_obj_id=elem1.id)[0].front_project_id).ldt |
233 id=models.Content.objects.filter( |
|
234 media_obj_id=elem1.id |
|
235 )[0].front_project_id |
|
236 ).ldt |
226 root = etree.XML(ldtproj.encode('utf-8'), self.parser) |
237 root = etree.XML(ldtproj.encode('utf-8'), self.parser) |
227 if root.xpath('annotations/content/ensemble/decoupage/elements/element')\ |
238 if root.xpath( |
228 == []: |
239 'annotations/content/ensemble/decoupage/elements/element' |
229 if force: |
240 ) == []: |
|
241 if self.force: |
230 elem1.delete() |
242 elem1.delete() |
231 self.stdout.write("video doesn't exist anymore : media deleted") |
243 self.stdout.write("video doesn't exist anymore : media deleted") |
232 self.mycsvfile.writerow([ |
244 self.mycsvfile.writerow([ |
233 "Media/Content/Project", |
245 "Media/Content/Project", |
234 elem1.src, |
246 elem1.src, |
235 "Yes", |
247 "Yes", |
236 "deleting(Video doesn't exist anymore + empty projects)" |
248 "deleting(Video doesn't exist anymore + empty projects)" |
237 ]) |
249 ]) |
238 j += 1 |
250 j += 1 |
239 else: |
251 else: |
240 self.clean_media_project(elem1, force) |
252 self.clean_media_project(elem1) |
241 if force: |
253 if self.force: |
242 self.stdout.write("%s files deleted"%j) |
254 self.stdout.write("%s files deleted"%j) |
243 else: |
255 else: |
244 self.stdout.write("%s files to delete"%j) |
256 self.stdout.write("%s files to delete"%j) |
245 i = 0 |
257 i = 0 |
246 files = list(chain( |
258 files = list(chain( |
323 newsource |
335 newsource |
324 ]) |
336 ]) |
325 continue |
337 continue |
326 if res > 400: |
338 if res > 400: |
327 try: |
339 try: |
328 ressrc = requests.head(to_https(elem.src, elem.videopath, 0),\ |
340 ressrc = requests.head( |
329 timeout=10).status_code |
341 to_https(elem.src, elem.videopath, 0), |
|
342 timeout=10 |
|
343 ).status_code |
330 except (requests.exceptions.Timeout, requests.ConnectionError): |
344 except (requests.exceptions.Timeout, requests.ConnectionError): |
331 self.stdout.write(" can't access source/new files", ending='') |
345 self.stdout.write(" can't access source/new files", ending='') |
332 self.logger.warning("can't access %s", elem.title) |
346 self.logger.warning("can't access %s", elem.title) |
333 res = "connection error" |
347 res = "connection error" |
334 self.mycsvfile.writerow([ |
348 self.mycsvfile.writerow([ |