-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.go
138 lines (118 loc) · 3.46 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
package main
import (
"bufio"
"flag"
"fmt"
"log"
"net/url"
"os"
"strings"
"time"
"github.com/81hvac1k02/FanslyStreamDownloader/fansly"
)
func parseURl(rawURL string) string {
parsedURL, err := url.Parse(rawURL)
if err != nil {
fmt.Println("Error parsing URL:", err)
return ""
}
// Split the path into segments
pathSegments := strings.Split(parsedURL.Path, "/")
// The last segment should be the part you want
if len(pathSegments) > 0 {
desiredPart := pathSegments[len(pathSegments)-1]
return desiredPart
} else {
fmt.Println("No path segments found")
}
return ""
}
// loadEnv reads a file and sets the environment variables
func loadEnv(filePath string) error {
file, err := os.Open(filePath)
if err != nil {
return err
}
defer file.Close()
scanner := bufio.NewScanner(file)
for scanner.Scan() {
line := scanner.Text()
// Skip empty lines and comments
if line == "" || strings.HasPrefix(line, "#") {
continue
}
// Split the line into key and value
parts := strings.SplitN(line, "=", 2)
if len(parts) != 2 {
continue // Skip malformed lines
}
key := strings.TrimSpace(parts[0])
value := strings.TrimSpace(parts[1])
// Set the environment variable
if err := os.Setenv(key, value); err != nil {
return err
}
}
return scanner.Err()
}
func main() {
logger := log.New(os.Stdout, "FanslyDownloader: ", log.LstdFlags)
userData := fansly.UserData{}
var envFile string
// Define command line flags
flag.StringVar(&userData.FanslyCreator, "name", "", "Creator's username or the url download stream from")
flag.StringVar(&userData.FanslyToken, "token", "", "Fansly authentication token")
flag.StringVar(&userData.UserAgent, "agent", "", "User agent string")
flag.StringVar(&userData.BasePath, "path", "", "Base path for downloads")
flag.StringVar(&envFile, "env", ".env", "Path to .env file")
flag.BoolVar(&userData.Metadata, "metadata", false, "Download metadata y/N")
flag.Parse()
if len(flag.Args()) == 0 {
flag.Usage()
os.Exit(1)
}
// Handle username from positional argument
if userData.FanslyCreator == "" && len(flag.Args()) > 0 {
userData.FanslyCreator = flag.Args()[0]
}
if strings.Contains(userData.FanslyCreator, "https://fansly.com/") {
userData.FanslyCreator = parseURl(userData.FanslyCreator)
}
if userData.FanslyCreator == "" {
logger.Fatal("No username provided. Use --name flag or provide as first argument")
}
// Load environment variables if flags not provided
if userData.FanslyToken == "" || userData.UserAgent == "" {
err := loadEnv(envFile)
if err != nil {
logger.Fatal("Could not read env:", err)
}
// Load from env if not provided by flags
if userData.FanslyToken == "" {
userData.FanslyToken = os.Getenv("FANSLY_TOKEN")
}
if userData.UserAgent == "" {
userData.UserAgent = os.Getenv("USER_AGENT")
}
if userData.BasePath == "" {
userData.BasePath = os.Getenv("BASEPATH")
}
}
// Set default base path if not provided
if userData.BasePath == "" {
logger.Println("No basepath provided. Using current working directory")
var err error
userData.BasePath, err = os.Getwd()
if err != nil {
logger.Fatal("Could not get current working directory:", err)
}
}
// Download the stream
for errCount := 0; errCount <= 6; errCount++ {
if fansly.DownloadStream(&userData, true) != nil {
logger.Printf("Error downloading stream. Retrying in %v seconds\n", errCount+1)
time.Sleep(time.Duration(errCount) + 1*time.Second) //exponential backoff
continue
}
}
}