[#] dg: простейший dos games downloader
oldpc(51t, 2) — All
2022-05-20 18:41:00



import sys, os; k = sys.argv[1][0] #dgpy ver 0.0.1

if k=='u':
  print ('mv games.utf games.bak')
  print ('wget http://ii.blcat.ru/s/games.utf')
  exit()

def dl(p,u,f,d):
  if not os.path.exists('dl/%s' % f):
    print ('mkdir -p dl && wget -c %s -O dl/%s' % (u,f))
  if k=='i':
    print ('mkdir -p dos/%s' % p)
    print ('unzip -d dos/%s dl/%s' % (p,f))

db = open('games.utf').read().splitlines()
def gv(v): return [n for n in db if n.split(' ')[0] == v]

if k=='s':
  print ('cat << EOFSEARCH')
  for t in db:
    t = t.split(' ',3)
    t = ' '.join((t[0],t[2],t[3]))
    if any([s.lower() in t.lower() for s in sys.argv[2:]]):
      print ("%s" % t)
  print ('EOFSEARCH')
else:
  for t in sys.argv[2:]:
    if gv(t):
      dl(*gv(t)[0].split(' ',3))




Для использования требуется скрипт враппер. Сохранить данный python-код, как dg.py, и рядом создать файл dg следующего содержания:

python3 dg.py $* | sh

Где python3 - используемая версия. Умеет следующие команды (все команды распознаются по первой букве, команды d и download равнозначны)

sh dg u : обновить базу данных. её урл жёстко захаркожен во первЫх строках
сейчас там игры с сайта gamesindos.narod.ru, но я добавлю и другие

sh dg s str1 str2 : ищет в базе описания, где есть str1 или str2, например d s keen wolf найдёт все упоминания keen и wolf. Если нужно, наоборот, сужать критерии поиска (когда игр будет много), можно any( в скрипте заменить на all(

sh dg d game1 game2 : скачивает указанные игры (название игры это первый столбец в поиске) в подкаталог dl. Например sh dg d keen1 civ-rus

sh dg i game1 game2 : скачивает (если ещё не загружены) и устанавливает игры в подкаталог dos (этот подкаталог можно сделать симлинком на директорию с играми в dosemu, dosbox или real dos, типа ln -s /mnt/hda2/gamez dos)

Типичное использование:

* Сохранить в отдельную поддиректорию файл dg.py
* echo 'python3 dg.py $* | sh' > dg
* sh dg u
* sh dg i civ-rus bounty pole-sch

(upd: изменена ссылка на games.utf)

[#] Re: dg: простейший dos games downloader
tuple(ping,54) — oldpc
2024-10-15 10:43:40


> Для использования требуется скрипт враппер. Сохранить данный python-код, как dg.py, и рядом создать файл dg следующего содержания:
> python3 dg.py $* | sh

Зачем нужен враппер? Можно же тот же самый питоновский файлик использовать через python3:
$ python3 dg.py i civ-rus bounty pole-sch

Или ещё проще - добавить шебанг в начало питоновского файла ("#!/usr/bin/env python3") и вызывать вот так:
$ ./dg.py i civ-rus bounty pole-sch

[#] Re: dg: простейший dos games downloader
iiii(ping,48) — tuple
2024-10-15 23:30:27


> Зачем нужен враппер?

потому что для краткости кода скрипт выдаёт shell-команды, и их надо исполнять :)

там же в конце написано | sh

[#] Re: dg: простейший dos games downloader
nnii(tolkiena, 2) — oldpc
2025-11-28 19:43:31


В связи с постоянным пропаданием games.utf, версия с укороченным списком (без описаний). кстати, в архивах есть R/TYCOON.ZIP и T/TYCOON.ZIP :), в этой версии можно прямо задавать r/tycoon или t/tycoon

dgm.py
import sys, os,base64; k = sys.argv[1][0] #dgmini

MIN='''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
tcqFAufV/95rJB1VGAAA'''


if k=='u':
    open('games.min.gz','wb').write(base64.b64decode(MIN))
    exit()

def dl(p,f):
  if not os.path.exists('dl/%s' % f):
    print ('mkdir -p dl && wget -c http://gamesindos.narod.ru/%s/%s.ZIP -O dl/%s.ZIP' % (p,f,f))
  if k=='i':
    print ('mkdir -p dos/%s' % f)
    print ('unzip -d dos/%s dl/%s.ZIP' % (f,f))

db = open('games.min').read().split()
def gv(v): 
    if '/' in v: return [v.upper()]
    else: return [n for n in db if n.split('/')[1].lower() == v]

if k=='s':
  print ('cat << EOFSEARCH')
  for t in db:
    x = t.split('/')
    t = x[1]
    if any([s.lower() in t.lower() for s in sys.argv[2:]]):
      print ("%s/%s" % (x[0],x[1]))
  print ('EOFSEARCH')
else:
  for t in sys.argv[2:]:
    if gv(t):
      dl(*gv(t)[0].split('/'))

dgm
python3 dgm.py $* | sh
gunzip games.min.gz 2> /dev/null

использование такое же

sh dgm u (создаёт games.min)
sh dgm s keen
sh dgm i civ-rus kb2