KXStudio Website https://kx.studio/
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.

330 lines
13KB

  1. #!/bin/bash
  2. set -e
  3. cd $(dirname "${0}")
  4. REPO_TARGET="${1}"
  5. if [ -z "${REPO_TARGET}" ]; then
  6. echo "usage: ${0} <apps|plugins>"
  7. exit 1
  8. fi
  9. # supported architectures, i386 will eventually go away once we build everything on "focal"
  10. PACKAGES_ARCHS=("amd64" "arm64" "armhf" "i386")
  11. # software we know to be abandoned, so we give warning to users to maybe not rely on it so much
  12. PACKAGES_ABANDONED=("ams-lv2" "arctican-plugins-lv2" "arctican-plugins-vst" "arpage" "autotalent" "beatslash-lv2" "easyssp-lv2" "easyssp-vst" "invada-studio-plugins-ladspa" "invada-studio-plugins-lv2" "juced-plugins-lv2" "juced-plugins-vst" "pizmidi-plugins" "teragonaudio-plugins-lv2" "teragonaudio-plugins-vst")
  13. # stuff to be hidden, for various reasons
  14. PACKAGES_BLACKLIST=("carla-bridge-linux32" "carla-bridge-linux64" "distrho-src" "jalv" "lv2vst" "wineasio-amd64" "wineasio-i386")
  15. # hidden packages, either abandoned by the author or stuff I no longer use and thus won't maintain updated here
  16. PACKAGES_HIDDEN=("cadence" "cadence-tools" "catia" "claudia" "fluajho" "gladish" "ladish" "non-sequencer" "non-sequencer-git" "patroneo" "vico")
  17. # stuff to always be shown, even when their arch is "all"
  18. PACKAGES_WHITELIST=("cadence" "catia" "claudia" "impro-visor" "j2sc")
  19. # packages with separate data package, merge into 1 single item
  20. PACKAGES_SEPARATE_DATA=("hybridreverb2")
  21. PACKAGES_BASE_URL="http://ppa.launchpad.net/kxstudio-debian/${REPO_TARGET}/ubuntu/"
  22. PACKAGES_BASE_HTTPS="https://launchpad.net/~kxstudio-debian/+archive/${REPO_TARGET}/+files/"
  23. rm -f Packages.gz Packages
  24. mkdir -p pool-cache
  25. wget -q http://ppa.launchpad.net/kxstudio-debian/${REPO_TARGET}/ubuntu/dists/bionic/main/binary-amd64/Packages.gz
  26. gzip -d Packages.gz
  27. mv Packages Packages.bionic
  28. wget -q http://ppa.launchpad.net/kxstudio-debian/${REPO_TARGET}/ubuntu/dists/focal/main/binary-amd64/Packages.gz
  29. gzip -d Packages.gz
  30. mv Packages Packages.focal
  31. cat Packages.bionic Packages.focal > Packages
  32. PACKAGES=$(cat Packages | grep "Package: " | sed "s/Package: //g" | sort | uniq)
  33. function is_abandoned() {
  34. local TEST="${1}"
  35. local PACKAGE
  36. for PACKAGE in ${PACKAGES_ABANDONED[@]}; do
  37. if [ ${TEST} = ${PACKAGE} ]; then
  38. return 0
  39. fi
  40. done
  41. return 1
  42. }
  43. function is_hidden() {
  44. local TEST="${1}"
  45. local PACKAGE
  46. for PACKAGE in ${PACKAGES_BLACKLIST[@]}; do
  47. if [ ${TEST} = ${PACKAGE} ]; then
  48. return 0
  49. fi
  50. done
  51. for PACKAGE in ${PACKAGES_HIDDEN[@]}; do
  52. if [ ${TEST} = ${PACKAGE} ]; then
  53. return 0
  54. fi
  55. done
  56. return 1
  57. }
  58. function is_whitelisted() {
  59. local TEST="${1}"
  60. local PACKAGE
  61. for PACKAGE in ${PACKAGES_WHITELIST[@]}; do
  62. if [ ${TEST} = ${PACKAGE} ]; then
  63. return 0
  64. fi
  65. done
  66. return 1
  67. }
  68. function has_data_package() {
  69. local TEST="${1}-data"
  70. local PACKAGE
  71. # FIXME remove after 1 year
  72. if [ ${TEST} = "lsp-plugins-data" ]; then
  73. return 1
  74. fi
  75. for PACKAGE in ${PACKAGES[@]}; do
  76. if [ ${TEST} = ${PACKAGE} ]; then
  77. return 0
  78. fi
  79. done
  80. return 1
  81. }
  82. function has_separate_data_package() {
  83. local TEST="${1}"
  84. local PACKAGE
  85. for PACKAGE in ${PACKAGES_SEPARATE_DATA[@]}; do
  86. if [ ${TEST} = ${PACKAGE} ]; then
  87. return 0
  88. fi
  89. done
  90. return 1
  91. }
  92. function get_homepage() {
  93. local SOURCE="${1}"
  94. local VERSION="${2}"
  95. local SRC_FILENAME="${SOURCE}_$(echo ${VERSION} | sed 's/:/./').dsc"
  96. local SRC_LETTER=$(echo "${SOURCE}" | head -c 1)
  97. if [ ! -f "pool-cache/${SRC_FILENAME}" ]; then
  98. wget -q -O "pool-cache/${SRC_FILENAME}" "${PACKAGES_BASE_URL}/pool/main/${SRC_LETTER}/${SOURCE}/${SRC_FILENAME}"
  99. if [ $? != 0 ]; then
  100. rm -f "pool-cache/${SRC_FILENAME}"
  101. return 1
  102. fi
  103. fi
  104. cat "pool-cache/${SRC_FILENAME}" | awk 'sub("Homepage: ","")'
  105. return 0
  106. }
  107. function get_vcs_page() {
  108. local SOURCE="${1}"
  109. local VERSION="${2}"
  110. local SRC_FILENAME="${SOURCE}_$(echo ${VERSION} | sed 's/:/./').dsc"
  111. local SRC_LETTER=$(echo "${SOURCE}" | head -c 1)
  112. if [ ! -f "pool-cache/${SRC_FILENAME}" ]; then
  113. wget -q -O "pool-cache/${SRC_FILENAME}" "${PACKAGES_BASE_URL}/pool/main/${SRC_LETTER}/${SOURCE}/${SRC_FILENAME}"
  114. if [ $? != 0 ]; then
  115. rm -f "pool-cache/${SRC_FILENAME}"
  116. return 1
  117. fi
  118. fi
  119. cat "pool-cache/${SRC_FILENAME}" | awk 'sub("Kxstudio-Vcs: ","")'
  120. return 0
  121. }
  122. for PACKAGE in ${PACKAGES[@]}; do
  123. if is_hidden ${PACKAGE} || echo "${PACKAGE}" | grep -q -- "-static"; then
  124. continue
  125. fi
  126. PACKAGE_LINESTART=$(cat Packages | grep -x -n "Package: ${PACKAGE}" | cut -d ':' -f 1 | sort -n | tail -n 1)
  127. PACKAGE_NUMLINES=$(cat Packages | tail -n +$((${PACKAGE_LINESTART} + 1)) | grep -n "Package: " | head -n 1 | cut -d ':' -f 1)
  128. if [ -n "${PACKAGE_NUMLINES}" ]; then
  129. PACKAGE_DETAILS=$(cat Packages | tail -n +${PACKAGE_LINESTART} | head -n ${PACKAGE_NUMLINES})
  130. else
  131. PACKAGE_DETAILS=$(cat Packages | tail -n +${PACKAGE_LINESTART})
  132. fi
  133. PACKAGE_FILENAME=$(echo "${PACKAGE_DETAILS}" | awk 'sub("Filename: ","")')
  134. if echo "${PACKAGE_FILENAME}" | grep -q "_all.deb" && ! is_whitelisted "${PACKAGE}"; then
  135. continue
  136. fi
  137. PACKAGE_BASENAME=$(basename "${PACKAGE_FILENAME}")
  138. PACKAGE_DATA=$(has_data_package "${PACKAGE}" && echo "${PACKAGE}-data" || echo)
  139. if [ -z "${PACKAGE_DATA}" ] && echo "${PACKAGE}" | grep -q -- \-; then
  140. PACKAGE_MAIN=$(echo "${PACKAGE}" | cut -d '-' -f 1)
  141. PACKAGE_DATA=$(has_data_package "${PACKAGE_MAIN}" && echo "${PACKAGE_MAIN}-data" || echo)
  142. fi
  143. PACKAGE_DESCRIPTION=$(echo "${PACKAGE_DETAILS}" | awk 'sub("Description: ","")')
  144. PACKAGE_PROVIDES=$(echo "${PACKAGE_DETAILS}" | awk 'sub("Provides: ","")')
  145. PACKAGE_SIZE=$(echo "${PACKAGE_DETAILS}" | grep -v "Installed-Size:" | awk 'sub("Size: ","")')
  146. PACKAGE_RVERSION=$(echo "${PACKAGE_DETAILS}" | awk 'sub("Version: ","")' | cut -d ':' -f 2)
  147. PACKAGE_VERSION=$(echo "${PACKAGE_RVERSION}" | cut -d '-' -f 1)
  148. PACKAGE_SOURCE=$(echo "${PACKAGE_DETAILS}" | awk 'sub("Source: ","")')
  149. if [ -z "${PACKAGE_SOURCE}" ]; then
  150. PACKAGE_SOURCE="${PACKAGE}"
  151. fi
  152. PACKAGE_HOMEPAGE=$(get_homepage "${PACKAGE_SOURCE}" "${PACKAGE_RVERSION}")
  153. PACKAGE_VCS_PAGE=$(get_vcs_page "${PACKAGE_SOURCE}" "${PACKAGE_RVERSION}")
  154. if echo "${PACKAGE_BASENAME}" | grep -q "carla-bridge-win64_"; then
  155. PACKAGE="carla-bridge-win"
  156. PACKAGE_DESCRIPTION="carla windows bridge"
  157. fi
  158. CLASS="repository-package"
  159. if is_abandoned ${PACKAGE}; then
  160. CLASS+=" abandoned"
  161. fi
  162. echo "<div class=\"${CLASS}\" id=\"${PACKAGE}\">"
  163. # screenshot
  164. SCREENSHOT=${PACKAGE}
  165. if [ ! -f "./screenshots/${SCREENSHOT}.png" ]; then
  166. SCREENSHOT=$(echo "${SCREENSHOT}" | sed "s/-lv2//g" | sed "s/-vst2//g" | sed "s/-vst3//g" | sed "s/-vst//g" | sed "s/-clap//g")
  167. if [ ! -f "./screenshots/${SCREENSHOT}.png" ]; then
  168. SCREENSHOT=""
  169. fi
  170. fi
  171. if [ -n "${SCREENSHOT}" ]; then
  172. echo "<div class=\"img_clickable\"><img src=\"/repo/screenshots/${SCREENSHOT}.png\" alt=\"${PACKAGE}\" class=\"img_thumb_150\"/>"
  173. echo "<div class=\"img_clickable_overlay\"><img src=\"/repo/screenshots/${SCREENSHOT}.png\" alt=\"${PACKAGE}\"/></div>"
  174. echo "</div>"
  175. else
  176. echo "<div><img src=\"/repo/screenshots/nogui.png\" alt=\"${PACKAGE}\" class=\"img_thumb_150\"/></div>"
  177. fi
  178. # full table
  179. echo "<div><table>"
  180. echo "<tr><td>Package Name:</td><td><a href=\"#${PACKAGE}\" style=\"text-decoration:none;color:#D6D6D6;\">${PACKAGE}</a></td></tr>"
  181. echo "<tr><td>Description:</td><td>${PACKAGE_DESCRIPTION}</td></tr>"
  182. if [ -n "${PACKAGE_HOMEPAGE}" ] || [ -n "${PACKAGE_VCS_PAGE}" ]; then
  183. echo "<tr><td>Useful links:</td><td>"
  184. if [ -n "${PACKAGE_HOMEPAGE}" ]; then
  185. echo "<a href=\"${PACKAGE_HOMEPAGE}\" target=\"_blank\">Homepage</a>&nbsp;&nbsp;"
  186. fi
  187. if [ -n "${PACKAGE_VCS_PAGE}" ]; then
  188. echo "<a href=\"${PACKAGE_VCS_PAGE}\" target=\"_blank\">VCS</a>&nbsp;&nbsp;"
  189. fi
  190. echo "</td></tr>"
  191. fi
  192. echo "<tr><td>Version:</td><td>${PACKAGE_VERSION}</td></tr>"
  193. echo "<tr><td>Package size:</td><td>"
  194. if [ ${PACKAGE_SIZE} -gt 1048576 ]; then
  195. echo "$((${PACKAGE_SIZE} / 1024 / 1024))Mb"
  196. else
  197. echo "$((${PACKAGE_SIZE} / 1024))Kb"
  198. fi
  199. if [ -n "${PACKAGE_DATA}" ]; then
  200. PACKAGE_DATA_LINESTART=$(cat Packages | grep -x -n "Package: ${PACKAGE_DATA}" | cut -d ':' -f 1 | sort -n | tail -n 1)
  201. PACKAGE_DATA_NUMLINES=$(cat Packages | tail -n +$((${PACKAGE_DATA_LINESTART} + 1)) | grep -n "Package: " | head -n 1 | cut -d ':' -f 1)
  202. if [ -n "${PACKAGE_DATA_NUMLINES}" ]; then
  203. PACKAGE_DATA_DETAILS=$(cat Packages | tail -n +${PACKAGE_DATA_LINESTART} | head -n ${PACKAGE_DATA_NUMLINES})
  204. else
  205. PACKAGE_DATA_DETAILS=$(cat Packages | tail -n +${PACKAGE_DATA_LINESTART})
  206. fi
  207. PACKAGE_DATA_SIZE=$(echo "${PACKAGE_DATA_DETAILS}" | grep -v "Installed-Size:" | awk 'sub("Size: ","")')
  208. if [ ${PACKAGE_DATA_SIZE} -gt 1048576 ]; then
  209. echo "+ $((${PACKAGE_DATA_SIZE} / 1024 / 1024))Mb (data)"
  210. else
  211. echo "+ $((${PACKAGE_DATA_SIZE} / 1024))Kb (data)"
  212. fi
  213. fi
  214. echo "</td></tr>"
  215. if [ ${REPO_TARGET} = "plugins" ]; then
  216. if [ -z "${PACKAGE_PROVIDES}" ]; then
  217. echo "<tr><td>Provides:</td><td>??</td></tr>"
  218. else
  219. echo "<tr><td>Provides:</td><td>"
  220. if echo "${PACKAGE_PROVIDES}" | grep -q standalone-plugin; then
  221. echo "Standalone "
  222. fi
  223. if echo "${PACKAGE_PROVIDES}" | grep -q ladspa-plugin; then
  224. echo "LADSPA "
  225. fi
  226. if echo "${PACKAGE_PROVIDES}" | grep -q dssi-plugin; then
  227. echo "DSSI "
  228. fi
  229. if echo "${PACKAGE_PROVIDES}" | grep -q lv2-plugin; then
  230. echo "LV2 "
  231. fi
  232. if echo "${PACKAGE_PROVIDES}" | grep -q vst-plugin; then
  233. echo "VST2 "
  234. fi
  235. if echo "${PACKAGE_PROVIDES}" | grep -q vst3-plugin; then
  236. echo "VST3 "
  237. fi
  238. if echo "${PACKAGE_PROVIDES}" | grep -q clap-plugin; then
  239. echo "CLAP "
  240. fi
  241. echo "</td></tr>"
  242. fi
  243. fi
  244. echo "<tr><td>Downloads:</td><td>"
  245. if echo "${PACKAGE_BASENAME}" | grep -q "carla-bridge-win64_"; then
  246. # amd64
  247. echo "<a href=\"${PACKAGES_BASE_HTTPS}${PACKAGE_BASENAME}\" target=\"_blank\">amd64</a>&nbsp;&nbsp;"
  248. # i386
  249. PACKAGE_BASENAME_ARCHED=$(echo "${PACKAGE_BASENAME}" | sed "s/-win64_/-win32_/g" | sed "s/_amd64.deb/_i386.deb/g")
  250. echo "<a href=\"${PACKAGES_BASE_HTTPS}${PACKAGE_BASENAME_ARCHED}\" target=\"_blank\">i386</a>&nbsp;&nbsp;(install both)"
  251. elif echo "${PACKAGE_BASENAME}" | grep -q "carla-vst-wine_"; then
  252. # amd64
  253. echo "<a href=\"${PACKAGES_BASE_HTTPS}${PACKAGE_BASENAME}\" target=\"_blank\">amd64</a>&nbsp;&nbsp;"
  254. # i386
  255. PACKAGE_BASENAME_ARCHED=$(echo "${PACKAGE_BASENAME}" | sed "s/_amd64.deb/_i386.deb/g")
  256. echo "<a href=\"${PACKAGES_BASE_HTTPS}${PACKAGE_BASENAME_ARCHED}\" target=\"_blank\">i386</a>&nbsp;&nbsp;"
  257. elif echo "${PACKAGE_BASENAME}" | grep -q "wineasio_"; then
  258. # amd64
  259. PACKAGE_BASENAME_ARCHED=$(echo "${PACKAGE_BASENAME}" | sed "s/wineasio_/wineasio-amd64_/g")
  260. echo "<a href=\"${PACKAGES_BASE_HTTPS}${PACKAGE_BASENAME_ARCHED}\" target=\"_blank\">amd64</a>&nbsp;&nbsp;"
  261. # i386
  262. PACKAGE_BASENAME_ARCHED=$(echo "${PACKAGE_BASENAME}" | sed "s/wineasio_/wineasio-i386_/g" | sed "s/_amd64.deb/_i386.deb/g")
  263. echo "<a href=\"${PACKAGES_BASE_HTTPS}${PACKAGE_BASENAME_ARCHED}\" target=\"_blank\">i386</a>&nbsp;&nbsp;"
  264. elif echo "${PACKAGE_BASENAME}" | grep -q "_all.deb"; then
  265. echo "<a href=\"${PACKAGES_BASE_HTTPS}${PACKAGE_BASENAME}\" target=\"_blank\">all</a>&nbsp;&nbsp;"
  266. else
  267. for ARCH in ${PACKAGES_ARCHS[@]}; do
  268. if [ "${ARCH}" = "i386" ] && (cat Packages.focal | grep -x -q "Package: ${PACKAGE}"); then
  269. continue
  270. fi
  271. PACKAGE_BASENAME_ARCHED=$(echo "${PACKAGE_BASENAME}" | sed "s/_amd64.deb/_${ARCH}.deb/g")
  272. echo "<a href=\"${PACKAGES_BASE_HTTPS}${PACKAGE_BASENAME_ARCHED}\" target=\"_blank\">${ARCH}</a>&nbsp;&nbsp;"
  273. done
  274. fi
  275. if [ -n "${PACKAGE_DATA}" ]; then
  276. if has_separate_data_package ${PACKAGE}; then
  277. PACKAGE_BASENAME_DATA=$(echo "${PACKAGE_BASENAME}" | sed "s|${PACKAGE}|${PACKAGE_DATA}|g" | sed "s/_amd64.deb/_all.deb/g")
  278. else
  279. PACKAGE_BASENAME_DATA=$(echo "${PACKAGE_BASENAME}" | sed "s|${PACKAGE}_|${PACKAGE_DATA}_|g" | sed "s/_amd64.deb/_all.deb/g")
  280. fi
  281. echo "<a href=\"${PACKAGES_BASE_HTTPS}${PACKAGE_BASENAME_DATA}\" target=\"_blank\">data</a>"
  282. fi
  283. echo "</td></tr>"
  284. echo "</table></div></div>"
  285. # separator
  286. echo "<br/>"
  287. echo
  288. done
  289. rm -f Packages Packages.bionic Packages.focal