OPDS Support (#526)
* Added some basic OPDS implementation * Fixed an issue with feed href * More changes * Added library routes and moved user code to a method so we can hack in fixed code without authentication * Images now load on the OPDS reusing our existing Image infrastructure. * Added the ability to download and moved some download code to a dedicated service * Download is working, pagination is implemented. * Refactored libraries to use pagination * Laid foundation for OpenSearch implementation * Fixed up some serialization issues and some old code that wasn't referencing helper methods * Ensure chapters are sorted when we send them over OPDS * OpenSearch implemented * Removed any support for OPDS-PS due to lack of apps supporting it. * Don't distribute development.json nor stats directory on build. * Implemented In Progress feed as well. * Ability to enable OPDS for server. OPDS now accepts initial call as POST in case app uses username/password. * UI now properly renders state for OPDS enablement. Added Collections routes. * Fixed pagination startIndex on OPDS feeds when there is less than 1 page. * Chunky Reader now works. It only accepts UTF-8 encodings * More Chunky fixes * More chunky changes, such a fussy client. * Implemented the ability to have a custom api key assigned to a user and use that api key as your authentication token against OPDS routing. * Implemented the ability to reset your API Key * Fixed favicon not being sent back correctly * Fixed an issue where images wouldn't send on OPDS feed. * Implemented Page streaming and fixed a pagination bug * Hooked in the ability to save progress in Kavita when Page Streaming
This commit is contained in:
parent
2a63e5e9e2
commit
6069d93c38
50 changed files with 2409 additions and 116 deletions
66
UI/Web/src/app/user-settings/api-key/api-key.component.ts
Normal file
66
UI/Web/src/app/user-settings/api-key/api-key.component.ts
Normal file
|
|
@ -0,0 +1,66 @@
|
|||
import { Component, ElementRef, Input, OnDestroy, OnInit, ViewChild } from '@angular/core';
|
||||
import { ToastrService } from 'ngx-toastr';
|
||||
import { Subject } from 'rxjs';
|
||||
import { take, takeUntil } from 'rxjs/operators';
|
||||
import { ConfirmService } from 'src/app/shared/confirm.service';
|
||||
import { AccountService } from 'src/app/_services/account.service';
|
||||
|
||||
@Component({
|
||||
selector: 'app-api-key',
|
||||
templateUrl: './api-key.component.html',
|
||||
styleUrls: ['./api-key.component.scss']
|
||||
})
|
||||
export class ApiKeyComponent implements OnInit, OnDestroy {
|
||||
|
||||
@Input() title: string = 'API Key';
|
||||
@Input() showRefresh: boolean = true;
|
||||
@Input() transform: (val: string) => string = (val: string) => val;
|
||||
@Input() tooltipText: string = '';
|
||||
@ViewChild('apiKey') inputElem!: ElementRef;
|
||||
key: string = '';
|
||||
private readonly onDestroy = new Subject<void>();
|
||||
|
||||
|
||||
constructor(private confirmService: ConfirmService, private accountService: AccountService, private toastr: ToastrService) { }
|
||||
|
||||
ngOnInit(): void {
|
||||
this.accountService.currentUser$.pipe(takeUntil(this.onDestroy)).subscribe(user => {
|
||||
let key = '';
|
||||
if (user) {
|
||||
key = user.apiKey;
|
||||
} else {
|
||||
key = 'ERROR - KEY NOT SET';
|
||||
}
|
||||
|
||||
if (this.transform != undefined) {
|
||||
this.key = this.transform(key);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
ngOnDestroy() {
|
||||
this.onDestroy.next();
|
||||
this.onDestroy.complete();
|
||||
}
|
||||
|
||||
async copy() {
|
||||
await navigator.clipboard.writeText(this.key);
|
||||
}
|
||||
|
||||
async refresh() {
|
||||
if (!await this.confirmService.confirm('This will invalidate any OPDS configurations you have setup. Are you sure you want to continue?')) {
|
||||
return;
|
||||
}
|
||||
this.accountService.resetApiKey().subscribe(newKey => {
|
||||
this.key = newKey;
|
||||
this.toastr.success('API Key reset');
|
||||
});
|
||||
}
|
||||
|
||||
selectAll() {
|
||||
if (this.inputElem) {
|
||||
this.inputElem.nativeElement.setSelectionRange(0, this.key.length);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue