scene release to discogs release
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

186 lignes
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