from lnx.logicnode.lnx_nodes import * class CreateTorrentNode(LnxLogicTreeNode): """Create Torrent""" bl_idname = 'LNCreateTorrentNode' bl_label = 'Create Torrent' bl_description = ('Build a .torrent from content (file, files or folder)') lnx_category = 'Leenkx' lnx_version = 1 def __init__(self, *args, **kwargs): super(CreateTorrentNode, self).__init__(*args, **kwargs) array_nodes[str(id(self))] = self def update_sockets(self, context): if not self.inputs: return links = {} for socket in self.inputs: for link in socket.links: links.setdefault(socket.name, []).append( (link.from_node, link.from_socket)) for socket in self.inputs[1:]: self.inputs.remove(socket) self._add_data_inputs() tree = self.id_data for socket in self.inputs: if socket.name in links: for from_node, from_socket in links[socket.name]: tree.links.new(from_socket, socket) def _add_data_inputs(self): mode_sockets = { 'file': ('LnxDynamicSocket', 'File (Bytes)', 'Content of the single file as Bytes'), 'files': ('LnxNodeSocketArray', 'Files ({path, data})', 'Array of {path, data} objects'), 'folder': ('LnxStringSocket', 'Folder Path', 'Folder read recursively for content (native targets only)'), } socket_type, label, desc = mode_sockets.get(self.property1, mode_sockets['file']) self.add_input(socket_type, label) self.add_input('LnxStringSocket', 'Name') self.add_input('LnxStringSocket', 'Comment') self.add_input('LnxStringSocket', 'Created By') self.add_input('LnxStringSocket', 'Source') self.add_input('LnxNodeSocketArray', 'Trackers') self.add_input('LnxBoolSocket', 'Private') self.add_input('LnxIntSocket', 'Piece Length') self.add_input('LnxNodeSocketArray', 'Web Seeds') property0: HaxeEnumProperty('property0', items=[('1', 'V1', 'BitTorrent v1 - SHA-1 piece list over one packed stream; works with every client'), ('2', 'V2', 'BitTorrent v2 (BEP 52) - SHA-256 merkle tree per file, pieces aligned to file boundaries; needs modern peers'), ('3', 'Hybrid', 'One .torrent with both v1 and v2 metadata - two infohashes (btih + btmh) over the same info dict')], name='Version', default='1') property1: HaxeEnumProperty('property1', items=[('file', 'File', 'Single file: Data is a Bytes payload'), ('files', 'Files', 'Multiple files: Data is an array of {path, data}'), ('folder', 'Folder', 'Read a folder recursively (native targets only): Data is a folder path string')], name='Data', default='file', update=update_sockets) def lnx_init(self, context): self.add_input('LnxNodeSocketAction', 'In') self._add_data_inputs() self.add_output('LnxNodeSocketAction', 'Out') self.add_output('LnxDynamicSocket', 'Meta') self.add_output('LnxDynamicSocket', 'Torrent Bytes') self.add_output('LnxStringSocket', 'InfoHash') self.add_output('LnxStringSocket', 'Magnet') def draw_buttons(self, context, layout): layout.prop(self, 'property0') layout.prop(self, 'property1') def register(): add_category('Leenkx', icon='ORIENTATION_CURSOR') CreateTorrentNode.on_register()