fix alt text, i think
[pdt.git] / pdt.sh
diff --git a/pdt.sh b/pdt.sh
index 25cc46198efad6b649fdca8e083069e687df37ce..a93932690a973e0ee90fce91129fa61ab9426e30 100644 (file)
--- a/pdt.sh
+++ b/pdt.sh
 
 PATH="$HOME/.local/bin:$PATH"
 
+
+_pdtsh_file="$(readlink -f -- "${BASH_SOURCE[0]}")"
+_pdtsh_dir="${_pdtsh_file%/*}"
+_pdtsh_tweet="$_pdtsh_dir/t.py"
+
+# usage: tweet [-PROFILE_NAME] [POST...]
+# Uses variables as input:
+# $media for image file path.
+# $alt_text for image alt text.
+tweet() {
+  local oath
+  oath=$HOME/.rainbow_oauth
+  if [[ $1 == -* ]]; then
+    rm -f $oath
+    ln -s $oath$1 $oath
+    shift
+  fi
+  source ~/src/twitter/venv/bin/activate
+  {
+    printf "%s\n" "$*"
+    if [[ $media ]]; then
+      printf "%s\n" "$media"
+      if [[ $alt_text ]]; then
+        printf "%s\n" "$alt_text"
+      fi
+    fi
+  } |  $_pdtsh_tweet
+  deactivate
+}
+
 # usage: rbow [-PROFILE_NAME] [COMMAND]
 #
 # Wrapper for rainbowstream to use multiple logins and tweet directly
@@ -57,60 +87,85 @@ EOF
   deactivate
 }
 
-diaspora() {
-  source ~/src/diaspy/venv/bin/activate
-  python3 ~/src/jan-pona-mute/jan-pona-mute.py "$@" || { deactivate; return 1; }
-  deactivate
-}
 
 # usage: toot [-PROFILE_NAME] [TOOT_ARGS]
 toot() {
-  local account
+  local mast_profile
   source ~/src/toot/venv/bin/activate
   if [[ $1 == -* ]]; then
-    account=${1#-}
+    mast_profile=${1#-}
     shift
-    command toot activate --quiet $account || { deactivate; return 1; }
+    command toot activate --quiet $mast_profile || { deactivate; return 1; }
   fi
   command toot "$@" || { deactivate; return 1; }
   deactivate
 }
 
 
-# post to mastodon + twitter + gnu social post + diaspora
-#
-# Diaspora is skipped if posting to dbd accounts.
+# post to mastodon + twitter + gnu social post
 #
 # If posting video, it only goes to twitter. Other accounts can be
 # posted to manually with free software.
 #
-# usage: pdt [--dbd] [-m MEDIA_FILE] [-v VIDEO_PATH] [POST]
+# Alt text only goes to mastodon.
+#
+# usage: pdt [-s mastodon|twitter|gnusocial] [--dbd] [-m IMAGE_FILE] [-a ALT_TEXT] [-v VIDEO_PATH] [POST]
+# -s mastodon|twitter|gnusocial = post to a single social network.
+# -m IMAGE_FILE = Uploads IMAGE_FILE. if MEDIA_FILE.txt exists, the last line of that file will be used as ALT_TEXT
+#                 unless -a has been used.
 pdt() {
-  local video media rbow_account gs_account mastodon_account dbd video rbow_arg toot_arg dia_arg gs_arg
+  local video media twitter_account gs_account mastodon_account video gs_arg network
+  local do_mastodon do_twitter do_gnusocial
+  local -a toot_args
   if [[ $pdttest ]]; then
-    rbow_account=iank
+    twitter_account=iank
     gs_account=fsfes
-    mastodon_account=iank@hostux.social
+    mastodon_account=fsftest@hostux.social
   else
-    rbow_account=fsf
+    twitter_account=fsf
     gs_account=fsf
     mastodon_account=fsf@hostux.social
   fi
-  dbd=false
   video=false
+  do_mastodon=true
+  do_twitter=true
+  do_gnusocial=true
   while [[ $1 == -* ]]; do
     case $1 in
+      -s)
+        network="$2"
+        do_mastodon=false
+        do_twitter=false
+        do_gnusocial=false
+        case $network in
+          mastodon)
+            do_mastodon=true
+            ;;
+          twitter)
+            do_twitter=true
+            ;;
+          gnusocial)
+            do_gnusocial=true
+            ;;
+          *)
+            echo "pdt: error: expected -s mastodon|twitter|gnusocial"
+            return 1
+            ;;
+        esac
+        shift 2
+        ;;
+      -a)
+        alt_text="$2"
+        shift 2
+        ;;
       -m)
         media="$2"
         shift 2
