浏览代码

add cut support

David 10 年之前
父节点
当前提交
50d564d63b
共有 10 个文件被更改,包括 115 次插入30 次删除
  1. 2 0
      .gitignore
  2. 5 0
      back/constants.py
  3. 12 13
      back/db.py
  4. 6 2
      back/tasks.py
  5. 27 14
      back/web.py
  6. 4 0
      front/app.js
  7. 29 0
      front/controllers/cutCtrl.js
  8. 1 0
      front/index.html
  9. 28 0
      front/views/cut.html
  10. 1 1
      front/views/raw.html

+ 2 - 0
.gitignore

@@ -1,3 +1,5 @@
 *pyc
 */__pycache__/*
 *.swp
+/front/raw/*
+/front/videos/*

+ 5 - 0
back/constants.py

@@ -0,0 +1,5 @@
+PORT = 8981
+BASE_PATH="/back" #changes based on webserver
+
+RAW_PATH='/home/david/git/youtube-uploader/web/front/raw/'
+CUT_OUTPUT_PATH='/home/david/git/youtube-uploader/web/front/videos/'

+ 12 - 13
back/db.py

@@ -1,11 +1,11 @@
-from pymongo import MongoClient, errors, DESCENDING, ASCENDING
-from bson.objectid import ObjectId
 import time
 import re
 import os
 import subprocess
 
-RAW_DIRECTORY="/home/david"
+from bson.objectid import ObjectId
+from constants import RAW_PATH
+from pymongo import MongoClient, errors, DESCENDING, ASCENDING
 
 class db():
     DB = "videos"
@@ -16,19 +16,13 @@ class db():
         self.cut_files = self.client[self.DB]["cut"]
         self.ul_files  = self.client[self.DB]["ul"]
 
-    def jsonable(self, el):
-        if el is None or "_id" not in el:
-            return el
-
-        el["_id"] = str(el["_id"])
-        return el
 
     def raw(self, _id=None):
         ret = None
         if _id:
-            ret = self.raw_files.find_one({"_id": ObjectId(id)})
+            ret = jsonable(self.raw_files.find_one({"_id": ObjectId(_id)}))
         else:
-            ret = [ self.jsonable(r) for r in self.raw_files.find() ]
+            ret = [ jsonable(r) for r in self.raw_files.find() ]
 
         return ret
 
@@ -41,9 +35,9 @@ class db():
             return False
 
     def insert_raw_list(self):
-        for fname in os.listdir(RAW_DIRECTORY):
+        for fname in os.listdir(RAW_PATH):
             if fname.endswith("flv"):
-                self.insert_raw(file_info(os.path.join(RAW_DIRECTORY,fname)))
+                self.insert_raw(file_info(os.path.join(RAW_PATH,fname)))
 
 
 def get_video_length(fname):
@@ -60,4 +54,9 @@ def file_info(fname):
             'date': time.ctime(os.path.getctime(fname))
            }
 
+def jsonable(el):
+    if el is None or "_id" not in el:
+        return el
+    el["_id"] = str(el["_id"])
+    return el
 

+ 6 - 2
back/tasks.py

@@ -1,10 +1,11 @@
+import os.path
 import time
+
+from constants import CUT_OUTPUT_PATH
 from subprocess import Popen,PIPE
 from rq import get_current_job
 from rq.decorators import job
 from worker import conn
-import os.path
-
 
 @job('default',connection=conn, timeout=30)
 def long_job(arg):
@@ -30,6 +31,7 @@ def cut_video(in_fname,start_time,end_time,out_fname):
         return { "status":"error",
                  "error": "El archivo %s no existe" % in_fname
                }
+    out_fname=os.path.join(CUT_OUTPUT_PATH,out_fname)
     if os.path.isfile(out_fname):
         return { "status":"error",
                  "error": "El archivo %s existe" % out_fname
@@ -43,6 +45,7 @@ def cut_video(in_fname,start_time,end_time,out_fname):
                 '-t', end_time,
                 '-c', 'copy',
                 '-movflags', '+faststart',
+                '-f','mp4',
                 out_fname
               ]
 
@@ -65,3 +68,4 @@ def run_process(process = None):
             job.save()
         else:
             break
+    return ""

+ 27 - 14
back/web.py

@@ -1,15 +1,14 @@
 #!/usr/bin/env python3
+from constants import BASE_PATH,PORT
+import datetime
 import json
 import tasks
 
 from db import db
-from flask import Flask, jsonify
+from flask import Flask, jsonify, request
 from rq import Queue
 from rq.job import Job
 from worker import conn
-
-PORT = 8981
-BASE_PATH="/back" #changes based on webserver
 app = Flask(__name__)
 d=db()
 @app.route(BASE_PATH + '/')
@@ -21,11 +20,25 @@ 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
+    return jsonify(ret)
+
+@app.route(BASE_PATH + '/cut/', methods=["POST"])
+def cut():
+    ret={"status":"Procesando"}
+    data = request.get_json()
+    video=d.raw(data["id"])
+    out_filename="%s_%s_%s.mp4" % (data["curso"], datetime.date.today().strftime('%Y%m%d'), data["desc"])
+    job = tasks.cut_video.delay(video["file"],data["inicio"],data["fin"],out_filename)
+    ret["job_id"]=job.get_id()
+    return jsonify(ret)
+
 @app.route(BASE_PATH + '/job')
 def job():
-    # func=tasks.cut_video , args=("/home/david/movie-1467033043.flv","0:45","1:48:00","/home/david/salida-cortada.mp4",), result_ttl=5000
-    #job = tasks.long_job.delay("test")
-    job = tasks.cut_video.delay("/home/david/movie-1467033043.flv","0:45","1:48:00","/home/david/salida-cortada.mp4")
+#    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()}
@@ -37,17 +50,17 @@ def job():
 def get_results(job_key):
 
     print(job_key)
-    job = Job.fetch(job_key, connection=conn)
+    try:
+        job = Job.fetch(job_key, connection=conn)
+    except:
+        return "Error. Probablemente job_key es invalido", 400
+
 
     if job.is_finished:
-        return str(job.result), 200
+        return "Result: %s" % str(job.result), 200
     else:
-        return "%s" % json.dumps(job.meta) , 202
+        return "Process: %s" % json.dumps(job.meta) , 202
 
-@app.route(BASE_PATH + '/cut')
-def cut_list():
-    ret=[]
-    return jsonify(ret)
 
 @app.route(BASE_PATH + '/uploaded')
 def uploaded_list():

+ 4 - 0
front/app.js

@@ -7,6 +7,10 @@ app.config(['$routeProvider', '$locationProvider', function ($routeProvider, $lo
 		templateUrl: 'views/raw.html',
 		controller: 'rawCtrl'
 	})
+	.when('/cut/:id', {
+		templateUrl: 'views/cut.html',
+		controller: 'cutCtrl'
+	})
 	.when('/processed', {
 		templateUrl: 'views/processed.html',
 		//controller: 'facturaCtrl'

+ 29 - 0
front/controllers/cutCtrl.js

@@ -0,0 +1,29 @@
+app.controller('cutCtrl', ['$scope', '$http','$routeParams', function ($scope, $http,$routeParams) {
+	$scope.inicio=0;
+	$scope.fin=0;
+	$scope.curso="";
+	$scope.desc="";
+
+	$scope.update = function() {
+		$http.get('/back/raw/' + $routeParams.id).success(function(data) {
+	   		$scope.video = data; 
+		});
+	};
+	$scope.post = function() {
+		var data = {
+					curso: $scope.curso,
+					desc: $scope.desc,
+					inicio: $scope.inicio,
+					fin: $scope.fin,
+					id: $routeParams.id
+				};
+		$http.post('/back/cut/', data).success(
+			function(data,state) {
+				console.log(data);
+			});
+	};
+
+	$scope.update();
+
+}]);
+

+ 1 - 0
front/index.html

@@ -15,6 +15,7 @@
 	<script type="text/javascript" src="/js/angular-notify/dist/angular-notify.js"></script>
 	<script type="text/javascript" src="/app.js"></script>
 	<script type="text/javascript" src="/controllers/rawCtrl.js"></script>
+	<script type="text/javascript" src="/controllers/cutCtrl.js"></script>
     <base href="/" />
 </head>
 <body>

+ 28 - 0
front/views/cut.html

@@ -0,0 +1,28 @@
+
+<div>
+	<div class="row">
+		<div class="col-md-6">
+			<video width="100%" controls preload>
+				<source src="{{video.file}}" type="video/mp4"> 
+			</video>
+		</div>
+		<div class="col-md-6">
+			<label>
+				Inicio:
+				<input ng-model="inicio" type="text">
+			</label>
+			<label>
+				Fin:
+				<input ng-model="fin" type="text">
+			</label>
+			<label>
+				Curso:
+				<input ng-model="curso" type="text">
+			</label>
+			<label>
+				Desc:
+				<input ng-model="desc" type="text">
+			</label>
+			<button ng-click="post()">Enviar</button>
+		</div>
+</div>

+ 1 - 1
front/views/raw.html

@@ -19,7 +19,7 @@ RAW
 			{{r.length}}
 		</td>
 		<td>
-			<a ng-href="/process/{{r.file}}">editar</a>
+			<a ng-href="/#/cut/{{r._id}}">editar</a>
 		</td>
 	</tr>
 </table>