fix(users/Profpatsch/whatcd-resolver): numeric release types

The RED Gazelle API is so inconsistent, smh.

Sometimes they return the release type string, sometimes the integer
representing it. So let’s handle both!

Change-Id: Ie99f01342a13269df5c1e2036aaede54d7149516
Reviewed-on: https://cl.tvl.fyi/c/depot/+/13223
Tested-by: BuildkiteCI
Reviewed-by: Profpatsch <mail@profpatsch.de>
This commit is contained in:
Profpatsch 2025-03-08 18:50:28 +01:00
parent 2ed3f7c026
commit cf80c75a69
2 changed files with 56 additions and 45 deletions

View file

@ -539,53 +539,64 @@ data TorrentData transmissionInfo = TorrentData
} }
-- | https://redacted.sh/wiki.php?action=article&id=455#_1804298149 -- | https://redacted.sh/wiki.php?action=article&id=455#_1804298149
newtype ReleaseType = ReleaseType {unReleaseType :: Text} data ReleaseType = ReleaseType {intKey :: Int, stringKey :: Text}
deriving stock (Eq, Show) deriving stock (Eq, Show)
releaseTypeFromTextOrIntKey :: Text -> ReleaseType
releaseTypeFromTextOrIntKey t =
allReleaseTypesSorted
& List.find
( \rt -> do
rt.stringKey == t || buildText intDecimalT rt.intKey == t
)
& fromMaybe (ReleaseType {intKey = (-1), stringKey = t})
releaseTypeComparison :: Comparison ReleaseType releaseTypeComparison :: Comparison ReleaseType
releaseTypeComparison = releaseTypeComparison = listIndexComparison allReleaseTypesSorted
listIndexComparison
[ releaseTypeAlbum, allReleaseTypesSorted :: [ReleaseType]
releaseTypeLiveAlbum, allReleaseTypesSorted =
releaseTypeAnthology, [ releaseTypeAlbum,
releaseTypeSoundtrack, releaseTypeLiveAlbum,
releaseTypeEP, releaseTypeAnthology,
releaseTypeCompilation, releaseTypeSoundtrack,
releaseTypeSingle, releaseTypeEP,
releaseTypeRemix, releaseTypeCompilation,
releaseTypeBootleg, releaseTypeSingle,
releaseTypeInterview, releaseTypeRemix,
releaseTypeMixtape, releaseTypeBootleg,
releaseTypeDemo, releaseTypeInterview,
releaseTypeConcertRecording, releaseTypeMixtape,
releaseTypeDJMix, releaseTypeDemo,
releaseTypeUnknown, releaseTypeConcertRecording,
releaseTypeProducedBy, releaseTypeDJMix,
releaseTypeComposition, releaseTypeUnknown,
releaseTypeRemixedBy, releaseTypeProducedBy,
releaseTypeGuestAppearance releaseTypeComposition,
] releaseTypeRemixedBy,
releaseTypeGuestAppearance
]
releaseTypeAlbum, releaseTypeSoundtrack, releaseTypeEP, releaseTypeAnthology, releaseTypeCompilation, releaseTypeSingle, releaseTypeLiveAlbum, releaseTypeRemix, releaseTypeBootleg, releaseTypeInterview, releaseTypeMixtape, releaseTypeDemo, releaseTypeConcertRecording, releaseTypeDJMix, releaseTypeUnknown, releaseTypeProducedBy, releaseTypeComposition, releaseTypeRemixedBy, releaseTypeGuestAppearance :: ReleaseType releaseTypeAlbum, releaseTypeSoundtrack, releaseTypeEP, releaseTypeAnthology, releaseTypeCompilation, releaseTypeSingle, releaseTypeLiveAlbum, releaseTypeRemix, releaseTypeBootleg, releaseTypeInterview, releaseTypeMixtape, releaseTypeDemo, releaseTypeConcertRecording, releaseTypeDJMix, releaseTypeUnknown, releaseTypeProducedBy, releaseTypeComposition, releaseTypeRemixedBy, releaseTypeGuestAppearance :: ReleaseType
releaseTypeAlbum = ReleaseType "Album" releaseTypeAlbum = ReleaseType 1 "Album"
releaseTypeSoundtrack = ReleaseType "Soundtrack" releaseTypeSoundtrack = ReleaseType 3 "Soundtrack"
releaseTypeEP = ReleaseType "EP" releaseTypeEP = ReleaseType 5 "EP"
releaseTypeAnthology = ReleaseType "Anthology" releaseTypeAnthology = ReleaseType 6 "Anthology"
releaseTypeCompilation = ReleaseType "Compilation" releaseTypeCompilation = ReleaseType 7 "Compilation"
releaseTypeSingle = ReleaseType "Single" releaseTypeSingle = ReleaseType 9 "Single"
releaseTypeLiveAlbum = ReleaseType "Live album" releaseTypeLiveAlbum = ReleaseType 11 "Live album"
releaseTypeRemix = ReleaseType "Remix" releaseTypeRemix = ReleaseType 13 "Remix"
releaseTypeBootleg = ReleaseType "Bootleg" releaseTypeBootleg = ReleaseType 14 "Bootleg"
releaseTypeInterview = ReleaseType "Interview" releaseTypeInterview = ReleaseType 15 "Interview"
releaseTypeMixtape = ReleaseType "Mixtape" releaseTypeMixtape = ReleaseType 16 "Mixtape"
releaseTypeDemo = ReleaseType "Demo" releaseTypeDemo = ReleaseType 17 "Demo"
releaseTypeConcertRecording = ReleaseType "Concert Recording" releaseTypeConcertRecording = ReleaseType 18 "Concert Recording"
releaseTypeDJMix = ReleaseType "DJ Mix" releaseTypeDJMix = ReleaseType 19 "DJ Mix"
releaseTypeUnknown = ReleaseType "Unknown" releaseTypeUnknown = ReleaseType 21 "Unknown"
releaseTypeProducedBy = ReleaseType "Produced By" releaseTypeProducedBy = ReleaseType 1021 "Produced By"
releaseTypeComposition = ReleaseType "Composition" releaseTypeComposition = ReleaseType 1022 "Composition"
releaseTypeRemixedBy = ReleaseType "Remixed By" releaseTypeRemixedBy = ReleaseType 1023 "Remixed By"
releaseTypeGuestAppearance = ReleaseType "Guest Appearance" releaseTypeGuestAppearance = ReleaseType 1024 "Guest Appearance"
data TorrentGroupJson = TorrentGroupJson data TorrentGroupJson = TorrentGroupJson
{ groupName :: Text, { groupName :: Text,
@ -684,7 +695,7 @@ getBestTorrents opts = do
groupId <- Dec.fromField @Int groupId <- Dec.fromField @Int
torrentId <- Dec.fromField @Int torrentId <- Dec.fromField @Int
seedingWeight <- Dec.fromField @Int seedingWeight <- Dec.fromField @Int
releaseType <- ReleaseType <$> Dec.text releaseType <- releaseTypeFromTextOrIntKey <$> Dec.text
artists <- Dec.json $ artists <- Dec.json $
Json.eachInArray $ do Json.eachInArray $ do
id_ <- Json.keyLabel @"artistId" "id" (Json.asIntegral @_ @Int) id_ <- Json.keyLabel @"artistId" "id" (Json.asIntegral @_ @Int)

View file

@ -941,7 +941,7 @@ mkBestTorrentsTable opts fresh = do
{Html.toHtml @Text b.torrentGroupJson.groupName} {Html.toHtml @Text b.torrentGroupJson.groupName}
</a> </a>
</td> </td>
<td>{Html.toHtml @Text b.releaseType.unReleaseType}</td> <td>{Html.toHtml @Text b.releaseType.stringKey}</td>
<td>{Html.toHtml @Natural b.torrentGroupJson.groupYear}</td> <td>{Html.toHtml @Natural b.torrentGroupJson.groupYear}</td>
<td>{Html.toHtml @Int b.seedingWeight}</td> <td>{Html.toHtml @Int b.seedingWeight}</td>
<td>{Html.toHtml @Text b.torrentFormat}</td> <td>{Html.toHtml @Text b.torrentFormat}</td>
@ -951,7 +951,7 @@ mkBestTorrentsTable opts fresh = do
) )
let section :: NonEmpty (TorrentData (Label "percentDone" Percentage)) -> Html let section :: NonEmpty (TorrentData (Label "percentDone" Percentage)) -> Html
section rows = do section rows = do
let releaseType = rows & NonEmpty.head & (.releaseType.unReleaseType) let releaseType = rows & NonEmpty.head & (.releaseType.stringKey)
[hsx| [hsx|
<h2>{releaseType}s</h2> <h2>{releaseType}s</h2>
<table class="table"> <table class="table">