-        rbow_arg=" --i $media"
-        toot_arg="--media $media"
-        dia_arg="-p $media "
+        toot_args+=(--media "$media" )
         gs_arg="-F media=@$media"
         ;;
       --dbd)
-        dbd=true
-        rbow_account=dbd
+        twitter_account=dbd
         gs_account=dbd
         mastodon_account=endDRM@hostux.social
         shift
@@ -131,6 +186,12 @@ pdt() {
       echo "error: file path contains a space. move it to non-space path"
       return 1
     fi
+    if [[ ! $alt_text && -r $media.txt && -s $media.txt ]]; then
+      alt_text=$(tail -n1 $media.txt)
+    fi
+    if [[ $alt_text ]]; then
+      toot_args+=(--description "$alt_text" )
+    fi
   fi
   # if we have no argument
   if (( ! $# )); then
@@ -139,37 +200,34 @@ pdt() {
   fi
   if [[ $- == *i* ]]; then
     echo "About to PDT the following line. Press enter to confirm or ctrl-c to quit:"
-    echo "$input"
-    read
+    echo "$*"
+    read -r
   fi
   if $video; then
     local oath
     oath=$HOME/.rainbow_oauth
-    account=fsf
-    if $dbd; then
-      account=dbd
-    fi
     rm -f $oath
-    ln -s ${oath}-$account $oath
+    ln -s ${oath}-$twitter_account $oath
     python3 ~/src/video-tweet/async-upload.py "$media" "$*"
     return
   fi
   fails=()
-  if ! rbow -$rbow_account t "$*" $rbow_arg; then
-    fails+=(tweet)
-  fi
-  if ! toot -$mastodon_account post "$*" $toot_arg; then
-    fails+=(toot)
+  if $do_twitter; then
+    if ! tweet -$twitter_account "$*"; then
+      fails+=(tweet)
+    fi
   fi
-  if ! $dbd; then
-    if ! printf "post %s\n" "${dia_arg}$*" | diaspora; then
-      fails+=(diaspora)
+  if $do_mastodon; then
+    if ! toot -$mastodon_account post "$*" "${toot_args[@]}"; then
+      fails+=(toot)
     fi
   fi
-  # https://gnusocial.net/doc/twitterapi
-  if ! curl -o /dev/null -sS -u "$gs_account:$(cat ~/.gnusocial_login-$gs_account)" \
-       $gs_arg -F "status=$*" https://status.fsf.org/api/statuses/update.xml; then
-    fails+=(gnu-social)
+  if $do_gnusocial; then
+    # https://gnusocial.net/doc/twitterapi
+    if ! curl -o /dev/null -sS -u "$gs_account:$(cat ~/.gnusocial_login-$gs_account)" \
+         $gs_arg -F "status=$*" https://status.fsf.org/api/statuses/update.xml; then
+      fails+=(gnu-social)
+    fi
   fi
   if (( ${#fails[@]} )); then
     printf "$(tput setaf 5)█$(tput sgr0)%.0s" $(eval echo "{1..${COLUMNS:-60}}"); echo
@@ -177,101 +235,186 @@ pdt() {
   fi
 }
 
-# Usage: pdt-setup
-pdt-setup() {
+# Usage: toot-setup
+#
+# Only run manually for testing.
+#
+# this expects pdt-pip-setup has been run already, and it doesn't setup
+# errhandle.
+#
+# note: auth info is stored at ~/.config/toot/config.json
+pdt-toot-setup() {
+  local -a twitter_accounts mastodon_accounts
   if [[ $pdttest ]]; then
-    mastodon_accounts=(iank)
+    twitter_accounts=(iank)
+    mastodon_accounts=(fsftest)
   else
+    twitter_accounts=(fsf dbd)
     mastodon_accounts=(fsf endDRM)
   fi
 
-  mkdir -p ~/src
-  cd ~/src
-  for repo in errhandle rainbowstream diaspy jan-pona-mute video-tweet; do
-    if [[ -e $repo ]]; then
-      cd $repo
-      git fetch
-      git reset --hard origin/master
-      git clean -xfffd
-      cd ..
-    else
-      git clone https://vcs.fsf.org/git/$repo.git
+  rm -rf ~/src/toot
+  mkdir -p ~/src/toot
+  cd ~/src/toot
+  # on t11, got myself into a situation where when doing pip install virtualenv,
+  # it gave an error that /usr/bin/pip didn't exist, so i did
+  # sudo ln -s /home/iank/.local/bin/pip /usr/bin
+  #
+  python3 -m virtualenv -p python3 venv
+  source venv/bin/activate
+  # pip freeze after a pip install, as of 2022-11-28
+  cat >requirements.txt <<'EOF'
+beautifulsoup4==4.11.1
+certifi==2022.9.24
+charset-normalizer==2.1.1
+idna==2.8
+requests==2.22.0
+soupsieve==2.3.2.post1
+toot==0.29.0
+urllib3==1.25.8
+urwid==2.1.2
+wcwidth==0.2.5
+EOF
+
+  # new 2022-11 packages
+  # beautifulsoup4==4.11.1
+  # certifi==2022.9.24
+  # charset-normalizer==2.1.1
+  # idna==3.4
+  # requests==2.28.1
+  # soupsieve==2.3.2.post1
+  # toot==0.29.0
+  # urllib3==1.26.13
+  # urwid==2.1.2
+  # wcwidth==0.2.5
+
+  # old 2019 packages
+  # beautifulsoup4==4.8.2
+  # certifi==2019.11.28
+  # chardet==3.0.4
+  # idna==2.8
+  # requests==2.22.0
+  # soupsieve==1.9.5
+  # toot==0.25.2
+  # urllib3==1.25.8
+  # urwid==2.1.0
+  # wcwidth==0.1.8
+
+  # i mixed in some old packages to get newer toot working on t9.
+
+  python3 -m pip install -r requirements.txt
+  cd -
+  deactivate
+  for account in ${mastodon_accounts[@]}; do
+    if ! toot activate $account@hostux.social &>/dev/null; then
+      printf "$(tput setaf 5)█$(tput sgr0)%.0s" $(eval echo "{1..${COLUMNS:-60}}");
+      echo "Please login to the account named \"$account\" on https://hostux.social in your main browser then press enter."
+      echo "WARNING: if you log into an account other than \"$account\", this won't work"
+      read -r
+      toot login -i hostux.social
     fi
   done
-  source ~/src/errhandle/err
-  cp ~/src/rainbowstream/rainbowstream/colorset/config ~/.rainbow_config.json
+}
 
+# Usage: pdt-pip-setup
+pdt-pip-setup() {
   if [[ ! -e ~/.local/bin/pip ]]; then
     tmp=$(mktemp)
-    wget -O$tmp https://bootstrap.pypa.io/get-pip.py
+    pyver=$(python3 --version | sed -r 's/.*(3\.[0-9]+).*/\1/')
+    echo fyi: detected pyver: $pyver. this should look something like 3.6
+
+    if dpkg --compare-versions 3.6 ge $pyver; then
+      # The bootstrap script at https://bootstrap.pypa.io/get-pip.py required 3.7+
+      # when i wrote this.
+      wget -O$tmp https://bootstrap.pypa.io/pip/$pyver/get-pip.py
+    else
+      wget -O$tmp https://bootstrap.pypa.io/get-pip.py
+    fi
     python3 $tmp --user
     hash -r
   fi
+  python3 -m pip install --user -U virtualenv
+}
 
-
-  if [[ ! -e ~/.local/bin/virtualenv ]]; then
-    python3 -m pip install --user virtualenv
-  fi
-
-  cd ~/src/rainbowstream
+# generally only meant to be called internally from pdt-setup
+pdt-twitter-setup() {
+  # twitter setup
+  mkdir -p ~/src/twitter
+  cd ~/src/twitter
   python3 -m virtualenv -p python3 venv
   source venv/bin/activate
+  # as of 2022-11-30
+  cat >requirements.txt <<'EOF'
+certifi==2022.9.24
+twitter==1.19.6
+EOF
   python3 -m pip install -r requirements.txt
-  python3 -m pip install -e .
   deactivate
+  cd -
 
-
-  # This repo's upstream is https://alexschroeder.ch/cgit/diaspy which is
-  # recommended in the install instructions here:
-  # https://alexschroeder.ch/cgit/jan-pona-mute/about/
-  cd ~/src/diaspy
+  # note: we could ditch rainbowstream altogether and just pass around
+  # oath api key string in a password file or something if we learned
+  # how to get it from the new twitter client im using. I'm just keeping
+  # this because it works and I like the format of how it stores its
+  # auth secrets.
+  cd ~/src/rainbowstream
   python3 -m virtualenv -p python3 venv
   source venv/bin/activate
   python3 -m pip install -r requirements.txt
   python3 -m pip install -e .
   deactivate
 
-  rm -rf ~/src/toot
-  mkdir -p ~/src/toot
-  cd ~/src/toot
-  python3 -m virtualenv -p python3 venv
-  source venv/bin/activate
-  # pip freeze after a pip install.
-  cat >requirements.txt <<'EOF'
-beautifulsoup4==4.8.2
-certifi==2019.11.28
-chardet==3.0.4
-idna==2.8
-requests==2.22.0
-soupsieve==1.9.5
-toot==0.25.2
-urllib3==1.25.8
-urwid==2.1.0
-wcwidth==0.1.8
-EOF
-  python3 -m pip install -r requirements.txt
-  deactivate
-
-
-  if [[ ! -s ~/.config/jan-pona-mute/login ]]; then
-    mkdir ~/.config/jan-pona-mute
-    account=fsf@framasphere.org
-    read -r -p "enter the password for $account > " pass
-    # background: format for this found using the save command
-    cat >~/.config/jan-pona-mute/login <<EOF
-account $account
-password $pass
-login
-EOF
-  fi
-
-  for account in dbd fsf; do
+  for account in ${twitter_accounts[@]}; do
     if [[ ! -s ~/.rainbow_oauth-$account ]]; then
       printf "$(tput setaf 5)█$(tput sgr0)%.0s" $(eval echo "{1..${COLUMNS:-60}}");
-      echo "Please login to $account on twitter in your main browser then press enter. After rainbowstream prompt loads, quit with command q"
+      echo "Please login to the account named \"$account\" on twitter in your main browser then press enter. After rainbowstream prompt loads, quit by typing q then enter"
       read -r
       rbow -$account
     fi
+  done
+  for account in ${twitter_accounts[@]}; do
+    if [[ ! -s $HOME/.rainbow_oauth-$account ]]; then
+      echo "pdt-setup error: expected non-empty file at $HOME/.rainbow_oauth-$account by this point. try reruning pdt-setup and logging in to the correct twitter account in browser or contact ian"
+      return 1
+    fi
+  done
+  if [[ ! $pdttest ]] && diff -q $HOME/.rainbow_oauth-fsf $HOME/.rainbow_oauth-dbd &>/dev/null; then
+    echo "pdt-setup error: error, $HOME/.rainbow_oauth-fsf $HOME/.rainbow_oauth-dbd are the same. Did you follow the instructions closely and log into fsf and then dbd when prompted? try reruning pdt-setup and doing that"
+    return 1
+  fi
+  cd -
+}
+
+
+# Usage: pdt-setup
+pdt-setup() {
+
+  start_dir="$PWD"
+  mkdir -p ~/src
+  cd ~/src
+  for repo in errhandle rainbowstream video-tweet; do
+    if [[ -e $repo ]]; then
+      cd $repo
+      git fetch
+      git reset --hard origin/master
+      git clean -xfffd
+      cd ..
+    else
+      git clone https://vcs.fsf.org/git/$repo.git
+    fi
+  done
+  cd "$start_dir"
+  source ~/src/errhandle/err
+  cp ~/src/rainbowstream/rainbowstream/colorset/config ~/.rainbow_config.json
+
+  pdt-pip-setup
+
+  pdt-toot-setup
+
+  pdt-twitter-setup
+
+
+  for account in dbd fsf; do
     if [[ ! -s ~/.gnusocial_login-$account ]]; then
       printf "$(tput setaf 5)█$(tput sgr0)%.0s" $(eval echo "{1..${COLUMNS:-60}}");
       read -r -p "please enter the password for $account@status.fsf.org > " pass
@@ -281,13 +424,6 @@ EOF
     fi
   done
 
-  for account in ${mastodon_accounts[@]}; do
-    if ! toot activate $account@hostux.social &>/dev/null; then
-      printf "$(tput setaf 5)█$(tput sgr0)%.0s" $(eval echo "{1..${COLUMNS:-60}}");
-      echo "Please login to $account on https://hostux.social in your main browser then press enter."
-      read -r
-      toot login -i hostux.social
-    fi
-  done
   err-allow
+  echo "pdt-setup complete"
 }