107 lines
		
	
	
	
		
			2.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			107 lines
		
	
	
	
		
			2.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
#!/usr/bin/env python3
 | 
						|
# -*- coding:utf-8 -*-
 | 
						|
 | 
						|
# SPDX-FileCopyrightText: 2014-2021 Luca Beltrame <lbeltrame@kde.org>
 | 
						|
# SPDX-License-Identifier: GPL-3.0-or-later
 | 
						|
 | 
						|
import argparse
 | 
						|
from enum import Enum
 | 
						|
import os
 | 
						|
from pathlib import Path
 | 
						|
import re
 | 
						|
import stat
 | 
						|
 | 
						|
import transmissionrpc
 | 
						|
from xdg import Mime
 | 
						|
 | 
						|
 | 
						|
class FileType(Enum):
 | 
						|
 | 
						|
    music = 1
 | 
						|
    video = 2
 | 
						|
    application = 3
 | 
						|
    image = 4
 | 
						|
    unknown = 100
 | 
						|
 | 
						|
    @staticmethod
 | 
						|
    def detect(filelist: dict):
 | 
						|
 | 
						|
        # Get the largest file
 | 
						|
        largest = max(filelist, key=lambda x: filelist[x])
 | 
						|
 | 
						|
        category = Mime.get_type_by_name(largest).media
 | 
						|
 | 
						|
        if category == "audio":
 | 
						|
            return FileType.music
 | 
						|
        elif category == "video":
 | 
						|
            return FileType.video
 | 
						|
        elif category == "application":
 | 
						|
            return FileType.application
 | 
						|
        elif category == "image":
 | 
						|
            return FileType.image
 | 
						|
        else:
 | 
						|
            return FileType.unknown
 | 
						|
 | 
						|
    def destination_dir(self) -> Path:
 | 
						|
 | 
						|
        if self is FileType.music:
 | 
						|
            return Path("/home/storage/music/Anime/")
 | 
						|
        elif self is FileType.video:
 | 
						|
            return Path("/home/storage/video/")
 | 
						|
        elif self is FileType.application:
 | 
						|
            return Path("/home/storage/applications/")
 | 
						|
        elif self is FileType.image:
 | 
						|
            return Path("/home/storage/images/")
 | 
						|
        else:
 | 
						|
            return Path("/home/storage/transmission-downloads/")
 | 
						|
 | 
						|
 | 
						|
def main():
 | 
						|
 | 
						|
    # Get the information from Transmission
 | 
						|
 | 
						|
    source_directory = os.environ.get("TR_TORRENT_DIR")
 | 
						|
    source_file = os.environ.get("TR_TORRENT_NAME")
 | 
						|
    torrent_id = os.environ.get("TR_TORRENT_ID")
 | 
						|
 | 
						|
    with open("/var/lib/transmission/rpcpass", "r") as handle:
 | 
						|
        rpc_pass = handle.read().strip()
 | 
						|
 | 
						|
    if source_directory is None or source_file is None:
 | 
						|
        print("Please run this script from Transmission.")
 | 
						|
        exit(1)
 | 
						|
 | 
						|
    source = Path(source_directory) / source_file
 | 
						|
 | 
						|
    assert source.exists()
 | 
						|
 | 
						|
    client = transmissionrpc.Client("localhost", port=9091,
 | 
						|
                                    user="transmission", password=rpc_pass)
 | 
						|
 | 
						|
    # Returns a dictionary with the torrent_id as key
 | 
						|
    filelist = client.get_files(torrent_id)[int(torrent_id)]
 | 
						|
    filelist = {filelist[item]["name"]: filelist[item]["size"] for item in
 | 
						|
                filelist}
 | 
						|
 | 
						|
    filetype = FileType.detect(filelist)
 | 
						|
 | 
						|
    destination = filetype.destination_dir()
 | 
						|
 | 
						|
    if destination == source_directory:
 | 
						|
        return
 | 
						|
 | 
						|
    dest_path = destination / source.name
 | 
						|
    source.rename(dest_path)
 | 
						|
 | 
						|
    permissions = dest_path.stat().st_mode
 | 
						|
    permissions = permissions | stat.S_IROTH | stat.S_IWOTH | stat.S_IXOTH
 | 
						|
    dest_path.chmod(permissions)
 | 
						|
 | 
						|
    client.stop_torrent(torrent_id)
 | 
						|
    client.remove_torrent(torrent_id)
 | 
						|
 | 
						|
    print("Moved {} to {}".format(source, dest_path))
 | 
						|
 | 
						|
 | 
						|
if __name__ == "__main__":
 | 
						|
    main()
 |