Example #1
0
 async def save_file(self,
                     file_name: Optional[str] = None,
                     download_directory: Optional[str] = None):
     await self.start()
     if self.file_output_task and not self.file_output_task.done(
     ):  # cancel an already running save task
         self.file_output_task.cancel()
     self.download_directory = download_directory or self.download_directory or self.config.download_dir
     if not self.download_directory:
         raise ValueError("no directory to download to")
     if not (file_name or self._file_name
             or self.descriptor.suggested_file_name):
         raise ValueError("no file name to download to")
     if not os.path.isdir(self.download_directory):
         log.warning(
             "download directory '%s' does not exist, attempting to make it",
             self.download_directory)
         os.mkdir(self.download_directory)
     self._file_name = await get_next_available_file_name(
         self.loop, self.download_directory, file_name or self._file_name
         or sanitize_file_name(self.descriptor.suggested_file_name))
     await self.blob_manager.storage.change_file_download_dir_and_file_name(
         self.stream_hash, self.download_directory, self.file_name)
     await self.update_status(ManagedStream.STATUS_RUNNING)
     self.file_output_task = self.loop.create_task(
         self._save_file(self.full_path))
     try:
         await asyncio.wait_for(self.started_writing.wait(),
                                self.config.download_timeout,
                                loop=self.loop)
     except asyncio.TimeoutError:
         log.warning("timeout starting to write data for lbry://%s#%s",
                     self.claim_name, self.claim_id)
         self.stop_tasks()
         await self.update_status(ManagedStream.STATUS_STOPPED)
Example #2
0
 async def save_file(self,
                     file_name: typing.Optional[str] = None,
                     download_directory: typing.Optional[str] = None,
                     node: typing.Optional['Node'] = None):
     await self.start(node)
     if self.file_output_task and not self.file_output_task.done(
     ):  # cancel an already running save task
         self.file_output_task.cancel()
     self.download_directory = download_directory or self.download_directory or self.config.download_dir
     if not self.download_directory:
         raise ValueError("no directory to download to")
     if not (file_name or self._file_name
             or self.descriptor.suggested_file_name):
         raise ValueError("no file name to download to")
     if not os.path.isdir(self.download_directory):
         log.warning(
             "download directory '%s' does not exist, attempting to make it",
             self.download_directory)
         os.mkdir(self.download_directory)
     self._file_name = await get_next_available_file_name(
         self.loop, self.download_directory, file_name or self._file_name
         or sanitize_file_name(self.descriptor.suggested_file_name))
     await self.blob_manager.storage.change_file_download_dir_and_file_name(
         self.stream_hash, self.download_directory, self.file_name)
     await self.update_status(ManagedStream.STATUS_RUNNING)
     self.file_output_task = self.loop.create_task(
         self._save_file(self.full_path))
     await self.started_writing.wait()
Example #3
0
    async def start(self, timeout: Optional[float] = None,
                    save_now: bool = False):
        timeout = timeout or self.config.download_timeout
        if self._running.is_set():
            return
        log.info("start downloader for stream (sd hash: %s)", self.sd_hash)
        self._running.set()
        try:
            await asyncio.wait_for(self.downloader.start(), timeout, loop=self.loop)
        except asyncio.TimeoutError:
            self._running.clear()
            raise DownloadSDTimeoutError(self.sd_hash)

        if self.delayed_stop_task and not self.delayed_stop_task.done():
            self.delayed_stop_task.cancel()
        self.delayed_stop_task = self.loop.create_task(self._delayed_stop())
        if not await self.blob_manager.storage.file_exists(self.sd_hash):
            if save_now:
                if not self._file_name:
                    self._file_name = await get_next_available_file_name(
                        self.loop, self.download_directory,
                        self._file_name or sanitize_file_name(self.descriptor.suggested_file_name)
                    )
                file_name, download_dir = self._file_name, self.download_directory
            else:
                file_name, download_dir = None, None
            self._added_on = int(time.time())
            self.rowid = await self.blob_manager.storage.save_downloaded_file(
                self.stream_hash, file_name, download_dir, 0.0, added_on=self._added_on
            )
        if self.status != self.STATUS_RUNNING:
            await self.update_status(self.STATUS_RUNNING)
Example #4
0
 def test_sanitize_file_name(self):
     self.assertEqual(sanitize_file_name(' t/-?t|.g.ext '), 't-t.g.ext')
     self.assertEqual(sanitize_file_name('end_dot .'), 'end_dot')
     self.assertEqual(sanitize_file_name('.file\0\0'), '.file')
     self.assertEqual(sanitize_file_name('test n\16ame.ext'), 'test name.ext')
     self.assertEqual(sanitize_file_name('COM8.ext', default_file_name='default1'), 'default1.ext')
     self.assertEqual(sanitize_file_name('LPT2', default_file_name='default2'), 'default2')
     self.assertEqual(sanitize_file_name('', default_file_name=''), '')