Skip to content

Commit 8f6defc

Browse files
committed
feat:增加clean指令
1 parent 50d4f29 commit 8f6defc

File tree

9 files changed

+179
-10
lines changed

9 files changed

+179
-10
lines changed

cmd/clean.go

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package cmd
2+
3+
import (
4+
"github.com/JerryZhou343/cctool/internal/app"
5+
"github.com/JerryZhou343/cctool/internal/console"
6+
"github.com/JerryZhou343/cctool/internal/flags"
7+
"github.com/JerryZhou343/cctool/internal/status"
8+
"github.com/spf13/cobra"
9+
)
10+
11+
var (
12+
cleanCmd = cobra.Command{
13+
Use: "clean",
14+
Short: "清除空白字幕",
15+
Args: cobra.OnlyValidArgs,
16+
RunE: func(cmd *cobra.Command, args []string) (err error) {
17+
if len(flags.SrcFiles) == 0 {
18+
err = status.ErrSourceFileNotEnough
19+
return
20+
}
21+
application.Run()
22+
for _, itr := range flags.SrcFiles {
23+
task := app.NewCleanTask(itr)
24+
application.AddTask(task)
25+
}
26+
27+
console.Console(application)
28+
application.CheckTask()
29+
application.Destroy()
30+
return nil
31+
},
32+
}
33+
)
34+
35+
func init() {
36+
cleanCmd.PersistentFlags().StringSliceVarP(&flags.SrcFiles, "source", "s", []string{}, "单个或多个源文件")
37+
}

cmd/root.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,5 @@ func init() {
1818
RootCmd.AddCommand(&mergeCmd)
1919
RootCmd.AddCommand(&generateCmd)
2020
RootCmd.AddCommand(&convertCmd)
21+
RootCmd.AddCommand(&cleanCmd)
2122
}

internal/app/application.go

