feat(17-01): add WriteTrackTagsByPath and ImageFilePicker backend methods
- WriteTrackTagsByPath resolves filePath to trackID via GetAudioFileByPath - ImageFilePicker opens native file dialog filtered to JPEG/PNG - Added Wails TypeScript bindings for both new methods
This commit is contained in:
@@ -67,3 +67,26 @@ func (fe *FrontendUtil) PlaylistFilePicker() (
|
||||
|
||||
return files, nil
|
||||
}
|
||||
|
||||
// ImageFilePicker opens a file selection dialog filtered to image
|
||||
// files (JPEG, PNG). Returns the selected file path, or empty
|
||||
// string if the user cancelled.
|
||||
func (fe *FrontendUtil) ImageFilePicker() (string, error) {
|
||||
file, err := runtime.OpenFileDialog(
|
||||
fe.ctx,
|
||||
runtime.OpenDialogOptions{
|
||||
Title: "Select Cover Art",
|
||||
Filters: []runtime.FileFilter{
|
||||
{
|
||||
DisplayName: "Image Files (*.jpg, *.jpeg, *.png)",
|
||||
Pattern: "*.jpg;*.jpeg;*.png",
|
||||
},
|
||||
},
|
||||
},
|
||||
)
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("could not open file dialog: %w", err)
|
||||
}
|
||||
|
||||
return file, nil
|
||||
}
|
||||
|
||||
@@ -172,3 +172,17 @@ func (tw *TagWriter) WriteTrackTags(trackID int64, changes TagChanges) error {
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// WriteTrackTagsByPath resolves a file path to its audio_file.id and
|
||||
// delegates to WriteTrackTags. This is the frontend-facing entry
|
||||
// point since the frontend identifies tracks by FilePath.
|
||||
func (tw *TagWriter) WriteTrackTagsByPath(filePath string, changes TagChanges) error {
|
||||
ctx := context.Background()
|
||||
|
||||
audioFile, err := tw.db.Queries.GetAudioFileByPath(ctx, filePath)
|
||||
if err != nil {
|
||||
return fmt.Errorf("resolve track by path %q: %w", filePath, err)
|
||||
}
|
||||
|
||||
return tw.WriteTrackTags(audioFile.ID, changes)
|
||||
}
|
||||
|
||||
@@ -4,6 +4,8 @@ import {context} from '../models';
|
||||
|
||||
export function DirectoryPicker():Promise<string>;
|
||||
|
||||
export function ImageFilePicker():Promise<string>;
|
||||
|
||||
export function PlaylistFilePicker():Promise<Array<string>>;
|
||||
|
||||
export function SetContext(arg1:context.Context):Promise<void>;
|
||||
|
||||
@@ -6,6 +6,10 @@ export function DirectoryPicker() {
|
||||
return window['go']['frontendutil']['FrontendUtil']['DirectoryPicker']();
|
||||
}
|
||||
|
||||
export function ImageFilePicker() {
|
||||
return window['go']['frontendutil']['FrontendUtil']['ImageFilePicker']();
|
||||
}
|
||||
|
||||
export function PlaylistFilePicker() {
|
||||
return window['go']['frontendutil']['FrontendUtil']['PlaylistFilePicker']();
|
||||
}
|
||||
|
||||
+10
@@ -0,0 +1,10 @@
|
||||
// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL
|
||||
// This file is automatically generated. DO NOT EDIT
|
||||
import {context} from '../models';
|
||||
import {tagwriter} from '../models';
|
||||
|
||||
export function SetContext(arg1:context.Context):Promise<void>;
|
||||
|
||||
export function WriteTrackTags(arg1:number,arg2:tagwriter.TagChanges):Promise<void>;
|
||||
|
||||
export function WriteTrackTagsByPath(arg1:string,arg2:tagwriter.TagChanges):Promise<void>;
|
||||
Executable
+15
@@ -0,0 +1,15 @@
|
||||
// @ts-check
|
||||
// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL
|
||||
// This file is automatically generated. DO NOT EDIT
|
||||
|
||||
export function SetContext(arg1) {
|
||||
return window['go']['tagwriter']['TagWriter']['SetContext'](arg1);
|
||||
}
|
||||
|
||||
export function WriteTrackTags(arg1, arg2) {
|
||||
return window['go']['tagwriter']['TagWriter']['WriteTrackTags'](arg1, arg2);
|
||||
}
|
||||
|
||||
export function WriteTrackTagsByPath(arg1, arg2) {
|
||||
return window['go']['tagwriter']['TagWriter']['WriteTrackTagsByPath'](arg1, arg2);
|
||||
}
|
||||
Reference in New Issue
Block a user