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:
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user