Lines changed: 67 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import (
1919
"github.com/JerryZhou343/cctool/internal/translate/tencent"
2020
"github.com/panjf2000/ants/v2"
2121
"github.com/pkg/errors"
22+
"strings"
2223
"sync"
2324

2425
"time"
@@ -47,6 +48,8 @@ type Application struct {
4748
//生成字幕任务
4849
generateTaskChan chan Task
4950

51+
cleanTaskChan chan Task
52+
5053
//任务数组
5154
taskSlice []Task
5255
//
@@ -64,6 +67,7 @@ func NewApplication() *Application {
6467
translatorLock: new(sync.Mutex),
6568

6669
convertTaskChan: make(chan Task, 100),
70+
cleanTaskChan: make(chan Task, 100),
6771

6872
generatorSet: map[string]*SrtGenerator{},
6973
idleGenerator: map[string]struct{}{},
@@ -86,6 +90,7 @@ func (a *Application) Run() {
8690
go a.translate()
8791
go a.convert()
8892
go a.generate()
93+
go a.clean()
8994
}
9095

9196
func (a *Application) GetRunningMsg() string {
@@ -190,7 +195,10 @@ func (a *Application) AddTask(task Task) (err error) {
190195
a.generateTaskChan <- task
191196
case TaskTypeConvert:
192197
a.convertTaskChan <- task
198+
case TaskTypeClean:
199+
a.cleanTaskChan <- task
193200
}
201+
194202
a.msgChan <- fmt.Sprintf("添加任务成功 %s", task)
195203
a.taskSlice = append(a.taskSlice, task)
196204
return nil
@@ -205,7 +213,7 @@ func (a *Application) CheckTask() {
205213
select {
206214
case <-time.After(2 * time.Second):
207215
for _, itr := range a.taskSlice {
208-
a.msgChan <- fmt.Sprintf("时间: %s %s",time.Now().Local().Format("2006-01-02 15:04:05"), itr)
216+
a.msgChan <- fmt.Sprintf("时间: %s %s", time.Now().Local().Format("2006-01-02 15:04:05"), itr)
209217

210218
//任务超过最大重试次数就不再尝试
211219
if itr.GetState() == TaskStateFailed && itr.GetFailedTimes() < 10 {
@@ -371,3 +379,61 @@ func (a *Application) convert() {
371379
}
372380
}
373381
}
382+
383+
func (a *Application) clean() {
384+
for {
385+
select {
386+
case t := <-a.cleanTaskChan:
387+
_ = ants.Submit(func() {
388+
var (
389+
err error
390+
ret []*srt.Srt
391+
src []*srt.Srt
392+
)
393+
task := t.(*CleanTask)
394+
task.State = TaskStateInit
395+
err = task.Init()
396+
if err != nil {
397+
task.State = TaskStateFailed
398+
task.Failed(err)
399+
return
400+
}
401+
402+
src, err = srt.Open(task.SrcFile)
403+
if err != nil {
404+
task.State = TaskStateFailed
405+
task.Failed(err)
406+
return
407+
}
408+
//doing
409+
task.State = TaskStateDoing
410+
newSequence := 0
411+
for idx, itr := range src {
412+
task.Progress = float32(idx+1) / float32(len(src))
413+
if strings.TrimSpace(itr.Subtitle) == "" {
414+
continue
415+
} else {
416+
newSequence += 1
417+
ret = append(ret, &srt.Srt{
418+
Sequence: newSequence,
419+
Start: itr.Start,
420+
End: itr.End,
421+
Subtitle: itr.Subtitle,
422+
})
423+
}
424+
425+
}
426+
//done
427+
err = srt.WriteSrt(task.DstFile, ret)
428+
if err != nil {
429+
task.State = TaskStateFailed
430+
task.Failed(err)
431+
return
432+
}
433+
task.State = TaskStateDone
434+
})
435+
case <-a.ctx.Done():
436+
return
437+
}
438+
}
439+
}

internal/app/common.go

Lines changed: 67 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ const (
2222
TaskTypeGenerate
2323
TaskTypeConvert
2424
TaskTypeMerge
25+
TaskTypeClean
2526
)
2627

2728
type TaskState int
@@ -116,7 +117,7 @@ func (t *TranslateTask) Init() (err error) {
116117
absPath := filepath.Dir(absFilePath)
117118
fileName := filepath.Base(absFilePath)
118119
ext := filepath.Ext(fileName)
119-
name := strings.Trim(fileName, ext)
120+
name := strings.TrimRight(fileName, ext)
120121
t.DstFile = filepath.Join(absPath, fmt.Sprintf("%s_%s%s", name, t.To, ext))
121122
return
122123
}
@@ -171,7 +172,7 @@ func (c *ConvertTask) Init() (err error) {
171172
absPath := filepath.Dir(absFilePath)
172173
fileName := filepath.Base(absFilePath)
173174
ext := filepath.Ext(fileName)
174-
name := strings.Trim(fileName, ext)
175+
name := strings.TrimRight(fileName, ext)
175176
c.DstFile = filepath.Join(absPath, fmt.Sprintf("%s.%s", name, c.To))
176177
return
177178
}
@@ -255,3 +256,67 @@ func (g *GenerateTask) Failed(err error) {
255256
func (g *GenerateTask) GetFailedTimes() int {
256257
return g.FailedTimes
257258
}
259+
260+
type CleanTask struct {
261+
SrcFile string
262+
DstFile string
263+
State TaskState
264+
Err error
265+
Progress float32
266+
FailedTimes int
267+
}
268+
269+
func NewCleanTask(srcFile string) *CleanTask {
270+
return &CleanTask{
271+
SrcFile: srcFile,
272+
DstFile: "",
273+
State: TaskStateInit,
274+
Err: nil,
275+
Progress: 0,
276+
FailedTimes: 0,
277+
}
278+
}
279+
280+
func (c *CleanTask) Init() (err error) {
281+
var (
282+
absFilePath string
283+
)
284+
absFilePath, err = filepath.Abs(c.SrcFile)
285+
if err != nil {
286+
return
287+
}
288+
absPath := filepath.Dir(absFilePath)
289+
fileName := filepath.Base(absFilePath)
290+
ext := filepath.Ext(fileName)
291+
name := strings.TrimRight(fileName, ext)
292+
c.DstFile = filepath.Join(absPath, fmt.Sprintf("%s_%s%s", name, "clean", ext))
293+
294+
return
295+
}
296+
297+
func (t *CleanTask) String() string {
298+
if t.Err == nil {
299+
return fmt.Sprintf("源文件: %s 目标文件: %s 进度: %.2f", t.SrcFile, t.DstFile, t.Progress*100) +
300+
"% " + fmt.Sprintf("状态: %s", t.State)
301+
} else {
302+
return fmt.Sprintf("源文件: %s 目标文件: %s 进度: %.2f", t.SrcFile, t.DstFile, t.Progress*100) +
303+
"% " + fmt.Sprintf("状态: %s 错误: %+v", t.State, t.Err)
304+
}
305+
}
306+
307+
func (t *CleanTask) Type() TaskType {
308+
return TaskTypeClean
309+
}
310+
311+
func (t *CleanTask) GetState() TaskState {
312+
return t.State
313+
}
314+
315+
func (g *CleanTask) Failed(err error) {
316+
g.Err = err
317+
g.FailedTimes++
318+
}
319+
320+
func (g *CleanTask) GetFailedTimes() int {
321+
return g.FailedTimes
322+
}

internal/app/translator.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ func (t *Translator) Do(ctx context.Context, task *TranslateTask, doneCallBack f
7070
time.Sleep(t.interval)
7171
tmp := strings.ReplaceAll(strings.ReplaceAll(itr.Subtitle, "\r\n", " "), "\n", " ")
7272
strings.TrimSpace(tmp)
73-
if tmp != ""{
73+
if tmp != "" {
7474
subtitle, err = t.tool.Do(tmp, task.From, task.To)
7575
}
7676
if err != nil {

internal/translate/baidu/baidu.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ func (t *Translator) call(params *url.Values) (ret *response, err error) {
8888
}
8989
defer rsp.Body.Close()
9090
content, err = ioutil.ReadAll(rsp.Body)
91-
if err != nil || rsp.StatusCode != http.StatusOK{
91+
if err != nil || rsp.StatusCode != http.StatusOK {
9292
return
9393
}
9494
//log.Printf("%+v", string(content))

internal/translate/google/google.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,13 +86,13 @@ func (t *Translator) call(params *url.Values) (ret *response, err error) {
8686
defer rsp.Body.Close()
8787

8888
content, err = ioutil.ReadAll(rsp.Body)
89-
if err != nil || rsp.StatusCode != http.StatusOK{
89+
if err != nil || rsp.StatusCode != http.StatusOK {
9090
return
9191
}
9292
var arr []interface{}
9393
json.Unmarshal(content, &arr)
9494
ret = new(response)
95-
if result, ok := arr[0].([]interface{});ok{
95+
if result, ok := arr[0].([]interface{}); ok {
9696
for _, itr := range result {
9797
if v, ok := itr.([]interface{})[0].(string); ok {
9898
ret.Dst += v

internal/translate/tencent/tencent.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ func (t *Translator) call(params *url.Values) (ret *response, err error) {
7373
}
7474
defer rsp.Body.Close()
7575
content, err = ioutil.ReadAll(rsp.Body)
76-
if err != nil || rsp.StatusCode != http.StatusOK{
76+
if err != nil || rsp.StatusCode != http.StatusOK {
7777
return
7878
}
7979

main.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ import (
77

88
var (
99
Major = 1
10-
Minor = 0
11-
Patch = 1
10+
Minor = 1
11+
Patch = 0
1212
)
1313

1414
func main() {

0 commit comments

Comments
 (0)