cClaude.rocks ☕ Le blog

[Nouvelles technologies, sciences et coups de gueule…]

Menu

Les fichiers .nomedia servent sur Android à ne pas ajouter les médias (photos ou vidéos) contenu dans le dossier dans la galerie du téléphone. Attention, il ne s’agit pas des fichiers finissant par .nomedia mais bien du fichier unique par répertoire se nommant .nomedia.

Le contenu du fichier n’a pas d’importance, il peut être vide, seule sa présence compte.



La problématique

Si ces fichiers sont laissés vides, les applications de nettoyage peuvent-être amené à les supprimer (que ce soit parce qu’ils sont vides ou que de fait se sont des fichiers identiques).

Tant que l’on reste sur la plateforme Android ce n’est pas vraiment un problème (les applications de nettoyage sont parfaitement au fait de la règle), mais lorsqu’on synchronise avec son ordinateur (par exemple à l’aide de Nextcloud) cela est différent. Certaines applications de recherche de doublons ou de nettoyage des fichiers vides seront peut-être moins au fait de cette règle.

Certaines applications sur Android génèrent les fichiers .nomedia en mettant déjà le nom du répertoire courant (qui doit être caché). Le chemin utilisé pour alimenter le fichier est souvent dans ce cas le chemin absolu du répertoire.

Je vous propose donc un petit script qui va se charge de faire ce travail. On va donc vérifier que chaque fichier .nomedia qui existe contienne le chemin du dossier où se trouve fichier .nomedia.

Une version simpliste :

find ~/Nextcloud -type f -name .nomedia -empty -print | while read -r FILENAME ; do echo "$( dirname "${FILENAME}" )" >"${FILENAME}" ; done

Ici on ne recherche que les fichiers .nomedia vide et on met le nom du répertoire (nom absolu du dossier sur l’ordinateur).

On peut améliorer un peu ce code en utilisant une fonction et en ajoutant une trace des fichiers modifiés.

function fill_nomedia_files {
  local -r _dir_="$1"

  find "${_dir_}" -type f -name .nomedia -empty -print | while read -r FILENAME ; do
    echo "${FILENAME}"
    echo "$( dirname "${FILENAME}" )" >"${FILENAME}"
  done
}

Qui s’utilisera par exemple :

fill_nomedia_files ~/Nextcloud
  • Version un peu plus aboutie
    function fill_nomedia_files {
      local -r _dir_="$1"
    
      if [ -n "${FILL_NOMEDIA_PREFIX:-}" ] ; then
       local content_prefix="${FILL_NOMEDIA_PREFIX}"
      else
        local content_prefix=
      fi
    
      if [ "${FILL_NOMEDIA_MODE:-}" != 'LOCAL' ] ; then
        cd "${_dir_}" || return $?
        local file_prefix=
      else
        local file_prefix="${_dir_}"
      fi
    
      local __filename__=
      local _filename_=
      local _content_=
      local _expected_=
      find "${_dir_}" -type f -name '.nomedia'  -printf '%P\n' | while read -r __filename__ ; do
         _filename_="${file_prefix}${__filename__}"
         _expected_="$( echo "${content_prefix}$( dirname "${__filename__}" )" )"
         _content_="$( cat "${_filename_}" )" || return $?
    
        if [ "${_expected_}" = "${_content_}" ] ; then
          echo "OK: ${_filename_}"
        else
          if [ "${FILL_NOMEDIA_DEBUG:-}" = 'true' ] ; then
            echo "UPDATE: '${_filename_}' using '${_expected_}'"
            cat <<EOF
    FOUND:
    [${_content_}]
    ---
    EOF
          else
            echo "UPDATE: '${_filename_}'"
          fi
          if [ "${FILL_NOMEDIA_DRY_RUN:-}" != 'true' ] ; then
            echo -n "${_expected_}" >"${_filename_}"
          fi
        fi
      done
    }
    

    Si vous définissez la variable FILL_NOMEDIA_PREFIX sont contenu sera ajouté pour préfixer le nom de dossier mis dans le fichier .nomedia.

    FILL_NOMEDIA_PREFIX='/storage/emulated/0/Android/media/com.nextcloud.client/nextcloud/user@drive.cclaude.rocks/'
    

    Si vous définissez la variable FILL_NOMEDIA_MODE avec la valeur 'LOCAL', le nom complet du répertoire sur l’ordinateur sera utilisé comme nom du dossier mis dans le fichier .nomedia.

    FILL_NOMEDIA_MODE='LOCAL'
    

    Si vous définissez la variable FILL_NOMEDIA_DEBUG avec la valeur 'true', des traces supplémentaires seront affichées.

    FILL_NOMEDIA_DEBUG='true'
    

    Si vous définissez la variable FILL_NOMEDIA_DRY_RUN avec la valeur 'true', le script se déroulera sans alimenter les fichiers .nomedia mais expliquera ce qu’il va faire si une autre valeur est définie.

    FILL_NOMEDIA_DRY_RUN='true'
    

    Ce script s’utilisera comme suit :

    fill_nomedia_files ~/Nextcloud
    

ᦿ


ℹ 2006 - 2022 | 🏠 Accueil du domaine | 🏡 Accueil du blog