[DEV] rework path of data with id only for reference
This commit is contained in:
parent
682b36c167
commit
6f19f0cf11
3
.gitignore
vendored
3
.gitignore
vendored
@ -6,6 +6,9 @@
|
|||||||
/tmp
|
/tmp
|
||||||
/out-tsc
|
/out-tsc
|
||||||
|
|
||||||
|
dataPush
|
||||||
|
node_modules
|
||||||
|
|
||||||
# dependencies
|
# dependencies
|
||||||
applicationFront/node_modules
|
applicationFront/node_modules
|
||||||
|
|
||||||
|
@ -52,6 +52,19 @@ def add(_app, _name_api):
|
|||||||
return response.json(data_global_elements.get_interface(_name_api).gets())
|
return response.json(data_global_elements.get_interface(_name_api).gets())
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
class DataModelBdd:
|
||||||
|
id = int
|
||||||
|
size = int
|
||||||
|
sha512 = str
|
||||||
|
mime_type = str
|
||||||
|
original_name = [str, type(None)]
|
||||||
|
# creating time
|
||||||
|
create_date = str
|
||||||
|
|
||||||
|
data_global_elements.get_interface(_name_api).set_data_model(DataModelBdd)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@elem_blueprint.post('/' + _name_api, strict_slashes=True, stream=True)
|
@elem_blueprint.post('/' + _name_api, strict_slashes=True, stream=True)
|
||||||
@doc.summary("send new file data")
|
@doc.summary("send new file data")
|
||||||
@doc.description("Create a new data file (associated with his sha512.")
|
@doc.description("Create a new data file (associated with his sha512.")
|
||||||
@ -82,38 +95,49 @@ def add(_app, _name_api):
|
|||||||
sha1.update(body)
|
sha1.update(body)
|
||||||
file_stream.close()
|
file_stream.close()
|
||||||
print("SHA512: " + str(sha1.hexdigest()))
|
print("SHA512: " + str(sha1.hexdigest()))
|
||||||
destination_filename = os.path.join(_app.config['REST_MEDIA_DATA'], str(sha1.hexdigest()))
|
|
||||||
|
new_data = {
|
||||||
|
"size": total_size,
|
||||||
|
"sha512": str(sha1.hexdigest()),
|
||||||
|
'original_name': _request.headers["filename"],
|
||||||
|
'mime_type': _request.headers["mime-type"],
|
||||||
|
'create_date': datetime.datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%S.%f')[:-3] + 'Z'
|
||||||
|
}
|
||||||
|
# TODO: Check if the element already exist ...
|
||||||
|
|
||||||
|
return_bdd = data_global_elements.get_interface(_name_api).post(new_data)
|
||||||
|
|
||||||
|
basic_data_path = os.path.join(_app.config['REST_MEDIA_DATA'], str(return_bdd["id"]))
|
||||||
|
|
||||||
|
if not os.path.exists(basic_data_path):
|
||||||
|
os.makedirs(basic_data_path)
|
||||||
|
destination_filename = os.path.join(basic_data_path, "video")
|
||||||
|
"""
|
||||||
if os.path.isfile(destination_filename) == True:
|
if os.path.isfile(destination_filename) == True:
|
||||||
answer_data = {
|
answer_data = {
|
||||||
"size": total_size,
|
"size": total_size,
|
||||||
"sha512": str(sha1.hexdigest()),
|
"sha512": str(sha1.hexdigest()),
|
||||||
'filename': _request.headers["filename"],
|
'filename': _request.headers["filename"],
|
||||||
'mime-type': _request.headers["mime-type"],
|
'mime_type': _request.headers["mime-type"],
|
||||||
"already_exist": True,
|
"already_exist": True,
|
||||||
}
|
}
|
||||||
await _response.write(json.dumps(answer_data, sort_keys=True, indent=4))
|
await _response.write(json.dumps(answer_data, sort_keys=True, indent=4))
|
||||||
return
|
return
|
||||||
|
"""
|
||||||
|
|
||||||
# move the file
|
# move the file
|
||||||
shutil.move(temporary_file, destination_filename)
|
shutil.move(temporary_file, destination_filename)
|
||||||
|
|
||||||
# collect media info ...
|
# collect media info ...
|
||||||
media_info = MediaInfo.parse(destination_filename)
|
media_info = MediaInfo.parse(destination_filename)
|
||||||
data_metafile = {
|
data_metafile = {
|
||||||
"sha512": str(sha1.hexdigest()),
|
"sha512": str(sha1.hexdigest()),
|
||||||
"size": total_size,
|
"size": total_size,
|
||||||
'filename': _request.headers["filename"],
|
'filename': _request.headers["filename"],
|
||||||
'mime-type': _request.headers["mime-type"],
|
'mime_type': _request.headers["mime-type"],
|
||||||
'media-info': json.loads(media_info.to_json())
|
'media_info': json.loads(media_info.to_json())
|
||||||
}
|
}
|
||||||
tools.file_write_data(destination_filename + ".meta", json.dumps(data_metafile, sort_keys=True, indent=4))
|
tools.file_write_data(os.path.join(basic_data_path, "meta.json"), json.dumps(data_metafile, sort_keys=True, indent=4))
|
||||||
answer_data = {
|
await _response.write(json.dumps(return_bdd, sort_keys=True, indent=4))
|
||||||
"size": total_size,
|
|
||||||
"sha512": str(sha1.hexdigest()),
|
|
||||||
'filename': _request.headers["filename"],
|
|
||||||
'mime-type': _request.headers["mime-type"],
|
|
||||||
"already_exist": True,
|
|
||||||
}
|
|
||||||
await _response.write(json.dumps(answer_data, sort_keys=True, indent=4))
|
|
||||||
return response.stream(streaming, content_type='application/json')
|
return response.stream(streaming, content_type='application/json')
|
||||||
|
|
||||||
@elem_blueprint.get('/' + _name_api + '/<id:string>', strict_slashes=True)
|
@elem_blueprint.get('/' + _name_api + '/<id:string>', strict_slashes=True)
|
||||||
@ -130,9 +154,10 @@ def add(_app, _name_api):
|
|||||||
id = id[:-4]
|
id = id[:-4]
|
||||||
if id[-4:] == ".ts":
|
if id[-4:] == ".ts":
|
||||||
id = id[:-3]
|
id = id[:-3]
|
||||||
filename = os.path.join(_app.config['REST_MEDIA_DATA'], id)
|
filename = os.path.join(_app.config['REST_MEDIA_DATA'], id, "video")
|
||||||
|
value = data_global_elements.get_interface(_name_api).get(id)
|
||||||
headers = {
|
headers = {
|
||||||
'Content-Type': 'video/x-matroska',
|
'Content-Type': value["mime_type"],
|
||||||
'Accept-Ranges': 'Accept-Ranges: bytes'
|
'Accept-Ranges': 'Accept-Ranges: bytes'
|
||||||
}
|
}
|
||||||
try:
|
try:
|
||||||
|
@ -66,7 +66,7 @@ def add(_app, _name_api):
|
|||||||
|
|
||||||
class DataModelBdd:
|
class DataModelBdd:
|
||||||
id = int
|
id = int
|
||||||
sha512 = str
|
data_id = int
|
||||||
type_id = int
|
type_id = int
|
||||||
saison_id = [int, type(None)]
|
saison_id = [int, type(None)]
|
||||||
episode = [int, type(None)]
|
episode = [int, type(None)]
|
||||||
@ -109,7 +109,7 @@ def add(_app, _name_api):
|
|||||||
@doc.consumes(DataModel, location='body')#, required=True)
|
@doc.consumes(DataModel, location='body')#, required=True)
|
||||||
@doc.response_success(status=201, description='If successful created')
|
@doc.response_success(status=201, description='If successful created')
|
||||||
async def create(request):
|
async def create(request):
|
||||||
for type_key in ["sha512","type_id","name"]:
|
for type_key in ["data_id","type_id","name"]:
|
||||||
if type_key not in request.json.keys():
|
if type_key not in request.json.keys():
|
||||||
raise ServerError("Bad Request: Missing Key '" + type_key + "'", status_code=400)
|
raise ServerError("Bad Request: Missing Key '" + type_key + "'", status_code=400)
|
||||||
for type_key in ["create_date"]:
|
for type_key in ["create_date"]:
|
||||||
@ -120,7 +120,7 @@ def add(_app, _name_api):
|
|||||||
request.json[type_key] = None
|
request.json[type_key] = None
|
||||||
request.json["create_date"] = datetime.datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%S.%f')[:-3] + 'Z'
|
request.json["create_date"] = datetime.datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%S.%f')[:-3] + 'Z'
|
||||||
#Find if already exist
|
#Find if already exist
|
||||||
list_elem = data_global_elements.get_interface(_name_api).find(["group_id", "sha512"], request.json);
|
list_elem = data_global_elements.get_interface(_name_api).find(["group_id", "data_id"], request.json);
|
||||||
for elem in list_elem:
|
for elem in list_elem:
|
||||||
return response.json(elem)
|
return response.json(elem)
|
||||||
|
|
||||||
|
@ -118,6 +118,7 @@ def add_interface(_name, _default_value = None):
|
|||||||
interface.reset_with_value(_default_value);
|
interface.reset_with_value(_default_value);
|
||||||
data_global_elements.add_interface(_name, interface)
|
data_global_elements.add_interface(_name, interface)
|
||||||
|
|
||||||
|
add_interface(data_global_elements.API_DATA)
|
||||||
add_interface(data_global_elements.API_TYPE, default_values_type)
|
add_interface(data_global_elements.API_TYPE, default_values_type)
|
||||||
add_interface(data_global_elements.API_GROUP)
|
add_interface(data_global_elements.API_GROUP)
|
||||||
add_interface(data_global_elements.API_SAISON)
|
add_interface(data_global_elements.API_SAISON)
|
||||||
|
@ -126,8 +126,9 @@ def push_video_file(_path, _basic_key={}):
|
|||||||
return True
|
return True
|
||||||
|
|
||||||
debug.info("Add media : '" + _path + "'")
|
debug.info("Add media : '" + _path + "'")
|
||||||
if file_extension[1:] not in ["webm", "avi", "mkv", "mov", "mp4", "ts"] \
|
# "avi", , "mov", , "ts", "cover_1.tiff", "cover_1.bmp", "cover_1.tga"] copy only file that is supported by the html5 video player (chrome mode only)
|
||||||
and file_name not in ["cover_1.jpg","cover_1.png", "cover_1.till", "cover_1.bmp", "cover_1.tga"]:
|
if file_extension[1:] not in ["webm", "mkv", "mp4"] \
|
||||||
|
and file_name not in ["cover_1.jpg","cover_1.png"]:
|
||||||
debug.warning("Not send file : " + _path + " Not manage file_extension... " + file_extension)
|
debug.warning("Not send file : " + _path + " Not manage file_extension... " + file_extension)
|
||||||
return False
|
return False
|
||||||
|
|
||||||
@ -217,10 +218,25 @@ def push_video_file(_path, _basic_key={}):
|
|||||||
if mediaId == 0:
|
if mediaId == 0:
|
||||||
debug.error("Get media ID = 0 With no error");
|
debug.error("Get media ID = 0 With no error");
|
||||||
return False;
|
return False;
|
||||||
|
|
||||||
"""
|
"""
|
||||||
mime = magic.Magic(mime=True)
|
mime = magic.Magic(mime=True)
|
||||||
mime_type = mime.from_file(_path)
|
mime_type = mime.from_file(_path)
|
||||||
|
# do it by myself .. it is better ...
|
||||||
|
filename___, file_extension = os.path.splitext(_path)
|
||||||
|
if file_extension == "mkv":
|
||||||
|
mime_type = "video/x-matroska"
|
||||||
|
elif file_extension == "mka":
|
||||||
|
mime_type = "audio/x-matroska"
|
||||||
|
elif file_extension == "mp4":
|
||||||
|
mime_type = "video/mp4"
|
||||||
|
elif file_extension == "webm":
|
||||||
|
mime_type = "video/webm"
|
||||||
|
elif file_extension == "json":
|
||||||
|
mime_type = "application/json"
|
||||||
|
elif file_extension == "jpeg":
|
||||||
|
mime_type = "image/jpeg"
|
||||||
|
elif file_extension == "png":
|
||||||
|
mime_type = "image/png"
|
||||||
headers_values = {'filename': _path, 'mime-type': mime_type}
|
headers_values = {'filename': _path, 'mime-type': mime_type}
|
||||||
result_send_data = requests.post("http://127.0.0.1:15080/data", headers=headers_values, data=upload_in_chunks(_path, chunksize=4096))
|
result_send_data = requests.post("http://127.0.0.1:15080/data", headers=headers_values, data=upload_in_chunks(_path, chunksize=4096))
|
||||||
debug.info("result *********** : " + str(result_send_data) + " " + result_send_data.text)
|
debug.info("result *********** : " + str(result_send_data) + " " + result_send_data.text)
|
||||||
|
287
back/tools/videoTranscode.py
Executable file
287
back/tools/videoTranscode.py
Executable file
@ -0,0 +1,287 @@
|
|||||||
|
#!/usr/bin/python
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
##
|
||||||
|
## @author Edouard DUPIN
|
||||||
|
##
|
||||||
|
## @copyright 2016, Edouard DUPIN, all right reserved
|
||||||
|
##
|
||||||
|
## @license APACHE v2.0 (see license file)
|
||||||
|
##
|
||||||
|
import os
|
||||||
|
import fnmatch
|
||||||
|
import sys
|
||||||
|
import subprocess
|
||||||
|
import shlex
|
||||||
|
##
|
||||||
|
## @brief Execute the command with no get of output
|
||||||
|
##
|
||||||
|
def run_command(cmd_line):
|
||||||
|
# prepare command line:
|
||||||
|
args = shlex.split(cmd_line)
|
||||||
|
print("[INFO] cmd = " + str(args))
|
||||||
|
try:
|
||||||
|
# create the subprocess
|
||||||
|
p = subprocess.Popen(args)
|
||||||
|
except subprocess.CalledProcessError as e:
|
||||||
|
print("[ERROR] subprocess.CalledProcessError : " + str(args))
|
||||||
|
return False
|
||||||
|
#except:
|
||||||
|
# debug.error("Exception on : " + str(args))
|
||||||
|
# launch the subprocess:
|
||||||
|
output, err = p.communicate()
|
||||||
|
# Check error :
|
||||||
|
if p.returncode == 0:
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
##
|
||||||
|
## @brief Get list of all Files in a specific path (with a regex)
|
||||||
|
## @param[in] path (string) Full path of the machine to search files (start with / or x:)
|
||||||
|
## @param[in] regex (string) Regular expression to search data
|
||||||
|
## @param[in] recursive (bool) List file with recursive search
|
||||||
|
## @param[in] remove_path (string) Data to remove in the path
|
||||||
|
## @return (list) return files requested
|
||||||
|
##
|
||||||
|
def get_list_of_file_in_path(path, regex="*", recursive = False, remove_path=""):
|
||||||
|
out = []
|
||||||
|
if os.path.isdir(os.path.realpath(path)):
|
||||||
|
tmp_path = os.path.realpath(path)
|
||||||
|
tmp_rule = regex
|
||||||
|
else:
|
||||||
|
debug.error("path does not exist : '" + str(path) + "'")
|
||||||
|
|
||||||
|
for root, dirnames, filenames in os.walk(tmp_path):
|
||||||
|
deltaRoot = root[len(tmp_path):]
|
||||||
|
while len(deltaRoot) > 0 \
|
||||||
|
and ( deltaRoot[0] == '/' \
|
||||||
|
or deltaRoot[0] == '\\' ):
|
||||||
|
deltaRoot = deltaRoot[1:]
|
||||||
|
if recursive == False \
|
||||||
|
and deltaRoot != "":
|
||||||
|
return out
|
||||||
|
tmpList = filenames
|
||||||
|
if len(tmp_rule) > 0:
|
||||||
|
tmpList = fnmatch.filter(filenames, tmp_rule)
|
||||||
|
# Import the module :
|
||||||
|
for cycleFile in tmpList:
|
||||||
|
#for cycleFile in filenames:
|
||||||
|
add_file = os.path.join(tmp_path, deltaRoot, cycleFile)
|
||||||
|
if len(remove_path) != 0:
|
||||||
|
if add_file[:len(remove_path)] != remove_path:
|
||||||
|
print("ERROR : Request remove start of a path that is not the same: '" + add_file[:len(remove_path)] + "' demand remove of '" + str(remove_path) + "'")
|
||||||
|
else:
|
||||||
|
add_file = add_file[len(remove_path)+1:]
|
||||||
|
out.append(add_file)
|
||||||
|
return out;
|
||||||
|
|
||||||
|
#ffmpeg -i 000.ts -threads 0 -vcodec libx264 -crf 20 -force_key_frames expr:gte\(t,n_forced*1\) -s 720x540 -acodec mp2 -ac 2 -ab 192k -ar 48000 -async 1 -deinterlace 000_transcoded.ts
|
||||||
|
#ffmpeg -i 000.ts -threads 0 -vcodec libx264 -crf 20 -force_key_frames expr:gte\(t,n_forced*1\) -acodec mp2 -ac 2 -ab 192k -ar 48000 -async 1 -deinterlace 000_transcoded.ts
|
||||||
|
|
||||||
|
list_files_ts = get_list_of_file_in_path('.', "*.ts")
|
||||||
|
list_files_flv = get_list_of_file_in_path('.', "*.flv")
|
||||||
|
list_files_mp4 = get_list_of_file_in_path('.', "*.mp4")
|
||||||
|
list_files_avi = get_list_of_file_in_path('.', "*.avi")
|
||||||
|
list_files_mkv = get_list_of_file_in_path('.', "*.mkv")
|
||||||
|
list_files_wmv = get_list_of_file_in_path('.', "*.wmv")
|
||||||
|
list_files_divx = get_list_of_file_in_path('.', "*.divx")
|
||||||
|
list_files_webm = get_list_of_file_in_path('.', "*.webm")
|
||||||
|
|
||||||
|
# remove all encoded element in the other files (TS)
|
||||||
|
for elem_mkv in list_files_mkv:
|
||||||
|
index = 0
|
||||||
|
for elem_ts in list_files_ts:
|
||||||
|
if elem_mkv[:-3]+"ts" == elem_ts:
|
||||||
|
break;
|
||||||
|
index += 1
|
||||||
|
if index != len(list_files_ts):
|
||||||
|
print("[INFO] remove from list '" + list_files_ts[index] + "' ==> already transcoded")
|
||||||
|
del list_files_ts[index]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# remove all encoded element in the other files (FLV)
|
||||||
|
for elem_mkv in list_files_mkv:
|
||||||
|
index = 0
|
||||||
|
for elem_flv in list_files_flv:
|
||||||
|
if elem_mkv[:-3]+"flv" == elem_flv:
|
||||||
|
break;
|
||||||
|
index += 1
|
||||||
|
if index != len(list_files_flv):
|
||||||
|
print("[INFO] remove from list '" + list_files_flv[index] + "' ==> already transcoded")
|
||||||
|
del list_files_flv[index]
|
||||||
|
|
||||||
|
|
||||||
|
# remove all encoded element in the other files (mp4)
|
||||||
|
for elem_mkv in list_files_mkv:
|
||||||
|
index = 0
|
||||||
|
for elem_mp4 in list_files_mp4:
|
||||||
|
if elem_mkv[:-3]+"mp4" == elem_mp4:
|
||||||
|
break;
|
||||||
|
index += 1
|
||||||
|
if index != len(list_files_mp4):
|
||||||
|
print("[INFO] remove from list '" + list_files_mp4[index] + "' ==> already transcoded")
|
||||||
|
del list_files_mp4[index]
|
||||||
|
|
||||||
|
|
||||||
|
# remove all encoded element in the other files (TS)
|
||||||
|
for elem_mkv in list_files_mkv:
|
||||||
|
index = 0
|
||||||
|
for elem_avi in list_files_avi:
|
||||||
|
if elem_mkv[:-3]+"ts" == elem_avi:
|
||||||
|
break;
|
||||||
|
index += 1
|
||||||
|
if index != len(list_files_avi):
|
||||||
|
print("[INFO] remove from list '" + list_files_avi[index] + "' ==> already transcoded")
|
||||||
|
del list_files_avi[index]
|
||||||
|
|
||||||
|
|
||||||
|
# remove all encoded element in the other files (wmv)
|
||||||
|
for elem_mkv in list_files_mkv:
|
||||||
|
index = 0
|
||||||
|
for elem_wmv in list_files_wmv:
|
||||||
|
if elem_mkv[:-3]+"wmv" == elem_wmv:
|
||||||
|
break;
|
||||||
|
index += 1
|
||||||
|
if index != len(list_files_wmv):
|
||||||
|
print("[INFO] remove from list '" + list_files_wmv[index] + "' ==> already transcoded")
|
||||||
|
del list_files_wmv[index]
|
||||||
|
|
||||||
|
# remove all encoded element in the other files (divx)
|
||||||
|
for elem_mkv in list_files_mkv:
|
||||||
|
index = 0
|
||||||
|
for elem_divx in list_files_divx:
|
||||||
|
if elem_mkv[:-3]+"divx" == elem_divx:
|
||||||
|
break;
|
||||||
|
index += 1
|
||||||
|
if index != len(list_files_divx):
|
||||||
|
print("[INFO] remove from list '" + list_files_divx[index] + "' ==> already transcoded")
|
||||||
|
del list_files_divx[index]
|
||||||
|
|
||||||
|
print("list of elements TS : ")
|
||||||
|
for elem in list_files_ts:
|
||||||
|
print(" - '" + elem + "'")
|
||||||
|
print("list of elements MP4 : ")
|
||||||
|
for elem in list_files_mp4:
|
||||||
|
print(" - '" + elem + "'")
|
||||||
|
print("list of elements FLV : ")
|
||||||
|
for elem in list_files_flv:
|
||||||
|
print(" - '" + elem + "'")
|
||||||
|
print("list of elements AVI : ")
|
||||||
|
for elem in list_files_avi:
|
||||||
|
print(" - '" + elem + "'")
|
||||||
|
print("list of elements WMV : ")
|
||||||
|
for elem in list_files_wmv:
|
||||||
|
print(" - '" + elem + "'")
|
||||||
|
print("list of elements MKV : ")
|
||||||
|
for elem in list_files_mkv:
|
||||||
|
print(" - '" + elem + "'")
|
||||||
|
print("list of elements divx : ")
|
||||||
|
for elem in list_files_divx:
|
||||||
|
print(" - '" + elem + "'")
|
||||||
|
print("list of elements webm : ")
|
||||||
|
for elem in list_files_webm:
|
||||||
|
print(" - '" + elem + "'")
|
||||||
|
|
||||||
|
|
||||||
|
from pymediainfo import MediaInfo
|
||||||
|
|
||||||
|
def trancode_local(list_of_file=[], extention="ts", total_count_of_file=0, offset=0) :
|
||||||
|
print("Start strancoding: '." + extention + "' ... " + str(len(list_of_file)))
|
||||||
|
id_elem = 0
|
||||||
|
for elem in list_of_file:
|
||||||
|
id_elem += 1
|
||||||
|
print(" ========================================================================================")
|
||||||
|
print(" == " + str(offset+id_elem) + " / " + str(total_count_of_file))
|
||||||
|
print(" == Trancode: '" + elem.replace("'", "\'") + "'")
|
||||||
|
print(" ========================================================================================")
|
||||||
|
# collect media info ...
|
||||||
|
#if it is a mk: .. chack the opus format...
|
||||||
|
if extention == "mkv":
|
||||||
|
media_info = MediaInfo.parse(elem)
|
||||||
|
print("media-info: ... " + str(len(media_info.tracks)))
|
||||||
|
need_trascode_audio = False
|
||||||
|
for elem_track in media_info.tracks:
|
||||||
|
data_print = "[" + str(elem_track.track_id) + "] " + str(elem_track.track_type)
|
||||||
|
#print('track_id = ' + str(elem_track.track_id))
|
||||||
|
#print('track_type = ' + str(elem_track.track_type))
|
||||||
|
if elem_track.track_type == "Audio":
|
||||||
|
data_print += " (" + str(elem_track.language) + ") enc=" + str(elem_track.format);
|
||||||
|
#print('language = ' + str(elem_track.language))
|
||||||
|
#print('format = ' + str(elem_track.format))
|
||||||
|
if elem_track.format != "Opus":
|
||||||
|
need_trascode_audio = True
|
||||||
|
elif elem_track.track_type == "Video":
|
||||||
|
data_print += " enc=" + str(elem_track.format);
|
||||||
|
print(" - " + data_print)
|
||||||
|
#print("media-info: ..." + str(dir(elem_track)))
|
||||||
|
if need_trascode_audio == False:
|
||||||
|
print(" ==> No transcoding, already in the good format...")
|
||||||
|
continue
|
||||||
|
|
||||||
|
|
||||||
|
"""
|
||||||
|
media_info = MediaInfo.parse(elem)
|
||||||
|
print("media-info: ..." + str(len(media_info.tracks)))
|
||||||
|
for elem_track in media_info.tracks:
|
||||||
|
print('track_type = ' + str(elem_track.track_type))
|
||||||
|
print('track_id = ' + str(elem_track.track_id))
|
||||||
|
print('language = ' + str(elem_track.language))
|
||||||
|
#print("media-info: ..." + str(dir(elem_track)))
|
||||||
|
continue
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
cmd_line = "ffmpeg -i "
|
||||||
|
cmd_line += elem.replace(" ", "\ ").replace("'", "\\'")
|
||||||
|
#cmd_line += " -threads 4 -vcodec libx264 -crf 22 -force_key_frames expr:gte\(t,n_forced*1\) -acodec mp2 -ac 2 -ab 192k -ar 48000 -async 1 -deinterlace zzz_transcoded.mkv_tmp"
|
||||||
|
#cmd_line += " -threads 4 -vcodec copy -acodec mp2 -ac 2 -ab 192k -ar 48000 -async 1 -deinterlace tmp_transcoded.avi"
|
||||||
|
#cmd_line += " -threads 4 -vcodec copy -acodec mp2 -ac 2 -ab 192k -ar 48000 -async 1 -deinterlace tmp_transcoded.mp4"
|
||||||
|
#cmd_line += " -threads 6 -c:v libvpx-vp9 -lossless 1 -c:a libopus -b:a 128k -deinterlace tmp_transcoded.webm"
|
||||||
|
#cmd_line += " -threads 6 -c:v libvpx-vp9 -row-mt 1 -c:a libopus -b:a 128k -deinterlace tmp_transcoded.webm"
|
||||||
|
# -map 0:v ==> copy all video stream
|
||||||
|
# -map 0:a ==> copy all audio stream
|
||||||
|
# -map 0:s ==> copy all subtitle stream
|
||||||
|
|
||||||
|
cmd_line += " -map 0:v -map 0:a -c:v copy -c:a libopus -b:a 128k -deinterlace -threads 6 zzz_transcoded.mkv_tmp"
|
||||||
|
#cmd_line += " -threads 4 -vcodec copy -acodec copy tmp_transcoded.webm"
|
||||||
|
ret = run_command(cmd_line)
|
||||||
|
print(" ret value = " + str(ret))
|
||||||
|
if ret == False:
|
||||||
|
print("[ERROR] Trancode: error occured ...")
|
||||||
|
exit(-1)
|
||||||
|
print(" move in: '" + elem[:-len(extention)] + "mkv'")
|
||||||
|
cmd_line = "mv " + elem.replace(" ", "\ ").replace("'", "\\'") + " " + elem.replace(" ", "\ ").replace("'", "\\'") + "__"
|
||||||
|
ret = run_command(cmd_line)
|
||||||
|
cmd_line = "mv zzz_transcoded.mkv_tmp " + elem.replace(" ", "\ ").replace("'", "\\'")[:-len(extention)] + "mkv"
|
||||||
|
ret = run_command(cmd_line)
|
||||||
|
|
||||||
|
|
||||||
|
#cmd_line = "mv " + elem.replace(" ", "\ ").replace("'", "\\'") + " last_transcoded.ts"
|
||||||
|
#ret = run_command(cmd_line)
|
||||||
|
#break
|
||||||
|
|
||||||
|
full_list_size = len(list_files_ts) + len(list_files_mp4) + len(list_files_flv) + len(list_files_avi) + len(list_files_wmv) + len(list_files_divx)
|
||||||
|
offset = 0;
|
||||||
|
|
||||||
|
trancode_local(list_files_ts , "ts", full_list_size, offset)
|
||||||
|
offset += len(list_files_ts)
|
||||||
|
trancode_local(list_files_mp4 , "mp4", full_list_size, offset)
|
||||||
|
offset += len(list_files_mp4)
|
||||||
|
trancode_local(list_files_flv , "flv", full_list_size, offset)
|
||||||
|
offset += len(list_files_flv)
|
||||||
|
trancode_local(list_files_avi , "avi", full_list_size, offset)
|
||||||
|
offset += len(list_files_avi)
|
||||||
|
trancode_local(list_files_wmv , "wmv", full_list_size, offset)
|
||||||
|
offset += len(list_files_wmv)
|
||||||
|
trancode_local(list_files_divx , "divx", full_list_size, offset)
|
||||||
|
offset += len(list_files_divx)
|
||||||
|
trancode_local(list_files_mkv , "mkv", full_list_size, offset)
|
||||||
|
offset += len(list_files_mkv)
|
||||||
|
#trancode_local(list_files_webm , "webm", full_list_size, offset)
|
||||||
|
#offset += len(list_files_webm)
|
||||||
|
|
||||||
|
## extract a thumb from a video
|
||||||
|
## ffmpeg -i Passenger.mkv -ss 00:05:00 -f image2 -vframes 1 thumb.jpg
|
||||||
|
|
@ -30,7 +30,7 @@ export class ElementVideoComponent implements OnInit {
|
|||||||
episode:number = undefined
|
episode:number = undefined
|
||||||
group_id:number = undefined
|
group_id:number = undefined
|
||||||
saison_id:number = undefined
|
saison_id:number = undefined
|
||||||
sha512:string = ""
|
data_id:number = -1
|
||||||
time:number = undefined
|
time:number = undefined
|
||||||
type_id:number = undefined
|
type_id:number = undefined
|
||||||
generated_name:string = ""
|
generated_name:string = ""
|
||||||
@ -53,11 +53,11 @@ export class ElementVideoComponent implements OnInit {
|
|||||||
self.episode = response.episode;
|
self.episode = response.episode;
|
||||||
self.group_id = response.group_id;
|
self.group_id = response.group_id;
|
||||||
self.saison_id = response.saison_id;
|
self.saison_id = response.saison_id;
|
||||||
self.sha512 = response.sha512;
|
self.data_id = response.data_id;
|
||||||
self.time = response.time;
|
self.time = response.time;
|
||||||
self.generated_name = response.generated_name;
|
self.generated_name = response.generated_name;
|
||||||
if (self.sha512 != "") {
|
if (self.data_id != -1) {
|
||||||
self.video_source = "http://localhost:15080/data/" + self.sha512 + ".mp4";
|
self.video_source = "http://localhost:15080/data/" + self.data_id + ".mp4";
|
||||||
self.video_enable = true;
|
self.video_enable = true;
|
||||||
} else {
|
} else {
|
||||||
self.video_source = "";
|
self.video_source = "";
|
||||||
@ -72,7 +72,7 @@ export class ElementVideoComponent implements OnInit {
|
|||||||
self.episode = undefined;
|
self.episode = undefined;
|
||||||
self.group_id = undefined;
|
self.group_id = undefined;
|
||||||
self.saison_id = undefined;
|
self.saison_id = undefined;
|
||||||
self.sha512 = "";
|
self.data_id = -1;
|
||||||
self.time = undefined;
|
self.time = undefined;
|
||||||
self.generated_name = "";
|
self.generated_name = "";
|
||||||
self.video_source = "";
|
self.video_source = "";
|
||||||
|
@ -29,7 +29,7 @@ export class VideoDetailComponent implements OnInit {
|
|||||||
episode:number = undefined
|
episode:number = undefined
|
||||||
group_id:number = undefined
|
group_id:number = undefined
|
||||||
saison_id:number = undefined
|
saison_id:number = undefined
|
||||||
sha512:string = ""
|
data_id:number = -1
|
||||||
time:number = undefined
|
time:number = undefined
|
||||||
type_id:number = undefined
|
type_id:number = undefined
|
||||||
generated_name:string = ""
|
generated_name:string = ""
|
||||||
@ -54,11 +54,11 @@ export class VideoDetailComponent implements OnInit {
|
|||||||
self.episode = response.episode;
|
self.episode = response.episode;
|
||||||
self.group_id = response.group_id;
|
self.group_id = response.group_id;
|
||||||
self.saison_id = response.saison_id;
|
self.saison_id = response.saison_id;
|
||||||
self.sha512 = response.sha512;
|
self.data_id = response.data_id;
|
||||||
self.time = response.time;
|
self.time = response.time;
|
||||||
self.generated_name = response.generated_name;
|
self.generated_name = response.generated_name;
|
||||||
if (self.sha512 != "") {
|
if (self.data_id != -1) {
|
||||||
self.video_source = "http://localhost:15080/data/" + self.sha512 + ".mp4";
|
self.video_source = "http://localhost:15080/data/" + self.data_id + ".mp4";
|
||||||
} else {
|
} else {
|
||||||
self.video_source = "";
|
self.video_source = "";
|
||||||
}
|
}
|
||||||
@ -71,7 +71,7 @@ export class VideoDetailComponent implements OnInit {
|
|||||||
self.episode = undefined;
|
self.episode = undefined;
|
||||||
self.group_id = undefined;
|
self.group_id = undefined;
|
||||||
self.saison_id = undefined;
|
self.saison_id = undefined;
|
||||||
self.sha512 = "";
|
self.data_id = -1;
|
||||||
self.time = undefined;
|
self.time = undefined;
|
||||||
self.generated_name = "";
|
self.generated_name = "";
|
||||||
self.video_source = "";
|
self.video_source = "";
|
||||||
|
Loading…
x
Reference in New Issue
Block a user