BitMover/media.py

149 lines
4.9 KiB
Python

#!/usr/bin/env python
"""
Create the media object
"""
import os
from datetime import datetime
import ffmpeg
import sys
#Local Imports
from hashing import xx_hash, hash_path
from get_image_tag import get_image_date
# from configure import files
from lumberjack import timber
log = timber(__name__)
class Media:
""" media class """
def __init__(self, source_path,event,config):
""" init """
self.configuration = config
self.source_path_dir = os.path.dirname(source_path)
self.source_path_hash = hash_path(source_path)
self.event_name = event
self.file_name = os.path.basename(source_path)
self.dotted_file_ext = os.path.splitext(self.file_name)[1].lower()
self.file_ext = self.dotted_file_ext.split('.')[1]
self.file_type = self.get_file_type()
self.capture_date = get_capture_date(source_path,self.file_type)
self.store_originals = config['store_originals']
self.destination_path = self.set_destination_path()
self.destination_originals_path = ''
self.filehash = '' # Only populate this one if it's called upon.
def set_destination_path(self):
""" set the destination path for the file """
p = self.configuration['folders']['destination']['base'] + '/' \
+ self.capture_date[0] + '/' \
+ self.capture_date[0] + '-' \
+ self.capture_date[1] + '/' \
+ self.capture_date[0] + '-' \
+ self.capture_date[1] + '-' \
+ self.capture_date[2]
if self.event_name:
p = p + '-' + self.event_name
if self.file_type == 'image':
p = p + '/PHOTO'
if self.file_ext.lower() in ('jpg', 'jpeg'):
if self.store_originals is True:
self.destination_originals_path = p + '/ORIGINALS/JPG'
p = p + '/JPG'
else:
if self.store_originals is True:
self.destination_originals_path = p + '/ORIGINALS/RAW'
p = p + '/RAW'
elif self.file_type == 'video':
p = p + '/VIDEO'
elif self.file_type == 'audio':
p = p + '/AUDIO'
else:
log.critical(f'{self.file_type} is not known. You should have never landed here.')
return p
def generate_hash(self):
""" generate the hash and store it to self.filehash """
return xx_hash(self.source_path_dir)
def set_hash(self):
"""set the hash for the file """
self.filehash = self.generate_hash()
def get_hash(self):
""" a function to get return the hash """
if not self.filehash:
self.set_hash()
return self.filehash
def get_file_type(self):
""" determine if the extension is in the list of file types """
log.debug(f'get_file_type():')
for t in self.configuration['file_types']:
log.debug(f'Checking if file is part of {t}')
for e in self.configuration['file_types'][t]:
log.debug(f'Checking if {self.file_ext.lower()} ends with {e}')
if self.file_ext.lower().endswith(e):
log.debug(self.file_ext + ' ends with ' + e)
return t
else:
log.debug(self.file_ext + f' does not end with {e}')
def get_capture_date(path, f_type):
""" get capture date from meta """
log.debug(f'get_capture_date({path}, {f_type}')
if f_type == 'image':
stamp = get_image_date(path)
elif f_type == 'video':
try:
stamp = datetime.strptime(
ffmpeg.probe(path)['format']['tags']['creation_time'],
'%Y-%m-%dT%H:%M:%S.%f%z')
except:
try:
stamp = datetime.fromtimestamp(os.path.getctime(path))
except:
try:
stamp = datetime.strptime(
str('1900:01:01 00:00:00'), '%Y:%m:%d %H:%M:%S')
except:
log.critical(f'\nCould not get timestamp for {path}. Giving up.')
sys.exit()
elif f_type == 'audio':
try:
stamp = datetime.strptime(ffmpeg.probe(
path)['format']['tags']['date'], '%Y-%m-%d')
except KeyError as ke:
log.warning(f'\nError: {ke} for {path}. Trying getctime...')
try:
stamp = datetime.fromtimestamp(os.path.getctime(path))
except:
log.critical(f'\nCould not get timestamp for {path}. Giving up.')
sys.exit()
else:
try:
stamp = datetime.fromtimestamp(os.path.getctime(path))
except:
log.critical(f'\nCould not get timestamp for {path}. Giving up.')
sys.exit()
year = stamp.strftime("%Y")
month = stamp.strftime("%m")
day = stamp.strftime("%d")
return year, month, day