(self, inner_path, *args, **kwargs)
| 564 | @PluginManager.registerTo("WorkerManager") |
| 565 | class WorkerManagerPlugin(object): |
| 566 | def addTask(self, inner_path, *args, **kwargs): |
| 567 | file_info = kwargs.get("file_info") |
| 568 | if file_info and "piecemap" in file_info: # Bigfile |
| 569 | self.site.settings["has_bigfile"] = True |
| 570 | |
| 571 | piecemap_inner_path = helper.getDirname(file_info["content_inner_path"]) + file_info["piecemap"] |
| 572 | piecemap_task = None |
| 573 | if not self.site.storage.isFile(piecemap_inner_path): |
| 574 | # Start download piecemap |
| 575 | piecemap_task = super(WorkerManagerPlugin, self).addTask(piecemap_inner_path, priority=30) |
| 576 | autodownload_bigfile_size_limit = self.site.settings.get("autodownload_bigfile_size_limit", config.autodownload_bigfile_size_limit) |
| 577 | if "|" not in inner_path and self.site.isDownloadable(inner_path) and file_info["size"] / 1024 / 1024 <= autodownload_bigfile_size_limit: |
| 578 | gevent.spawn_later(0.1, self.site.needFile, inner_path + "|all") # Download all pieces |
| 579 | |
| 580 | if "|" in inner_path: |
| 581 | # Start download piece |
| 582 | task = super(WorkerManagerPlugin, self).addTask(inner_path, *args, **kwargs) |
| 583 | |
| 584 | inner_path, file_range = inner_path.split("|") |
| 585 | pos_from, pos_to = map(int, file_range.split("-")) |
| 586 | task["piece_i"] = int(pos_from / file_info["piece_size"]) |
| 587 | task["sha512"] = file_info["sha512"] |
| 588 | else: |
| 589 | if inner_path in self.site.bad_files: |
| 590 | del self.site.bad_files[inner_path] |
| 591 | if piecemap_task: |
| 592 | task = piecemap_task |
| 593 | else: |
| 594 | fake_evt = gevent.event.AsyncResult() # Don't download anything if no range specified |
| 595 | fake_evt.set(True) |
| 596 | task = {"evt": fake_evt} |
| 597 | |
| 598 | if not self.site.storage.isFile(inner_path): |
| 599 | self.site.storage.createSparseFile(inner_path, file_info["size"], file_info["sha512"]) |
| 600 | piece_num = int(math.ceil(float(file_info["size"]) / file_info["piece_size"])) |
| 601 | self.site.storage.piecefields[file_info["sha512"]].frombytes(b"\x00" * piece_num) |
| 602 | else: |
| 603 | task = super(WorkerManagerPlugin, self).addTask(inner_path, *args, **kwargs) |
| 604 | return task |
| 605 | |
| 606 | def taskAddPeer(self, task, peer): |
| 607 | if "piece_i" in task: |
nothing calls this directly
no test coverage detected