Compare commits
2 Commits
2f738413f3
...
72889d3083
Author | SHA1 | Date | |
---|---|---|---|
72889d3083 | |||
bd87baa40a |
39
Makefile
Normal file
39
Makefile
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
GOCMD=go
|
||||||
|
GOBUILD=$(GOCMD) build
|
||||||
|
GOCLEAN=$(GOCMD) clean
|
||||||
|
GOTEST=$(GOCMD) test
|
||||||
|
GOGET=$(GOCMD) get
|
||||||
|
BINARY_NAME=drmdtool
|
||||||
|
|
||||||
|
all: test build
|
||||||
|
|
||||||
|
build:
|
||||||
|
$(GOBUILD) -o $(BINARY_NAME) -v
|
||||||
|
|
||||||
|
test:
|
||||||
|
$(GOTEST) -v ./...
|
||||||
|
|
||||||
|
clean:
|
||||||
|
$(GOCLEAN)
|
||||||
|
rm -f $(BINARY_NAME)
|
||||||
|
|
||||||
|
run:
|
||||||
|
$(GOBUILD) -o $(BINARY_NAME) -v
|
||||||
|
./$(BINARY_NAME)
|
||||||
|
|
||||||
|
deps:
|
||||||
|
$(GOGET) github.com/BurntSushi/toml
|
||||||
|
$(GOGET) github.com/beevik/etree
|
||||||
|
$(GOGET) github.com/asticode/go-astisub
|
||||||
|
|
||||||
|
# Cross compilation
|
||||||
|
build-linux:
|
||||||
|
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 $(GOBUILD) -o $(BINARY_NAME)_linux -v
|
||||||
|
|
||||||
|
build-windows:
|
||||||
|
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 $(GOBUILD) -o $(BINARY_NAME).exe -v
|
||||||
|
|
||||||
|
build-mac:
|
||||||
|
CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 $(GOBUILD) -o $(BINARY_NAME)_mac -v
|
||||||
|
|
||||||
|
.PHONY: all build test clean run deps build-linux build-windows build-mac
|
@ -132,6 +132,8 @@ func handleSelect(w http.ResponseWriter, r *http.Request) {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sortItems(items)
|
||||||
|
|
||||||
groupedItems := groupItemsBySeason(items)
|
groupedItems := groupItemsBySeason(items)
|
||||||
allItems[filename] = groupedItems
|
allItems[filename] = groupedItems
|
||||||
}
|
}
|
||||||
@ -184,6 +186,7 @@ func handleProcess(w http.ResponseWriter, r *http.Request) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
selectedItems := filterSelectedItems(allItems, items)
|
selectedItems := filterSelectedItems(allItems, items)
|
||||||
|
sortItems(selectedItems)
|
||||||
go processItems(filename, selectedItems)
|
go processItems(filename, selectedItems)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -50,6 +50,18 @@
|
|||||||
button:hover, input[type="submit"]:hover {
|
button:hover, input[type="submit"]:hover {
|
||||||
background-color: #45a049;
|
background-color: #45a049;
|
||||||
}
|
}
|
||||||
|
#fix-order-button {
|
||||||
|
background-color: #2196F3;
|
||||||
|
color: white;
|
||||||
|
border: none;
|
||||||
|
padding: 10px 15px;
|
||||||
|
margin: 5px;
|
||||||
|
border-radius: 4px;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
#fix-order-button:hover {
|
||||||
|
background-color: #1976D2;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
@ -59,11 +71,12 @@
|
|||||||
{{range $filename, $fileItems := .AllItems}}
|
{{range $filename, $fileItems := .AllItems}}
|
||||||
<h2>{{$filename}}</h2>
|
<h2>{{$filename}}</h2>
|
||||||
{{range $season, $items := $fileItems}}
|
{{range $season, $items := $fileItems}}
|
||||||
<div class="season">
|
<div class="season" id="season-{{$filename}}-{{$season}}">
|
||||||
<div class="season-title">
|
<div class="season-title">
|
||||||
<input type="checkbox" class="season-checkbox" id="season-{{$filename}}-{{$season}}" checked onchange="toggleSeason('{{$filename}}-{{$season}}')">
|
<input type="checkbox" class="season-checkbox" id="season-checkbox-{{$filename}}-{{$season}}" checked onchange="toggleSeason('{{$filename}}-{{$season}}')">
|
||||||
<label for="season-{{$filename}}-{{$season}}">{{$season}}</label>
|
<label for="season-checkbox-{{$filename}}-{{$season}}">{{$season}}</label>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="season-items">
|
||||||
{{range $item := $items}}
|
{{range $item := $items}}
|
||||||
<div class="item">
|
<div class="item">
|
||||||
<label>
|
<label>
|
||||||
@ -72,6 +85,7 @@
|
|||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
{{end}}
|
{{end}}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{{end}}
|
{{end}}
|
||||||
{{end}}
|
{{end}}
|
||||||
@ -94,7 +108,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
function toggleSeason(season) {
|
function toggleSeason(season) {
|
||||||
var seasonCheckbox = document.getElementById('season-' + season);
|
var seasonCheckbox = document.getElementById('season-checkbox-' + season);
|
||||||
var episodeCheckboxes = document.getElementsByClassName('episode-' + season);
|
var episodeCheckboxes = document.getElementsByClassName('episode-' + season);
|
||||||
for (var i = 0; i < episodeCheckboxes.length; i++) {
|
for (var i = 0; i < episodeCheckboxes.length; i++) {
|
||||||
episodeCheckboxes[i].checked = seasonCheckbox.checked;
|
episodeCheckboxes[i].checked = seasonCheckbox.checked;
|
||||||
|
40
utils.go
40
utils.go
@ -9,6 +9,7 @@ import (
|
|||||||
"os/exec"
|
"os/exec"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"regexp"
|
"regexp"
|
||||||
|
"sort"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
@ -196,6 +197,43 @@ func filterSelectedItems(items []Item, selectedItems []string) []Item {
|
|||||||
return filtered
|
return filtered
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func sortItems(items []Item) {
|
||||||
|
sort.Slice(items, func(i, j int) bool {
|
||||||
|
iMeta := parseMetadata(items[i].Metadata)
|
||||||
|
jMeta := parseMetadata(items[j].Metadata)
|
||||||
|
|
||||||
|
if iMeta.Title != jMeta.Title {
|
||||||
|
return iMeta.Title < jMeta.Title
|
||||||
|
}
|
||||||
|
|
||||||
|
iSeason := extractNumber(iMeta.Season)
|
||||||
|
jSeason := extractNumber(jMeta.Season)
|
||||||
|
|
||||||
|
if iSeason != jSeason {
|
||||||
|
return iSeason < jSeason
|
||||||
|
}
|
||||||
|
|
||||||
|
iEpisode := extractEpisodeNumber(items[i].Filename)
|
||||||
|
jEpisode := extractEpisodeNumber(items[j].Filename)
|
||||||
|
|
||||||
|
return iEpisode < jEpisode
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func extractNumber(s string) int {
|
||||||
|
num, _ := strconv.Atoi(strings.TrimLeft(s, "S"))
|
||||||
|
return num
|
||||||
|
}
|
||||||
|
|
||||||
|
func extractEpisodeNumber(filename string) int {
|
||||||
|
parts := strings.Split(filename, "E")
|
||||||
|
if len(parts) > 1 {
|
||||||
|
num, _ := strconv.Atoi(parts[1])
|
||||||
|
return num
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
func processItems(filename string, items []Item) error {
|
func processItems(filename string, items []Item) error {
|
||||||
jobsMutex.Lock()
|
jobsMutex.Lock()
|
||||||
jobInfo := &JobInfo{
|
jobInfo := &JobInfo{
|
||||||
@ -215,6 +253,8 @@ func processItems(filename string, items []Item) error {
|
|||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
|
sortItems(items)
|
||||||
|
|
||||||
for i := 0; i < len(items); i++ {
|
for i := 0; i < len(items); i++ {
|
||||||
select {
|
select {
|
||||||
case <-jobInfo.AbortChan:
|
case <-jobInfo.AbortChan:
|
||||||
|
Loading…
Reference in New Issue
Block a user