From 2bcda14287b8a3eb334e6822d60d5b3e5e10761b Mon Sep 17 00:00:00 2001 From: lijianyou Date: Tue, 21 Oct 2025 21:10:55 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PublishProfiles/FolderProfile.pubxml.user | 2 +- README.md | 43 ++++++++----------- dy.net.csproj.user | 2 +- job/DouYinCollectSyncJob.cs | 26 ++++++++--- job/DouYinFavoritSyncJob.cs | 24 ++++++++--- job/DouYinUperPostSyncJob.cs | 38 +++++++++------- 6 files changed, 80 insertions(+), 55 deletions(-) diff --git a/Properties/PublishProfiles/FolderProfile.pubxml.user b/Properties/PublishProfiles/FolderProfile.pubxml.user index a7cbce5..0131b15 100644 --- a/Properties/PublishProfiles/FolderProfile.pubxml.user +++ b/Properties/PublishProfiles/FolderProfile.pubxml.user @@ -5,7 +5,7 @@ https://go.microsoft.com/fwlink/?LinkID=208121. <_PublishTargetUrl>F:\work\code\me\dysync.net\bin\Release\net6.0\publish\ - True|2025-10-20T02:31:05.5865212Z||;True|2025-10-20T10:20:41.5717101+08:00||;True|2025-10-19T10:08:33.6669332+08:00||;False|2025-10-19T10:07:22.3337545+08:00||;False|2025-10-19T10:05:22.9484805+08:00||;True|2025-10-10T16:54:27.1472888+08:00||;False|2025-10-10T16:53:44.1700030+08:00||;False|2025-10-10T16:52:48.1740453+08:00||;False|2025-10-10T16:51:21.5067253+08:00||;False|2025-10-10T16:50:19.2140597+08:00||;False|2025-10-10T16:49:21.2213290+08:00||;False|2025-10-10T16:48:47.7229948+08:00||;False|2025-10-10T16:48:15.1258700+08:00||;True|2025-09-30T13:29:42.2354235+08:00||;True|2025-09-25T11:44:52.6858389+08:00||;True|2025-09-25T11:08:27.8810109+08:00||;True|2025-09-25T09:28:50.2563374+08:00||;True|2025-09-24T16:14:02.3072184+08:00||;True|2025-09-23T22:38:52.4414757+08:00||;True|2025-09-23T22:19:07.1006356+08:00||;True|2025-09-23T22:18:01.5945225+08:00||;True|2025-09-23T22:06:15.6293613+08:00||;True|2025-09-23T21:53:14.2977444+08:00||;True|2025-09-23T21:46:55.2322411+08:00||;False|2025-09-23T21:45:23.7858854+08:00||;False|2025-09-23T21:03:51.8325689+08:00||;True|2025-09-23T10:03:32.2251920+08:00||;False|2025-09-23T09:38:08.2372201+08:00||;False|2025-09-23T09:37:49.9390545+08:00||;True|2024-03-11T21:31:45.8102398+08:00||;True|2024-03-11T07:26:24.7660541+08:00||;True|2024-03-08T22:08:40.0154831+08:00||;True|2024-03-03T10:14:36.8109114+08:00||;True|2024-03-02T18:44:57.3288537+08:00||;True|2024-01-24T17:51:37.9164415+08:00||;True|2024-01-24T16:36:50.5612157+08:00||;True|2024-01-24T15:51:35.7556653+08:00||;True|2024-01-17T23:40:40.7526618+08:00||;True|2024-01-17T23:36:10.3692844+08:00||;True|2024-01-17T23:22:03.2378834+08:00||;True|2024-01-03T11:35:44.7118292+08:00||;True|2024-01-03T11:11:23.4270453+08:00||;True|2024-01-03T11:04:35.2081526+08:00||;True|2024-01-03T10:57:03.7053107+08:00||;True|2024-01-03T10:51:50.7463989+08:00||;False|2024-01-03T10:50:24.9775312+08:00||;True|2024-01-03T10:47:30.1128183+08:00||;True|2024-01-03T10:42:55.8640657+08:00||;True|2024-01-03T09:24:24.3436056+08:00||;True|2024-01-02T23:40:38.2001198+08:00||;True|2024-01-02T23:08:36.7230444+08:00||;True|2024-01-02T22:53:43.9658255+08:00||;True|2024-01-02T22:25:38.5545279+08:00||;False|2024-01-02T22:24:42.6577609+08:00||;True|2024-01-02T22:04:33.4708889+08:00||;True|2024-01-02T21:49:57.9249898+08:00||;True|2023-12-28T22:42:58.5976180+08:00||;True|2023-12-28T22:24:09.2051205+08:00||;True|2023-12-28T22:05:48.4865497+08:00||;True|2023-12-28T21:50:57.4549336+08:00||;True|2023-12-28T21:45:30.4557939+08:00||;True|2023-12-28T21:19:59.3614594+08:00||;False|2023-12-28T21:17:04.3069097+08:00||;False|2023-12-28T21:15:56.7788810+08:00||;False|2023-12-28T21:14:57.3617402+08:00||;False|2023-12-28T21:10:45.4382469+08:00||;True|2023-12-28T19:45:33.1431914+08:00||;True|2023-12-26T11:30:36.6418716+08:00||;True|2023-12-26T11:17:40.6433651+08:00||;True|2023-12-26T09:13:56.0741559+08:00||;True|2023-12-26T09:10:55.5358737+08:00||;True|2023-12-25T23:15:34.6534359+08:00||;True|2023-12-25T23:09:47.1566176+08:00||;False|2023-12-25T23:07:32.1118803+08:00||;True|2023-12-25T22:59:50.4643459+08:00||;True|2023-12-25T22:50:14.3584798+08:00||;False|2023-12-25T22:49:20.0279513+08:00||;True|2023-12-25T22:44:07.4183973+08:00||;True|2023-12-25T22:35:27.3847085+08:00||;True|2023-12-25T22:23:21.3542658+08:00||;True|2023-12-25T22:12:00.5219522+08:00||;True|2023-12-25T16:52:12.5089621+08:00||;True|2023-12-25T16:43:30.8348193+08:00||;True|2023-12-25T16:35:08.2421925+08:00||;True|2023-12-25T16:25:21.3233455+08:00||;False|2023-12-25T16:24:39.1703901+08:00||;True|2023-12-25T16:24:01.4340091+08:00||;True|2023-12-25T16:10:06.5213850+08:00||;True|2023-12-25T15:42:17.1376331+08:00||;True|2023-12-25T15:29:47.8537015+08:00||;True|2023-12-25T14:04:54.3750643+08:00||;False|2023-12-25T14:04:07.9330700+08:00||;True|2023-12-25T13:51:58.1949269+08:00||;True|2023-12-25T13:41:42.4832670+08:00||;True|2023-12-25T13:00:25.3861450+08:00||;True|2023-12-25T12:48:45.3851245+08:00||;True|2023-12-25T12:46:54.1266013+08:00||;True|2023-12-25T12:37:03.2615780+08:00||;False|2023-12-25T12:36:06.2657224+08:00||;True|2023-12-25T12:31:59.6032354+08:00||; + True|2025-10-21T10:35:28.8392541Z||;True|2025-10-20T10:31:05.5865212+08:00||;True|2025-10-20T10:20:41.5717101+08:00||;True|2025-10-19T10:08:33.6669332+08:00||;False|2025-10-19T10:07:22.3337545+08:00||;False|2025-10-19T10:05:22.9484805+08:00||;True|2025-10-10T16:54:27.1472888+08:00||;False|2025-10-10T16:53:44.1700030+08:00||;False|2025-10-10T16:52:48.1740453+08:00||;False|2025-10-10T16:51:21.5067253+08:00||;False|2025-10-10T16:50:19.2140597+08:00||;False|2025-10-10T16:49:21.2213290+08:00||;False|2025-10-10T16:48:47.7229948+08:00||;False|2025-10-10T16:48:15.1258700+08:00||;True|2025-09-30T13:29:42.2354235+08:00||;True|2025-09-25T11:44:52.6858389+08:00||;True|2025-09-25T11:08:27.8810109+08:00||;True|2025-09-25T09:28:50.2563374+08:00||;True|2025-09-24T16:14:02.3072184+08:00||;True|2025-09-23T22:38:52.4414757+08:00||;True|2025-09-23T22:19:07.1006356+08:00||;True|2025-09-23T22:18:01.5945225+08:00||;True|2025-09-23T22:06:15.6293613+08:00||;True|2025-09-23T21:53:14.2977444+08:00||;True|2025-09-23T21:46:55.2322411+08:00||;False|2025-09-23T21:45:23.7858854+08:00||;False|2025-09-23T21:03:51.8325689+08:00||;True|2025-09-23T10:03:32.2251920+08:00||;False|2025-09-23T09:38:08.2372201+08:00||;False|2025-09-23T09:37:49.9390545+08:00||;True|2024-03-11T21:31:45.8102398+08:00||;True|2024-03-11T07:26:24.7660541+08:00||;True|2024-03-08T22:08:40.0154831+08:00||;True|2024-03-03T10:14:36.8109114+08:00||;True|2024-03-02T18:44:57.3288537+08:00||;True|2024-01-24T17:51:37.9164415+08:00||;True|2024-01-24T16:36:50.5612157+08:00||;True|2024-01-24T15:51:35.7556653+08:00||;True|2024-01-17T23:40:40.7526618+08:00||;True|2024-01-17T23:36:10.3692844+08:00||;True|2024-01-17T23:22:03.2378834+08:00||;True|2024-01-03T11:35:44.7118292+08:00||;True|2024-01-03T11:11:23.4270453+08:00||;True|2024-01-03T11:04:35.2081526+08:00||;True|2024-01-03T10:57:03.7053107+08:00||;True|2024-01-03T10:51:50.7463989+08:00||;False|2024-01-03T10:50:24.9775312+08:00||;True|2024-01-03T10:47:30.1128183+08:00||;True|2024-01-03T10:42:55.8640657+08:00||;True|2024-01-03T09:24:24.3436056+08:00||;True|2024-01-02T23:40:38.2001198+08:00||;True|2024-01-02T23:08:36.7230444+08:00||;True|2024-01-02T22:53:43.9658255+08:00||;True|2024-01-02T22:25:38.5545279+08:00||;False|2024-01-02T22:24:42.6577609+08:00||;True|2024-01-02T22:04:33.4708889+08:00||;True|2024-01-02T21:49:57.9249898+08:00||;True|2023-12-28T22:42:58.5976180+08:00||;True|2023-12-28T22:24:09.2051205+08:00||;True|2023-12-28T22:05:48.4865497+08:00||;True|2023-12-28T21:50:57.4549336+08:00||;True|2023-12-28T21:45:30.4557939+08:00||;True|2023-12-28T21:19:59.3614594+08:00||;False|2023-12-28T21:17:04.3069097+08:00||;False|2023-12-28T21:15:56.7788810+08:00||;False|2023-12-28T21:14:57.3617402+08:00||;False|2023-12-28T21:10:45.4382469+08:00||;True|2023-12-28T19:45:33.1431914+08:00||;True|2023-12-26T11:30:36.6418716+08:00||;True|2023-12-26T11:17:40.6433651+08:00||;True|2023-12-26T09:13:56.0741559+08:00||;True|2023-12-26T09:10:55.5358737+08:00||;True|2023-12-25T23:15:34.6534359+08:00||;True|2023-12-25T23:09:47.1566176+08:00||;False|2023-12-25T23:07:32.1118803+08:00||;True|2023-12-25T22:59:50.4643459+08:00||;True|2023-12-25T22:50:14.3584798+08:00||;False|2023-12-25T22:49:20.0279513+08:00||;True|2023-12-25T22:44:07.4183973+08:00||;True|2023-12-25T22:35:27.3847085+08:00||;True|2023-12-25T22:23:21.3542658+08:00||;True|2023-12-25T22:12:00.5219522+08:00||;True|2023-12-25T16:52:12.5089621+08:00||;True|2023-12-25T16:43:30.8348193+08:00||;True|2023-12-25T16:35:08.2421925+08:00||;True|2023-12-25T16:25:21.3233455+08:00||;False|2023-12-25T16:24:39.1703901+08:00||;True|2023-12-25T16:24:01.4340091+08:00||;True|2023-12-25T16:10:06.5213850+08:00||;True|2023-12-25T15:42:17.1376331+08:00||;True|2023-12-25T15:29:47.8537015+08:00||;True|2023-12-25T14:04:54.3750643+08:00||;False|2023-12-25T14:04:07.9330700+08:00||;True|2023-12-25T13:51:58.1949269+08:00||;True|2023-12-25T13:41:42.4832670+08:00||;True|2023-12-25T13:00:25.3861450+08:00||;True|2023-12-25T12:48:45.3851245+08:00||;True|2023-12-25T12:46:54.1266013+08:00||;True|2023-12-25T12:37:03.2615780+08:00||;False|2023-12-25T12:36:06.2657224+08:00||; \ No newline at end of file diff --git a/README.md b/README.md index ba4cb68..dded1f6 100644 --- a/README.md +++ b/README.md @@ -89,38 +89,33 @@ docker run -d --restart=always \ ### Arm设备请使用 registry.cn-hangzhou.aliyuncs.com/jianzhichu/dysync.net:arm_0.1.1 版本镜像 创建 docker-compose.yml 文件,复制以下内容,替换「本地路径」后执行 docker-compose up -d: -```yaml version: '3.8' services: dysync: image: registry.cn-hangzhou.aliyuncs.com/jianzhichu/dysync.net - container_name: dysync2025 # 容器名称可自定义 - restart: always # 容器异常退出时自动重启 + container_name: dysync2025 + restart: always ports: - - "10101:10101" # 端口映射:本地端口:容器端口(容器端口10101不可修改) + - "10101:10101" volumes: - # 第一个账号:收藏视频存储路径(本地路径:容器路径) - - /本地/收藏视频路径:/app/collect - # 第一个账号:喜欢视频存储路径(本地路径:容器路径) - - /本地/喜欢视频路径:/app/favorite - # 数据库存储路径(持久化配置和同步记录) - - /本地/数据库路径:/app/db - # 指定博主视频存储路径 - - /本地/博主视频路径:/app/uper - # 多账号示例:第二个账号视频存储路径(需在后台对应配置) - - /本地/第二个账号视频路径:/app/yeyeye - # (可选)环境变量配置(取消注释并修改) - # environment: - # - ENV_VAR_NAME=value - # (可选)自定义网络配置(取消注释并修改) - # networks: - # - custom_network + - /volume1/docker/dysync/db:/app/db + + - /volume2/mediay/dysync:/app/collect + - /volume2/mediay/dysync_fav:/app/favorite + - /volume2/mediay/dysync_up:/app/uper + # 下面是多账号路径映射示例(可选) + - /volume2/mediay/dysync2:/app/yeyeye + - /volume2/mediay/dysync2_fav:/app/yeyeye_fav + - /volume2/mediay/dysync2_up:/app/yeyeye_up + # 配置DNS服务器(解决域名解析失败导致的无法访问外网) + network_mode: bridge + dns: + - 8.8.8.8 # Google DNS + - 114.114.114.114 # 国内DNS + - 223.5.5.5 + -# (可选)自定义网络配置 -# networks: -# custom_network: -# driver: bridge ``` ## 🚀 5. 软件截图 diff --git a/dy.net.csproj.user b/dy.net.csproj.user index 7a395d4..77714ef 100644 --- a/dy.net.csproj.user +++ b/dy.net.csproj.user @@ -2,7 +2,7 @@ tiny.ddns - FolderProfile + F:\work\code\me\dysync.net\Properties\PublishProfiles\FolderProfile.pubxml ApiControllerEmptyScaffolder root/Common/Api diff --git a/job/DouYinCollectSyncJob.cs b/job/DouYinCollectSyncJob.cs index d5bf520..99f7a38 100644 --- a/job/DouYinCollectSyncJob.cs +++ b/job/DouYinCollectSyncJob.cs @@ -117,11 +117,7 @@ namespace dy.net.job var tag3 = tags.FirstOrDefault(x => x.Level == 3)?.TagName; string saveFolder = CreateSaveFolder(cookie, item, tag1, tag2); - // 创建文件夹(提前创建,避免下载时才操作) - if (!Directory.Exists(saveFolder)) - { - Directory.CreateDirectory(saveFolder); - } + var fileName = $"{item.AwemeId}.{v.Format}"; // 用ID做文件名,避免特殊字符 var savePath = Path.Combine(saveFolder, fileName); @@ -130,7 +126,16 @@ namespace dy.net.job Serilog.Log.Debug($"collect-视频[{SanitizePath(item.Desc)}]开始下载"); await Task.Delay(_random.Next(1, 4) * 1000); var downVideo = await _douyinService.DownloadAsync(videoUrl, savePath, cookie.Cookies); - Serilog.Log.Debug($"collect-视频[{SanitizePath(item.Desc)}]下载{(downVideo ? "成功" : "失败")}"); + + if (downVideo) + { + Serilog.Log.Debug($"collect-视频[{SanitizePath(item.Desc)}]下载{(downVideo ? "成功" : "失败")}"); + } + else + { + Serilog.Log.Error($"collect-视频[{SanitizePath(item.Desc)}]下载{(downVideo ? "成功" : "失败")}"); + + } if (downVideo) { await DownVideoCover(item, saveFolder, cookie.Cookies); @@ -323,7 +328,14 @@ namespace dy.net.job // 路径中避免特殊字符,用ID替代描述 var safeTag1 = string.IsNullOrWhiteSpace(tag1) ? "other" : SanitizePath(tag1); List pathParts = new List { cookie.SavePath, safeTag1 }; - return Path.Combine(pathParts[0], string.Join("-", pathParts.Skip(1)), SanitizePath(item.Desc) + "@" + item.AwemeId); + var saveFolder = Path.Combine(pathParts[0], string.Join("-", pathParts.Skip(1)), SanitizePath(item.Desc) + "@" + item.AwemeId); + + // 创建文件夹(提前创建,避免下载时才操作) + if (!Directory.Exists(saveFolder)) + { + Directory.CreateDirectory(saveFolder); + } + return saveFolder; //if (string.IsNullOrWhiteSpace(tag2)) // return Path.Combine(pathParts[0], string.Join("-", pathParts.Skip(1)), SanitizePath(item.Desc) + "@" + item.AwemeId); //else diff --git a/job/DouYinFavoritSyncJob.cs b/job/DouYinFavoritSyncJob.cs index 077ed42..c5b1748 100644 --- a/job/DouYinFavoritSyncJob.cs +++ b/job/DouYinFavoritSyncJob.cs @@ -118,11 +118,6 @@ namespace dy.net.job var tag3 = tags.FirstOrDefault(x => x.Level == 3)?.TagName; string saveFolder = CreateSaveFolder(cookie, item, tag1, tag2); - // 创建文件夹(提前创建,避免下载时才操作) - if (!Directory.Exists(saveFolder)) - { - Directory.CreateDirectory(saveFolder); - } var fileName = $"{item.AwemeId}.{v.Format}"; // 用ID做文件名,避免特殊字符 var savePath = Path.Combine(saveFolder, fileName); @@ -131,7 +126,15 @@ namespace dy.net.job Serilog.Log.Debug($"favorite-视频[{SanitizePath(item.Desc)}]开始下载"); await Task.Delay(_random.Next(1, 4) * 1000); var downVideo = await _douyinService.DownloadAsync(videoUrl, savePath, cookie.Cookies); - Serilog.Log.Debug($"favorite-视频[{SanitizePath(item.Desc)}]下载{(downVideo ? "成功" : "失败")}"); + + if (downVideo) + { + Serilog.Log.Debug($"favorite-视频[{SanitizePath(item.Desc)}]下载{(downVideo ? "成功" : "失败")}"); + } + else + { + Serilog.Log.Error($"favorite-视频[{SanitizePath(item.Desc)}]下载{(downVideo ? "成功" : "失败")}"); + } if (downVideo) { await DownVideoCover(item, saveFolder, cookie.Cookies); @@ -327,7 +330,14 @@ namespace dy.net.job // 路径中避免特殊字符,用ID替代描述 var safeTag1 = string.IsNullOrWhiteSpace(tag1) ? "other" : SanitizePath(tag1); List pathParts = new List { cookie.FavSavePath, safeTag1 }; - return Path.Combine(pathParts[0], string.Join("-", pathParts.Skip(1)), SanitizePath(item.Desc) + "@" + item.AwemeId); + var saveFolder= Path.Combine(pathParts[0], string.Join("-", pathParts.Skip(1)), SanitizePath(item.Desc) + "@" + item.AwemeId); + + // 创建文件夹(提前创建,避免下载时才操作) + if (!Directory.Exists(saveFolder)) + { + Directory.CreateDirectory(saveFolder); + } + return saveFolder; //if (string.IsNullOrWhiteSpace(tag2)) // return Path.Combine(pathParts[0], string.Join("-", pathParts.Skip(1)), SanitizePath(item.Desc) + "@" + item.AwemeId); //else diff --git a/job/DouYinUperPostSyncJob.cs b/job/DouYinUperPostSyncJob.cs index 5313b56..2159a4b 100644 --- a/job/DouYinUperPostSyncJob.cs +++ b/job/DouYinUperPostSyncJob.cs @@ -125,13 +125,9 @@ namespace dy.net.job var tag1 = tags.FirstOrDefault(x => x.Level == 1)?.TagName; var tag2 = tags.FirstOrDefault(x => x.Level == 2)?.TagName; var tag3 = tags.FirstOrDefault(x => x.Level == 3)?.TagName; - string saveFolder = CreateSaveFolder(cookie, item, tag1, tag2); + string saveFolder = CreateSaveFolder(cookie, uper.uper); - // 创建文件夹(提前创建,避免下载时才操作) - if (!Directory.Exists(saveFolder)) - { - Directory.CreateDirectory(saveFolder); - } + var fileName = $"{item.AwemeId}.{v.Format}"; // 用ID做文件名,避免特殊字符 var savePath = Path.Combine(saveFolder, fileName); @@ -140,7 +136,14 @@ namespace dy.net.job Serilog.Log.Debug($"dyuploder-[{uper.uper}]-视频[{SanitizePath(item.Desc)}]开始下载"); await Task.Delay(_random.Next(1, 4) * 1000); var downVideo = await _douyinService.DownloadAsync(videoUrl, savePath, cookie.Cookies); - Serilog.Log.Debug($"dyuploder-[{uper.uper}]-视频[{SanitizePath(item.Desc)}]下载{(downVideo ? "成功" : "失败")}"); + if(downVideo) + { + Serilog.Log.Debug($"dyuploder-[{uper.uper}]-视频[{SanitizePath(item.Desc)}]下载{(downVideo ? "成功" : "失败")}"); + } + else + { + Serilog.Log.Error($"dyuploder-[{uper.uper}]-视频[{SanitizePath(item.Desc)}]下载{(downVideo ? "成功" : "失败")}"); + } if (downVideo) { await DownVideoCover(item, saveFolder, cookie.Cookies); @@ -154,7 +157,7 @@ namespace dy.net.job // 有可能下载大头像失败,尝试用缩略图地址 if (string.IsNullOrWhiteSpace(avatarUrl)) { - avatarUrl=item.Author?.AvatarThumb?.UrlList != null && item.Author.AvatarThumb.UrlList.Any() + avatarUrl = item.Author?.AvatarThumb?.UrlList != null && item.Author.AvatarThumb.UrlList.Any() ? item.Author.AvatarThumb.UrlList[0] : null; } @@ -326,16 +329,21 @@ namespace dy.net.job /// 创建目录 /// /// - /// - /// - /// + /// /// - private static string CreateSaveFolder(DyUserCookies cookie, Aweme item, string? tag1, string? tag2) + private static string CreateSaveFolder(DyUserCookies cookie, string uperName) { + var saveFolder = Path.Combine(cookie.UpSavePath, uperName); + // 创建文件夹(提前创建,避免下载时才操作) + if (!Directory.Exists(saveFolder)) + { + Directory.CreateDirectory(saveFolder); + } + return saveFolder; // 路径中避免特殊字符,用ID替代描述 - var safeTag1 = string.IsNullOrWhiteSpace(tag1) ? "other" : SanitizePath(tag1); - List pathParts = new List { cookie.UpSavePath, safeTag1 }; - return Path.Combine(pathParts[0], string.Join("-", pathParts.Skip(1)), SanitizePath(item.Desc) + "@" + item.AwemeId); + //var safeTag1 = string.IsNullOrWhiteSpace(tag1) ? "other" : SanitizePath(tag1); + //List pathParts = new List { cookie.UpSavePath, safeTag1 }; + //return Path.Combine(pathParts[0], string.Join("-", pathParts.Skip(1)), SanitizePath(item.Desc) + "@" + item.AwemeId); //if (string.IsNullOrWhiteSpace(tag2)) // return Path.Combine(pathParts[0], string.Join("-", pathParts.Skip(1)), SanitizePath(item.Desc) + "@" + item.AwemeId); //else