Skip to content
Snippets Groups Projects
Select Git revision
  • dfccd71429fae262153c044d4e22eb1826d634cf
  • master default protected
2 results

vite.config.ts

Blame
  • Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    sorter.py 6.13 KiB
    from server import *
    import traceback
    
    @app.route('/sort/log')
    @register_navbar('Sortierlog', icon='sort-by-attributes-alt')
    @mod_required
    def sort_log():
    	return render_template('sortlog.html',sortlog=query('''
    			SELECT 
    				sortlog.*,
    				lectures.id as lecture_id,
    				lectures.title as lecture_title,
    				lectures.course_id as course_id, 
    				courses.title as course_title
    			FROM sortlog 
    			JOIN lectures ON lectures.id = sortlog.lecture_id
    			JOIN courses ON courses.id = lectures.course_id 
    			ORDER BY sortlog.`when` DESC
    			LIMIT 50
    		'''),sorterrorlog=query('SELECT * FROM sorterrorlog ORDER BY sorterrorlog.`when` DESC'))
    
    
    def to_ascii(inputstring):
    	asciistring = inputstring
    	for charset in [('ä', 'ae'), ('ö', 'oe'), ('ü', 'ue'), ('ß', 'ss')]:
    		asciistring = asciistring.replace(charset[0],charset[1])
    	return asciistring
    
    def insert_video(lectureid,dbfilepath,filepath,fileformatid):
    	video_id = modify('''INSERT INTO videos_data 
    		(lecture_id,visible,path,video_format,title,comment,internal,file_modified,time_created,time_updated,created_by,hash,file_size)
    		VALUES 
    		(?,0,?,?,"","","",?,?,?,?,"",?)''',
    		lectureid, dbfilepath, fileformatid, datetime.now(), datetime.now(), datetime.now(), -1, os.stat(filepath).st_size)
    	query('INSERT INTO sortlog (lecture_id,video_id,path,`when`) VALUES (?,?,?,?)', lectureid, video_id, dbfilepath, datetime.now())
    
    
    @app.route('/sort/now')
    @mod_required
    @sched_func(600)
    def sort_now():
    	modify('BEGIN')
    	courses = query('SELECT * FROM courses')
    	formats = query('SELECT * FROM formats ORDER BY prio')
    	for course in courses:
    		for mountpoint in config['VIDEOMOUNT']:
    			existingvideos = query('SELECT videos.path FROM videos JOIN lectures ON (videos.lecture_id = lectures.id) WHERE lectures.course_id = ?',course['id'])
    			knownerrors = query('SELECT sorterrorlog.path FROM sorterrorlog WHERE sorterrorlog.course_id = ?',course['id'])
    			ignorefiles = existingvideos + knownerrors
    			lectures = query('SELECT * from lectures where course_id = ?',course['id'])
    			coursepath = mountpoint['mountpoint']+course['handle']
    			try:
    				files = os.listdir(coursepath)
    			except FileNotFoundError:
    				files = []
    			for filename in files:
    				try:
    					# if the video is in the table "videos" already (with the correct course), skip it
    					ignore = False
    					for file_to_ignore in ignorefiles:
    						# path is something like
    						# vpnonline/08ws-swt/08ws-swt-081118.mp4
    						if os.path.basename(filename) == os.path.basename(file_to_ignore['path']):
    							ignore = True
    							break
    					if ignore:
    						continue
    					filepath = coursepath + '/' + filename
    					# filenames: <handle>-<sorter>-<format>.mp4
    					# "sorter" musst be found with fuzzy matching. "sorter" musst be one or more of the following types: (inside the loop)
    					
    					# '_' and ' ' are handled like '-'
    					splitfilename = filename.replace('_','-').replace(' ','-').split('-')
    					if not	os.path.splitext(filename)[1] == '.mp4':
    						continue
    					# we save all extraced data in a dict
    					data = {'keywords': []}
    					# parse the file name and save all data in 'data'
    					for s in splitfilename:
    						s = s.replace('.mp4','')
    						#-<YYMMDD> (date)
    						#-<HHMM> (time)
    						#-<keyword>
    						#	Looking for keywords in: title,speaker,comment, comma seperated list in internal
    						try:
    							if len(s) == 6:
    								data['date'] = datetime.strptime(s,'%y%m%d').date()
    							elif  len(s) == 4:
    								data['time'] = datetime.strptime(s,'%H%M').time()
    							else:	
    								data['keywords'].append(s)
    						except ValueError:
    							# if its not a date or time, handle it as keyword
    							data['keywords'].append(s)
    					# try to match the file on a single lecture
    					matches = []
    					
    					# first try date and time (if one of them is set)
    					if ('date' in data) or ('time' in data):
    						for lecture in lectures:
    							if not ('time' in lecture) or not lecture['time']:
    								continue
    							if ('date' in data) and (lecture['time'].date() != data['date']):
    									continue
    							if ('time' in data) and (lecture['time'].time() != data['time']):
    									continue
    							matches.append(lecture)
    					# if we can't match exactly  based on date and time, we have to match keywords
    					if ((len(matches) != 1) and (len(data['keywords']) > 0)):
    						#only test lectures with the correct date/time, if we have any. Else test for matches in all lectures of this course
    						if len(matches) == 0:
    							matches.extend(lectures)
    						found = False
    						for field in ['title','speaker','comment','internal']:
    							for lecture in matches:
    								for keyword in data['keywords']:
    									# first test for exact match, else make it asci and try substring test
    									if (keyword == lecture[field]) or \
    									   (str(keyword).lower() in str(to_ascii(lecture[field]).lower())):
    										found = True
    										matches = [lecture]
    									if found:
    										break
    								if found:
    									break
    							if found:
    								break
    					# now we should have found exactly one match
    					dbfilepath = mountpoint['prefix']+course['handle']+'/'+filename
    					if len(matches) == 1:
    						# now match the format
    						for videoformat in formats:
    							#we match the last part of the file name without the extension
    							formatstring = splitfilename[-1].split('.',1)[0].lower()
    							if formatstring in videoformat['keywords'].replace(',',' ').split(' '):
    								data['format'] = videoformat['id']
    								break
    						# default format is "unknown", with id 0
    						if not 'format' in data:
    							data['format'] = 0
    						# insert the video into videos_data and log
    						insert_video( matches[0]['id'], dbfilepath, filepath, fileformatid)
    					else:
    						# if we couldn't match the video on exactly one lecture, log an error
    						matches_id = []
    						for match in matches:
    							matches_id.append(str(match['id']))
    						query('INSERT INTO sorterrorlog_data (course_id,path,matches,`when`,time_updated,time_created) VALUES (?,?,?,?,?,?)', course['id'], dbfilepath, ','.join(matches_id), datetime.now(), datetime.now(), datetime.now())
    				except Exception:
    					traceback.print_exc()
    
    		
    	modify('COMMIT')
    	if 'ref' in request.values:
    		return redirect(request.values['ref'])
    	else:
    		return 'OK',  200