🐛 error fixes, and removed some returned data

This commit is contained in:
Zechariah 2022-05-31 01:08:03 +08:00
parent bf45a192e0
commit e25f7e5546
10 changed files with 42 additions and 68 deletions

View File

@ -21,6 +21,7 @@ import {
VideoFull VideoFull
} from "." } from "."
import { Cookie, CookieJar } from "tough-cookie" import { Cookie, CookieJar } from "tough-cookie"
import { writeFileSync } from "fs"
export default class YTMusic { export default class YTMusic {
private cookiejar: CookieJar private cookiejar: CookieJar
@ -436,7 +437,7 @@ export default class YTMusic {
"musicPlaylistShelfRenderer", "musicPlaylistShelfRenderer",
"musicResponsiveListItemRenderer" "musicResponsiveListItemRenderer"
) )
let continuation = traverse(playlistData, "musicPlaylistShelfRenderer", "continuation") let continuation = traverse(playlistData, "continuation")
while (true) { while (true) {
if (continuation instanceof Array) break if (continuation instanceof Array) break

View File

@ -1,20 +1,13 @@
import assert from "assert" import assert from "assert"
import describeParallel from "mocha.parallel" import describeParallel from "mocha.parallel"
import Validator from "validate-any/dist/classes/Validator"
import YTMusic from ".."
import {
ALBUM_DETAILED,
ALBUM_FULL,
ARTIST_DETAILED,
ARTIST_FULL,
PLAYLIST_FULL,
PLAYLIST_VIDEO,
SONG_DETAILED,
SONG_FULL,
VIDEO_DETAILED,
VIDEO_FULL
} from "../interfaces"
import { iValidationError, LIST, STRING, validate } from "validate-any" import { iValidationError, LIST, STRING, validate } from "validate-any"
import Validator from "validate-any/dist/classes/Validator"
import YTMusic from "../"
import {
ALBUM_DETAILED, ALBUM_FULL, ARTIST_DETAILED, ARTIST_FULL, PLAYLIST_FULL, PLAYLIST_VIDEO,
SONG_DETAILED, SONG_FULL, VIDEO_DETAILED, VIDEO_FULL
} from "../interfaces"
const issues: iValidationError[][] = [] const issues: iValidationError[][] = []
const queries = ["Lilac", "Weekend", "Eill", "Eminem", "Lisa Hannigan"] const queries = ["Lilac", "Weekend", "Eill", "Eminem", "Lisa Hannigan"]

View File

@ -27,7 +27,6 @@ export interface VideoDetailed {
videoId: string videoId: string
name: string name: string
artists: ArtistBasic[] artists: ArtistBasic[]
views: number
duration: number duration: number
thumbnails: ThumbnailFull[] thumbnails: ThumbnailFull[]
} }
@ -67,7 +66,6 @@ export interface AlbumDetailed extends AlbumBasic {
type: "ALBUM" type: "ALBUM"
playlistId: string playlistId: string
artists: ArtistBasic[] artists: ArtistBasic[]
year: number
thumbnails: ThumbnailFull[] thumbnails: ThumbnailFull[]
} }

View File

@ -1,19 +1,10 @@
import ObjectValidator from "validate-any/dist/validators/ObjectValidator"
import {
AlbumBasic,
AlbumDetailed,
AlbumFull,
ArtistBasic,
ArtistDetailed,
ArtistFull,
PlaylistFull,
SongDetailed,
SongFull,
ThumbnailFull,
VideoDetailed,
VideoFull
} from "."
import { BOOLEAN, LIST, NUMBER, OBJECT, STRING } from "validate-any" import { BOOLEAN, LIST, NUMBER, OBJECT, STRING } from "validate-any"
import ObjectValidator from "validate-any/dist/validators/ObjectValidator"
import {
AlbumBasic, AlbumDetailed, AlbumFull, ArtistBasic, ArtistDetailed, ArtistFull, PlaylistFull,
SongDetailed, SongFull, ThumbnailFull, VideoDetailed, VideoFull
} from "./"
export const THUMBNAIL_FULL: ObjectValidator<ThumbnailFull> = OBJECT({ export const THUMBNAIL_FULL: ObjectValidator<ThumbnailFull> = OBJECT({
url: STRING(), url: STRING(),
@ -46,7 +37,6 @@ export const VIDEO_DETAILED: ObjectValidator<VideoDetailed> = OBJECT({
videoId: STRING(), videoId: STRING(),
name: STRING(), name: STRING(),
artists: LIST(ARTIST_BASIC), artists: LIST(ARTIST_BASIC),
views: NUMBER(),
duration: NUMBER(), duration: NUMBER(),
thumbnails: LIST(THUMBNAIL_FULL) thumbnails: LIST(THUMBNAIL_FULL)
}) })
@ -64,7 +54,6 @@ export const ALBUM_DETAILED: ObjectValidator<AlbumDetailed> = OBJECT({
playlistId: STRING(), playlistId: STRING(),
name: STRING(), name: STRING(),
artists: LIST(ARTIST_BASIC), artists: LIST(ARTIST_BASIC),
year: NUMBER(),
thumbnails: LIST(THUMBNAIL_FULL) thumbnails: LIST(THUMBNAIL_FULL)
}) })
@ -85,7 +74,6 @@ export const VIDEO_FULL: ObjectValidator<VideoFull> = OBJECT({
videoId: STRING(), videoId: STRING(),
name: STRING(), name: STRING(),
artists: LIST(ARTIST_BASIC), artists: LIST(ARTIST_BASIC),
views: NUMBER(),
duration: NUMBER(), duration: NUMBER(),
thumbnails: LIST(THUMBNAIL_FULL), thumbnails: LIST(THUMBNAIL_FULL),
description: STRING(), description: STRING(),
@ -121,7 +109,6 @@ export const ALBUM_FULL: ObjectValidator<AlbumFull> = OBJECT({
playlistId: STRING(), playlistId: STRING(),
name: STRING(), name: STRING(),
artists: LIST(ARTIST_BASIC), artists: LIST(ARTIST_BASIC),
year: NUMBER(),
thumbnails: LIST(THUMBNAIL_FULL), thumbnails: LIST(THUMBNAIL_FULL),
description: STRING(), description: STRING(),
songs: LIST(SONG_DETAILED) songs: LIST(SONG_DETAILED)

View File

@ -1,9 +1,9 @@
import { AlbumBasic, AlbumDetailed, AlbumFull, ArtistBasic } from "../"
import { ALBUM_DETAILED, ALBUM_FULL } from "../interfaces"
import checkType from "../utils/checkType" import checkType from "../utils/checkType"
import SongParser from "./SongParser"
import traverseList from "../utils/traverseList" import traverseList from "../utils/traverseList"
import traverseString from "../utils/traverseString" import traverseString from "../utils/traverseString"
import { ALBUM_DETAILED, ALBUM_FULL } from "../interfaces" import SongParser from "./SongParser"
import { AlbumBasic, AlbumDetailed, AlbumFull, ArtistBasic } from ".."
export default class AlbumParser { export default class AlbumParser {
public static parse(data: any, albumId: string): AlbumFull { public static parse(data: any, albumId: string): AlbumFull {
@ -25,7 +25,6 @@ export default class AlbumParser {
...albumBasic, ...albumBasic,
playlistId: traverseString(data, "buttonRenderer", "playlistId")(), playlistId: traverseString(data, "buttonRenderer", "playlistId")(),
artists, artists,
year: +traverseString(data, "header", "subtitle", "text")(-1),
thumbnails, thumbnails,
description: traverseString(data, "description", "text")(), description: traverseString(data, "description", "text")(),
songs: traverseList(data, "musicResponsiveListItemRenderer").map(item => songs: traverseList(data, "musicResponsiveListItemRenderer").map(item =>
@ -51,7 +50,6 @@ export default class AlbumParser {
name: traverseString(run, "text")() name: traverseString(run, "text")()
})), })),
name: traverseString(flexColumns[0], "runs", "text")(), name: traverseString(flexColumns[0], "runs", "text")(),
year: +traverseString(flexColumns[1], "runs", "text")(-1),
thumbnails: traverseList(item, "thumbnails") thumbnails: traverseList(item, "thumbnails")
}, },
ALBUM_DETAILED ALBUM_DETAILED
@ -66,7 +64,6 @@ export default class AlbumParser {
playlistId: traverseString(item, "thumbnailOverlay", "playlistId")(), playlistId: traverseString(item, "thumbnailOverlay", "playlistId")(),
name: traverseString(item, "title", "text")(), name: traverseString(item, "title", "text")(),
artists: [artistBasic], artists: [artistBasic],
year: +traverseString(item, "subtitle", "text")(-1),
thumbnails: traverseList(item, "thumbnails") thumbnails: traverseList(item, "thumbnails")
}, },
ALBUM_DETAILED ALBUM_DETAILED
@ -81,7 +78,6 @@ export default class AlbumParser {
playlistId: traverseString(item, "musicPlayButtonRenderer", "playlistId")(), playlistId: traverseString(item, "musicPlayButtonRenderer", "playlistId")(),
name: traverseString(item, "title", "text")(), name: traverseString(item, "title", "text")(),
artists: [artistBasic], artists: [artistBasic],
year: +traverseString(item, "subtitle", "text")(-1),
thumbnails: traverseList(item, "thumbnails") thumbnails: traverseList(item, "thumbnails")
}, },
ALBUM_DETAILED ALBUM_DETAILED

View File

@ -1,11 +1,11 @@
import AlbumParser from "./AlbumParser" import { ArtistBasic, ArtistDetailed, ArtistFull } from "../"
import { ARTIST_DETAILED, ARTIST_FULL } from "../interfaces"
import checkType from "../utils/checkType" import checkType from "../utils/checkType"
import Parser from "./Parser"
import SongParser from "./SongParser"
import traverseList from "../utils/traverseList" import traverseList from "../utils/traverseList"
import traverseString from "../utils/traverseString" import traverseString from "../utils/traverseString"
import { ARTIST_DETAILED, ARTIST_FULL } from "../interfaces" import AlbumParser from "./AlbumParser"
import { ArtistBasic, ArtistDetailed, ArtistFull } from ".." import Parser from "./Parser"
import SongParser from "./SongParser"
export default class ArtistParser { export default class ArtistParser {
public static parse(data: any, artistId: string): ArtistFull { public static parse(data: any, artistId: string): ArtistFull {

View File

@ -1,8 +1,8 @@
import { PlaylistFull } from "../"
import { PLAYLIST_FULL } from "../interfaces"
import checkType from "../utils/checkType" import checkType from "../utils/checkType"
import traverseList from "../utils/traverseList" import traverseList from "../utils/traverseList"
import traverseString from "../utils/traverseString" import traverseString from "../utils/traverseString"
import { PLAYLIST_FULL } from "../interfaces"
import { PlaylistFull } from ".."
export default class PlaylistParser { export default class PlaylistParser {
public static parse(data: any, playlistId: string): PlaylistFull { public static parse(data: any, playlistId: string): PlaylistFull {

View File

@ -1,10 +1,10 @@
import { SearchResult } from "../"
import traverseList from "../utils/traverseList"
import AlbumParser from "./AlbumParser" import AlbumParser from "./AlbumParser"
import ArtistParser from "./ArtistParser" import ArtistParser from "./ArtistParser"
import PlaylistParser from "./PlaylistParser" import PlaylistParser from "./PlaylistParser"
import SongParser from "./SongParser" import SongParser from "./SongParser"
import traverseList from "../utils/traverseList"
import VideoParser from "./VideoParser" import VideoParser from "./VideoParser"
import { SearchResult } from ".."
export default class SearchParser { export default class SearchParser {
public static parse(item: any): SearchResult { public static parse(item: any): SearchResult {

View File

@ -1,10 +1,11 @@
import { LIST, OBJECT, STRING } from "validate-any"
import { AlbumBasic, ArtistBasic, SongDetailed, SongFull, ThumbnailFull } from "../"
import { ALBUM_BASIC, ARTIST_BASIC, SONG_DETAILED, SONG_FULL, THUMBNAIL_FULL } from "../interfaces"
import checkType from "../utils/checkType" import checkType from "../utils/checkType"
import Parser from "./Parser"
import traverseList from "../utils/traverseList" import traverseList from "../utils/traverseList"
import traverseString from "../utils/traverseString" import traverseString from "../utils/traverseString"
import { ALBUM_BASIC, ARTIST_BASIC, SONG_DETAILED, SONG_FULL, THUMBNAIL_FULL } from "../interfaces" import Parser from "./Parser"
import { AlbumBasic, ArtistBasic, SongDetailed, SongFull, ThumbnailFull } from ".."
import { LIST, OBJECT, STRING } from "validate-any"
export default class SongParser { export default class SongParser {
public static parse(data: any): SongFull { public static parse(data: any): SongFull {
@ -19,7 +20,7 @@ export default class SongParser {
name: traverseString(data, "author")() name: traverseString(data, "author")()
} }
], ],
duration: +traverseString(data, "videoDetails", "lengthSeconds"), duration: +traverseString(data, "videoDetails", "lengthSeconds")(),
thumbnails: traverseList(data, "videoDetails", "thumbnails"), thumbnails: traverseList(data, "videoDetails", "thumbnails"),
description: traverseString(data, "description")(), description: traverseString(data, "description")(),
formats: traverseList(data, "streamingData", "formats"), formats: traverseList(data, "streamingData", "formats"),
@ -45,7 +46,7 @@ export default class SongParser {
})) }))
.slice(0, -1), .slice(0, -1),
album: { album: {
albumId: traverseString(item, "browseId")(-1), albumId: traverseString(flexColumns[1], "runs", "browseId")(-1),
name: traverseString(flexColumns[1], "runs", "text")(-3) name: traverseString(flexColumns[1], "runs", "text")(-3)
}, },
duration: Parser.parseDuration(traverseString(flexColumns[1], "runs", "text")(-1)), duration: Parser.parseDuration(traverseString(flexColumns[1], "runs", "text")(-1)),
@ -97,8 +98,8 @@ export default class SongParser {
name: traverseString(flexColumns[0], "runs", "text")(), name: traverseString(flexColumns[0], "runs", "text")(),
artists: [artistBasic], artists: [artistBasic],
album: { album: {
albumId: traverseString(flexColumns[2], "runs", "text")(), albumId: traverseString(flexColumns[2], "browseId")(),
name: traverseString(flexColumns[2], "browseId")() name: traverseString(flexColumns[2], "runs", "text")()
}, },
thumbnails: traverseList(item, "thumbnails") thumbnails: traverseList(item, "thumbnails")
}, },

View File

@ -1,10 +1,10 @@
import { VideoDetailed, VideoFull } from "../"
import { PLAYLIST_VIDEO } from "../interfaces"
import checkType from "../utils/checkType" import checkType from "../utils/checkType"
import Parser from "./Parser"
import traverse from "../utils/traverse" import traverse from "../utils/traverse"
import traverseList from "../utils/traverseList" import traverseList from "../utils/traverseList"
import traverseString from "../utils/traverseString" import traverseString from "../utils/traverseString"
import { PLAYLIST_VIDEO } from "../interfaces" import Parser from "./Parser"
import { VideoDetailed, VideoFull } from ".."
export default class VideoParser { export default class VideoParser {
public static parse(data: any): VideoFull { public static parse(data: any): VideoFull {
@ -18,7 +18,6 @@ export default class VideoParser {
name: traverseString(data, "author")() name: traverseString(data, "author")()
} }
], ],
views: +traverseString(data, "videoDetails", "viewCount")(),
duration: +traverseString(data, "videoDetails", "lengthSeconds")(), duration: +traverseString(data, "videoDetails", "lengthSeconds")(),
thumbnails: traverseList(data, "videoDetails", "thumbnails"), thumbnails: traverseList(data, "videoDetails", "thumbnails"),
description: traverseString(data, "description")(), description: traverseString(data, "description")(),
@ -43,9 +42,6 @@ export default class VideoParser {
artistId: traverseString(run, "browseId")(), artistId: traverseString(run, "browseId")(),
name: traverseString(run, "text")() name: traverseString(run, "text")()
})), })),
views: Parser.parseNumber(
traverseString(flexColumns[1], "runs", "text")(-3).slice(0, -6)
),
duration: Parser.parseDuration(traverseString(flexColumns[1], "text")(-1)), duration: Parser.parseDuration(traverseString(flexColumns[1], "text")(-1)),
thumbnails: traverseList(item, "thumbnails") thumbnails: traverseList(item, "thumbnails")
} }
@ -53,7 +49,9 @@ export default class VideoParser {
public static parsePlaylistVideo(item: any): Omit<VideoDetailed, "views"> { public static parsePlaylistVideo(item: any): Omit<VideoDetailed, "views"> {
const flexColumns = traverseList(item, "flexColumns") const flexColumns = traverseList(item, "flexColumns")
const videoId = traverseString(item, "playNavigationEndpoint", "videoId")() const videoId =
traverseString(item, "playNavigationEndpoint", "videoId")() ||
traverseList(item, "thumbnails")[0].url.match(/https:\/\/i\.ytimg\.com\/vi\/(.+)\//)[1]
return checkType<Omit<VideoDetailed, "views">>( return checkType<Omit<VideoDetailed, "views">>(
{ {