chore: fix remarks shadowrocket subscription (#4247)

This commit is contained in:
Harry NG 2026-05-11 13:24:22 +07:00 committed by GitHub
parent e20d73ba7e
commit 9f06bffbea
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 54 additions and 41 deletions

View file

@ -37,6 +37,8 @@ const lastOnlineMs = Number(subData.lastOnline || 0);
const subUrl = subData.subUrl || ''; const subUrl = subData.subUrl || '';
const subJsonUrl = subData.subJsonUrl || ''; const subJsonUrl = subData.subJsonUrl || '';
const subClashUrl = subData.subClashUrl || ''; const subClashUrl = subData.subClashUrl || '';
const subTitle = subData.subTitle || '';
const subSupportUrl = subData.subSupportUrl || '';
const links = Array.isArray(subData.links) ? subData.links : []; const links = Array.isArray(subData.links) ? subData.links : [];
// Panel's "Calendar Type" setting; controls whether expiry / lastOnline // Panel's "Calendar Type" setting; controls whether expiry / lastOnline
// render in Gregorian or Jalali on this standalone subscription page. // render in Gregorian or Jalali on this standalone subscription page.
@ -102,7 +104,14 @@ function linkName(link, idx) {
// iOS deep links taken verbatim from the legacy subpage. Each // iOS deep links taken verbatim from the legacy subpage. Each
// client expects the sub URL in a slightly different param name. // client expects the sub URL in a slightly different param name.
const shadowrocketUrl = computed(() => `sub://${btoa(subUrl)}`); const shadowrocketUrl = computed(() => {
if (!subUrl) return '';
const separator = subUrl.includes('?') ? '&' : '?';
const rawUrl = subUrl + separator + 'flag=shadowrocket';
const base64Url = encodeURIComponent(btoa(rawUrl));
const remark = encodeURIComponent(subTitle || sId || 'Subscription');
return `shadowrocket://add/sub/${base64Url}?remark=${remark}`;
});
const v2boxUrl = computed(() => `v2box://install-sub?url=${encodeURIComponent(subUrl)}&name=${encodeURIComponent(sId)}`); const v2boxUrl = computed(() => `v2box://install-sub?url=${encodeURIComponent(subUrl)}&name=${encodeURIComponent(sId)}`);
const streisandUrl = computed(() => `streisand://import/${encodeURIComponent(subUrl)}`); const streisandUrl = computed(() => `streisand://import/${encodeURIComponent(subUrl)}`);
const v2raytunUrl = computed(() => subUrl); const v2raytunUrl = computed(() => subUrl);

View file

@ -128,7 +128,7 @@ func (a *SUBController) subs(c *gin.Context) {
basePath = "/" basePath = "/"
} }
basePathStr := basePath.(string) basePathStr := basePath.(string)
page := a.subService.BuildPageData(subId, hostHeader, traffic, lastOnline, subs, subURL, subJsonURL, subClashURL, basePathStr) page := a.subService.BuildPageData(subId, hostHeader, traffic, lastOnline, subs, subURL, subJsonURL, subClashURL, basePathStr, a.subTitle, a.subSupportUrl)
a.serveSubPage(c, basePathStr, page) a.serveSubPage(c, basePathStr, page)
return return
} }

View file

@ -1413,25 +1413,27 @@ func searchHost(headers any) string {
// PageData is a view model for subpage.html // PageData is a view model for subpage.html
// PageData contains data for rendering the subscription information page. // PageData contains data for rendering the subscription information page.
type PageData struct { type PageData struct {
Host string Host string
BasePath string BasePath string
SId string SId string
Enabled bool Enabled bool
Download string Download string
Upload string Upload string
Total string Total string
Used string Used string
Remained string Remained string
Expire int64 Expire int64
LastOnline int64 LastOnline int64
Datepicker string Datepicker string
DownloadByte int64 DownloadByte int64
UploadByte int64 UploadByte int64
TotalByte int64 TotalByte int64
SubUrl string SubUrl string
SubJsonUrl string SubJsonUrl string
SubClashUrl string SubClashUrl string
Result []string SubTitle string
SubSupportUrl string
Result []string
} }
// ResolveRequest extracts scheme and host info from request/headers consistently. // ResolveRequest extracts scheme and host info from request/headers consistently.
@ -1545,7 +1547,7 @@ func (s *SubService) joinPathWithID(basePath, subId string) string {
// BuildPageData parses header and prepares the template view model. // BuildPageData parses header and prepares the template view model.
// BuildPageData constructs page data for rendering the subscription information page. // BuildPageData constructs page data for rendering the subscription information page.
func (s *SubService) BuildPageData(subId string, hostHeader string, traffic xray.ClientTraffic, lastOnline int64, subs []string, subURL, subJsonURL, subClashURL string, basePath string) PageData { func (s *SubService) BuildPageData(subId string, hostHeader string, traffic xray.ClientTraffic, lastOnline int64, subs []string, subURL, subJsonURL, subClashURL string, basePath string, subTitle string, subSupportUrl string) PageData {
download := common.FormatTraffic(traffic.Down) download := common.FormatTraffic(traffic.Down)
upload := common.FormatTraffic(traffic.Up) upload := common.FormatTraffic(traffic.Up)
total := "∞" total := "∞"
@ -1563,25 +1565,27 @@ func (s *SubService) BuildPageData(subId string, hostHeader string, traffic xray
} }
return PageData{ return PageData{
Host: hostHeader, Host: hostHeader,
BasePath: basePath, BasePath: basePath,
SId: subId, SId: subId,
Enabled: traffic.Enable, Enabled: traffic.Enable,
Download: download, Download: download,
Upload: upload, Upload: upload,
Total: total, Total: total,
Used: used, Used: used,
Remained: remained, Remained: remained,
Expire: traffic.ExpiryTime / 1000, Expire: traffic.ExpiryTime / 1000,
LastOnline: lastOnline, LastOnline: lastOnline,
Datepicker: datepicker, Datepicker: datepicker,
DownloadByte: traffic.Down, DownloadByte: traffic.Down,
UploadByte: traffic.Up, UploadByte: traffic.Up,
TotalByte: traffic.Total, TotalByte: traffic.Total,
SubUrl: subURL, SubUrl: subURL,
SubJsonUrl: subJsonURL, SubJsonUrl: subJsonURL,
SubClashUrl: subClashURL, SubClashUrl: subClashURL,
Result: subs, SubTitle: subTitle,
SubSupportUrl: subSupportUrl,
Result: subs,
} }
} }