scene release to discogs release
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

186 lines
5.6KB

  1. #!/usr/bin/env -S fish
  2. #set fish_trace on
  3. function usage
  4. begin
  5. echo "Reads tsv release from sdtin, outputs JSON"
  6. echo
  7. echo "Usage: $0 [-v][-eURL]"
  8. echo
  9. echo " -eURL/--endpoint=URL Set ElasticSearch /_search endpoint URL"
  10. echo " -v/--verbose Print query and warnings"
  11. exit 1
  12. end >&2
  13. end
  14. argparse -n (status current-filename) 'v/verbose' 'h/help' 'e/endpoint=?' -- $argv
  15. if test $status -ne 0
  16. usage
  17. end
  18. if set -q _flag_help
  19. usage
  20. end
  21. if not set -q _flag_endpoint
  22. set _flag_endpoint 'http://localhost:9200/_all/_search'
  23. end
  24. curl -s -o /dev/null -G "$_flag_endpoint"
  25. if test $status -ne 0
  26. echo "ERR: Search API Endpoint $_flag_endpoint failed"
  27. exit 1
  28. end
  29. set OUT (mktemp -t rls.ES.XXXXXXXX.json)
  30. function discord_format
  31. switch $argv[1]
  32. case (seq 100)VINYL VINYL VLS Vinyl vinyl
  33. printf '%s' "Vinyl"
  34. case (seq 100)CD CD CDA CDS CDM CDEP EP
  35. printf '%s' "CD"
  36. case CDR CDREP
  37. printf '%s' "CDr"
  38. case TAPE
  39. printf '%s' "Cassette"
  40. case WEB SINGLE-WEB EP-WEB
  41. printf '%s' "File"
  42. case '*'
  43. printf '%s' "*"
  44. end
  45. end
  46. while read -l -d (printf '\t') ORG A T C B F E Y
  47. set _in_A "$A"; set _in_T "$T"; set _in_C "$C";
  48. set _in_B "$B"; set _in_F "$F"; set _in_E "$E"; set _in_Y "$Y"
  49. if set -q A; and test -n "$A"
  50. set A (string trim "$A")
  51. switch "$A"
  52. case VA Va va "V.A." OST "O.S.T" "Various Artists"
  53. set Q "q=artists.name:\"Various\""
  54. case '*'
  55. set A (string replace -a ')' ' ' "$A")
  56. set A (string replace -a '(' ' ' "$A")
  57. set A (string lower "$A")
  58. set Q "q=artists.name:\"$A\""
  59. end
  60. end
  61. if set -q T; and test -n "$T"
  62. set T (string replace -a '(' ' ' "$T")
  63. set T (string replace -a ')' ' ' "$T")
  64. set T (string trim "$T")
  65. set T (string lower "$T")
  66. set -a Q " AND title:\"$T\"~"
  67. end
  68. if set -q C; and test -n "$C"
  69. set -a Q " AND (identifiers.value:$C~ OR labels.catno:$C)"
  70. end
  71. if set -q B; and test -n "$B"
  72. set B (string trim "$B")
  73. set -a Q " AND (identifiers.value:$B~ OR labels.catno:$B)"
  74. end
  75. if set -q F; and test -n "$F"
  76. switch "$F"
  77. case CDS
  78. set -a Q " AND formats.name:CD AND formats.descriptions:Single"
  79. case CDM
  80. set -a Q " AND formats.name:CD AND formats.descriptions:Maxi-Single"
  81. case CDA
  82. set -a Q " AND formats.name:CD AND formats.descriptions:Album"
  83. case '*'
  84. set -a Q " AND formats.name:$(discord_format $F)"
  85. end
  86. else
  87. # No format given, at least exclude Vinyl which would usually be named in rls
  88. set -a Q " AND NOT formats.name:Vinyl"
  89. end
  90. if set -q Y
  91. set -a Q " AND released:[$Y-01-01 TO $Y-12-31]"
  92. end
  93. # TODO Editions
  94. if set -q Q; and test -n "$Q"
  95. if set -q _flag_verbose
  96. echo "$Q" >&2
  97. end
  98. set CODE (curl -s -G -w '%{http_code}' -o "$OUT" --data-urlencode "$Q" --data-urlencode size=100 "$_flag_endpoint")
  99. if test $status -ne 0
  100. echo "ERR: curl request failed" >&2
  101. rm "$OUT"
  102. continue
  103. end
  104. if test $CODE -ne 200
  105. begin
  106. echo "ERR: ES status code $CODE"
  107. echo $ORG
  108. echo $Q
  109. end >&2
  110. rm "$OUT"
  111. continue
  112. end
  113. set ES_COUNT (jq -r .hits.total.value "$OUT")
  114. if test $status -ne 0
  115. begin
  116. echo "ERR: Failed parsing result"
  117. echo $ORG
  118. echo $Q
  119. end >&2
  120. rm "$OUT"
  121. continue
  122. end
  123. if test $ES_COUNT -eq 0
  124. echo '{}' | jq -SMc --arg rls "$ORG" --arg query "$Q" --arg cnt "$ES_COUNT" \
  125. --arg a "$_in_A" \
  126. --arg t "$_in_T" \
  127. --arg c "$_in_C" \
  128. --arg b "$_in_B" \
  129. --arg f "$_in_F" \
  130. --arg e "$_in_E" \
  131. --arg y "$_in_Y" \
  132. '
  133. {
  134. "_scene_release_name": $rls,
  135. "_query": $query,
  136. "_search_result_count": $cnt | tonumber,
  137. "_artist": $a,
  138. "_title": $t,
  139. "_catno": $c,
  140. "_barcode": $b,
  141. "_format": $f,
  142. "_edition": $e,
  143. "_year": $y
  144. }'
  145. else if test $ES_COUNT -eq 1
  146. jq -SMc --arg rls "$ORG" --arg query "$Q" --arg count "$ES_COUNT" '.hits.hits[0] |
  147. ._source + {
  148. "_scene_release_name": $rls,
  149. "_query": $query,
  150. "_search_result_count": $count | tonumber,
  151. }' "$OUT"
  152. else if test $ES_COUNT -gt 1
  153. # skip results with mixed mastere ids
  154. set UNIQUE_MASTERS (jq -r '[.hits.hits[]._source.master_id] | unique | length' $OUT)
  155. if test $UNIQUE_MASTERS -gt 1
  156. if set -q _flag_verbose
  157. echo "WARN: Mixed results $ORG" >&2
  158. end
  159. rm "$OUT"
  160. continue
  161. else
  162. jq -SMc --arg rls "$ORG" --arg query "$Q" --arg count "$ES_COUNT" '.hits.hits[0] |
  163. ._source + {
  164. "_scene_release_name": $rls,
  165. "_query": $query,
  166. "_search_result_count": $count | tonumber,
  167. }' "$OUT"
  168. end
  169. end
  170. rm "$OUT"
  171. end
  172. end