Add download link to downloaded file

This adds a simple download link that points to the downloaded file.

Note: This makes all files in the download directory (and its
sub-directory) available to any user.

Closes gh-26
This commit is contained in:
Steffen Klee 2021-12-13 22:35:19 +01:00
parent ddf258855d
commit fe4993153c
4 changed files with 11 additions and 1 deletions

View File

@ -108,6 +108,7 @@ if config.URL_PREFIX != '/':
return web.HTTPFound(config.URL_PREFIX) return web.HTTPFound(config.URL_PREFIX)
routes.static(config.URL_PREFIX + 'favicon/', 'favicon') routes.static(config.URL_PREFIX + 'favicon/', 'favicon')
routes.static(config.URL_PREFIX + 'download/', config.DOWNLOAD_DIR)
routes.static(config.URL_PREFIX, 'ui/dist/metube') routes.static(config.URL_PREFIX, 'ui/dist/metube')
app.add_routes(routes) app.add_routes(routes)

View File

@ -30,6 +30,7 @@ class DownloadInfo:
self.quality = quality self.quality = quality
self.format = format self.format = format
self.status = self.msg = self.percent = self.speed = self.eta = None self.status = self.msg = self.percent = self.speed = self.eta = None
self.filename = None
class Download: class Download:
manager = None manager = None
@ -60,6 +61,9 @@ class Download:
'speed', 'speed',
'eta', 'eta',
)}) )})
def put_status_postprocessor(d):
if d['postprocessor'] == 'MoveFiles' and d['status'] == 'finished':
self.status_queue.put({'status': 'finished', 'filename': d['info_dict']['filepath']})
ret = yt_dlp.YoutubeDL(params={ ret = yt_dlp.YoutubeDL(params={
'quiet': True, 'quiet': True,
'no_color': True, 'no_color': True,
@ -69,6 +73,7 @@ class Download:
'cachedir': False, 'cachedir': False,
'socket_timeout': 30, 'socket_timeout': 30,
'progress_hooks': [put_status], 'progress_hooks': [put_status],
'postprocessor_hooks': [put_status_postprocessor],
**self.ytdl_opts, **self.ytdl_opts,
}).download([self.info.url]) }).download([self.info.url])
self.status_queue.put({'status': 'finished' if ret == 0 else 'error'}) self.status_queue.put({'status': 'finished' if ret == 0 else 'error'})
@ -113,6 +118,8 @@ class Download:
if status is None: if status is None:
return return
self.tmpfilename = status.get('tmpfilename') self.tmpfilename = status.get('tmpfilename')
if 'filename' in status:
self.info.filename = os.path.relpath(status.get('filename'))
self.info.status = status['status'] self.info.status = status['status']
self.info.msg = status.get('msg') self.info.msg = status.get('msg')
if 'downloaded_bytes' in status: if 'downloaded_bytes' in status:

View File

@ -112,7 +112,8 @@
<fa-icon *ngIf="download.value.status == 'finished'" [icon]="faCheckCircle" style="color: green;"></fa-icon> <fa-icon *ngIf="download.value.status == 'finished'" [icon]="faCheckCircle" style="color: green;"></fa-icon>
<fa-icon *ngIf="download.value.status == 'error'" [icon]="faTimesCircle" style="color: red;"></fa-icon> <fa-icon *ngIf="download.value.status == 'error'" [icon]="faTimesCircle" style="color: red;"></fa-icon>
</div> </div>
<span ngbTooltip="{{download.value.msg}}">{{ download.value.title }}</span> <span ngbTooltip="{{download.value.msg}}"><a *ngIf="!!download.value.filename; else noDownloadLink" href="download/{{download.value.filename}}" target="_blank">{{ download.value.title }}</a></span>
<ng-template #noDownloadLink>{{ download.value.title }}</ng-template>
</td> </td>
<td> <td>
<button *ngIf="download.value.status == 'error'" type="button" class="btn btn-link" (click)="retryDownload(download.key, download.value.quality)"><fa-icon [icon]="faRedoAlt"></fa-icon></button> <button *ngIf="download.value.status == 'error'" type="button" class="btn btn-link" (click)="retryDownload(download.key, download.value.quality)"><fa-icon [icon]="faRedoAlt"></fa-icon></button>

View File

@ -15,6 +15,7 @@ interface Download {
url: string, url: string,
status: string; status: string;
msg: string; msg: string;
filename: string;
quality: string; quality: string;
percent: number; percent: number;
speed: number; speed: number;