Pārlūkot izejas kodu

upload files to yt

David 10 gadi atpakaļ
vecāks
revīzija
bdb2fb9fa2

+ 10 - 3
back/db.py

@@ -15,10 +15,9 @@ class db():
         self.raw_files = self.client[self.DB]["raw"]
         self.cut_files = self.client[self.DB]["cut"]
         self.ul_files  = self.client[self.DB]["ul"]
-        self.jobs      = self.client[self.DB]["jobs"]
 
-    def getJobs(self):
-        ret = [ jsonable(r) for r in self.jobs.find() ]
+    def uploaded(self):
+        ret = [ jsonable(f) for f in self.ul_files.find() ]
         return ret
 
     def raw(self, _id=None):
@@ -39,6 +38,14 @@ class db():
 
         return ret
 
+    def insert_uploaded(self, data):
+        try:
+            self.ul_files.insert_one(data)
+            return True
+        except errors.DuplicateKeyError:
+            print("Dup")
+            return False
+
     def insert_processed(self, data):
         try:
             self.cut_files.insert_one(data)

BIN
back/especificosos-nuevo.png


+ 27 - 5
back/tasks.py

@@ -1,6 +1,7 @@
 import os.path
 import datetime
 import json
+import thumb
 
 from constants import CUT_OUTPUT_PATH
 from subprocess import Popen,PIPE
@@ -17,7 +18,9 @@ date_fmt='%d/%m/%Y, %H:%M'
 
 
 def jobrunner(fn,args):
+    print(args)
     job = fn.delay(*args)
+    print(job.get_id())
     job_key_list.append(job.get_id())
     return job
 
@@ -52,6 +55,30 @@ def jobs():
         ret.append(out)
     return ret
 
+def upload_video(_id,prof,texto1,texto2):
+    vid=d.processed(_id)
+    ul_file = vid["out_fname"]
+    titulo = ("%s - %s - %s" % (prof,texto1,texto2))
+    print("pre-thumb")
+    thumb_file = thumb.create_thumb(prof,texto1,texto2)
+    print(thumb_file)
+    #job = jobrunner(upload (titulo, thumb_file, ul_file)) 
+    #FIXME
+    job = upload.delay(titulo, thumb_file, ul_file)
+    job_key_list.append(job.get_id())
+    print(job.get_id())
+
+
+@job('default',connection=conn, timeout=3600*2, result_ttl=3600*2)
+def upload(title,thumb_path,video_path):
+    import youtube_upload.main
+    j=get_current_job()
+    job_start=datetime.datetime.now()
+    v_id=youtube_upload.main.main(title,thumb_path,video_path,job=j)
+    job_end=datetime.datetime.now()
+    d.insert_uploaded({'title': title,'yt': v_id, 'video':video_path, 'enqueued_at': job_start, 'finished_at': job_end })
+    return v_id
+
 @job('default',connection=conn, timeout=30)
 def long_job(arg):
     for i in range(20):
@@ -63,11 +90,6 @@ def long_job(arg):
     return "37"
 
 
-@job('default',connection=conn, timeout=3600*2, result_ttl=3600*2)
-def upload_video(title,thumb_path,video_path):
-    import youtube_upload.main
-    j=get_current_job()
-    return youtube_upload.main.main(title,thumb_path,video_path,job=j)
 
 
 @job('default',connection=conn, timeout=360*2, result_ttl=360*2)

+ 22 - 0
back/thumb.py

@@ -0,0 +1,22 @@
+#!/usr/bin/env python3
+
+import tempfile
+from wand.image import Image
+from wand.drawing import Drawing 
+from wand.color import Color
+
+draw = Drawing()
+
+def create_thumb(prof,texto1,texto2):
+    with tempfile.NamedTemporaryFile(suffix='.png',delete=None) as fp:
+        with Image(filename='especificosos-nuevo.png') as img:
+            draw.font = "Helvetica"
+            draw.gravity = "center"
+            draw.font_weight = 200
+            draw.fill_color = Color('white')
+            draw.font_size = 50
+            draw.text(0,180, "%s\n%s\n%s" % (prof,texto1,texto2))
+            draw(img)
+            img.save(file=fp)
+        fp.close()
+        return fp.name

