db.py 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. import datetime
  2. import time
  3. import re
  4. import os
  5. import subprocess
  6. from bson.objectid import ObjectId
  7. from constants import RAW_PATH, DB_IP
  8. from pymongo import MongoClient, errors, DESCENDING, ASCENDING
  9. class db():
  10. DB = "videos"
  11. def __init__(self):
  12. self.client = MongoClient(DB_IP, 27017)
  13. self.raw_files = self.client[self.DB]["raw"]
  14. self.cut_files = self.client[self.DB]["cut"]
  15. self.ul_files = self.client[self.DB]["ul"]
  16. def uploaded(self):
  17. ret = []
  18. for f in self.ul_files.find():
  19. item = jsonable(f)
  20. item["enqueued_at"]=item["enqueued_at"].strftime("%d/%m/%Y %H:%M")
  21. item["finished_at"]=item["finished_at"].strftime("%d/%m/%Y %H:%M")
  22. ret.append(item)
  23. return ret
  24. def raw(self, _id=None):
  25. ret = None
  26. if _id:
  27. ret = jsonable(self.raw_files.find_one({"_id": ObjectId(_id)}))
  28. else:
  29. ret=[]
  30. for r in self.raw_files.find():
  31. item = jsonable(r)
  32. #item["date"]=item["date"].strftime("%d/%m/%Y %H:%M")
  33. ret.append(item)
  34. return ret
  35. def processed(self, _id=None):
  36. ret = None
  37. if _id:
  38. ret = jsonable(self.cut_files.find_one({"_id": ObjectId(_id)}))
  39. else:
  40. ret = [ jsonable(c) for c in self.cut_files.find() ]
  41. return ret
  42. def insert_uploaded(self, data):
  43. try:
  44. self.ul_files.insert_one(data)
  45. return True
  46. except errors.DuplicateKeyError:
  47. print("Dup")
  48. return False
  49. def insert_processed(self, data):
  50. try:
  51. self.cut_files.insert_one(data)
  52. return True
  53. except errors.DuplicateKeyError:
  54. print("Dup")
  55. return False
  56. def insert_raw(self, rawfile):
  57. try:
  58. print(rawfile)
  59. self.raw_files.insert_one(rawfile)
  60. return True
  61. except errors.DuplicateKeyError:
  62. print("Dup")
  63. return False
  64. def insert_raw_list(self):
  65. for fname in os.listdir(RAW_PATH):
  66. if fname.endswith("mp4"):
  67. self.insert_raw(file_info(os.path.join(RAW_PATH,fname)))
  68. def get_video_length(fname):
  69. process="ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 -sexagesimal %s" % fname
  70. process=process.split(" ")
  71. out,err= subprocess.Popen(process,stdout=subprocess.PIPE).communicate()
  72. out=out.decode('utf-8')
  73. if "." in out:
  74. out = out.split(".")[0]
  75. return out
  76. def file_info(fname):
  77. return {'file':fname,
  78. 'length': get_video_length(fname),
  79. 'date': time.ctime(os.path.getctime(fname))
  80. }
  81. def jsonable(el):
  82. if el is None or "_id" not in el:
  83. return el
  84. el["_id"] = str(el["_id"])
  85. return el