Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions internal/upload/validate.go
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,10 @@ func ValidateYouTubeURL(raw string) error {
switch strings.ToLower(parsed.Hostname()) {
case "youtube.com", "www.youtube.com", "youtu.be", "m.youtube.com":
return nil
case "x.com", "www.x.com", "mobile.x.com", "m.x.com":
return nil
case "twitter.com", "www.twitter.com", "mobile.twitter.com", "m.twitter.com":
return nil
default:
return ErrInvalidURL
}
Expand Down
6 changes: 6 additions & 0 deletions internal/upload/validate_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -67,10 +67,16 @@ func TestValidateYouTubeURL(t *testing.T) {
{name: "valid youtube watch", raw: "https://youtube.com/watch?v=X", wantErr: nil},
{name: "valid www", raw: "https://www.youtube.com/watch?v=X", wantErr: nil},
{name: "valid mobile", raw: "https://m.youtube.com/watch?v=X", wantErr: nil},
{name: "valid x post", raw: "https://x.com/user/status/123", wantErr: nil},
{name: "valid x video selector", raw: "https://www.x.com/user/status/123/video/2", wantErr: nil},
{name: "valid mobile x", raw: "https://mobile.x.com/user/status/123", wantErr: nil},
{name: "valid twitter post", raw: "https://twitter.com/user/status/123", wantErr: nil},
{name: "valid mobile twitter", raw: "https://m.twitter.com/user/status/123", wantErr: nil},
{name: "empty", raw: "", wantErr: ErrInvalidURL},
{name: "not url", raw: "not-url", wantErr: ErrInvalidURL},
{name: "foreign host", raw: "https://example.com/watch?v=X", wantErr: ErrInvalidURL},
{name: "host confusion", raw: "https://youtu.be.evil.com/x", wantErr: ErrInvalidURL},
{name: "x host confusion", raw: "https://x.com.evil.com/user/status/123", wantErr: ErrInvalidURL},
{name: "ftp scheme", raw: "ftp://youtube.com/watch?v=X", wantErr: ErrInvalidURL},
}

Expand Down
6 changes: 3 additions & 3 deletions internal/web/page_landing.templ
Original file line number Diff line number Diff line change
Expand Up @@ -75,9 +75,9 @@ templ landingFormats() {
<span class="ll-land-format-icon">
@iconUploadLink()
</span>
<strong>Ссылки на YouTube</strong>
<p>Или прямой URL на файл записи — скачаем сами.</p>
<span class="ll-land-format-meta">youtube.com · прямые ссылки</span>
<strong>Ссылки на YouTube и X</strong>
<p>Вставьте ссылку на видео — запись скачаем сами.</p>
<span class="ll-land-format-meta">youtube.com · x.com</span>
</div>
</div>
<div class="ll-land-options">
Expand Down
2 changes: 1 addition & 1 deletion internal/web/page_landing_templ.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions internal/web/page_upload.templ
Original file line number Diff line number Diff line change
Expand Up @@ -78,9 +78,9 @@ templ UploadPage(data LayoutData) {
<form id="ll-upload-url-panel" class="ll-upload-panel ll-upload-hidden" data-panel="url" hx-post="/upload/youtube" hx-swap="none" hx-headers={ `{"X-CSRF-Token":"` + data.CSRFToken + `"}` } method="post">
<label class="ll-upload-url-field">
@iconUploadLink()
<input type="url" name="url" placeholder="Вставьте ссылку на YouTube или прямой URL записи" autocomplete="off" required data-url-input/>
<input type="url" name="url" placeholder="Вставьте ссылку на YouTube или X" autocomplete="off" required data-url-input/>
</label>
<p class="ll-upload-url-hint">Поддерживаются YouTube и прямые ссылки на аудио/видео.</p>
<p class="ll-upload-url-hint">Поддерживаются видео с YouTube и из публичных постов X.</p>
<div class="ll-upload-options">
<label class="ll-upload-check">
<input type="checkbox" name="has_pdf" data-has-pdf/>
Expand Down
2 changes: 1 addition & 1 deletion internal/web/page_upload_templ.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

12 changes: 12 additions & 0 deletions internal/web/web_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -256,6 +256,12 @@ func TestRouter_Landing(t *testing.T) {
if !strings.Contains(body, "ll-land-formats") {
t.Error("лендинг должен содержать блок форматов")
}
if !strings.Contains(body, "Ссылки на YouTube и X") {
t.Error("лендинг должен сообщать о поддержке ссылок YouTube и X")
}
if !strings.Contains(body, "youtube.com · x.com") {
t.Error("лендинг должен перечислять поддерживаемые платформы")
}
}

// TestRouter_NotFound проверяет стилизованную 404 вместо голого текста chi.
Expand Down Expand Up @@ -425,6 +431,12 @@ func TestUploadPage_YouTubeForm(t *testing.T) {
if !strings.Contains(html, `name="url"`) {
t.Error("ожидается поле url")
}
if !strings.Contains(html, "Вставьте ссылку на YouTube или X") {
t.Error("ожидается подсказка о ссылках YouTube и X")
}
if !strings.Contains(html, "из публичных постов X") {
t.Error("ожидается пояснение об ограничении X публичными постами")
}
}

func TestUploadPage_ExtractToggle(t *testing.T) {
Expand Down