+ 40 - 21
back/web.py

@@ -15,23 +15,45 @@ d=db()
 def index():
     return "Hello world"
 
+@app.route(BASE_PATH + '/list/yt/')
+@app.route(BASE_PATH + '/list/yt')
+def uploaded_list():
+    ret={'list': d.uploaded()}
+    return jsonify(ret)
+
 @app.route(BASE_PATH + '/list/raw/')
 @app.route(BASE_PATH + '/list/raw')
 def raw_list():
     ret={'list': d.raw() }
     return jsonify(ret)
 
-@app.route(BASE_PATH + '/raw/<video_id>')
-def raw_file(video_id):
-    ret=d.raw(video_id)
-    ret["file"]=ret["file"].split("front")[1] #FIXME, path relativo al webserver
-    return jsonify(ret)
-
 @app.route(BASE_PATH + '/list/processed/')
 @app.route(BASE_PATH + '/list/processed')
 def processed_list():
     ret={'list': d.processed() }
     return jsonify(ret)
+
+@app.route(BASE_PATH + '/list/jobs/')
+@app.route(BASE_PATH + '/list/jobs')
+def jobs():
+    working = tasks.jobs()
+    return json.dumps({"working":working})
+
+@app.route(BASE_PATH + '/raw/<video_id>')
+def raw_file(video_id):
+    ret=d.raw(video_id)
+    print(ret)
+    if ret is not None:
+        ret["file"]=ret["file"].split("front")[1] #FIXME, path relativo al webserver
+        return jsonify(ret)
+    return "{}"
+
+@app.route(BASE_PATH + '/processed/<video_id>')
+def processed_file(video_id):
+    ret=d.processed(video_id)
+    ret["out_fname"]=ret["out_fname"].split("front")[1] #FIXME, path relativo al webserver
+    return jsonify(ret)
+
 @app.route(BASE_PATH + '/crop/', methods=["POST"])
 def crop():
     ret={"status":"Procesando"}
@@ -43,30 +65,31 @@ def crop():
                                 today.strftime('%Y%m%d'),
                                 data["desc"])
 
+    #job = tasks.crop_video.delay(video["file"],
     job = tasks.jobrunner(tasks.crop_video, 
                             (video["file"],
                             str(data["inicio"]),
                             str(data["fin"]),
                             out_filename,))
-    #job = tasks.crop_video.delay(video["file"],
-    #                            str(data["inicio"]),
-    #                            str(data["fin"]),
-    #                            out_filename)
     ret["job_id"]=job.get_id()
     return jsonify(ret)
 
-@app.route(BASE_PATH + '/list/jobs/')
-@app.route(BASE_PATH + '/list/jobs')
-def jobs():
-    working = tasks.jobs()
-    finished = d.getJobs()
-    return json.dumps({"working":working, "finished":finished})
+@app.route(BASE_PATH + '/upload/', methods=["POST"])
+def upload():
+    ret={"status":"Procesando"}
+    today=datetime.date.today()
+    data = request.get_json()
+    video=data["id"]
+    prof=data["prof"]
+    texto1=data["texto1"]
+    texto2=data["texto2"]
+    tasks.upload_video(video,prof,texto1,texto2)
+    return jsonify(ret)
 
 @app.route(BASE_PATH + '/job')
 def job():
     job = tasks.jobrunner(tasks.long_job, ("test",))
     #job = tasks.long_job.delay("test")
-#    job = tasks.upload_video.delay("titulo","/home/david/photo_2016-07-10_13-49-56.jpg","/home/david/movie-1467033043.flv")
 
     ret = {"id":job.get_id()}
 
@@ -83,10 +106,6 @@ def get_results(job_key):
     return ret
 
 
