mirror of
https://github.com/krau/SaveAny-Bot.git
synced 2026-05-31 05:01:06 +08:00
feat: parse url with js plugins support (#96)
* feat: WIP. add parser functionality and text message handling * fix: use json to marshal js result * feat: add metadata handling and version validation for jsParser * refactor: rename parser package to parsers and restructure parser handling * refactor: core code struct and impl parse task handle * feat: impl parsed download * fix: seek cache file when processing tph picture * feat: implement parsed task handling and progress tracking * feat: enhance task processing with concurrency control and progress tracking * feat: add resource ID generation and improve resource processing handling * feat: improve message formatting in parsed text and progress completion * feat: add example js plugin * feat: implement Twitter parser * fix: twitter parse video json decode error * feat: impl stream mode for parse task
This commit is contained in:
79
core/tasks/tfile/writer.go
Normal file
79
core/tasks/tfile/writer.go
Normal file
@@ -0,0 +1,79 @@
|
||||
package tfile
|
||||
|
||||
import (
|
||||
"context"
|
||||
"io"
|
||||
"sync/atomic"
|
||||
)
|
||||
|
||||
type ProgressWriterAt struct {
|
||||
ctx context.Context
|
||||
wrAt io.WriterAt
|
||||
progress ProgressTracker
|
||||
downloaded *atomic.Int64
|
||||
total int64
|
||||
info TaskInfo
|
||||
}
|
||||
|
||||
func (w *ProgressWriterAt) WriteAt(p []byte, off int64) (int, error) {
|
||||
at, err := w.wrAt.WriteAt(p, off)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
if w.progress != nil {
|
||||
w.progress.OnProgress(w.ctx, w.info, w.downloaded.Add(int64(at)), w.total)
|
||||
}
|
||||
return at, nil
|
||||
}
|
||||
|
||||
func newWriterAt(
|
||||
ctx context.Context,
|
||||
wrAt io.WriterAt,
|
||||
progress ProgressTracker,
|
||||
taskInfo TaskInfo,
|
||||
) *ProgressWriterAt {
|
||||
return &ProgressWriterAt{
|
||||
ctx: ctx,
|
||||
progress: progress,
|
||||
downloaded: &atomic.Int64{},
|
||||
total: taskInfo.FileSize(),
|
||||
wrAt: wrAt,
|
||||
info: taskInfo,
|
||||
}
|
||||
}
|
||||
|
||||
type ProgressWriter struct {
|
||||
ctx context.Context
|
||||
wrAt io.Writer
|
||||
progress ProgressTracker
|
||||
downloaded *atomic.Int64
|
||||
total int64
|
||||
info TaskInfo
|
||||
}
|
||||
|
||||
func (w *ProgressWriter) Write(p []byte) (int, error) {
|
||||
at, err := w.wrAt.Write(p)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
if w.progress != nil {
|
||||
w.progress.OnProgress(w.ctx, w.info, w.downloaded.Add(int64(at)), w.total)
|
||||
}
|
||||
return at, nil
|
||||
}
|
||||
|
||||
func newWriter(
|
||||
ctx context.Context,
|
||||
wr io.Writer,
|
||||
progress ProgressTracker,
|
||||
taskInfo TaskInfo,
|
||||
) *ProgressWriter {
|
||||
return &ProgressWriter{
|
||||
ctx: ctx,
|
||||
progress: progress,
|
||||
downloaded: &atomic.Int64{},
|
||||
total: taskInfo.FileSize(),
|
||||
wrAt: wr,
|
||||
info: taskInfo,
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user