Browse Source

1,新增,从 Emby 获取所有的 UserId List
2,调整,从 Emby 获取最新的视频的时候,支持 SkipWatched 字段,跳过所有用户看过的视频列表;

Signed-off-by: 716 <[email protected]>

716 4 years ago
parent
commit
bb4a67e6dc

+ 49 - 18
internal/pkg/emby_helper/emby.go

@@ -95,7 +95,7 @@ func (em EmbyApi) GetRecentlyItems() (emby.EmbyRecentlyItems, error) {
 
 	var recItems emby.EmbyRecentlyItems
 	var err error
-	if em.embyConfig.UserId == "" {
+	if em.embyConfig.SkipWatched == false {
 		// 默认是不指定某一个User的视频列表
 		_, err = em.getNewClient().R().
 			SetQueryParams(map[string]string{
@@ -111,24 +111,55 @@ func (em EmbyApi) GetRecentlyItems() (emby.EmbyRecentlyItems, error) {
 			SetResult(&recItems).
 			Get(em.embyConfig.Url + "/emby/Items")
 	} else {
-		// 获取指定用户的视频列表
-		_, err = em.getNewClient().R().
-			SetQueryParams(map[string]string{
-				"api_key":          em.embyConfig.ApiKey,
-				"IsUnaired":        "false",
-				"Limit":            fmt.Sprintf("%d", em.embyConfig.LimitCount),
-				"Recursive":        "true",
-				"SortOrder":        "Descending",
-				"IncludeItemTypes": "Episode,Movie",
-				"Filters":          "IsNotFolder,IsUnplayed",
-				"SortBy":           "DateCreated",
-			}).
-			SetResult(&recItems).
-			Get(em.embyConfig.Url + "/emby/Users/" + em.embyConfig.UserId + "/Items")
+
+		var userIds emby.EmbyUsers
+		userIds, err = em.GetUserIdList()
+		if err != nil {
+			return emby.EmbyRecentlyItems{}, err
+		}
+
+		for _, item := range userIds.Items {
+			var tmpRecItems emby.EmbyRecentlyItems
+			// 获取指定用户的视频列表
+			_, err = em.getNewClient().R().
+				SetQueryParams(map[string]string{
+					"api_key":          em.embyConfig.ApiKey,
+					"IsUnaired":        "false",
+					"Limit":            fmt.Sprintf("%d", em.embyConfig.LimitCount),
+					"Recursive":        "true",
+					"SortOrder":        "Descending",
+					"IncludeItemTypes": "Episode,Movie",
+					"Filters":          "IsNotFolder,IsUnplayed",
+					"SortBy":           "DateCreated",
+				}).
+				SetResult(&tmpRecItems).
+				Get(em.embyConfig.Url + "/emby/Users/" + item.Id + "/Items")
+
+			if err != nil {
+				return emby.EmbyRecentlyItems{}, err
+			}
+
+			recItems.Items = append(recItems.Items, tmpRecItems.Items...)
+			recItems.TotalRecordCount += tmpRecItems.TotalRecordCount
+		}
+
 	}
 
+	return recItems, nil
+}
+
+// GetUserIdList 获取所有的 UserId
+func (em EmbyApi) GetUserIdList() (emby.EmbyUsers, error) {
+	var recItems emby.EmbyUsers
+	_, err := em.getNewClient().R().
+		SetQueryParams(map[string]string{
+			"api_key": em.embyConfig.ApiKey,
+		}).
+		SetResult(&recItems).
+		Get(em.embyConfig.Url + "/emby/Users/Query")
+
 	if err != nil {
-		return emby.EmbyRecentlyItems{}, err
+		return emby.EmbyUsers{}, err
 	}
 
 	return recItems, nil
@@ -171,7 +202,7 @@ func (em EmbyApi) GetItemVideoInfo(id string) (emby.EmbyVideoInfo, error) {
 }
 
 // GetItemVideoInfoByUserId 可以拿到这个视频的选择字幕Index,配合 GetItemVideoInfo 使用。 在 API 调试界面 -- UserLibraryService
-func (em EmbyApi) GetItemVideoInfoByUserId(id string) (emby.EmbyVideoInfoByUserId, error) {
+func (em EmbyApi) GetItemVideoInfoByUserId(userId, videoId string) (emby.EmbyVideoInfoByUserId, error) {
 
 	var recItem emby.EmbyVideoInfoByUserId
 
@@ -180,7 +211,7 @@ func (em EmbyApi) GetItemVideoInfoByUserId(id string) (emby.EmbyVideoInfoByUserI
 			"api_key": em.embyConfig.ApiKey,
 		}).
 		SetResult(&recItem).
-		Get(em.embyConfig.Url + "/emby/Users/" + em.embyConfig.UserId + "/Items/" + id)
+		Get(em.embyConfig.Url + "/emby/Users/" + userId + "/Items/" + videoId)
 	if err != nil {
 		return emby.EmbyVideoInfoByUserId{}, err
 	}

+ 12 - 1
internal/pkg/emby_helper/emby_test.go

@@ -49,7 +49,7 @@ func TestEmbyHelper_GetItemVideoInfoByUserId(t *testing.T) {
 	// 95813 -- 命运夜
 	// 96564 -- The Bad Batch - S01E11
 	// 108766 -- R&M - S05E06
-	videoInfo, err := em.GetItemVideoInfoByUserId("108766")
+	videoInfo, err := em.GetItemVideoInfoByUserId("xxxxxxxxxxxxx", "108766")
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -66,3 +66,14 @@ func TestEmbyHelper_UpdateVideoSubList(t *testing.T) {
 		t.Fatal(err)
 	}
 }
+
+func TestEmbyHelper_GetUserIdList(t *testing.T) {
+	em := NewEmbyHelper(pkg.GetConfig().EmbyConfig)
+	userIds, err := em.GetUserIdList()
+	if err != nil {
+		t.Fatal(err)
+	}
+	for i, item := range userIds.Items {
+		println(i, item.Name, item.Id)
+	}
+}

+ 4 - 4
internal/types/emby/config.go

@@ -1,8 +1,8 @@
 package emby
 
 type EmbyConfig struct {
-	Url        string //	Emby 的地址,需要带上端口号 http://192.168.1.2:8089
-	ApiKey     string //	相应的 API Key
-	LimitCount int    //	最多获取多少更新的内容
-	UserId     string // 	指定一个 Emby 用户的 ID
+	Url         string //	Emby 的地址,需要带上端口号 http://192.168.1.2:8089
+	ApiKey      string //	相应的 API Key
+	LimitCount  int    //	最多获取多少更新的内容
+	SkipWatched bool   // 	跳过看过的视频,这里会读取所有 Emby 的 User 看过的列表,默认 false
 }

+ 8 - 0
internal/types/emby/type.go

@@ -44,6 +44,14 @@ type EmbyVideoInfo struct {
 	} `json:"MediaStreams"`
 }
 
+type EmbyUsers struct {
+	Items []struct {
+		Name string `json:"Name"`
+		Id   string `json:"Id"`
+	} `json:"Items"`
+	TotalRecordCount int `json:"TotalRecordCount"`
+}
+
 type EmbyVideoInfoByUserId struct {
 	Name          string    `json:"Name"`
 	OriginalTitle string    `json:"OriginalTitle"`