-@app.route(BASE_PATH + '/uploaded')
-def uploaded_list():
-    ret=[]
-    return jsonify(ret)
 
 if __name__ == '__main__':
     app.run(host="0.0.0.0",port=PORT, debug=True)

+ 12 - 0
front/app.js

@@ -27,6 +27,18 @@ app.config(['$routeProvider', '$locationProvider', function ($routeProvider, $lo
 			}
 			}
 	})
+	.when('/upload/:id', {
+		templateUrl: 'views/upload.html',
+		controller: 'uploadCtrl',
+		resolve:{
+			video: function($http,$route) {
+				return $http.get('/back/processed/' + $route.current.params.id).then(
+					function(data) {
+						return data.data;
+					});
+			}
+			}
+	})
 	.otherwise({
 		redirectTo: '/'
 	});

+ 10 - 0
front/controllers/jobsCtrl.js

@@ -0,0 +1,10 @@
+app.controller('jobsCtrl', ['$scope', '$http', function ($scope, $http) {
+	$scope.update = function() {
+		$http.get('back/list/jobs').success(function(data) {
+	   		$scope.finished = data.finished;
+	   		$scope.working  = data.working;
+		});
+	};
+
+	$scope.update();
+}]);

+ 23 - 0
front/controllers/uploadCtrl.js

@@ -0,0 +1,23 @@
+app.controller('uploadCtrl', function ($scope, $http,video,notify) {
+	$scope.profesor="";
+	$scope.texto1="";
+	$scope.texto2="";
+	$scope.video = video; 
+
+	$scope.post = function() {
+		var data = {
+					prof: $scope.profesor,
+					texto1: $scope.texto1,
+					texto2: $scope.texto2,
+					id: $scope.video._id
+				};
+		$http.post('/back/upload/', data)
+		.success(function(data,state) {
+			notify({message:data.status,classes:"alert"});
+		})
+		.error(function(data) {
+			notify({message:data.status,classes:"alert alert-danger"});
+		});
+	};
+});
+

+ 1 - 0
front/index.html

@@ -18,6 +18,7 @@
 	<script type="text/javascript" src="/controllers/processedCtrl.js"></script>
 	<script type="text/javascript" src="/controllers/jobsCtrl.js"></script>
 	<script type="text/javascript" src="/controllers/cutCtrl.js"></script>
+	<script type="text/javascript" src="/controllers/uploadCtrl.js"></script>
     <base href="/" />
 </head>
 <body>

+ 1 - 1
front/views/processed.html

@@ -29,7 +29,7 @@
 			{{v.out_fname}}
 		</td>
 		<td>
-			<a ng-href="/#/cut/{{r._id}}">subir</a>
+			<a ng-href="/upload/{{v._id}}">subir</a>
 		</td>
 	</tr>
 </table>

+ 41 - 0
front/views/upload.html

@@ -0,0 +1,41 @@
+<div>
+	<label>
+		Subir {{video.out_fname}}
+	</label>
+	<div class="row">
+		<div class="col-md-6">
+			<video id="video" width="100%" controls preload>
+				<source src="{{video.out_fname}}" type="video/mp4">
+				Error. Video no soportado
+			</video>
+		</div>
+		<div class="col-md-6">
+
+			<div class="row">
+				<div class="col-md-6">
+					<div class="form-group">
+					    <label>Profesor</label>
+					    <input type="text" class="form-control" ng-model="profesor">
+					</div>
+				</div>
+				<div class="col-md-6">
+					<div class="form-group">
+					    <label>Texto1</label>
+					    <input type="text" class="form-control" ng-model="texto1">
+					</div>
+				</div>
+			</div>
+		
+			<div class="row">
+				<div class="col-md-6">
+					<div class="form-group">
+					    <label>Texto2</label>
+					    <input type="text" class="form-control" ng-model="texto2">
+					</div>
+				</div>
+			</div>
+		</div>
+	</div>
+
+	<button ng-click="post()" class="btn btn-default btn-send">Enviar</button>
+</div>