XenoTheStrange

Remove Watermarks From Videos (9anime.to, 1080p Only) [Python, FFMPEG][in progress]

May 6th, 2022 (edited)
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.99 KB | None | 0 0
  1. #!/usr/bin/python3
  2.  
  3. import os
  4. import sys
  5. import codecs
  6. import subprocess
  7. from json import loads
  8. from PIL import Image
  9.  
  10. dbg = False
  11. logging_enabled = True
  12.  
  13. #USAGE ./script.py "dir"
  14. #dir needs a / at the end
  15. #this will decode the mask img if needed then begin processing all files in that    (which should all be videos)
  16. #by default this will work for 1920x1080 so you'll need to tweak it for anything else
  17. #TODO try automatic resizing the mask using PIL (see below todo note)
  18.  
  19. mask_1920x1080 = b'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\ncV3S7bbE27Vfzm9bHKbL05dUjmGbr63kelvX23Uu83mLU85xyLHmMqb9fTkPufVtG8tuSXVZ87iv\nuS3XpcovAAIcQuh121oex5i319OPPz6XPsV9632r8/kShvF6eTnFXIbTL7+s13U6/+Ul9WGtz89t\nXfrpfGmvJb9+Wa6hH2OKva3L1tIw9X25Xk+nuIW4vj2nqYa+XJ9fzt8eDgwA/8QB7nW5vD7fpV0K\n9fr044+v5dZv96n12C5fTmG5DZenU7pe0ukvT+vxbTg/nfLaTu3lte6P4fXLeQrX9PZ821+vj7sU\n6uXpl5e+hf0yX891yHM6n5bz7XJMbb2dfvrzl8tmCRoAAQ693l5/GuvrPrf1/PTTz5dyvj4/lBBC\nnU/ncDjm+fWSDodwfnqtu2OeXy9lvt61t7c67eN8msv5Kc2nZXh9+XgYwnr+8vQWDq/7+vJ0Kcv8\nOCxvt3j3cDf0dX59+vPP58UMGIB/au+X5MY0HB+/+3Q/pb7Mr8+nWz5+eDyW2ENb5lsYp7hcljiN\n/fp26cMuLvOSj/e7dp1bGdN6XdK0i8t1zYeH+0MJ2+V0uvbdcerz25z2D3elXm9hOu6HsM3n15dX\na9AACHAIIcQ87A/H3RD7tszztcZpvx9LCKFv6xZKjttSY8l9ua0hl7itNY270te1pZLqVkMpsa41\njrv9mENd5tsayjiE9baGcZpKX9eQpzGHul6v1+tqCRoAAX4vcB6GkmNvdd22HvJQ3h+Y0FoLKYbW\nWoyp19pCirG1FnNJvdUeU+ytxZhCby2mMuQYel1rDSnn0GoNqZQYWg0p5xhb3bbN04ABEOCvg5hS\niiH01lvvMcb0fsfI3kMI8etL6z3E960UY+89hPh+y6wYQu8hppji+zFCjL++I33bI/TuImAACPG3\nw/eN/mtQ//uWz18b+20r9K979vhX//x2jPjt/fFro//78AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8Hf9FzV2HL3D\n4zLYAAAAAElFTkSuQmCC\n'.replace(b'@', b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n')
  20.  
  21. def load_mask(size):
  22.     #size not implemented
  23.     try:
  24.         open("9anime_mask.png","r")
  25.     except FileNotFoundError:
  26.         with open(f"mask_{size}.png", "wb") as fh:
  27.             fh.write(codecs.decode(mask_1920x1080,'base64'))
  28.  
  29. def get_files():
  30.     #dir expects a slash at the end
  31.     dir = sys.argv[1]
  32.     if dir[-1] != "/": dir = dir+"/"
  33.     files = os.listdir(dir)
  34.     files.sort()
  35.     return (dir,files)
  36.  
  37. def get_video_resolution(filepath):
  38.     command = f"""ffprobe -v quiet -print_format json -show_streams "{filepath}" """
  39.     proc = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
  40.     data = loads(proc.stdout)
  41.     width = data['streams'][0]['width']
  42.     height = data['streams'][0]['height']
  43.     return f"{width}x{height}"
  44.  
  45. def log(string):
  46.     if not logging_enabled: return
  47.     if string[-1] == "\n" extra = "" else: extra = "\n"
  48.     with open("log.txt", "a") as logfile:
  49.         logfile.write(string + extra)
  50.  
  51. def remove_watermark(mask_dimensions, dir, file):
  52.     command = f"""ffmpeg -hwaccel auto -n -i "{dir}{file}" -vf  "removelogo=mask_{mask_dimensions}.png" -c:v libx264 -profile:v high -vf format=yuv420p -c:a aac -dn -map_metadata:c -1 -map_chapters:c -1 "{dir}no_watermark/{file}" """
  53.     proc = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
  54.     if dbg:print(proc.stderr+b'\n',proc.stdout);log((proc.stderr+b'\n',proc.stdout))
  55.     if proc.stdout != b"":print("[INFO]: Done");log(f"""Processed: {file}""")
  56.     if b"already exists" in proc.stderr:
  57.         if print(f"[ERROR]: File Exists")
  58.         log(f"""[ERROR]: {file} already exists""")
  59.     elif b"does not match with the input video size" in proc.stderr:
  60.         os.system(f"""rm "{dir}no_watermark/{file}" """)
  61.         log(f""""[ERROR]: Wrong Mask Dimensions: {file}. Expected {get_video_resolution(f"{dir}{file}")}""") #TODO USE PIL to resize and attempt again with new mask. Need to refactor more to do so.
  62.     elif b"Is a directory" in proc.stderr:pass
  63.     elif dbg and proc.stdout == b"":print(proc.stderr);log(f"""[ERROR]: {dir}{file}\n{proc.stderr}\n""")
  64.  
  65. def main():
  66.     dir,files = get_files()
  67.     load_mask("1920x1080")
  68.     path = f"{dir}no_watermark/"
  69.     if not(os.path.exists(path) and os.path.isdir(path)):
  70.         os.mkdir(path)
  71.     log(f"""[INFO]: Entering "{dir}" """)
  72.     for i, file in enumerate(files):
  73.         os.system(f"""echo "{dir}{file}">last.txt """)#so I know where it was at if it dies
  74.         print(f"[{i+1}/{len(files)}] Processing {file}")
  75.         remove_watermark("1920x1080", dir, file)
  76.  
  77.  
  78. if __name__ == "__main__":
  79.     main()
  80.  
Add Comment
Please, Sign In to add comment