aboutsummaryrefslogtreecommitdiff
path: root/ui/src/app/app.component.html
blob: 1496bde7d1e50e47ba29dc2db89ddaddfee50bca (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
<nav class="navbar navbar-expand-md navbar-dark bg-dark">
  <a class="navbar-brand" href="#">MeTube</a>
  <!--
  <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarsDefault" aria-controls="navbarsDefault" aria-expanded="false" aria-label="Toggle navigation">
    <span class="navbar-toggler-icon"></span>
  </button>
  <div class="collapse navbar-collapse" id="navbarsDefault">
    <ul class="navbar-nav mr-auto">
      <li class="nav-item active">
        <a class="nav-link" href="#">Home <span class="sr-only">(current)</span></a>
      </li>
    </ul>
  </div>
  -->
</nav>

<main role="main" class="container">
  <form #f="ngForm">
    <div class="container add-url-box">
      <div class="row">
        <div class="col add-url-component input-group">
          <input type="text" class="form-control" placeholder="Video or playlist URL" name="addUrl" [(ngModel)]="addUrl" [disabled]="addInProgress || downloads.loading">
        </div>
      </div>
      <div class="row">
        <div class="col-md-5 add-url-component">
          <div class="input-group">
            <div class="input-group-prepend">
              <span class="input-group-text">Quality</span>
            </div>
            <select class="custom-select" name="quality" [(ngModel)]="quality" (change)="qualityChanged()" [disabled]="addInProgress || downloads.loading">
              <option *ngFor="let q of qualities" [ngValue]="q.id">{{ q.text }}</option>
            </select>
          </div>
        </div>
        <div class="col-md-4 add-url-component">
          <div class="input-group">
            <div class="input-group-prepend">
              <span class="input-group-text">Format</span>
            </div>
            <select class="custom-select" name="format" [(ngModel)]="format" (change)="formatChanged()" [disabled]="addInProgress || downloads.loading">
              <option *ngFor="let f of formats" [ngValue]="f.id">{{ f.text }}</option>
            </select>
          </div>
        </div>
        <div class="col-md-3 add-url-component">
          <button class="btn btn-primary add-url" type="submit" (click)="addDownload()" [disabled]="addInProgress || downloads.loading">
            <span class="spinner-border spinner-border-sm" role="status" id="add-spinner" *ngIf="addInProgress"></span>
            {{ addInProgress ? "Adding..." : "Add" }}
          </button>
        </div>
      </div>
    </div>
  </form>

  <div *ngIf="downloads.loading" class="alert alert-info" role="alert">
    Connecting to server...
  </div>
    <div class="metube-section-header">Downloading</div>
  <table class="table">
    <thead>
      <tr>
        <th scope="col" style="width: 1rem;">
          <app-master-checkbox #queueMasterCheckbox [id]="'queue'" [list]="downloads.queue" (changed)="queueSelectionChanged($event)"></app-master-checkbox>
        </th>
        <th scope="col">
          <button type="button" class="btn btn-link px-0 mr-4" disabled #queueDelSelected (click)="delSelectedDownloads('queue')"><fa-icon [icon]="faTrashAlt"></fa-icon>&nbsp; Cancel selected</button>
        </th>
        <th scope="col" style="width: 14rem;"></th>
        <th scope="col" style="width: 8rem;">Speed</th>
        <th scope="col" style="width: 7rem;">ETA</th>
        <th scope="col" style="width: 2rem;"></th>
      </tr>
    </thead>
    <tbody>
      <tr *ngFor="let download of downloads.queue | keyvalue: asIsOrder" [class.disabled]='download.value.deleting'>
        <td>
          <app-slave-checkbox [id]="download.key" [master]="queueMasterCheckbox" [checkable]="download.value"></app-slave-checkbox>
        </td>
        <td>{{ download.value.title }}</td>
        <td><ngb-progressbar height="1.5rem" [showValue]="download.value.status != 'preparing'" [striped]="download.value.status == 'preparing'" [animated]="download.value.status == 'preparing'" type="success" [value]="download.value.status == 'preparing' ? 100 : download.value.percent | number:'1.0-0'"></ngb-progressbar></td>
        <td>{{ download.value.speed | speed }}</td>
        <td>{{ download.value.eta | eta }}</td>
        <td><button type="button" class="btn btn-link" (click)="delDownload('queue', download.key)"><fa-icon [icon]="faTrashAlt"></fa-icon></button></td>
      </tr>
    </tbody>
  </table>

  <div class="metube-section-header">Completed</div>
  <table class="table">
    <thead>
      <tr>
        <th scope="col" style="width: 1rem;">
          <app-master-checkbox #doneMasterCheckbox [id]="'done'" [list]="downloads.done" (changed)="doneSelectionChanged($event)"></app-master-checkbox>
        </th>
        <th scope="col">
          <button type="button" class="btn btn-link px-0 mr-4" disabled #doneDelSelected (click)="delSelectedDownloads('done')"><fa-icon [icon]="faTrashAlt"></fa-icon>&nbsp; Clear selected</button>
          <button type="button" class="btn btn-link px-0 mr-4" disabled #doneClearCompleted (click)="clearCompletedDownloads()"><fa-icon [icon]="faCheckCircle"></fa-icon>&nbsp; Clear completed</button>
          <button type="button" class="btn btn-link px-0 mr-4" disabled #doneClearFailed (click)="clearFailedDownloads()"><fa-icon [icon]="faTimesCircle"></fa-icon>&nbsp; Clear failed</button>
        </th>
        <th scope="col" style="width: 2rem;"></th>
        <th scope="col" style="width: 2rem;"></th>
      </tr>
    </thead>
    <tbody>
      <tr *ngFor="let download of downloads.done | keyvalue: asIsOrder" [class.disabled]='download.value.deleting'>
        <td>
          <app-slave-checkbox [id]="download.key" [master]="doneMasterCheckbox" [checkable]="download.value"></app-slave-checkbox>
        </td>
        <td>
          <div style="display: inline-block; width: 1.5rem;">
            <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>
          </div>
          <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>
          <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>
        </td>
        <td>
          <button type="button" class="btn btn-link" (click)="delDownload('done', download.key)"><fa-icon [icon]="faTrashAlt"></fa-icon></button>
        </td>
      </tr>
    </tbody>
  </table>

</main><!-- /.container -->
bgstack15