Hallo,
die momentane Firmware meines Dreambox 7025 ist von Anfang des Jahres. Und anscheinend ist dieses Problem noch immer aktuell: Löschen während Aufnahme?
Vor einiger Zeit habe ich mir ein kleines Python Skript geschrieben, das Dateien gaaaaanz langsam löschen kann.
Es löscht in den aktuellen Einstellungen 1,5 GB pro Minute, indem es eine Datei einfach schrittweise alle 2 Sekunden um 50 MB verkleinert.
Ruckler in Aufnahmen durch das löschen großer Filmdateien sind damit zumindest sehr selten.
Da ich die Box nur per Netzwerk bediene (sie steht in einem anderem Zimmer) lade ich die Aufnahmen per FTP auf meinen PC und markiere die fertig heruntergeladenen Dateien, indem ich sie umbenenne und dem Namen ein kleines 'z' voranstelle. Das Skript läuft im Hintergrund und bearbeitet alle Dateien die mit 'z' beginnen.
Die restlichen Dateien lösche ich normal per FTP.
Falls ihr diese Funktion in die offizielle Firmware aufnehmt wäre es sehr schön, wenn ihr dieses "Markieren von zu löschenden Dateien durch umbenennen und verkleinern im Hintergrund" beibehalten würdet, damit man damit auch per FTP Dateien langsam löschen kann.
Benutzung des folgenden Codes auf eigene Gefahr
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import sys
import tempfile
import time
# Einstellen auf 50 MB alle 2 Sekunden
shrinkvalue = 50*1024*1024
shrinkwait = 2 # seconds
dirpy = sys.path[0]
dirwork = "/media/hdd/movie"
# Pruefe ob das Script schon laeuft
isrunning = False
l = os.listdir(dirpy)
for e in l:
e2 = e[:7]
if e2 == "working":
isrunning = True
if isrunning:
print "Skript laeuft bereits"
sys.exit()
# Erzeuge eine Datei als Ausfuehrungssperre
tmp = tempfile.NamedTemporaryFile(mode='w+b', bufsize=-1, suffix='', prefix='working.', dir=dirpy)
while 1:
l = os.listdir(dirwork)
for e in l:
e2 = e[:1]
if e2 == "z":
# Wenn Dateiname mit einem 'z' beginnt...
f = dirwork + "/" + e
print f
if os.path.exists(f):
size = os.path.getsize(f)
if size > 0:
# Oeffne die Datei...
try:
bin = open(f, "ab")
except IOError, (errno, strerror):
print strerror
#print "size: " + str(size)
while size > 0:
sizenew = size % shrinkvalue
if sizenew > 0:
sizenew = size - sizenew
else:
sizenew = size - shrinkvalue
#print "new: " + str(sizenew)
# Und verkleinere die Datei bis nichts mehr uebrig ist
bin.truncate(sizenew)
# Warte kurz damit die Dreambox Zeit hat evtl. Daten abzuspeichern usw.
time.sleep(shrinkwait)
size = os.path.getsize(f)
bin.close()
#else:
#os.remove(f)
else:
print "Nicht gefunden"
time.sleep(5)
sys.exit()
Alles anzeigen
Damit ich das Skript nicht immer per Telnet aufrufen muss hab ich mir das ins Linux-Autostart eingebaut (ich kenn mich nicht gut aus mit Linux und hab mir das zusammengesucht).
shrink.py habe ich abgelegt in /home/root
Dateiberechtigung: 755
Folgendes kommt nach /etc/init.d/shrink.sh
#! /bin/sh
case "$1" in
start)
echo -n "Starte Shrink"
echo -n " Shrink"; python /home/root/shrink.py &
;;
stop)
echo -n "Stoppe Shrink"
echo -n " Shrink"; rm /home/root/working.*
;;
esac
: exit 0
Alles anzeigen
Dateiberechtigung: 755
Folgende Befehle per Telnet ausführen:
ln -s /etc/init.d/shrink.sh /etc/rc3.d/K99shrink.sh
ln -s /etc/init.d/shrink.sh /etc/rc3.d/S99shrink.sh
Ob das Skript nach dem Neustart der Box läuft, kann man daran erkennen, dass in /home/root eine Datei ist deren Name mit "working" beginnt.
Problem: falls die Box nicht richtig heruntergefahren wird (Stromausfall) startet das Skript nicht mehr weil erst die "working"-Datei gelöscht werden muss.
Vielleicht kann das noch jemand verbessern?
Gruß
Konari